Skip to content
CosmonautJonesPublic

About

Ann Arbor students find and claim time-limited local restaurant deals; restaurants post offers and redeem them by QR code. Built in Jac.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

374 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

M-Local

M-Local

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.

Illustration: a student holds a phone showing a QR pass while a staff member at a local restaurant counter gets ready to scan it

  • 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.edu inbox 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.

How it works

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
Loading

The server owns authorization, inventory, expiry and redemption.

Quick start

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.sh

Checks 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.


Project details

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

Release status

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.

Candidate behavior

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.

Demo

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.

Screenshots

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
Historical offer feed Historical offer detail Historical claim pass Historical business insights

Local development

Run from the repository in WSL Bash, with pinned official Jac 0.37.23:

bash scripts/setup.sh
bash scripts/dev.sh

The 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.

Verification

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.sh

Complete 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.

Architecture and hosting

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.

Team references

Payments, POS integration, automatic business approval and native iOS/Android packaging remain outside this candidate.

About

Ann Arbor students find and claim time-limited local restaurant deals; restaurants post offers and redeem them by QR code. Built in Jac.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages