BuildWithMatija
Back to Builds
ToolActiveClosed source

Home Cloud

A private photo and video cloud that keeps the files on your own drive instead of a third-party cloud.

  • Payload CMS 3
  • Next.js 16
  • React 19
  • Vite 8
  • TypeScript
  • Go 1.22
  • PostgreSQL
  • Docker Compose
  • pnpm
  • Tailwind CSS
  • HTTP Range Requests
  • Short-lived signed URLs
Problem
Personal photos and videos quickly outgrow simple folders, especially when files are large, uploads fail, and video playback needs proper streaming. Third-party cloud storage solves convenience but gives up ownership, recurring cost control, and direct control over where the files live. A local drive solves ownership, but not browsing, uploads, thumbnails, permissions, or media playback in the browser.
Thesis
The bet is that a personal cloud should separate metadata from binary storage. Payload CMS owns users, permissions, asset records, folders, tags, and signed URL issuance, while a Go fileserver handles the heavy binary work: chunk receipt, assembly, local disk storage, and streaming. The frontend stays thin: login, upload, browsing, and media viewing.
Validation
The repository contains a working monorepo with Payload CMS, a Vite React frontend, and a Go fileserver. Implemented pieces include Payload auth and collections, chunked uploads, upload resume, asset grid, media viewer, signed media URL flow, owner-scoped access rules, folder navigation, and tag filtering. The phase audit is honest that end-to-end serving is still blocked for newly uploaded assets because Phase 4 processing does not yet move assets to ready.
Proof points
  • Private repository reviewed: matija2209/home-cloud
  • README describes the project as a self-hosted personal cloud for storing, browsing, and streaming photos and videos.
  • Architecture docs describe a control-plane / storage-plane split: Payload CMS for auth and metadata, React/Vite for UI, and Go for file storage and streaming.
  • Implementation tracker marks Payload auth, asset records, chunked uploads, upload resume, signed media URLs, owner-scoped access rules, folder navigation, and tag filtering as done.
  • Phase audit reports frontend lint/build, CMS build, and Go compile validation passing.
  • Phase audit also reports that serving is not fully end-to-end yet because Phase 4 processing is missing and uploaded assets do not become ready.
  • No public deployment URL, customer proof, or public demo link was verified from the repository.
Audience
  • People who want a private photo and video cloud on their own disk instead of Google Photos, iCloud, or Dropbox
  • Developers building a self-hosted media library with browser upload and streaming
  • Anyone with a large local drive who wants structured browsing, ownership, and web access without storing media in Postgres

Executive summary

Home Cloud is a self-hosted personal cloud for photos and videos. The core goal is simple: keep media on a local drive, but still get a browser-based experience for login, uploads, browsing, previews, and streaming.

The project is split into three apps. apps/cms is Payload CMS running inside Next.js. It owns auth, metadata, access control, and control-plane APIs. apps/frontend is a Vite + React client for login, uploads, asset browsing, and media viewing. apps/fileserver is a Go storage worker and media server for chunked uploads, file assembly, thumbnails, and streaming.

This is an active private build, not a public product launch. The repo shows a real implementation foundation, but the phase audit is clear that the media processing stage is still missing, which blocks newly uploaded assets from becoming fully viewable end to end.

The problem

A normal folder on a hard drive is good storage, but it is not a cloud. It does not give you browser upload, resumable large-file handling, authentication, asset browsing, thumbnails, tags, folders, or video seeking.

Third-party clouds solve those problems, but with tradeoffs. Files live somewhere else, storage becomes a subscription, and the system is shaped around the provider’s product decisions. For a personal archive of photos and videos, especially large video files, that can be the wrong bargain.

The difficult part is that media storage has two different jobs. Metadata and permissions want a structured application backend. Binary uploads and video streaming want a lower-level file server. Trying to make one system do both usually creates pain.

The thesis

Home Cloud uses a control-plane / storage-plane split.

Payload CMS is the control plane. It owns identity, permissions, assets, folders, tags, albums, shares, and custom REST endpoints. It creates upload sessions, stores asset records, protects server-managed fields, and issues short-lived signed URLs for media display.

The Go fileserver is the storage plane. It receives chunks, writes them to temporary storage, assembles final files, stores them on the local drive, serves files by asset ID, validates signed URLs, and supports HTTP range requests for video seeking.

The frontend does not decide storage paths or process media. It logs users in, uploads chunks to Go, reads metadata from Payload, and renders images or videos from signed URLs.

What I built

Monorepo structure

The repository is split into three applications:

text
apps/cms
  Payload CMS v3 inside Next.js 16

apps/frontend
  Vite + React client

apps/fileserver
  Go storage worker and media server

Payload CMS control plane (apps/cms)

  • User auth and role-based access
  • Asset records with owner-scoped visibility rules
  • Folders, tags, and albums for organisation
  • Custom REST endpoints for upload session creation and signed URL issuance
  • Server-managed fields protected from client tampering
  • Short-lived signed URLs for media display without exposing raw disk paths

React frontend (apps/frontend)

  • Login and session handling against Payload
  • Chunked upload UI with resume support for large files
  • Asset grid with folder navigation and tag filtering
  • Media viewer for images and video with seeking via signed URLs
  • Thin client: no direct disk access, no storage path decisions in the browser

Go fileserver (apps/fileserver)

  • Chunk receipt and temporary staging
  • File assembly and write to local disk
  • Serve media by asset ID with signed URL validation
  • HTTP range requests for video seeking
  • Thumbnail generation (processing pipeline integration planned)

Architecture

text
Browser
  → Vite + React frontend
  → Payload CMS (auth, metadata, signed URLs)
  → Go fileserver (chunks, assembly, streaming)
  → Local disk storage

Postgres
  → Payload collections (users, assets, folders, tags, shares)

Binary files never live in Postgres. Payload owns metadata and permissions; Go owns bytes on disk. The frontend talks to both: Payload for structure and auth, Go for upload chunks and media delivery.

Current status

Active private build. Payload auth, asset records, chunked uploads, upload resume, signed media URLs, owner-scoped access, folder navigation, and tag filtering are implemented. Frontend lint/build, CMS build, and Go compile validation pass.

Blocked on Phase 4 processing: newly uploaded assets do not become fully viewable end-to-end because the processing stage that moves assets to a ready state is not complete. This is an honest gap — the control plane and upload path work; the media-ready pipeline does not.

No public deployment URL or demo link is documented in the repository.

Related services

  • Internal tools
  • Next.js developer
  • Payload CMS websites

Working through something similar?

If your company has a workflow, content system, or internal process that needs to become real software, this is the kind of work I can help with.

Get in touch

Related builds

You might also find these useful

ProductShippedPrivate beta

Farmica

Order operations for direct-to-consumer farms — a spletna naročilnica that collects scattered channel orders into one weekly workflow.

  • Next.js
  • React
  • TypeScript
  • next-intl
  • Tailwind CSS
  • Vercel
  • Brevo
  • Google Analytics 4
View buildVisit
ProductShippedDemo available

Izložbica

Izložbica is a multi-tenant storefront and backoffice platform for creators who sell physical products through small catalogues, direct orders, pickup, delivery, and manual payment workflows. It gives sellers a simple public izložbica plus a private Pisarna for products, orders, stock, payments, and customer handling.

  • Next.js
  • React
  • TypeScript
  • Payload CMS
  • PostgreSQL
  • next-intl
  • TanStack Form
  • Zod
  • Radix UI
  • Stripe
  • Brevo
  • S3-compatible storage
  • Playwright
  • Vitest
  • pnpm
View buildLive demo
ToolActiveOpen source

DropImg

A self-hosted, Docker-first image hosting tool — drag, drop, or paste to get instant public URLs, with built-in multi-user support, S3-compatible storage, and optional background removal.

  • React 19
  • Vite
  • Hono
  • Node.js
  • TypeScript
  • Tailwind CSS 4
  • SQLite
  • Drizzle ORM
  • Garage S3
  • Docker
  • Better Auth
  • Cloudflare
View buildGitHub
Build with Matija logo

Build with Matija

Modern websites, content systems, and AI workflows built for long-term growth.

Services

  • Headless CMS Websites
  • Next.js & Headless CMS Advisory
  • AI Systems & Automation
  • Website & Content Audit

Resources

  • Case Studies
  • How I Work
  • Blog
  • Topics
  • CMS Hub
  • E-commerce Hub
  • B2B Website Strategy
  • Dashboard

Headless CMS

  • Payload CMS Developer
  • CMS Migration
  • Multi-Tenant CMS
  • Payload vs Sanity
  • Payload vs WordPress
  • Payload vs Contentful

Get in Touch

Ready to modernize your stack? Let's talk about what you're building.

Book a discovery callContact me →
© 2026Build with Matija•All rights reserved•Privacy Policy•Terms of Service
BuildWithMatija
Get In Touch