M-Local helps Ann Arbor students find and claim time-limited deals at local restaurants, and lets those restaurants post offers and redeem them with a QR code.
- Browse first: students see local offers and filter by price, time and diet before signing in.
- Claim with a code: sign in with an emailed code from a verified
@umich.eduinbox and get a QR pass with the saved terms and expiry. - Redeem once: the restaurant previews the QR and confirms a one-time redemption.
- Run your offers: businesses verify an email, submit for manual approval, then manage photos, drafts and offer windows.
- See what worked: businesses review recorded claims, redemptions and sales charts.
flowchart LR
S[Student browses offers] --> C[Claims with emailed code]
C --> Q[Gets QR pass]
Q --> R[Restaurant scans and confirms]
R --> D[(Server records one-time redemption)]
B[Business posts offer after approval] --> S
The server owns authorization, inventory, expiry and redemption.
Linux, macOS (Apple silicon) or WSL Bash, with Python 3 installed. This installs
the pinned, checksum-verified Jac 0.37.23 runtime and starts the app at
http://localhost:8000:
git clone https://github.com/CosmonautJones/m-local.git
cd m-local
bash scripts/setup.sh
bash scripts/dev.shChecks and tests: bash scripts/check.sh and bash scripts/test.sh core.
More in Runtime setup.
Status: engineering release candidate on main; live rollout is not yet
approved. See Release status, the
gate matrix, the
acceptance checklist,
the changelog and release tracking.
Built by Travis Jones, Rohan Maxa, Manthan Patil and Adam Jiang. See team attribution and the ownership contract.
Illustrative demo · Connected-photo review · Runtime setup · Release tracking
main contains the merged engineering release candidate: the PR #55/#59
student and merchant release plus the October 15-18 hardening stack
(PRs #60-#70: exact-package recovery binding, offline preflight parity,
private research handling, single-PostgreSQL auxiliary proofs, disposable SQL
startup and immutable build identity). Every workflow passes on main.
Live rollout remains unapproved. An existing hosted app must not be assumed
to contain the repository's latest changes; compare its /version.json build
identity before relying on it. See the
release tracking record.
| Component | Review |
|---|---|
| Manual approval, connected photos and recovery foundation | PR #55 |
| Native hardening, student experience, header fix and merchant suspension | PR #59 (includes #56-#58) |
| Recovery binding, preflight parity, private research and build identity | PR #70 (includes #60-#62, #69) |
| PostgreSQL auxiliary proofs and disposable integrated SQL startup | PR #68 (includes #63-#67) |
Earlier immutable handoffs (for example the combined candidate handoff) preserve historical receipts. Source composition is informational; every later source head needs its own checks.
Remaining gates include research access, retention and historical publication, provider durability and existing-user migration, an approved rollout artifact, current-candidate inbox delivery, off-host recovery, monitoring, phones/cameras and human acceptance. Follow the gate matrix and acceptance checklist. Local fixtures and a reachable homepage do not complete hosted acceptance.
Travis approved private retention of contact research on October 16. main no
longer tracks research payloads (they were preserved privately first) and new
release packages refuse them. Prior public Git history still contains them until
separately addressed; older archives containing research must remain
private. Readers, retention and history handling remain open in
privacy decisions.
| Students | Businesses |
|---|---|
| Browse before signup; filter by price, time and diet. | Verify a business email, import or enter details, and submit for manual approval. |
| Sign in with an emailed code when claiming; retain the selected offer through verification and reload. | Manage connected profile/offer photos, drafts, publication retries and bounded offer windows. |
| Recheck availability before confirming; receive a QR pass with saved terms and expiry. | Preview the claim QR and explicitly confirm one-time redemption. |
| See clear empty, loading, sold-out, expired and error states. | Inspect recorded claims and redemptions with honest sample labels. |
The server owns authorization, inventory, expiry and redemption. A hold lasts up to 20 minutes or the offer end, whichever comes first. The combined candidate limits each student to two live holds while preserving existing claims. Repeat requests retain the original claim; saved price and terms do not change when an offer is edited.
Host-authorized merchant suspension hides public offers and blocks new claims, publication and redemption. Existing claims stay visible with support guidance and keep their original expiry and terms. Only an attributed, revision-checked reinstatement resumes service; routine business edits cannot clear suspension. See the operator commands.
M-Local access is available to people who can verify access to their @umich.edu
inbox, including alumni. Verification proves inbox access, not current enrollment
or official U-M endorsement. Businesses check any stated offer eligibility at the
counter. Sample offers are fictional and cannot be redeemed at a real business.
Server sample policy applies across public feed, detail and favorite paths while
preserving legitimate saved claims.
The accepted 50-second, 1080p demo uses fictional businesses and illustrative activity. It predates the connected-photo revision; review current photo screens separately. It does not establish real merchant participation, live hosting, inbox delivery or physical-device acceptance. The current media privacy review still has audio and QR contents unverified.
These are historical browser captures from September 27, 2026, with fictional test data, predating the connected-photo candidate. They do not establish current host behavior or physical-device acceptance. Other preserved captures remain in docs/screenshots.
| Discovery | Offer detail | Claim pass | Business insights |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Run from the repository in WSL Bash, with pinned official Jac 0.37.23:
bash scripts/setup.sh
bash scripts/dev.shThe development app listens at http://localhost:8000. Use the runtime wrappers
in RUNTIME.md; preserve existing stores and human work.
Never reset a shared demo or production database. Email setup and optional website
extraction are described in ONBOARDING.md.
bash scripts/check.sh
bash scripts/test.sh core
bash scripts/test.sh context
bash scripts/test.sh insights
bash scripts/test.sh onboarding
bash scripts/build.shComplete checks are defined in check.yml and shared-onboarding-proof.yml, with additional native, browser and packaged-recovery workflows on the component and combined branches. They include photo ownership, manual business approval, coordinated recovery, deployment safety, Node and compiled-browser checks. Required proofs must execute at the final source SHA; absent or skipped proof steps are not passing evidence.
At the historical 2be568a checkpoint, the functional job passed 493 core executions across
134 expected names, 66 Node tests and 162 compiled-browser tests.
Actual browser proof
passed 62 checks;
native preservation/topology proof
passed 80 preservation checks and 266 runtime checks with 21 faults;
cloud package recovery
passed 66 authenticated checks for its separate artifact. These receipts do not
certify a later source or the recreated local archive, which still lacks its own
authenticated recovery certificate.
Jac owns the connected graph, offer/claim lifecycle and application shell. Python supports onboarding, email, photo normalization, production validation and recovery tooling. JavaScript supports browser components and the restricted gateway. Use the suitable language for each task; source percentage imposes no language-conversion target.
The supported combined topology is one exclusive backend and one serialized gateway, with no overlapping rollout, extra graph writer or public native-route bypass. Complete upstream responses stay in the serialized lane. This is bounded safety evidence, not a multiple-replica or measured-capacity claim.
Graph/identity storage, onboarding SQLite, original signing keys and photo ownership/files must be preserved together on durable storage. The hosting package contains secret names, preflight, backup, isolated restore, rollout, smoke checks and source rollback. Travis must explicitly approve deployment and live data work.
The existing JacHammer address is a historical host reference. Its deployed candidate revision, durability and readiness are unverified here. Do not invite real account onboarding from this README.
- Work handoff
- Team contract and parallel workflow
- QR redemption
- Business insights
- Persistent coordination and independent review
Payments, POS integration, automatic business approval and native iOS/Android packaging remain outside this candidate.





