- JavaScript 64.8%
- Python 33.9%
- HTML 0.7%
- CSS 0.6%
Les vrais documents légaux (server/legal/{cgu.txt, Confidentiality.txt,
imprint.txt}) portent des données personnelles et ne sont plus versionnés
(gitignore server/legal/*.txt). Seuls les gabarits *.txt.example (champs ⟨…⟩)
sont suivis ; copier + remplir par déploiement. Sans les fichiers réels, Full
retombe sur Personnel.
Tests Full rendus indépendants des fichiers réels via un LEGAL_DIR temporaire
(full_legal_dir()) — suite verte même sans les .txt.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
||
|---|---|---|
| client | ||
| server | ||
| .gitignore | ||
| CLAUDE.md | ||
| README.md | ||
JobTrack
Local-first job-application tracker.
- /client — Mithril.js front-end with an Orbit.js data layer (offline store + sync).
- /server — Django + Django REST Framework back-end serving a JSON:API under
/api/v1/.
The app works fully offline; when a logged-in account has sync enabled (admin-controlled flag), the client synchronises its local Orbit store with the server in the background.
Requirements
- Python ≥ 3.12 and uv (server)
- Node.js ≥ 20 and npm (client)
Run the server
cd server
uv sync # create the venv and install dependencies
uv run python manage.py migrate
uv run python manage.py createsuperuser # for the /jtadmin admin
uv run python manage.py runserver # http://127.0.0.1:8000
- API:
http://127.0.0.1:8000/api/v1/ - Admin:
http://127.0.0.1:8000/jtadmin/
Run the client
cd client
npm install
npm run dev # http://localhost:5173
The client expects the API at http://127.0.0.1:8000 (configurable in
client/src/config.js once the sync layer lands). Client and server run on
different origins; CORS is configured server-side for the Vite dev origin.
Data model
Both sides define the same entities — Company, Contact, Application, Note — with:
- client-generated UUID4 primary keys (records are created offline),
created_at/updated_attimestamps,- soft delete via a
deleted_attombstone (deletions must propagate across devices).
The application stage (À postuler / Envoyé / Entretien / Réponse / Clôturé) is a fixed enumeration shared by client and server rather than a table: the design fixes the five stages, and per-user stage rows would need seed records whose IDs conflict across offline devices.
Account erasure (DELETE /api/v1/me) is a hard delete, distinct from the
per-record soft delete used for sync.