Admin – ihaveanidea

Gallery

Site (legacy category)

Idea type: 610d89a5-24cb-5043-a01f-02076dd4399e

81f45569-1628-48f4-97a2-2d461e37b8fc · Owner: mark@mark-christensen.com · Created · Updated

Tags: File management Human Amplifiers service Media

← Back to Ideas

Elements

Optional content — concept, plan, task list, release notes, freeform notes, attachments. Add or edit any of these in any order.

Type Title Pos Content Created Updated
concept 0 165e0e5e-e13b-4b06-bf4a-1ab248ded797
Body (498 bytes)
{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"This already exists in an earlier form as Photo Gallery. That was intended to be a very efficient, prerendered site and didnt focus much on the creation side. This made it hard to use and so I lost interest. This updated version should achieve both prerendering for easy viewing as well as good UX for adding content. It also needs to improve upon the video delivery side because the old version was really laggy."}]}]}
task_list Deploy new version Chore 0 fe6ce6d7-1a88-4429-9723-5ffefe83ae03
Data
{"done":true,"release_id":"5ce7abfa-1081-4090-b4ca-1ddf0066dd5b","task_type_id":"7a52c188-6cda-58d0-9872-9aafb05b81ce"}
task_list Test new version Chore 0 3a70d33a-9101-478e-befc-8c98fa61a5f6
Data
{"done":true,"release_id":"5ce7abfa-1081-4090-b4ca-1ddf0066dd5b","task_type_id":"7a52c188-6cda-58d0-9872-9aafb05b81ce"}
task_list Add proper design system Chore 0 ace62a78-a4da-4e6d-a98f-0cee8bcea786
Data
{"done":true,"release_id":"5ce7abfa-1081-4090-b4ca-1ddf0066dd5b","task_type_id":"7a52c188-6cda-58d0-9872-9aafb05b81ce"}
task_list Improve UX Chore 0 53f69e85-7f6d-4265-9bb1-22740be9dbda
Data
{"done":true,"release_id":"5ce7abfa-1081-4090-b4ca-1ddf0066dd5b","task_type_id":"7a52c188-6cda-58d0-9872-9aafb05b81ce"}
task_list Can't drag to reorder on mobile Bug 0 97a85dc8-8c38-451d-8cc7-edc3a5fe0167
Data
{"done":true,"release_id":"a9bb68fd-629c-4832-9030-a99011bd9347","task_type_id":"818ca193-82c3-5d3d-8976-2b0b8359226f"}
release 3.0 0 a9bb68fd-629c-4832-9030-a99011bd9347
Body (123 bytes)
{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Multi-user support and admin controls "}]}]}
Data
{"released":true}
plan Multi-user support 0 a42e1386-98af-4a98-b1c1-004fd6cb5201
Data
{"complete":true,"items":[{"children":[],"done":true,"id":"ef7bb1cf-8bd5-4376-82f2-755d62daeb23","ref":{"element_id":"a9bb68fd-629c-4832-9030-a99011bd9347","kind":"release"},"text":"3.0"}],"schema":2.0}
task_list Multi-user support Feature 0 aaaeb095-0590-4c3c-a40c-71d9ddcb0226
Data
{"done":true,"release_id":"a9bb68fd-629c-4832-9030-a99011bd9347","task_type_id":"83776309-6f31-52b1-89ab-fce3a072eef9"}
task_list Admin console Feature 0 8240b1b8-7756-43d8-b48b-26046e0683c2
Data
{"done":true,"release_id":"a9bb68fd-629c-4832-9030-a99011bd9347","task_type_id":"83776309-6f31-52b1-89ab-fce3a072eef9"}
task_list Unbreak galleries Chore 0 c16b85a2-9bf9-4d25-b882-fa6deb33f3ba
Data
{"done":true,"task_type_id":"7a52c188-6cda-58d0-9872-9aafb05b81ce"}
task_list Add backup/restore Feature 0 1b131f76-ef0d-4f90-8715-0331fa505aca
Data
{"done":true,"release_id":"a9bb68fd-629c-4832-9030-a99011bd9347","task_type_id":"83776309-6f31-52b1-89ab-fce3a072eef9"}
release 1.0 1 121405cb-7165-4d6a-a740-fc80b3fe1899
Body (114 bytes)
{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Original build of the service"}]}]}
Data
{"released":true}
release 2.0 2 5ce7abfa-1081-4090-b4ca-1ddf0066dd5b
Body (131 bytes)
{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Modernized version.  New stack, same mission."}]}]}
Data
{"released":true}
plan Rebuild 4 547d6afe-3ebd-4f2e-bb8f-1f647b0f5f6c
Data
{"complete":true,"items":[{"children":[{"children":[],"done":true,"id":"071ebe98-cd75-4045-bb83-41f6d7e448c9","ref":{"element_id":"a8ec5a55-22f8-40f3-b58b-5d77c969df0c","kind":"note"},"text":"Modernization notes"}],"done":true,"id":"55bca9f8-25de-40fa-bb65-5f8b00f4fb61","ref":{"element_id":"5ce7abfa-1081-4090-b4ca-1ddf0066dd5b","kind":"release"},"text":"2.0"},{"children":[],"done":true,"id":"dbb17870-8a91-4215-9710-6e1591f40a42","ref":{"element_id":"121405cb-7165-4d6a-a740-fc80b3fe1899","kind":"release"},"text":"1.0"}],"schema":2.0}
note Modernization notes 4 a8ec5a55-22f8-40f3-b58b-5d77c969df0c
Body (469 bytes)
{"type":"doc","content":[{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Remove CBEN idea"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Make editor use React and live in a single app"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Maintain the HTML export/publish with embedded thumbs"}]}]}]},{"type":"paragraph"}]}
plan Media improvements 14 eee56299-6a20-4d3e-b4e3-2b00241425d2
Data
{"complete":true,"items":[{"children":[],"done":true,"id":"1adac9a3-a7b4-4617-baec-c9732cd17cb0","ref":{"element_id":"7b34dc1c-c496-4c75-8f0f-bf338cd9254f","kind":"release"},"text":"4.0"}],"schema":2.0}
release 4.0 15 7b34dc1c-c496-4c75-8f0f-bf338cd9254f
Body (91 bytes)
{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Videos"}]}]}
Data
{"released":true}
task_list Allow users to upload videos (size limited to 50MB by default but configurable) Feature 16 db9fe9a4-fc12-4349-af37-dcc57cbb45b3
Data
{"done":true,"release_id":"7b34dc1c-c496-4c75-8f0f-bf338cd9254f","task_type_id":"83776309-6f31-52b1-89ab-fce3a072eef9"}
task_list Improve Nginx config to support high quality video streaming Feature 17 b3c83ecb-7ece-46fd-a06d-84e7b5ebafee
Data
{"done":true,"release_id":"7b34dc1c-c496-4c75-8f0f-bf338cd9254f","task_type_id":"83776309-6f31-52b1-89ab-fce3a072eef9"}
task_list Add Cloudflare support for video streaming Feature 18 18ec98c8-d22a-459f-bf0b-624fb8ec61cf
Data
{"done":true,"release_id":"7b34dc1c-c496-4c75-8f0f-bf338cd9254f","task_type_id":"83776309-6f31-52b1-89ab-fce3a072eef9"}
task_list Rate limiting to public APIs - login, reset request Feature 19 bce5eb8c-465c-4167-aba8-345046d99de4
Data
{"done":true,"release_id":"a9bb68fd-629c-4832-9030-a99011bd9347","task_type_id":"83776309-6f31-52b1-89ab-fce3a072eef9"}

Shares

Granted from the desktop or Android app's Share dialog — this view is for oversight/cleanup, not for granting new shares.

Email Access Status Created Updated
Not shared with anyone.

Linked Repos (Assets)

Read-only here — repos are linked and scanned from the desktop app, then synced to this account.

Repo Remote Last Commit Scanned Details
photo_gallery_edit git@144.76.119.114:/home/git/photo_gallery_edit.git 798ca8ad Fix for processing video UX
All fields
ID: 73734ae7-eaf8-4718-9024-e5aca5a68c0a
Label: Original version
Local path: C:\Users\anonymous\projects\photo_gallery_edit
Default branch: master
Last commit author: anonymous <anonymous@anonymo.us>
Last commit at: —
AGENTS source file: —
Source device app id: desktop:38ded643-95fb-489f-969c-7871359f7c40
Created:
Updated:
README excerpt (2005 bytes)
# Photo Gallery Edit (PGE)

A small single-user tool for curating photo galleries and **publishing** them as
self-contained static HTML pages at a shareable URL, optionally password-protected.

- Upload images (auto EXIF-orient + thumbnails), give each a title and description,
  reorder by drag-and-drop.
- Publish → paginated static pages where each image is embedded as a `data:` URI
  (the page renders with zero extra requests); full-size originals load in the
  background for the click-to-enlarge lightbox.
- Per-gallery viewer passwords: any number, added/removed independently. A correct
  password grants 48 hours of access; removing a password ends the sessions that
  used it.
- Multi-user: each account owns its own galleries. Admins get a console
  (`/admin`) to invite users by email, see per-user stats, set a user's password,
  toggle admin, and deactivate accounts, plus a log of every password-reset
  request and a **Backup** tab to download / restore the SQLite database.

**Stack:** FastAPI + SQLite (backend, `backend/`) · React + Vite + TypeScript
(editor SPA, `frontend/`). One process serves the API (`/api`), the editor (`/`),
and published galleries (`/g/<slug>`). The pre-rewrite codebase is kept under
`legacy/` (git tag `v0-legacy`).

## Run it (Docker)

```sh
cp .env.example .env
# Fill in SECRET_KEY and ADMIN_EMAIL, then generate ADMIN_PASSWORD_HASH:
( cd backend && uv run python -m app.cli hash-password )   # paste the hash into .env
docker compose -f docker/compose.yaml up --build
```

Open http://localhost:9200 and log in with the credentials from `.env`
(set `BASE_URL=http://localhost:9200` in `.env` so generated links match).
Data lives in the `pge_data` Docker volume.

`ADMIN_EMAIL` / `ADMIN_PASSWORD_HASH` seed the **first** user (an admin) on the
initial database migration. After that the `users` table is authoritative and
those variables are ignored — manage accounts from the admin console or the CLI.

## User management

- **Invite a user:** ad