MVP Specification

Last updated: 2026-04-02

1. Product summary

Build a self-contained Phoenix application for publishing static artifacts under stable URLs.

Supported artifact types in MVP:

The product should optimize for fast, pleasant publishing UX for Martin and Otto.

2. MVP goals

Must achieve

Explicit non-goals

3. Primary personas

Martin (human operator)

Needs:

Otto (API operator)

Needs:

4. URL and routing behavior

Public routes

Stability guarantees

5. Publication model

Each publication contains:

Attachments

Each publication may have 0..n attachments:

6. Auth behavior

Publication access

Each publication is either:

Protected default behavior

When a protected publication is created without explicit credentials:

Credential storage

To satisfy both UX and security requirements:

7. Content rendering behavior

HTML entrypoint

Markdown entrypoint

8. API surface (MVP)

API should be sufficient for Otto to publish artifacts without UI.

Required operations

  1. Create or overwrite publication
  2. Upload/replace entrypoint body
  3. Upload/replace attachments
  4. Set auth mode
  5. Generate password automatically or accept manual password
  6. Archive/unarchive publication
  7. List publications
  8. Fetch publication metadata including revealable credentials (admin-authenticated)

Recommended endpoint shape

Actual endpoint naming can be adjusted during implementation.

9. Admin UI (MVP)

Authentication

Required pages

Required actions

10. Index pages

/

Shows non-archived publications with at least:

/archive

Shows archived publications grouped by publication month. Individual item links should still point to the same /:slug route.

11. View counter

MVP metric:

No need for:

12. Constraints

13. Acceptance criteria

MVP is successful if Otto can:

  1. call the API with title + slug + HTML/Markdown body + attachments
  2. request protected mode with generated password
  3. receive URL + credentials
  4. immediately access the artifact via stable URL
  5. later update the same slug without redeploying the application
  6. archive it without breaking the URL

And Martin can:

  1. log into admin UI
  2. see current and archived publications
  3. reveal or regenerate per-publication credentials
  4. manually edit/archive/unarchive when needed