Files
nas-tools/CLAUDE.md
T

2.6 KiB

NAS Tools Project

PDD Workflow

This project follows PDD (Product Definition Document) development.

Always read these files before writing code:

  • docs/PDD.md — product vision, goals, targets (the north star)
  • docs/specs/active.md — current sprint spec (what we're building now)

Workflow:

  1. PDD → Sprint Spec → Implementation → Validate ACs
  2. Scope changes update the sprint spec first, code second
  3. Never ship without ACs passing

Dev Commands

  • Build dashboard: cd dashboard/frontend && npm run build
  • Dev dashboard: cd dashboard/backend && uvicorn main:app --reload + cd dashboard/frontend && npm run dev
  • Test: cd dashboard && python -m pytest backend/tests/
  • Deploy: Push to main → Gitea CI builds + deploys to NAS

Architecture

  • Synology DS224+ (x86_64, 18GB RAM), Tailscale IP: 100.78.131.124, LAN: 192.168.31.221
  • Docker: /volume1/@appstore/ContainerManager/usr/bin/docker, compose dirs: /volume1/docker/*
  • VPS Caddy (161.33.182.109, Tailscale: 100.109.198.126): reverse proxy for *.jimmygan.com
  • Build VPS (server2, 158.101.140.85, Tailscale: 100.70.115.1): podman builds
  • NAS Caddy: port 8443 fallback only (SNI broken)

Dashboard

  • Backend: Python FastAPI (dashboard/backend/)
  • Frontend: Svelte 5 + Tailwind CSS (dashboard/frontend/)
  • Svelte 5 runes: $state, $props, $bindable (not export let)
  • New pages: create route in src/routes/, import in App.svelte, update Sidebar.svelte

CI/CD

Two Gitea workflows in .gitea/workflows/:

  • deploy.yml — main branch: tests → build → deploy to production
  • deploy-dev.yml — dev branch: tests → build → deploy to dev

Build flow: VPS builds → pushes to local registry (100.78.131.124:5501/) → streams to NAS → docker compose up -d

Key Files

  • docs/architecture.md — full architecture reference
  • docs/TESTING.md — test patterns and conventions
  • specs/ — sprint history
  • .gitea/workflows/deploy.yml — main CI
  • .gitea/workflows/deploy-dev.yml — dev CI
  • dashboard/backend/main.py — FastAPI entry point
  • dashboard/frontend/src/App.svelte — Svelte entry point

Synology Quirks

  • No crontab — edit /etc/crontab with sudo + printf, restart crond
  • No scp subsystem — use cat file | ssh ... 'cat > dest'
  • ACLs override Unix perms — use sudo chmod 777 + synoacltool -enforce-inherit
  • Tailscale userspace mode — cannot bind Docker ports to Tailscale IPs

DNS

  • dnsmasq on NAS resolves *.jimmygan.com161.33.182.109 (Caddy VPS)
  • Tailscale split DNS: jimmygan.com → NAS (queries hit dnsmasq)