Initial scaffold: Flask/SQLite backend, React/Vite PWA frontend

Backend: receipt upload -> LLM vision extraction (OpenAI-compatible,
provider-agnostic), item review/edit, per-group splitting against
Cospend projects/members, highlight+upload via WebDAV, public share
link, bill creation via Cospend's OCS API (verified against real
source, not just doc summaries).

Frontend: capture -> review -> group -> summary flow as an installable
PWA.

install.sh / run.sh (venv + npm, tmux session) instead of Docker, per
the ~/Projects/gain pattern.
This commit is contained in:
2026-08-30 15:02:18 +02:00
commit d97aac0e17
42 changed files with 8274 additions and 0 deletions
+31
View File
@@ -0,0 +1,31 @@
# Copy to .env and fill in. Never commit .env.
# --- Nextcloud ---
NC_BASE_URL=https://cloud.dominik-roth.eu
NC_USERNAME=dodox
# Settings -> Security -> "Devices & Sessions" -> create app password
NC_APP_PASSWORD=
# Folder (relative to the user's files root) receipt images get uploaded to.
# Created automatically on first upload if missing (each path segment).
NC_UPLOAD_FOLDER=Documents/Cospend/Assets
# --- Cospend ---
# Optional: pre-selects a project in the UI. The app lists all your Cospend
# projects via the API (GET /ocs/v2.php/apps/cospend/api/v1/projects), so
# this is just a convenience default, not required.
COSPEND_PROJECT_ID=
# --- Vision LLM (OpenAI-compatible chat completions API) ---
# OpenAI example:
# LLM_BASE_URL=https://api.openai.com/v1
# LLM_MODEL=gpt-4o-mini
# Gemini (OpenAI-compat layer) example:
# LLM_BASE_URL=https://generativelanguage.googleapis.com/v1beta/openai/
# LLM_MODEL=gemini-2.0-flash
LLM_BASE_URL=
LLM_API_KEY=
LLM_MODEL=
# --- Flask ---
FLASK_SECRET_KEY=dev-change-me
DATABASE_PATH=instance/wgbill.sqlite3