[Epic] Applications #129

Open
opened 2026-06-19 13:21:33 +00:00 by james · 0 comments
Owner

Track applications to positions: the posting itself, supporting documents, the running history of where things stand, and (eventually) a tailored résumé generated from the user's career data.

By the end of this epic:

  • Applications have full CRUD UIs and API routes backed by the DB abstraction, with fields for company, position name, posting link, posting body, and status.
  • Each application carries a status from a fixed set: Open, Started, Submitted, Interviewing, Accepted, Rejected, Closed.
  • A user can upload, download, and delete documents associated with an application (résumés sent, cover letters, supporting material, offer letters, correspondence).
  • A user can add timestamped status updates to an application — each with a date and a notes body — and view them as a chronological timeline.
  • Every entity (Application, Document, StatusUpdate) is scoped to its owning user via a user_id FK; users only see and modify their own data. Cross-user reads return 404.

Linked tickets

  • Application core (entity, API, CRUD UI, status enum)
  • Application documents (upload / download / delete via lib/storage)
  • Application status updates (dated notes, timeline UI)
  • (deferred) Generate résumé tailored to an application

Cross-epic dependencies

  • Document storage uses the per-user-scoped lib/storage interface from ADR-0018 — same primitive the Profile picture upload uses today.
  • The deferred résumé-generation ticket depends on Career data (#4) being populated; it can stay parked until that epic closes.

Exit criteria

  • A user can create an application, set or change its status, upload and download documents, and add status updates from the PWA; data round-trips correctly on both SQLite and Postgres.
  • A second user signing in on the same instance sees none of the first user's applications, documents, or status updates, and a direct ID lookup across users returns 404.
  • Adding Applications scope is reflected in idea.md so the source of truth and the tickets agree.
Track applications to positions: the posting itself, supporting documents, the running history of where things stand, and (eventually) a tailored résumé generated from the user's career data. By the end of this epic: - Applications have full CRUD UIs and API routes backed by the DB abstraction, with fields for company, position name, posting link, posting body, and status. - Each application carries a status from a fixed set: **Open, Started, Submitted, Interviewing, Accepted, Rejected, Closed**. - A user can upload, download, and delete documents associated with an application (résumés sent, cover letters, supporting material, offer letters, correspondence). - A user can add timestamped status updates to an application — each with a date and a notes body — and view them as a chronological timeline. - **Every entity (Application, Document, StatusUpdate) is scoped to its owning user via a `user_id` FK; users only see and modify their own data.** Cross-user reads return 404. ## Linked tickets - Application core (entity, API, CRUD UI, status enum) - Application documents (upload / download / delete via `lib/storage`) - Application status updates (dated notes, timeline UI) - *(deferred)* Generate résumé tailored to an application ## Cross-epic dependencies - Document storage uses the per-user-scoped `lib/storage` interface from ADR-0018 — same primitive the Profile picture upload uses today. - The deferred résumé-generation ticket depends on Career data (#4) being populated; it can stay parked until that epic closes. ## Exit criteria - A user can create an application, set or change its status, upload and download documents, and add status updates from the PWA; data round-trips correctly on both SQLite and Postgres. - A second user signing in on the same instance sees none of the first user's applications, documents, or status updates, and a direct ID lookup across users returns 404. - Adding Applications scope is reflected in `idea.md` so the source of truth and the tickets agree.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
james/carol#129
No description provided.