This repository is a static web dashboard plus a small FastAPI backend. It hosts the Forest HUB landing page, several self-contained mini-projects under web/, and API-backed tools such as the movie library and the LLM docs database.
The repo is not a packaged frontend app with a build step. Most pages are plain HTML, CSS, and JavaScript. The backend is Python + FastAPI + SQLite.
index.htmlForest HUB landing page and project card grid.web/prompt-builder/Stable Diffusion prompt builder with optional AUTOMATIC1111 integration.web/a1111-debug/andweb/debug-a1111/Local debug harnesses for AUTOMATIC1111 + ControlNet.web/kids-movie-library/Static Kids Movie Library built fromkidsMoviesReport.md, with local watch flags and ratings.movies/index.htmlRedirect shim to/web/kids-movie-library/.web/mendeleev-bg/Interactive Bulgarian periodic table copied fromivangegovdve-sudo/mendeleev-bg.web/math-mania/Forest HUB subpage embedding the live Lovable Math Mania app.web/math-forest/Reserved route for the Math Forest rebuild; original app currently appears unavailable.web/llm-db/LLM Platforms DB UI.web/ai-init/AI/IT glossary app plus embeddable search.web/calendar/Printable calendar generator adapted from CalendarGenerator, with local saved settings and holiday lookup.calendar/index.htmlRedirect shim to/web/calendar/.web/shared-calendar/Local-only shared calendar.web/dice/Static 3D dice roller.frontend/index.htmlStandalone Runware item-icon generator demo.voice-project-dashboard/apps/mobile/Expo-based Voice Project Dashboard source deployed separately to Vercel.backend/FastAPI app, movies API, jobs API, LLM DB API, SQLite helpers, and tests.data/SQLite database, migrations, preset JSON, and curated inventory data.
There are two runtime layers:
- Static pages Served from the repo root with any static file server.
- FastAPI
Serves
/api/movies,/api/llm-db,/jobs,/health,/api/schema, and/api/item-icon.
Important local-dev detail:
web/kids-movie-library/is static and stores family watch/rating state in localStorage.web/llm-db/currently assumes same-origin requests to/api/llm-db.backend/app.pyonly allows browser CORS fromhttp://localhost:8080andhttp://127.0.0.1:8080.
Because of that, split-server mode works for most pages, but a truly "everything works" local setup needs either:
- same-origin serving for static files and FastAPI, or
- a code change to make
web/llm-db/use a configurable API base.
PowerShell:
python -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install fastapi uvicorn pydantic pytest httpxNotes:
- This repo does not currently ship a locked
requirements.txtorpyproject.toml. - The backend uses the standard library for SQLite and URL fetching.
pytestandhttpxare needed for the existing backend tests.
python -m uvicorn backend.app:app --reload --port 8000The backend auto-applies migrations in data/migrations/ and initializes data/movies.db.
In a second terminal from the repo root:
python -m http.server 8080Open:
- Hub:
http://127.0.0.1:8080/index.html - Calendar Generator:
http://127.0.0.1:8080/calendar/ - Movies:
http://127.0.0.1:8080/movies/ - Prompt Builder:
http://127.0.0.1:8080/web/prompt-builder/ - AI_INIT:
http://127.0.0.1:8080/web/ai-init/
Do not use file:// for these pages. Several tools rely on fetch, clipboard, localStorage, or CORS and need a real local server.
Use this when you want quick local iteration:
- static files on
http://127.0.0.1:8080 - FastAPI on
http://127.0.0.1:8000
This is the expected mode for:
- hub
- AI_INIT
- shared calendar
- dice
- prompt builder static features
- A1111 debug pages
- movies
- frontend item-icon demo
- voice-project-dashboard source app
Use this when you want the entire dashboard to be fully functional behind one origin.
Recommended approach for future work:
- serve
index.html,movies/,web/**,frontend/**,data/**, and/api/**from the same origin, preferablyhttp://127.0.0.1:8000
This is the cleanest path for:
web/llm-db/, which currently hardcodesconst API_BASE = '/api/llm-db'
If you keep split mode, make web/llm-db/ configurable before calling the dashboard fully functional.
- Route:
/index.html - Files:
index.html - Runtime: static only
- Done when:
- every visible in-repo tile opens a working destination
- no dead production links remain as
href="#" - titles, status text, and routes match the real project state
- Route:
/web/prompt-builder/ - Files:
web/prompt-builder/index.html - Runtime: static only for prompt composition, optional A1111 for generation
- Reads:
data/presets/newPresets.jsondata/sd_inventory_curated.json(optional enhancement)
- External dependency for generation:
- AUTOMATIC1111 WebUI with API enabled, usually
http://127.0.0.1:7860
- AUTOMATIC1111 WebUI with API enabled, usually
- Expected A1111 startup flags:
--api- CORS enabled for your local page origin if needed
- Done when:
- presets load if the JSON file exists
- manual mode still works if preset files fail to load
- A1111 health/model checks work when the local SD server is available
- txt2img or img2img requests succeed when configured
- Routes:
/web/a1111-debug/index.html/web/debug-a1111/index.html
- Runtime: static only, requires external A1111 API to do useful work
- Default external API base:
http://127.0.0.1:7860
- Done when:
- model listing works
- ControlNet detect works with an uploaded image
- txt2img or img2img test requests return an image
- failures show useful debug output instead of silent breakage
- Routes:
/movies//web/kids-movie-library/
- Files:
web/kids-movie-library/index.htmlweb/kids-movie-library/app.jsweb/kids-movie-library/styles.css
- Runtime:
- static only
- Source:
D:\projects\ivan-websites\kidsMoviesReport.md
- Data:
- 15 curated recommendations from the report
- 9 already-watched exclusions from the report
- family watch/rating state stored in localStorage
- Done when:
- search works
- theme, tag, Bulgarian audio, status, and sort filters work
- watched toggle persists
- family ratings persist
- Route:
/web/mendeleev-bg/
- Source repo:
ivangegovdve-sudo/mendeleev-bg
- Files:
web/mendeleev-bg/index.html
- Runtime:
- static only
- Done when:
- periodic table opens from Forest HUB
- element popups work
- compound highlighting works
- Bulgarian text renders correctly
- Route:
/web/math-mania/
- Current state:
- live Lovable app embedded from
https://forest-math-plus.lovable.app
- live Lovable app embedded from
- Runtime:
- static page with iframe
- Done when:
- embedded app loads from Forest HUB route
- full-screen link opens Lovable app
- Route:
/web/math-forest/
- Current state:
- rebuild route exists
- user confirmed original Forest Math appears gone
- Runtime:
- static rebuild placeholder today
- expected playable game/app after rebuild
- Done when:
- working playable Math Forest app loads from this route
- Forest HUB card no longer says rebuild
- Route:
/web/llm-db/index.html - Files:
web/llm-db/index.htmlbackend/llm_db/api.pybackend/llm_db/db.py
- Runtime:
- FastAPI required
- currently expects same-origin
/api/llm-db
- Database tables:
- stored in
data/movies.dbvia migration003_llm_docs.sql
- stored in
- Ingestion behavior:
- fetches remote
httpandhttpscontent only - blocks local/private IP targets and unsafe redirects
- fetches remote
- Done when:
- source ingest works
- source list loads
- document search works
- document detail expansion works
- unsafe URLs remain blocked
- Important:
- if served from
8080while API stays on8000, this page is not fully wired yet
- if served from
- Routes:
/web/ai-init//web/ai-init/embed/
- Files:
web/ai-init/index.htmlweb/ai-init/app.jsweb/ai-init/glossary-search.jsweb/ai-init/glossary-data.jsweb/ai-init/embed/index.htmlweb/ai-init/embed/embed.js
- Runtime: static only
- Done when:
- home search returns ranked results
- library view opens and browses categories
- clicking entries copies
ABBR - Expansion - embed view works as a lightweight search surface
- Routes:
/calendar//web/calendar/
- Files:
web/calendar/index.htmlweb/calendar/app.jsweb/calendar/styles.cssweb/calendar/assets/pics/web/calendar/NOTICE.md
- Runtime: static only
- External dependency:
- public holiday lookup from
https://kayaposoft.com/enrico/json/v1.0/
- public holiday lookup from
- Behavior:
- stores settings in localStorage
- supports local sample images or remote image URLs
- remains printable even if the holiday API is unavailable
- Attribution:
- adapted from
CalendarGeneratorby Franco Mossotto under Apache 2.0
- adapted from
- Route:
/web/shared-calendar/ - Files:
web/shared-calendar/index.html - Runtime: static only
- Storage:
- localStorage key
sharedCalendarActivities
- localStorage key
- Done when:
- add/edit/delete works
- drag and drop between days works
- data persists across reloads
- Route:
/web/dice/ - Files:
web/dice/index.html - Runtime: static only
- Done when:
- roll controls work
- D6 and D12 visuals animate correctly
- layout works on desktop and mobile
- Hub entry:
- external card in
index.html
- external card in
- Source:
voice-project-dashboard/apps/mobile/
- Runtime:
- Expo web app, deployed separately to Vercel
- local edits persist in browser storage
- Local commands:
cd voice-project-dashboard/apps/mobile
npm ci
npm run web- Build command:
cd voice-project-dashboard/apps/mobile
npm run build:web- Done when:
- search and stage filters work
- task and deliverable toggles update project progress
- producer notes persist after reload
- the live Vercel deployment opens from the Forest HUB card
- Route:
- standalone page at
frontend/index.html
- standalone page at
- Files:
frontend/index.htmlbackend/app.pyconfig/runware-item-icons.json
- Runtime:
- static page
- FastAPI on
8000 RUNWARE_API_KEYmust be set
- Env:
$env:RUNWARE_API_KEY="your-key"
python -m uvicorn backend.app:app --reload --port 8000- API endpoint:
POST /api/item-icon
- Done when:
- schema loads from config
- request validates
- Runware preprocess + inference return an image URL
- the UI shows the returned image
- API only right now, no dashboard page yet
- Files:
backend/jobs_api.py
- Routes:
POST /jobs/intakeGET /jobsGET /jobs/topGET /jobs/{job_id}POST /jobs/{job_id}/statusDELETE /jobs/{job_id}
- If you build a UI for this, add it as a real mini-project under
web/<slug>/and link it from the hub
The current hub also contains:
VFX Portfolioexternal linkClip Martexternal GitHub linkRetail AIplaceholder card right nowPython Learning Orchestratedplaceholder card right now
Do not call the hub complete while placeholder cards still point to #. Either:
- replace them with real working pages in this repo, or
- keep them explicitly labeled as placeholders and do not represent them as functional
- Backend app:
backend/app.py - Movies API:
backend/movies_api.py - LLM DB API:
backend/llm_db/api.py - Movie DB helpers:
backend/movies_db.py - Prompt Builder presets:
data/presets/newPresets.json - Curated SD inventory:
data/sd_inventory_curated.json - Runware config:
config/runware-item-icons.json
pytest backend/testsStatic checks:
node scratch/tests/lint-glossary.js
node --test scratch/tests/glossary-search.test.jsOptional Playwright smoke test:
cd scratch/tests
npm install
npx playwright install
cd ../..
node scratch/tests/glossary-e2e.mjsweb/llm-db/is same-origin only right now.index.htmlstill contains placeholder cards.frontend/index.htmlis functional as a standalone page but is not linked from the main hub.- There is no locked Python dependency file yet.
If the goal is "make the whole site functional," the first high-value task is to unify static + API serving or make every API-backed page configurable enough to work in split mode.
A sanitized example script is available at scratch/composio_email_manager_example.py.
Set these environment variables before running it:
COMPOSIO_API_KEYCOMPOSIO_EXTERNAL_USER_IDCOMPOSIO_TEST_RECIPIENT
Run:
python scratch/composio_email_manager_example.py