01. Add items
Register each stock item with its name, SKU, unit, and opening quantity so it can be counted and moved.
tidal-stcok is a web-based stock management application for a small inventory operation. It gives a Stock Manager and a Warehouse Operator one shared, durable record of what is in stock, how much of it there is, and every movement in and out of the store. The product intent is exactness and speed: counts must be current, every change to a quantity must be traceable to a recorded movement, and the surface must read like a calibrated instrument rather than a friendly form.
The audience is the two operational roles who touch stock daily: the Stock Manager, who owns the correctness of item records and quantities, and the Warehouse Operator, who records the physical movement of goods and checks quantities on the floor. Both reach the product through a public Landing page, create their own account on Sign Up, and return through Login. The application owns identity so that stock records, movements, and quantity edits remain bound to the correct person and can be resumed across sessions.
tidal-stcok is delivered as a React single-page frontend served alongside a shared FastAPI backend process, with MariaDB holding application-owned persistent data. The backend exposes the inventory, stock item, stock movement, and identity APIs; the frontend renders the six accepted destinations. There is no separate worker, queue, or third-party inventory provider in the current delivery.
The active human actors are the Stock Manager and the Warehouse Operator. Both are first-party users of the application. The application itself is the only system actor of consequence: it validates input, applies quantity arithmetic, persists movements, and enforces which role may reach which destination.
Current accepted behavior covers: self-service enrollment and returning verification; a Landing page that explains the product before any identity check; an Inventory list of stock items with current levels and the start of item creation; a Stock Item page showing one item and letting the Stock Manager edit its quantity; and a Stock Movements page where the Warehouse Operator records stock in and out and sees the resulting quantity. Access is layered: Landing, Sign Up, and Login are open; Inventory requires a logged-in user; Stock Item is restricted to the Stock Manager role; Stock Movements is restricted to the Warehouse Operator role.
Removed from scope
tidal-stcok is a first-party web application. The application owns the user identity, the stock item records, the quantity values, and the movement history. Nothing in the accepted requirements delegates inventory state to an external provider, and nothing is delivered headless.
Access is deliberately staged. A visitor can read the Landing page and can reach Sign Up and Login without an account. Everything that reads or changes stock — the Inventory list, a single Stock Item, and the Stock Movements ledger — sits behind login. Within the logged-in area, the two roles have different working surfaces: the Stock Manager owns item records and quantity corrections on Stock Item, and the Warehouse Operator owns the movement ledger on Stock Movements. Both roles can read the Inventory list, because both need to know current levels.
The current horizon is the six accepted pages and the behaviors described in Section 3. No reporting, purchasing, supplier, barcode, multi-warehouse, or notification capability is part of this delivery, and none should be inferred from the product category.
FR-1 — Manage a stock inventory on a website (explicit) As a Stock Manager or Warehouse Operator, I should have a persistent, shared stock inventory in the web application, so that both roles work from one authoritative record.
FR-2 — Add stock items with their details (explicit) As a Stock Manager, I should add a stock item with its details, so that the item exists in the inventory and can be counted and moved.
FR-3 — Update stock item quantities (explicit) As a Stock Manager, I should update a stock item's quantity directly, so that the recorded count matches a physical count or correction.
FR-4 — View current stock levels (explicit) As a Stock Manager or Warehouse Operator, I should view current stock levels, so that I can judge what is available before acting.
FR-5 — Record stock movement in and out (explicit) As a Warehouse Operator, I should record stock moving in and stock moving out, so that the ledger explains every change to a quantity.
FR-6 — Self-service enrollment on Sign Up (required_inference) As a new Stock Manager or Warehouse Operator, I should create my own account and choose my role, so that I can begin using the product without an administrator.
FR-7 — Returning verification on Login (required_inference) As a returning Stock Manager or Warehouse Operator, I should verify my identity, so that I resume my own work with my role intact.
FR-8 — Role-appropriate access to stock actions (required_inference) As a signed-in user, I should only reach the stock actions my role permits, so that quantity corrections and movement records stay with the role that owns them.
The Stock Manager is accountable for the correctness of the inventory record. Their work is corrective and supervisory: they decide what items exist, what unit each is counted in, and what the true quantity is when a physical count disagrees with the system. They are the only role that creates items and the only role that edits a quantity directly, which means every discrepancy that is not a physical movement lands with them.
Their primary goal is that no item is wrong and no shortage is discovered late. They start on Inventory, scan the ruled table for items whose quantity looks off, and open a Stock Item to correct it. They read the recent-movements list on that page to understand why a quantity drifted before they overwrite it, because a correction that ignores a recorded movement hides a real problem. They also create new items when a new product enters the store, supplying name, SKU, unit, and opening quantity.
Their inputs are item details and corrected counts; their decisions are whether a discrepancy is a correction or a movement that the Warehouse Operator should have recorded. They interact with the Warehouse Operator indirectly through the shared ledger: a movement the operator records changes the quantity the manager sees, and a correction the manager makes appears in the history the operator can read. Their observable success is a table whose quantities match the physical store and a history that explains every change.
The Warehouse Operator works at the point of physical movement. Their work is transactional and high-frequency: goods arrive, goods leave, and each event must be recorded at the moment it happens so the count stays true. They do not decide what items exist or what the true count should be; they record what physically moved and let the arithmetic follow.
Their primary goal is to record a movement quickly and see the resulting quantity immediately, so they can confirm the count before walking away. They start on Inventory to check what is on hand, move to Stock Movements, select the item, choose in or out, enter the quantity, and submit. The resulting quantity counts to its new value in the ledger, which is their confirmation. When an outbound quantity exceeds what is available, the rejection names the available quantity so they can reconcile on the spot rather than guess.
Their inputs are the item, the direction, the quantity, and an optional note describing the delivery or dispatch. Their decisions are direction and quantity, and whether a discrepancy is theirs to record or the Stock Manager's to correct. They interact with the Stock Manager through the ledger the manager reads and the quantities the manager corrects. Their observable success is a ledger entry for every physical movement and a current quantity that matches the shelf.
The muse is MARQ by Garmin: a luxury instrument surface where dark titanium grounds, ruled data, and dial gauges make counting feel calibrated. The headline for the direction is "Precision instrument control for stock."
Mode: dark only.
Colour tokens by role
| Role | Hex | Use |
|---|---|---|
| Background | #131518 | Page ground, 70 percent of the surface |
| Surface | #1D2024 | Raised bands, form wells, table header |
| Text | #EDE8DF | Body and headings, high contrast on both grounds |
| Primary | #C9A227 | Primary actions, live counts, outbound rules, the needle |
| Accent | #3FA9A0 | Inbound movement only, the stock-level gauge ring |
| Muted | #8A8F96 | Micro-labels, secondary metadata, dividers at reduced weight |
Typography
Saira Condensed, weight 600, uppercase for section heads and labels, wide tracking on labels and tight tracking on large counts.Barlow, weight 400, 16 px.clamp() so the 96 px hero count and 72 px quantity counts scale down to fit at 375 px without clipping.Shape language
Layout rhythm
Imagery
The public entry is a full-bleed dark titanium band. On the left, a 96 px condensed count of total units sits above a champagne rule, with the primary call to action resting on that rule. On the right, one large teal gauge ring carries a champagne needle that sweeps once on load and settles at its resting position. A topographic line field is drawn faintly behind the ring in muted tone, cropped by the band edge. Below the band, a ruled three-column strip names the three core capabilities — add items, update quantities, record movements — each separated by a 2 px divider and numbered from the left rail.
The concept recomposes only accepted content: the product name, the capability statements, and the Sign Up and Login entry points. The hero count and gauge are instrument framing, not a read of inventory, and no stock data is exposed before login.
Interaction Model: Animated Motion Tempo: restrained Hero Dimensionality: dimensional_css
Landing Hero Motion Brief
Quantity numerals on Stock Item and in the Stock Movements ledger count to their new value over 400 ms with the same precise easing. Inbound ledger rows carry a teal left rule and outbound rows a champagne left rule; the rule draws in on row entry. No element animates in a way that covers readable text or a control, and all headlines, labels, counts, and controls stay entirely within the viewport and their container at 375 px, 768 px, and 1280 px.
clamp() where needed.prefers-reduced-motion, the needle, counts, and rules render in their final static arrangement with no loss of content or control.#EDE8DF on #131518 and #1D2024 meets WCAG AA for body text; champagne and teal are used for accents and rules, with text on those colours set in the dark ground tone.Saira Condensed and Barlow loaded as web fonts.docker-compose.yml with three services: frontend, backend, and database. The frontend reaches the backend over the compose network; the backend reaches MariaDB over the compose network. No additional worker, queue, or ingress service is required for the accepted workflows.
Track stock items, quantities, and movements — one calibrated record for the manager and the operator on the floor.
Capabilities — core operations
Instrument readout
Register each stock item with its name, SKU, unit, and opening quantity so it can be counted and moved.
Set a corrected count against the recorded one, and the last-updated time moves with it.
Log stock in and stock out against an item, with the resulting quantity shown on every ledger row.

Track stock items, quantities, and movements — one calibrated record for the manager and the operator on the floor.
Capabilities — core operations
Instrument readout
Register each stock item with its name, SKU, unit, and opening quantity so it can be counted and moved.
Set a corrected count against the recorded one, and the last-updated time moves with it.
Log stock in and stock out against an item, with the resulting quantity shown on every ledger row.
No comments yet. Be the first!