Selected work / 01
CartCheck
Full-stack grocery shopping and list management.
StatusCompleted & deployed

01 / Context
The problem and the people
A private grocery checklist for planning a shop, tracking what has been bought, and keeping a record of completed trips. Prices and budgets stay optional throughout the workflow.
A shopping checklist should work even when prices are unknown. CartCheck keeps everyday list actions simple while preserving a useful, editable history of each trip.
- Intended users
- Individual shoppers, including students and family members, managing their own grocery lists.
02 / Contribution
My role in the work
Solo project owner & lead developer
- I developed CartCheck independently as its sole student project owner, setting the goals, approving scope and design decisions, and guiding the application through deployment.
- Codex assisted substantially with planning, UI design, implementation, tests, reviews and documentation. I use AI as a development assistant while remaining responsible for the project’s decisions and verification.
Built and documented
What the system does
Independent shopping lists
Create and name multiple lists, search a reusable grocery catalog, add custom items, edit quantities and mark items bought. Finishing one list leaves the others intact.
Optional money, explicit uncertainty
Estimated and actual item totals are separate. Missing amounts remain incomplete instead of becoming zero. Optional budgets use PHP, USD or EUR; trips retain their own currency.
History that preserves context
Finish a selected list as a named dated trip. Review and correct its item snapshots later without changing its original finish date.
System map / 03
How the pieces connect
Browser
React / Vite · lists, catalog and trip history
Application
Render / Express · sessions, validation and ownership
Persistence
Supabase PostgreSQL · private records and snapshots
Implementation
Technology used
- React
- Vite
- JavaScript
- Express
- PostgreSQL
- Supabase PostgreSQL
- Render
Engineering judgment
Decisions and trade-offs
One origin, one API boundary
Express serves the Vite build and /api from one Render service. Supabase supplies PostgreSQL; authentication and all shopper data access stay behind Express rather than a browser database client.
Transactions protect the trip lifecycle
Finish and correction operations lock the owned trip and check its revision. Repeated finishing returns the existing trip, while stale edits are rejected. Snapshots protect history from later catalog changes.
Fast feedback without stale private state
An account-session cache deduplicates reads, aborts requests on disposal and guards against stale responses. Safe optimistic mutations reconcile with the API or roll back after failure.
Documented results
Results
- Completed and deployed at cartcheck.merzbuilds.dev. The repository documents the delivered multiple-list workflow and the October 2026 release.
- The development record reports client/server tests, isolated PostgreSQL integration tests and scoped production walkthroughs. These are historical project checks, not tests rerun by this portfolio.
Project boundaries
Limitations
- CartCheck prioritizes checklists and trip records. It does not provide unit-price comparison, automatic price suggestions or cross-currency conversion.
- The repository’s security checklist tracks ongoing dependency, backup/restore, privacy and delivery verification work. Completion and scoped testing are not a guarantee of security or real inbox delivery.
Evidence trail