Page 1 of 18
System Requirements Document for purple-llm
1. Introduction
purple-llm is a website for accessing PDFs and books. Its product intent is a public reading commons: anyone can arrive, browse the available collection of PDF documents and books, and open an item to read it — without creating an account. A separate, account-holding role, the Library Owner, supplies and maintains the collection so that there is something to access.
The audience is twofold:
- Readers — people who come to find and read a PDF or a book. They need a legible, findable catalogue and a focused reading surface, not a feed of identical cards.
- Library Owners — the people who add and maintain the PDF and book items that Readers access. They need a calm, operational workspace for keeping the collection current and usable.
The product is deliberately narrow. It provides access to PDFs and books; it does not become a social platform, a storefront, a recommendation engine, or a general document-management suite.
Page 2 of 18
2. System Overview
purple-llm is delivered as a first-party web application with custom UI and application-owned identity.
Current delivery. The site serves a public, anonymously reachable collection of PDFs and books. Readers browse the Library, open an item in the Reader, and read it. Library Owners enroll themselves, verify on return, and maintain the collection through the Collection workspace and the Book Details workspace.
Actors.
- Reader (active human persona) — browses the public collection and reads PDFs and books. No account is required.
- Library Owner (active human persona) — adds and maintains the PDF and book items available on the site. Requires an account.
- Application backend (non-persona system actor) — stores the collection records and serves them to the public Library and Reader surfaces and to the authenticated Collection surfaces.
Accepted behavior. The site provides access to PDF documents and provides access to books. Readers reach the public collection and reading experience without establishing an account. Library Owners complete self-service enrollment before first managing the collection, and complete returning verification before accessing protected collection-management work.
Ownership. The public entry, the public collection, the reading surface, the identity surfaces, and the owner workspaces are all first-party application surfaces. There is no provider-owned or external-only surface in the current scope.
Narrow exclusions. No account is required for Readers to reach the public collection or the reading experience. No provisioning or invitation boundary is established for the Library Owner; enrollment is self-service. No adjacent account-management capabilities (password reset flows beyond returning verification, profile management, social features, billing, or recommendation) are part of the current scope.
Page 3 of 18
2a. Product Interpretation and Delivery Boundary
purple-llm is a reading commons with two clearly separated halves.
The public half is open. A visitor lands on the Landing surface, which explains in plain terms that this is a place to access PDFs and books, and moves into the Library, where the available PDFs and books are listed. From any item, the visitor opens the Reader and reads. None of this requires an account, and nothing in the public half is gated.
The owner half is protected. The Library Owner is the person who supplies and maintains the collection. Because the collection is durable, owner-specific state that must remain bound to the correct person, the Library Owner establishes an account once through self-service enrollment on the Sign Up surface, and verifies on return through the Login surface. Only then does the protected collection-management work — the Collection workspace and the Book Details workspace — become available.
The boundary between the two halves is exactly this: public browsing and reading are anonymous; collection management is owner-authenticated. The Landing surface is the anonymous entry point for the whole product, and it is the surface that carries the first impression. The Login and Sign Up surfaces are anonymous entry points for the owner half, because a protected destination cannot own the interaction that establishes access to itself.
Everything described here is current. No future-horizon capabilities are accepted in this document.
2b. Source Content Inventory
Not applicable. No reference directive in this project declares a content_source, so no source content inventory is produced.
Page 4 of 18
2c. Page Content and Component Coverage
Landing
- Information and state. Anonymous public entry. States the product's purpose: this website provides access to PDFs and books. Shows the live collection count in tabular numerals. Shows the current session state chip (
OPEN ACCESS for anonymous visitors, OWNER when a Library Owner session is active).
- Primary action. "Browse the library" — moves the visitor into the Library.
- Supporting actions. "Sign in" — moves a returning Library Owner to Login. "Create an owner account" — moves a new Library Owner to Sign Up.
- Domain entities. Collection (count only), Session state.
- Component responsibilities. Standing header with wordmark, section label in caps, and right-aligned state chip. Full-bleed hero field with the headline, a gold rule running edge to edge, a vermilion index number pinned at the left margin, a single ruled row carrying the collection count and the primary button, and a stacked diagram of three typographic book covers. Numbered left-rail wayfinding (01 Library, 02 Reading, 03 Collection) on desktop, collapsing to a numbered sticky tab strip on mobile.
- States. Loading: hero renders immediately with the headline and rule; the collection count shows a muted placeholder until resolved. Empty: when the collection count is zero, the ruled row reads that the collection is empty and the primary button remains available so the visitor can still reach the Library. Success: count resolves in tabular numerals. Error: if the count cannot be resolved, the ruled row shows a muted unavailable state and the primary button still works. Recovery: the count retries on next visit; no visitor action is required.
Login
- Information and state. Anonymous identity-access surface for returning Library Owners. Explains that signing in is for managing the collection.
- Primary action. Submit credentials to verify identity and continue to the protected owner workspace.
- Supporting actions. "Create an owner account" — moves to Sign Up. "Back to the library" — returns to the public Library.
- Domain entities. Library Owner account, Session.
- Component responsibilities. Standing header with wordmark,
SIGN IN micro-label, and state chip. Credential form with labeled fields and a rectangular submit button. Inline error region.
- States. Loading: submit button shows a pending state and the form is not double-submittable. Empty: fields start empty with labels visible. Success: session established; the Library Owner continues to the Collection workspace. Error: incorrect credentials show an inline message that does not reveal which field was wrong; the form retains the entered identifier so the Library Owner can correct the password. Recovery: the Library Owner retries in place, or moves to Sign Up if no account exists.
Sign Up
- Information and state. Anonymous identity-access surface for first-use enrollment of a Library Owner. Explains that an account is needed to add and manage PDFs and books.
- Primary action. Submit enrollment details to create the Library Owner account and establish the session.
- Supporting actions. "Sign in instead" — moves to Login. "Back to the library" — returns to the public Library.
- Domain entities. Library Owner account, Session.
- Component responsibilities. Standing header with wordmark,
ENROLL micro-label, and state chip. Enrollment form with labeled fields and a rectangular submit button. Inline validation and error region.
- States. Loading: submit button shows a pending state and the form is not double-submittable. Empty: fields start empty with labels visible. Success: account created and session established; the Library Owner continues to the Collection workspace. Error: validation failures are shown inline against the offending field; a duplicate-account failure is shown as a single message with a link to Login. Recovery: the Library Owner corrects the field and resubmits, or moves to Login.
Page 5 of 18
Library
- Information and state. Anonymous public collection. Lists the available PDFs and books as dense ruled catalogue rows with tabular numerals and a colour-coded format rule on the left edge. Shows each item's title, format, and available metadata. Shows the current session state chip.
- Primary action. Select an item to open it in the Reader.
- Supporting actions. Filter or narrow the listing by format. Move to the Landing surface. For an authenticated Library Owner, move to the Collection workspace.
- Domain entities. Collection item (title, format, cover colour block, metadata), Collection.
- Component responsibilities. Standing header with wordmark,
LIBRARY section label, and state chip. Numbered left-rail wayfinding with the gold active line on 01 Library. Ruled catalogue rows with a colour-coded left rule and typographic cover block. Format filter control. Empty and error regions.
- States. Loading: the first six rows reveal in a single staggered sequence; remaining rows follow. Empty: when no items are available, the surface shows a clear empty message that the collection has no items yet, with no broken rows. Success: rows render with tabular numerals and legible titles. Error: if the collection cannot be loaded, the surface shows an error message and a retry control. Recovery: retry reloads the listing; the visitor can also return to Landing.
Reader
- Information and state. Anonymous reading surface for a single PDF or book. Shows the item's title, format, and the document content itself. Shows reading position within the item.
- Primary action. Read the document — page through it and move through its content.
- Supporting actions. Return to the Library. Move to the next or previous item in the collection.
- Domain entities. Collection item, Document content, Reading position.
- Component responsibilities. Standing header with wordmark,
READING section label, and state chip. Numbered left-rail wayfinding with the gold active line on 02 Reading. Document viewport. Page and position indicator in tabular numerals. Return-to-Library control.
- States. Loading: the document viewport shows a loading state while the item resolves. Empty: not applicable — the Reader is only reached with a selected item; if no item is selected, the surface returns the visitor to the Library. Success: the document renders and the visitor can read and page through it. Error: if the document cannot be loaded, the surface shows an error message with a retry control and a return-to-Library control. Recovery: retry reloads the document; returning to the Library lets the visitor choose another item.
Collection
- Information and state. Protected owner workspace for browsing and maintaining the available PDF and book collection. Lists every item with its title, format, and current state. Shows the
OWNER state chip.
- Primary action. Open an item in Book Details to add or edit it.
- Supporting actions. Add a new item, which opens Book Details in its new-item state. Remove an item from the collection. Return to the public Library.
- Domain entities. Collection item, Collection, Library Owner account.
- Component responsibilities. Standing header with wordmark,
COLLECTION section label, and OWNER state chip. Numbered left-rail wayfinding with the gold active line on 03 Collection. Ruled management rows with a colour-coded left rule, tabular numerals, and per-row edit and remove controls. Add-item control. Confirmation region for removal. Empty and error regions.
- States. Loading: rows render progressively with a pending indicator. Empty: when the collection has no items, the surface shows an empty message and the add-item control as the clear next step. Success: rows render and edits are reflected immediately on return from Book Details. Error: if the collection cannot be loaded, the surface shows an error message and a retry control; if a removal fails, the row is restored and an inline message explains the failure. Recovery: retry reloads the listing; a failed removal can be retried from the row.
Page 6 of 18
Book Details
- Information and state. Protected owner workspace for a single PDF or book record and its reader-facing content. Shows the item's title, format, cover colour block, and the reader-facing fields that Readers will see.
- Primary action. Save the item record so it becomes or remains available in the public collection.
- Supporting actions. Cancel and return to the Collection without saving. Remove the item.
- Domain entities. Collection item (title, format, cover colour block, reader-facing content), Collection.
- Component responsibilities. Standing header with wordmark,
ITEM micro-label, and OWNER state chip. Numbered left-rail wayfinding. Record form with labeled fields for the item's title, format, cover colour, and reader-facing content. Typographic cover preview. Save, cancel, and remove controls. Inline validation and error region.
- States. Loading: the record form shows a loading state while the item resolves. Empty: in the new-item state, fields start empty with labels visible and the cover preview shows a neutral placeholder block. Success: saving returns the Library Owner to the Collection with the item present and updated. Error: validation failures are shown inline against the offending field; a save failure keeps the entered values and shows a retry control. Recovery: the Library Owner corrects the field and resaves, or cancels back to the Collection.
Page 7 of 18
3. Functional Requirements
FR-1 — Public purpose statement. As a Reader, I should be able to arrive at the Landing surface and immediately understand that this website provides access to PDFs and books, so that I know whether this is the place I want to read. (provenance: explicit)
- Trigger: the visitor opens the site root.
- Observable result: the Landing surface renders the product purpose and a "Browse the library" action.
- Access state: anonymous; no account required.
- Failure/recovery: if the collection count cannot be resolved, the purpose statement and the browse action still render.
- Continuation: the visitor moves to the Library.
FR-2 — Access PDF documents. As a Reader, I should be able to access PDF documents from the collection, so that I can read the PDFs I came for. (provenance: explicit)
- Trigger: the Reader selects a PDF item from the Library.
- Observable result: the Reader surface opens the selected PDF and its content is readable.
- Access state: anonymous; no account required.
- Failure/recovery: if the document cannot be loaded, the Reader shows an error with a retry control and a return-to-Library control.
- Continuation: the Reader pages through the document, or returns to the Library to choose another item.
FR-3 — Access books. As a Reader, I should be able to access books from the collection, so that I can read the books I came for. (provenance: explicit)
- Trigger: the Reader selects a book item from the Library.
- Observable result: the Reader surface opens the selected book and its content is readable.
- Access state: anonymous; no account required.
- Failure/recovery: if the book cannot be loaded, the Reader shows an error with a retry control and a return-to-Library control.
- Continuation: the Reader pages through the book, or returns to the Library to choose another item.
FR-4 — Browse the public collection. As a Reader, I should be able to browse the available PDFs and books in the Library, so that I can find an item worth reading. (provenance: required_inference)
- Trigger: the Reader opens the Library.
- Observable result: the available items render as ruled catalogue rows with title, format, and metadata.
- Access state: anonymous; no account required.
- Failure/recovery: if the collection cannot be loaded, the Library shows an error message and a retry control.
- Continuation: the Reader selects an item and moves to the Reader.
FR-5 — Reach the public collection and reading experience without an account. As a Reader, I should be able to reach the public collection and the reading experience without establishing an account, so that reading is never gated behind enrollment. (provenance: required_inference)
- Trigger: the Reader navigates to the Library or the Reader.
- Observable result: the surface renders fully with no identity prompt and no redirect to Login or Sign Up.
- Access state: anonymous.
- Failure/recovery: not applicable — there is no identity step to fail.
- Continuation: the Reader reads, or returns to the Library.
FR-6 — Self-service enrollment for the Library Owner. As a Library Owner, I should be able to complete self-service enrollment on the Sign Up surface before first managing the collection, so that I have an account bound to my own collection work. (provenance: required_inference)
- Trigger: a new Library Owner opens Sign Up from the Landing surface or from Login.
- Observable result: the account is created and a session is established.
- Access state: anonymous entry; the Sign Up surface itself is reachable without a session.
- Failure/recovery: validation failures are shown inline against the offending field; a duplicate-account failure is shown with a link to Login.
- Continuation: the Library Owner continues to the Collection workspace.
FR-7 — Returning verification for the Library Owner. As a Library Owner, I should be able to complete returning verification on the Login surface before accessing protected collection-management work, so that my collection work stays bound to me. (provenance: required_inference)
- Trigger: a returning Library Owner opens Login.
- Observable result: the session is verified and the protected owner workspace becomes available.
- Access state: anonymous entry; the Login surface itself is reachable without a session.
- Failure/recovery: incorrect credentials show an inline message that does not reveal which field was wrong, and the entered identifier is retained so the Library Owner can correct the password.
- Continuation: the Library Owner continues to the Collection workspace.
FR-8 — Browse and maintain the collection as owner. As a Library Owner, I should be able to browse and maintain the available PDF and book collection in the Collection workspace, so that Readers have a current, usable collection to access. (provenance: required_inference)
- Trigger: the Library Owner opens the Collection workspace with a verified session.
- Observable result: every item in the collection renders as a management row with its title, format, and current state.
- Access state: protected; requires a verified Library Owner session.
- Failure/recovery: if the collection cannot be loaded, the workspace shows an error message and a retry control; if a removal fails, the row is restored and an inline message explains the failure.
- Continuation: the Library Owner opens an item in Book Details, adds a new item, or removes an item.
FR-9 — Add or edit an individual PDF or book record. As a Library Owner, I should be able to add or edit an individual PDF or book record and its reader-facing content in Book Details, so that each item is correct and available to Readers. (provenance: required_inference)
- Trigger: the Library Owner opens Book Details for an existing item, or opens the new-item state from the Collection workspace.
- Observable result: saving the record makes the item present and updated in the collection that Readers browse.
- Access state: protected; requires a verified Library Owner session.
- Failure/recovery: validation failures are shown inline against the offending field; a save failure keeps the entered values and shows a retry control.
- Continuation: the Library Owner returns to the Collection workspace with the item present and updated.
FR-10 — Remove an item from the collection. As a Library Owner, I should be able to remove an item from the collection, so that the collection stays current and Readers are not offered items that are no longer available. (provenance: required_inference)
- Trigger: the Library Owner activates the remove control on a Collection row or in Book Details.
- Observable result: the item no longer appears in the Collection workspace or in the public Library.
- Access state: protected; requires a verified Library Owner session.
- Failure/recovery: if the removal fails, the row is restored and an inline message explains the failure; the Library Owner can retry from the row.
- Continuation: the Library Owner continues maintaining the collection.
Page 8 of 18
4. User Personas
Reader
Product context. The Reader is the reason the site exists. They arrive at purple-llm with a document or a book in mind, or with a general appetite to read, and they expect to get to content quickly. They are not asked to sign up, and they should never be interrupted by an identity prompt on the way to a document.
Primary goal. Reach and read the PDF or book they came for.
Distinct accepted responsibilities. The Reader browses the public collection in the Library, selects an item, and reads it in the Reader. Their recurring responsibility is finding and opening content; their success is reaching and reading the document or book they came for. They do not curate, add, edit, or remove anything.
Relevant inputs and decisions. The Reader's inputs are the collection listing and the item metadata shown on each ruled row — title, format, and available metadata. Their decisions are which item to open and whether to continue reading or return to the Library for another item.
Interactions with other accepted participants. The Reader's experience is shaped entirely by the Library Owner's curation: what the Reader can browse and read is exactly what the Library Owner has made available. The Reader never interacts with the Library Owner directly, and never sees the owner workspaces.
Observable success. The Reader opens an item and its content renders and is readable, with no account prompt anywhere on the path from Landing to Reader.
Page 9 of 18
Library Owner
Product context. The Library Owner is the person who supplies and maintains the collection. They are not a Reader with extra buttons; their work is operational and recurring — keeping the catalogue accurate, current, and usable so that Readers have something worth accessing. Their surface is calm and rhythmic rather than exploratory.
Primary goal. Maintain a current, usable collection of PDFs and books that Readers can access.
Distinct accepted responsibilities. The Library Owner completes self-service enrollment on Sign Up before first managing the collection, completes returning verification on Login on subsequent visits, browses and maintains the collection in the Collection workspace, adds or edits individual PDF and book records and their reader-facing content in Book Details, and removes items that are no longer available.
Relevant inputs and decisions. The Library Owner's inputs are the item's title, format, cover colour, and reader-facing content. Their decisions are what to add, what to correct, and what to remove.
Interactions with other accepted participants. The Library Owner's work is what makes the Reader's experience possible: every item they add or edit becomes available in the public Library, and every item they remove stops being offered. The Library Owner does not interact with Readers directly.
Observable success. After saving a record, the item is present and updated in the collection that Readers browse; after a removal, the item no longer appears in either the Collection workspace or the public Library.
5. Core User Flows
Page 10 of 18
Flow 1 — Reader arrives and browses the public collection
- The Reader opens purple-llm and lands on the Landing surface. The hero renders immediately with the headline, the gold rule, and the vermilion index number; the state chip reads
OPEN ACCESS.
- The Reader reads the purpose statement and sees the live collection count in tabular numerals on the ruled row beneath the rule.
- The Reader activates "Browse the library" and arrives at the Library surface. No identity prompt appears at any point.
- The Library renders the available PDFs and books as dense ruled catalogue rows, each with a colour-coded format rule on the left edge, a typographic cover block, and tabular numerals for metadata. The first six rows reveal in a single staggered sequence.
- The Reader scans the rows and, if the listing is long, narrows it with the format filter.
- Failure/recovery: if the collection cannot be loaded, the Library shows an error message and a retry control. The Reader activates retry; the listing reloads. If it still fails, the Reader returns to Landing and tries again later.
- Continuation: the Reader selects an item and moves to Flow 2.
Flow 2 — Reader opens and reads a PDF or a book
- From the Library, the Reader selects a ruled row for the item they want.
- The Reader surface opens for that item. The header shows the wordmark, the
READING section label, and the OPEN ACCESS state chip; the left rail shows the gold active line on 02 Reading.
- The document viewport shows a loading state while the item resolves, then renders the document content. The page and position indicator shows the Reader's position in tabular numerals.
- The Reader reads and pages through the document.
- Failure/recovery: if the document cannot be loaded, the Reader shows an error message with a retry control and a return-to-Library control. The Reader activates retry; the document reloads. If it still fails, the Reader returns to the Library and chooses another item.
- Continuation: the Reader either continues reading, moves to the next or previous item in the collection, or returns to the Library to choose something else.
Flow 3 — Library Owner enrolls for the first time
- The Library Owner opens purple-llm and lands on the Landing surface. The state chip reads
OPEN ACCESS because no owner session exists.
- The Library Owner activates "Create an owner account" and arrives at the Sign Up surface. The surface is reachable without a session, because a protected destination cannot own the interaction that establishes access to itself.
- The Sign Up surface explains that an account is needed to add and manage PDFs and books. The Library Owner fills in the labeled enrollment fields and submits.
- Failure/recovery: if a field fails validation, an inline message appears against that field and the Library Owner corrects it and resubmits. If the account already exists, a single message appears with a link to Login, and the Library Owner moves to Flow 4 instead.
- On success, the account is created and a session is established. The state chip changes to
OWNER.
- Continuation: the Library Owner continues to the Collection workspace and moves to Flow 5.
Page 11 of 18
Flow 4 — Library Owner verifies on return
- The Library Owner opens purple-llm and lands on the Landing surface, or goes directly to Login.
- On the Login surface, the Library Owner enters their credentials and submits. The Login surface is reachable without a session.
- Failure/recovery: if the credentials are incorrect, an inline message appears that does not reveal which field was wrong, and the entered identifier is retained so the Library Owner can correct the password and retry in place. If no account exists, the Library Owner moves to Sign Up and follows Flow 3.
- On success, the session is verified and the state chip changes to
OWNER.
- Continuation: the Library Owner continues to the Collection workspace and moves to Flow 5.
Flow 5 — Library Owner browses and maintains the collection
- The Library Owner arrives at the Collection workspace with a verified session. The header shows the
COLLECTION section label and the OWNER state chip; the left rail shows the gold active line on 03 Collection.
- The workspace renders every item in the collection as a management row with its title, format, and current state, with per-row edit and remove controls.
- Empty state: if the collection has no items, the workspace shows an empty message and the add-item control as the clear next step.
- The Library Owner reviews the rows and decides what to do next: open an item to edit it (Flow 6), add a new item (Flow 6), or remove an item (Flow 7).
- Failure/recovery: if the collection cannot be loaded, the workspace shows an error message and a retry control. The Library Owner activates retry; the listing reloads.
- Continuation: the Library Owner returns to the public Library to see the collection as Readers see it, or continues maintaining.
Flow 6 — Library Owner adds or edits a PDF or book record
- From the Collection workspace, the Library Owner either activates the add-item control for a new record or activates the edit control on an existing row.
- The Book Details workspace opens for that record. The header shows the
ITEM micro-label and the OWNER state chip. For a new record, the fields start empty with labels visible and the cover preview shows a neutral placeholder block; for an existing record, the form shows a loading state while the item resolves, then populates.
- The Library Owner enters or updates the item's title, format, cover colour, and reader-facing content. The typographic cover preview updates to show the solid colour block with the title set over it.
- The Library Owner activates Save.
- Failure/recovery: if a field fails validation, an inline message appears against that field and the Library Owner corrects it and resaves. If the save fails, the entered values are kept and a retry control is shown; the Library Owner retries or cancels back to the Collection without saving.
- On success, the Library Owner returns to the Collection workspace with the item present and updated.
- Continuation: the item is now available in the public Library, where Readers can browse and open it.
Page 12 of 18
Flow 7 — Library Owner removes an item from the collection
- From the Collection workspace, the Library Owner activates the remove control on a row, or activates remove from within Book Details.
- A confirmation region appears naming the item to be removed.
- The Library Owner confirms the removal.
- Failure/recovery: if the removal fails, the row is restored and an inline message explains the failure; the Library Owner can retry the removal from the row.
- On success, the item no longer appears in the Collection workspace and no longer appears in the public Library.
- Continuation: the Library Owner continues maintaining the collection.
Page 13 of 18
6. Visuals, Colors and Theme
Muse and headline. Erik Spiekermann — typography as infrastructure. The headline idea for this product is a library you can actually read: a reading commons where anyone can browse and open PDFs and books without an account, while a Library Owner curates the collection behind a login. The register is calm, trustworthy, and scholarly — closer to a well-signed public library or transit system than a startup landing page. The name purple-llm asks for a real point of view, so the ground is deep aubergine with transit-line signal colours for wayfinding, never a default blue on white.
Colour tokens (dark mode).
| Role | Hex | Use |
|---|
| Background / ground | #1B1224 | Deep aubergine ground carrying the whole product |
| Surface | #2A1E36 | Panels, one step lighter than the ground |
| Rule | #3D2E4C | 1px structural rules on every surface |
| Text | #F4EFE7 | Warm off-white body and heading text |
| Primary | #C9A227 | Gold signal — wordmark, active wayfinding lines, "Read now" |
| Accent | #E4572E | Vermilion hot accent — one thing per screen: current selection, new-item tag, or progress bar |
| Muted | #9B8FA6 | Metadata, counts, disabled states |
| Wayfinding teal | #2F7E7A | Third colour-coded left rule on shelves and rows |
Proportion target: roughly 70% ground, 20% surface, 10% signal colour.
Typography. Headings and body both use Fira Sans. Headings run in Medium and Bold, set in sentence case for titles and all-caps with 0.08em tracking for micro-labels (SECTION, SHELF, PDF). The landing headline is clamp(40px, 8vw, 96px) at weight 700 with -0.01em tracking; section headings are clamp(24px, 3.2vw, 40px) at weight 600. No italics for display. Body is 16px at 1.55 line-height. Numerals are tabular for counts and dates.
Type scale (1.333 modular). 96 / 72 / 40 / 28 / 20 / 16 / 14, with 14px reserved for metadata.
Shape language. Honest and functional: 4px radii on panels and buttons, 1px rules as the main structural device, no soft blobs or pill shapes except a single rounded status chip. Colour-coded left rules (gold, vermilion, teal) act as wayfinding lines on shelves and rows. Buttons are rectangular with a 2px bottom border that thickens on press — mechanical, not glossy.
Layout. A grid-locked system with a persistent left rail on desktop: a 240px column of numbered wayfinding links (01 Library, 02 Reading, 03 Collection) with a gold active line. Content sits in a 720–1100px measure depending on surface; the Library uses a dense 12-column grid of ruled rows rather than cards. On mobile the rail collapses to a sticky horizontal tab strip with the same numbers. Every surface has a standing header with the wordmark, a section label in caps, and a right-aligned state chip.
Imagery. No photography. The visual material is the interface itself: ruled catalogue rows, numbered shelf markers, schematic diagrams of a document's structure (cover, spine, page count), and a small set of thick-line pictograms for formats (PDF, EPUB, AUDIO). Cover art is represented as a solid colour block with the title set in Fira Sans over it — a typographic book cover, not a stock image.
Readable text and controls. Headlines, wordmarks, labels, numbers, row text, and controls stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling to fit. No element covers any part of them. Imagery and decoration may be cropped, bled, or overlapped as the direction asks, provided they cover no readable text or control.
Avoid. Blue or indigo accents on a white ground; Inter, Roboto, Arial, Helvetica, Open Sans, Lato, or system-ui for any text; gradient-blob heroes, glassmorphism panels, or blurred gradient backgrounds; a uniform grid of identical cards with hover-lift shadows; photographic stock imagery or 3D renders of books; centred hero text with a subtext and a single button beneath it; decorative animation, parallax, or particle effects; pill-shaped buttons and radii above 4px on panels. The generic indigo/blue-on-white SaaS template is forbidden for this project.
Page 14 of 18
7. Signature Design Concept
The signed catalogue.
The public entry is a full-bleed aubergine field (#1B1224) that reads like the entrance hall of a well-signed public library. A giant Fira Sans headline — A LIBRARY YOU CAN ACTUALLY READ — is set flush left across nine columns at clamp(40px, 8vw, 96px), weight 700, tracking -0.01em. A gold rule (#C9A227) runs edge to edge beneath it, and a vermilion index number 01 is pinned at the left margin in tabular numerals.
Under the rule, a single ruled row carries the live collection count in tabular numerals and the "Browse the library" button with its 2px gold underline. The right third holds a stacked diagram of three typographic book covers in gold, vermilion, and teal, offset vertically like spines on a shelf — the shelf reads as a poster wall, not a card grid.
The signature is the wayfinding: a numbered left rail (01 Library, 02 Reading, 03 Collection) with a gold active line that slides between items, collapsing to a numbered sticky tab strip at 375px. Every surface carries the same standing header — wordmark, all-caps section label with 0.08em tracking, and a right-aligned state chip reading OPEN ACCESS or OWNER depending on session. Hairline 1px rules run edge to edge on every surface, with section numbers set in tabular numerals at the left margin.
The concept recomposes only accepted content, states, and controls: the purpose statement, the collection count, the browse action, the identity entry points, and the session state chip. It introduces no new behaviour, page, or destination.
Page 15 of 18
8. Interaction Model & Motion Direction
Interaction Model: Static
Motion Tempo: restrained
Hero Dimensionality: flat
Landing Hero Motion Brief.
- Focal subject. The giant Fira Sans headline set flush left across nine columns, with the gold rule running edge to edge beneath it and the vermilion index number
01 pinned at the left margin. The stacked typographic book covers in the right third are the secondary subject.
- Input → transformation → outcome thesis. On load, the hero resolves from its composed first frame into its final state: the headline and rule are present immediately, the collection count resolves from a muted placeholder into tabular numerals, and the first six library rows reveal in a single staggered sequence when the visitor reaches the Library. The outcome is a fully legible, fully signed entry surface — no element moves after it settles.
- Motion vocabulary. Functional and brief: 140–180ms ease-out on state changes, a single staggered reveal of the first six library rows on load, and a gold underline that slides between active rail items. No parallax, no particles, no hover-lift.
- Composed first frame. The aubergine field with the headline, the gold rule, the vermilion
01, the ruled row with the muted count placeholder and the browse button, and the three offset typographic covers — all in their final positions.
- Reduced-motion state. Under
prefers-reduced-motion, everything resolves instantly to its final state: the staggered row reveal becomes an immediate render, the rail underline jumps rather than slides, and the count appears without transition.
Page 16 of 18
9. Non-Functional Requirements
NFR-1 — Anonymous public access. The Landing, Library, and Reader surfaces must render fully without any identity prompt, redirect, or gating. (provenance: required_inference; rationale: Readers must be able to reach the public collection and reading experience without establishing an account.)
NFR-2 — Protected owner surfaces. The Collection and Book Details surfaces must not expose collection-management state to a session that has not completed returning verification. (provenance: required_inference; rationale: returning verification is required before protected collection-management work.)
NFR-3 — Anonymous identity entry. The Login and Sign Up surfaces must be reachable without an existing session, because a protected destination cannot own the interaction that establishes access to itself. (provenance: required_inference)
NFR-4 — Legibility at every viewport. Headlines, wordmarks, labels, numbers, row text, and controls must stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling to fit, with no other element covering any part of them. (provenance: explicit — creative direction)
NFR-5 — Reduced motion. Under prefers-reduced-motion, all motion must resolve instantly to its final state. (provenance: explicit — creative direction)
NFR-6 — Contrast. Body text #F4EFE7 on ground #1B1224 and on surface #2A1E36 must meet accessible contrast for sustained reading; muted #9B8FA6 is reserved for metadata and disabled states, not for primary reading text. (provenance: required_inference; rationale: the product's purpose is reading, so text must be readable.)
NFR-7 — Tabular numerals. Counts, dates, and position indicators must render in tabular numerals so that columns align across ruled rows. (provenance: explicit — creative direction)
NFR-8 — Document loading feedback. The Reader must show a loading state while a document resolves and a clear error state with retry and return-to-Library controls if it fails. (provenance: required_inference; rationale: reading is the product's core outcome, so its failure must be recoverable.)
Page 17 of 18
10. Tech Stack
- Frontend: React, delivered as a web application with custom UI. (provenance: required_inference — the project requires a website with custom UI.)
- Backend: Python with FastAPI, serving the collection records to the public Library and Reader surfaces and to the authenticated Collection surfaces. (provenance: required_inference — the project requires backend integration.)
- Storage: A relational database for collection items and Library Owner accounts, with document files stored in object storage and referenced by the collection records. (provenance: required_inference — the collection and accounts are durable state.)
- Containerization: Docker with docker-compose for local development and deployment. (provenance: required_inference — standard delivery for the selected stack.)
- Typography: Fira Sans, self-hosted, for both headings and body. (provenance: explicit — creative direction.)
No source-specified technology choices were overridden or substituted.
11. Assumptions and Constraints
Assumptions.
- A-1. The collection is supplied and maintained by the Library Owner; there is no external content provider or ingestion pipeline in the current scope. (narrow, consistent with the accepted requirement that the Library Owner supplies the collection.)
- A-2. Library Owner enrollment is self-service, because no provisioning or invitation boundary is established. (from Planning Scope.)
- A-3. A single Library Owner role exists; no differentiated permissions or role-based visibility beyond the owner/reader split is established. (narrow, consistent with the accepted access contract.)
- A-4. Document content is stored and served by the application; the Reader renders the document in the application surface rather than handing off to an external viewer. (narrow, consistent with the accepted Reader surface.)
Constraints.
- C-1. Readers must be able to reach the public collection and reading experience without establishing an account. (explicit.)
- C-2. The Library Owner must complete self-service enrollment before first managing the collection, and returning verification before accessing protected collection-management work. (explicit.)
- C-3. The Login and Sign Up surfaces must remain anonymously reachable. (required_inference.)
- C-4. The visual system is dark-mode aubergine with gold and vermilion signals; blue or indigo accents on a white ground are forbidden, as is the generic indigo/blue-on-white SaaS template. (explicit — creative direction.)
- C-5. Inter, Roboto, Arial, Helvetica, Open Sans, Lato, and system-ui must not be used for any text. (explicit — creative direction.)
- C-6. Panels and buttons use 4px radii; pill shapes are limited to a single rounded status chip. (explicit — creative direction.)
- C-7. No parallax, particles, hover-lift, or decorative animation. (explicit — creative direction.)
- C-8. No photographic stock imagery or 3D renders of books. (explicit — creative direction.)
Page 18 of 18
12. Glossary
- Collection — the set of PDFs and books available on purple-llm, browsable by Readers in the Library and maintained by the Library Owner in the Collection workspace.
- Collection item — a single PDF or book record, with a title, format, cover colour block, and reader-facing content.
- Library Owner — the active human persona who supplies and maintains the collection; requires an account.
- Reader — the active human persona who browses and reads PDFs and books; requires no account.
- Reader surface — the focused reading destination where a single PDF or book is opened and read.
- Ruled catalogue row — the Library's item presentation: a dense row with a colour-coded format rule on the left edge, tabular numerals, and a typographic cover block, rather than a card.
- State chip — the right-aligned header indicator reading
OPEN ACCESS for anonymous visitors or OWNER for an authenticated Library Owner session.
- Typographic book cover — an item's cover represented as a solid block of gold, vermilion, or teal with the title set in Fira Sans over it.
- Wayfinding rail — the numbered left-rail navigation (01 Library, 02 Reading, 03 Collection) with a gold active line, collapsing to a numbered sticky tab strip on mobile.
No comments yet. Be the first!