Commit Graph

24 Commits

Author SHA1 Message Date
7b1a85bc84 feat: full UI overhaul — dark theme with custom design system
All checks were successful
Deploy / deploy (push) Successful in 39s
Replace Pico CSS with a custom dark design system:
- Deep navy background (#090b12) with violet-indigo accent (#7b6cf5)
- Outfit font for UI, JetBrains Mono for code/URLs
- Custom nav with SVG icons and active-state highlighting
- Pill badges with colored status dots
- Uppercase letter-spaced table headers
- Stat cards on replica detail page
- h3 section headings with extending rule line
- Refined dialog/modal styling with blur backdrop
- Terminal-style SSE log stream
- Progress bar with accent gradient animation
- Page entrance fade-in animation
- All Pico CSS variable references replaced with custom tokens

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 22:52:42 +01:00
CI
849c047f2c chore: bump version to 0.1.11 [skip ci] 2026-03-26 20:18:35 +00:00
12e0e7d202 feat: show tag counts alongside doc counts on dashboard
All checks were successful
Deploy / deploy (push) Successful in 21s
Fetch /api/tags/ in parallel with /api/documents/ for each instance.
Dashboard now displays "X docs, Y tags" per master/replica.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 21:18:25 +01:00
CI
874f1dce0d chore: bump version to 0.1.10 [skip ci] 2026-03-25 21:44:32 +00:00
86644abf07 fix: tojson filter must return Markup to avoid HTML-escaping quotes
All checks were successful
Deploy / deploy (push) Successful in 15s
Jinja2 autoescaping turns " into &quot; after filters run unless
the filter returns a Markup (safe) object. json.dumps alone produced
broken JS (const REPLICA_NAME = &quot;name&quot;;).
Wrap json.dumps output in markupsafe.Markup to prevent escaping.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 22:44:23 +01:00
CI
0fd0464fb5 chore: bump version to 0.1.9 [skip ci] 2026-03-25 21:36:32 +00:00
f76aba0f48 fix: update TemplateResponse to Starlette 0.41 signature
All checks were successful
Deploy / deploy (push) Successful in 16s
Starlette 0.41.x removed the old TemplateResponse(name, context) API.
Switch to the new TemplateResponse(request, name, context) signature,
which is the only supported form in Starlette >= 0.41.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 22:36:24 +01:00
CI
907696cb03 chore: bump version to 0.1.8 [skip ci] 2026-03-25 21:04:38 +00:00
15599b9f01 fix: add tojson Jinja2 filter to fix 500 on replica detail page
All checks were successful
Deploy / deploy (push) Successful in 17s
FastAPI's Jinja2Templates doesn't include Flask's tojson filter.
Register json.dumps as the tojson filter so replica_detail.html
can safely embed replica.name in a JS string literal.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 22:04:31 +01:00
CI
dd051e0f92 chore: bump version to 0.1.7 [skip ci] 2026-03-25 20:17:10 +00:00
cdc9407ff3 Implement master promotion feature
All checks were successful
Deploy / deploy (push) Successful in 33s
Allows promoting any replica to master with zero document re-downloads.
The sync_map rebuild uses existing DB data only — pure in-memory join.

Changes:
- app/sync/promote.py: preflight() checks (doc count, sync lock, ack
  warnings) and promote() transaction (pause scheduler, rebuild all
  sync_maps, create old-master replica, swap settings, resume scheduler)
- app/api/master.py: GET /api/master/promote/{id}/preflight (dry run)
  and POST /api/master/promote/{id} (execute)
- app/models.py: add promoted_from_master bool field to Replica
- app/database.py: idempotent ALTER TABLE migration for new column
- app/main.py: register master router
- app/templates/replica_detail.html: "Promote to Master" button +
  dialog with pre-flight summary, 3-card stats, ack checkboxes, spinner
- app/ui/routes.py: flash query param on dashboard route
- app/templates/dashboard.html: blue info banner for post-promotion flash

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 21:17:01 +01:00
CI
f29a451e55 chore: bump version to 0.1.6 [skip ci] 2026-03-23 09:11:07 +00:00
eee4d11f44 Redesign replicas page with professional B2B layout
All checks were successful
Deploy / deploy (push) Successful in 14s
- Two-column layout: add form (left) + prerequisites guide (right)
- Help sidebar with numbered checklist: reachability, API token, interval
- Callout for existing-instance reconcile workflow
- "What gets synced" info card with primary-color accent border
- Form fields with helper text under each input
- Spinner/busy state on submit buttons during API calls
- Clean status badges replacing emoji in replica table
- Better modal footer layout for edit dialog

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 10:11:00 +01:00
CI
9c95f566b2 chore: bump version to 0.1.5 [skip ci] 2026-03-22 20:44:44 +00:00
e660808640 Add reset-ts endpoint to reset last_sync_ts without clearing sync_map
All checks were successful
Deploy / deploy (push) Successful in 14s
Needed to safely recover missing docs: run reconcile first (populates
sync_map for existing docs), then reset-ts, then sync (only missing
docs get uploaded, existing ones get metadata patch only).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 21:44:37 +01:00
CI
098c1e633b chore: bump version to 0.1.4 [skip ci] 2026-03-22 19:10:19 +00:00
cbcf88ca96 fix: resync clears last_sync_ts; add live doc counts to dashboard
All checks were successful
Deploy / deploy (push) Successful in 14s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 20:10:12 +01:00
CI
3e9889ede0 chore: bump version to 0.1.3 [skip ci] 2026-03-22 19:01:41 +00:00
c87bc6a954 fix: httpx 0.28 AsyncClient multipart compat — pass all fields via files= list
All checks were successful
Deploy / deploy (push) Successful in 15s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 20:01:34 +01:00
CI
26a00d3e26 chore: bump version to 0.1.2 [skip ci] 2026-03-22 17:11:40 +00:00
e5c8a27ccf feat: switch to Tailscale sidecar + Traefik/Authentik via pngx.domverse-berlin.eu
All checks were successful
Deploy / deploy (push) Successful in 11s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 18:11:33 +01:00
CI
01fadb7412 chore: bump version to 0.1.1 [skip ci] 2026-03-22 16:59:37 +00:00
b99dbf694d feat: implement pngx-controller with Gitea CI/CD deployment
All checks were successful
Deploy / deploy (push) Successful in 30s
- Full FastAPI sync engine: master→replica document sync via paperless REST API
- Web UI: dashboard, replicas, logs, settings (Jinja2 + HTMX + Pico CSS)
- APScheduler background sync, SSE live log stream, Prometheus metrics
- Fernet encryption for API tokens at rest
- pngx.env credential file: written on save, pre-fills forms on load
- Dockerfile with layer-cached uv build, Python healthcheck
- docker-compose with host networking for Tailscale access
- Gitea Actions workflow: version bump, secret injection, docker compose deploy

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 17:59:25 +01:00
942482daab first commit 2026-03-20 18:37:36 +01:00