Skip to content

Repository files navigation

House Renovation Planner

A simple, mobile-first project planner for a house renovation. Projects → tasks → an append-only activity log (text + images), a per-project Kanban board, and a GitHub-style activity calendar with a per-day report carousel.

Stack

  • Frontend: React + Vite + TypeScript, shadcn/ui + Tailwind (mobile-first)
  • Backend: Go (standard library), serves the API and the built frontend
  • Database: SQLite (single file on a Docker volume)
  • Images: stored on a Docker volume; the DB keeps the path
  • Deploy: one container via docker-compose

Concepts

  • Auth: username-only, no passwords. Allowed usernames are pre-seeded via APP_USERS. Login issues a signed, long-lived cookie.
  • Projects are shared — everyone sees all projects.
  • Tasks have a required tag, optional assignee, due date, and a status (todo / in_progress / done / abandoned). Tasks are never deleted, only abandoned.
  • Log is append-only. Manual notes (text + optional image) plus automatic entries on status changes, due-date changes, and field edits.
  • Calendar: a day is gold if any task transitioned into done that day, otherwise green with intensity by activity volume. Tap a day for a report.

Configuration (environment variables)

VariableDefaultDescription
APP_USERSadmin:AdminAllowed users, username:Display Name, comma-separated.
APP_SECRET(ephemeral)Secret for signing cookies. Set this in production.
APP_TZUTCTimezone for grouping activity into days (IANA name).
PORT8080Port to listen on.
DB_PATH./data/app.dbSQLite file path.
UPLOADS_DIR./data/uploadsDirectory for uploaded images.
STATIC_DIR(empty)If set, serves the built frontend (set in Docker image).

Deploy on a VM

Point your domain's DNS A record at the VM's public IP, and open ports 80 and 443 in the firewall / cloud security group. Then:

cp .env.example .env # edit APP_USERS, APP_SECRET, DOMAIN, ACME_EMAIL
docker compose up -d --build

Caddy fetches a Let's Encrypt certificate on first start and redirects HTTP→HTTPS, so the app is served on https://<domain>. The Go app itself is not exposed to the host — only Caddy faces the internet.

Port 80 must stay reachable from the internet: Let's Encrypt uses it to validate the domain and to renew the cert automatically.

Data (DB + uploads) persists in the reno_data Docker volume; TLS certs live in caddy_data. Back up by copying those volumes.

Local development

Backend:

cd backend
APP_USERS="me:Me" APP_SECRET=dev go run .# API on http://localhost:8080

Frontend (proxies /api to the backend — added in the next step):

cd frontend
npm install
npm run dev

API overview

MethodPathPurpose
POST/api/loginLog in with a username
POST/api/logoutLog out
GET/api/meCurrent user
GET/api/usersList users (for assignees)
POST/api/users/avatarUpload own avatar (multipart image)
GET/api/projectsList projects (with task counts)
POST/api/projectsCreate a project
GET/api/projects/{id}Get a project
GET/api/projects/{id}/tasksList tasks (?status=, ?tag=)
POST/api/projects/{id}/tasksCreate a task
GET/api/tasks/{id}Task + full log
PATCH/api/tasks/{id}Update fields (auto-logs changes)
POST/api/tasks/{id}/logAdd a note (multipart text/image)
GET/api/tagsDistinct tags
GET/api/calendarDaily rollup (?from=&to=&tag=)
GET/api/calendar/day/{date}Day report events (?tag=)
GET/api/uploads/{file}Serve an uploaded image

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages