QuoteGen is a quotation generator web app for an IT agency. Agency staff use it to assemble client quotations across four service modules — Website, Android App, iOS App, and Custom Software — by entering client details, adding task line items with estimated hours and an hourly rate (or a flat cost), and watching a financial summary auto-calculate Subtotal, an optional Discount %, GST at 18%, and the Grand Total. Quotes are saved to a MongoDB database through a Node.js/Express API and can be exported as a clean, professional PDF built with jspdf and html2canvas.
The product intent is a precise, trustworthy quoting instrument: the tool that builds a quotation must feel like the document it produces — honest controls, visible structure, and a single signal colour for the one number that matters. The audience is the IT agency's internal staff: developers and account leads who live in numbers, hours, and GST math, and colleagues or managers who review saved quotes before they are shared with a client.
QuoteGen is delivered as a React.js single-page frontend styled with Tailwind CSS, a Node.js/Express backend exposing the quotation API, and a MongoDB database persisting quotations. PDF export runs in the browser using jspdf and html2canvas.
Current actors (closed active-human catalog):
Current behavior:
POST /api/quotes, GET /api/quotes, GET /api/quotes/:id.Narrow exclusions: No client-facing portal, no e-signature, no invoicing/payment collection, no multi-currency handling, no template gallery, no analytics dashboards, no email delivery of quotes. These are not requested and are out of scope.
QuoteGen is a first-party, application-owned web tool. Agency staff establish their own identity through self-service Sign Up and return through Login; the quotation workspace and saved-quote browsing are protected so that saved quotations remain bound to the correct staff member and can be resumed. The Landing page is anonymous and explains what QuoteGen does before sign-in. All quotation authoring, financial calculation, persistence, and PDF export are current, first-party responsibilities. There is no provider-owned or external-destination workflow in the current scope; MongoDB persistence and the Express API are internal system responsibilities supporting the human-facing pages. Future ideas (client portal, e-signature, invoicing) are explicitly out of the current delivery boundary.
Not applicable — no reference directive with content_source was supplied.
GET /api/quotes) showing client name, company, date, and grand total per row, in a ruled tabular layout with 11px caps column headers. Selecting a quote opens its detail view (from GET /api/quotes/:id) showing client info, module tasks, and financial totals.GET /api/quotes resolves. Empty — no saved quotes shows an empty state with a link to New Quote. Success — list and detail render. Error — fetch failure shows an inline error with retry. Recovery — user can retry the fetch or navigate to New Quote.FR-1 — Build QuoteGen with the fixed stack (explicit) As an Agency Quotation Author, I should use QuoteGen built with React.js frontend, Tailwind CSS styling, Node.js/Express backend, and MongoDB database, so that the app runs on the agency's chosen technology.
FR-2 — Header with logo placeholder and title (explicit) As an Agency Quotation Author, I should see a header with an agency logo placeholder and the app title "QuoteGen", so that the app is identifiable and branded.
FR-3 — Client Info section (explicit) As an Agency Quotation Author, I should enter Client Name, Company, Date, and Validity in a Client Info section, so that the quotation identifies the client and its terms.
FR-4 — Module Builder with four modules (explicit) As an Agency Quotation Author, I should see four main module sections — Website, Android App, iOS App, Custom Software — so that I can organize tasks by service type.
FR-5 — Add Task within a module (explicit) As an Agency Quotation Author, I should click "Add Task" within a module to add a task with Task Name, Estimated Hours, and Hourly Rate (or Flat Cost), so that I can itemize the work.
FR-6 — Remove Task (explicit) As an Agency Quotation Author, I should remove a task from a module, so that I can correct the quotation.
FR-7 — Financial Summary auto-calculation (explicit) As an Agency Quotation Author, I should see a sticky Financial Summary that auto-calculates Subtotal, applies an optional Discount %, calculates GST at 18%, and shows the Grand Total, so that I know the quotation value at all times.
FR-8 — Save Quote (explicit) As an Agency Quotation Author, I should click "Save Quote" to persist the quotation to the database, so that it can be retrieved later.
POST /api/quotes persists client info, modules, tasks, calculated totals, and date created; a "Saved" confirmation appears in secondary signal green (#2F6B4F).FR-9 — Export PDF (explicit) As an Agency Quotation Author, I should click "Export PDF" to generate a clean, professional PDF, so that I can deliver the quotation to the client.
FR-10 — POST /api/quotes (explicit)
As the system, I should expose POST /api/quotes to save a quote, so that authored quotations persist.
GET /api/quotes.FR-11 — GET /api/quotes (explicit)
As the system, I should expose GET /api/quotes to get all quotes, so that saved quotations can be listed.
FR-12 — GET /api/quotes/:id (explicit)
As the system, I should expose GET /api/quotes/:id to get a specific quote, so that a saved quotation can be reviewed in detail.
FR-13 — MongoDB schema (explicit) As the system, I should store client info, the array of selected modules, the specific tasks within those modules, the calculated totals, and the date created in MongoDB, so that quotations are durable and complete.
POST /api/quotes.FR-14 — PDF content (explicit) As an Agency Quotation Author, I should receive a PDF with a header containing the agency logo, client info, a table of modules/tasks, and a clear financial summary at the bottom, so that the document looks professional.
FR-15 — Self-service enrollment (required_inference) As an Agency Quotation Author, I should create my own account on Sign Up before first protected use, so that my saved quotations are bound to me and resumable.
FR-16 — Returning verification (required_inference) As an Agency Quotation Author or Agency Quote Reviewer, I should log in on Login before accessing saved quotations, so that protected quotation state remains bound to the correct staff member.
FR-17 — Backend persistence of quotations (required_inference) As the system, I should persist quotations in MongoDB via the three endpoints, so that saved quotations survive across sessions and are retrievable by id.
Product context: An IT agency staff member — developer or account lead — who assembles client quotations. They live in numbers, hours, and GST math, and they need the tool to feel like an instrument: honest controls, visible structure, and a single signal colour for the one number that matters.
Primary goal: Build a complete, accurate client quotation across the four service modules and deliver it as a professional PDF, while keeping a saved copy in the database.
Distinct accepted responsibilities:
Relevant inputs or decisions: Client details; module selection; task names, hours, rates or flat costs; discount percentage; when to save vs. export.
Interactions with other accepted participants: Their saved quotes become visible to the Agency Quote Reviewer via the Quotes page. They do not interact with the reviewer directly in the app.
Observable success: A saved quote appears in the Quotes list; an exported PDF contains the agency logo header, client info, module/task table, and financial summary; the Grand Total matches the on-screen calculation.
Product context: An agency colleague or manager who retrieves previously saved quotes to review client info, module tasks, and financial totals before the quote is shared or reused.
Primary goal: Browse all saved quotes and open a specific quote by id to verify its contents and totals.
Distinct accepted responsibilities:
GET /api/quotes).GET /api/quotes/:id) and review client info, module tasks, and financial totals.Relevant inputs or decisions: Which quote to open; whether the quote's contents and totals are correct.
Interactions with other accepted participants: Reviews quotes authored by the Agency Quotation Author; does not author or edit quotes in the current scope.
Observable success: The selected quote's detail view renders client info, module tasks, and financial totals matching the saved document.
POST /api/quotes persists the quote and a "Saved" confirmation appears in secondary signal green.GET /api/quotes, showing client name, company, date, and grand total per row in a ruled tabular layout.GET /api/quotes/:id returns the quote and the detail view renders client info, module tasks, and financial totals.Muse: Dieter Rams. Headline: "Less, but better — a quotation desk built like a Braun control panel."
The palette is a warm-grey desk with off-white controls mounted on it, near-black ink for all type and rules, and Braun orange as the only signal colour. The document produced must look like it came from a serious engineering firm, so the tool that builds it must feel like an instrument.
Colour tokens (light mode):
#EDEAE4#F7F5F1#1C1B19#1C1B19#E8500F — Grand Total figure, active module tab underline, focus rings, the 'Add Task' plus glyph, the discount input's live value. Never more than ~5% of any screen.#8A857C#2F6B4F — reserved for the 'Saved' confirmation only.#1C1B19 at 1px; inner dividers #C9C4BA at 1px.Typography:
Shape language: Rounded-rectangle controls only — 6px radius on inputs and buttons, 10px on panels, 2px on the module tab strip. No pills, no blobs, no soft shadows; depth comes from a 1px inset top highlight and a 1px bottom rule, like a physical switch. Circular only where it is a control (the 28px orange '+' button, the radio-style module selector dot).
Layout: Strict 12-column grid on the warm grey ground. Left 8 columns: Client Info panel (a 4-up label/value row), then the Module Builder as a horizontal tab strip of the four modules — each tab carries a small orange count badge of its task rows — with the active module's task table below in a ruled, tabular layout. Right 4 columns: a sticky Financial Summary panel that reads like a receipt: Subtotal, Discount % input, GST 18%, then a heavy 2px rule and the Grand Total in orange, with Save Quote and Export PDF stacked beneath. Header is a thin 64px bar with the logo placeholder as a 32px black square containing an orange dot, 'QuoteGen' in Archivo 700, and a right-aligned saved-quote count.
Imagery: No photography, no illustration. The visual content is the interface itself: ruled tables, tabular numerals, the orange signal dot, and one diagrammatic element — a thin horizontal 'spec strip' under the app title showing the four module names as a schematic legend, like a Braun device's function diagram. The PDF preview thumbnail in the summary panel is the only 'image', and it is a real rendered miniature of the quote.
Avoid: Blue or indigo anywhere; gradient blobs, glassmorphism, soft drop shadows, or hover-lift cards; pill buttons, large radii, or rounded-everything 'friendly SaaS' geometry; illustrated people, emoji, or decorative spot art; centred hero stacks with a subhead and a coloured CTA button; more than one saturated colour per screen; bouncy or springy easing; dense unlabelled icon-only controls.
The Landing page opens on a full-width warm grey field (#EDEAE4) with a single oversized two-line headline set flush-left in Archivo 700 at clamp(40px, 7vw, 88px): "QUOTE LIKE AN ENGINEER." stacked over "LESS, BUT BETTER." in ink, with the second line's period replaced by a 14px orange square. Beneath it, flush-left, a 3-line paragraph in 16px and one solid black button "Open the desk" with an orange 2px left edge. To the right, a schematic diagram panel — four ruled rows labelled WEBSITE / ANDROID / iOS / CUSTOM SOFTWARE with hairline rules and a single orange dot marking the active row — the only 'graphic'. No centred stack, no gradient, no floating cards.
The signature moves carry through the protected pages: the sticky Financial Summary reads like a Braun receipt with every line a label/value pair aligned to the right edge, a 2px black rule before the Grand Total, and the Grand Total figure in Archivo 700 at 72px in Braun orange with tabular numerals that roll on change. The Module Builder is a physical tab strip with four hard-edged tabs and a 2px orange underline on the active one plus a small orange count badge. Task rows are an instrument table with full-width hairline-ruled rows, 11px caps column headers, inputs that are borderless until focused (then a 1px orange ring), a right-aligned tabular amount column, a 28px circular orange '+' at the row's end to clone, and a thin '×' remove control that only appears on row hover. The 32px black logo square containing a single orange dot appears in the header and is repeated as the PDF header mark — the one brand gesture, used exactly twice and nowhere else. A schematic 'spec strip' under the app title on Landing and New Quote shows the four module names as an all-caps legend separated by hairline verticals, with the currently-edited module marked by an orange dot.
Interaction Model: Animated Motion Tempo: restrained Hero Dimensionality: flat
Landing Hero Motion Brief
prefers-reduced-motion, the headline and diagram render statically in their final positions; the orange dot remains on the default active row; hover transitions are removed; the "Open the desk" button remains fully usable.POST /api/quotes, GET /api/quotes, and GET /api/quotes/:id. Rationale: explicit user constraint.font-size: clamp(...) with its mobile size) to fit; no other element covers any part of them. Rationale: explicit design constraint.
QuoteGen is an IT agency quotation generator. Build client quotations across Website, Android App, iOS App and Custom Software modules, add task line items with hours and rates, and watch Subtotal, Discount, GST at 18% and the Grand Total calculate as you type. Save each quote to your desk and export it as a clean, professional PDF.

QuoteGen is an IT agency quotation generator. Build client quotations across Website, Android App, iOS App and Custom Software modules, add task line items with hours and rates, and watch Subtotal, Discount, GST at 18% and the Grand Total calculate as you type. Save each quote to your desk and export it as a clean, professional PDF.
No comments yet. Be the first!