Craftpine

Program · April 30 to July 14, 2026 · Closed

Corner

Payments and inventory for Toronto corner stores. One founder built it with two AI assistants, took a live charge, then closed it on the numbers.

How a sale moves

A sale can start at the counter, on a shopper's phone or at an unattended kiosk. Every path writes to the same ledger, which drives restocking and the daily close.

Countercash or card,keeper rings it upPhoneshopper checks outin the appKioskno staff on site,charged on exitPaymentcash, card orphone walletwritesLedgereach sale writtenexactly onceRestockreorders whatwas soldDaily closetill matchedto the ledgerCountercash or card,keeper ringsit upPhoneshopperchecks outin the appKioskno staff,chargedon exitPaymentcash, card orphone walletwritesLedgereach sale writtenexactly onceRestockreorders whatwas soldDaily closetill matchedto the ledger
Four money paths shipped: shopper checkout, walk-in register, tap-to-pay terminal and the unattended kiosk.

The kiosk

The unattended kiosk ran on a Raspberry Pi behind a touchscreen and drove a real lock. The $250 edge computer beside it ran language and speech models on the device.

The bench kiosk at checkout, showing $6.50 with scan-to-pay and tap-to-pay, an NVIDIA edge computer on the left
The bench unit at checkout, July 2026.

Nineteen attacks, all held

Before any real customer, the money loop was attacked 19 ways across 71 checks, and all 19 held. The one real bug it found was fixed and the run repeated clean.

A to E · local concurrency · 23 checksA: Oversell race, heldAOversell raceB: Idempotency storm, heldBIdempotency stormC: Rate-limit burst, heldCRate-limit burstD: Concurrent refund, heldDConcurrent refundE: Checkout key storm, heldECheckout keystormF to S · live test-mode payment rails · 48 checksF: Refund-initiate storm, heldFRefund-initiatestormG: Cron and webhook race, heldGCron and webhookraceH: Duplicate webhooks, heldHDuplicatewebhooksI: Persist-race adopt, heldIPersist-raceadoptJ: Decline storm, heldJDecline stormK: Webhook-drop converge, heldKWebhook-dropconvergeL: Cron-only backstop, heldLCron-onlybackstopM: Rate-limit isolation, heldMRate-limitisolationN: Reconcile cap, heldNReconcile capO: Cross-path collision, heldOCross-pathcollisionP: Pending refund arc, heldPPending refundarcQ: Out-of-order events, heldQOut-of-ordereventsR: Two-cron race, heldRTwo-cron raceS: Key reuse across transactions, heldS*Key reuse acrosstransactionsheld* S found the onereal bug. Fixed,re-run clean.A to E · local concurrency · 23 checksA: Oversell race, heldAOversell raceB: Idempotency storm, heldBIdempotencystormC: Rate-limit burst, heldCRate-limitburstD: Concurrent refund, heldDConcurrentrefundE: Checkout key storm, heldECheckout keystormF to S · live test-mode payment rails · 48 checksF: Refund-initiate storm, heldFRefund-initiatestormG: Cron and webhook race, heldGCron andwebhook raceH: Duplicate webhooks, heldHDuplicatewebhooksI: Persist-race adopt, heldIPersist-raceadoptJ: Decline storm, heldJDecline stormK: Webhook-drop converge, heldKWebhook-dropconvergeL: Cron-only backstop, heldLCron-onlybackstopM: Rate-limit isolation, heldMRate-limitisolationN: Reconcile cap, heldNReconcile capO: Cross-path collision, heldOCross-pathcollisionP: Pending refund arc, heldPPending refundarcQ: Out-of-order events, heldQOut-of-ordereventsR: Two-cron race, heldRTwo-cron raceS: Key reuse across transactions, heldS*Key reuse acrosstransactionsheld* S found the one realbug. Fixed, re-run clean.
A to E ran on local concurrency. F to S ran against live test-mode payment rails, June 2026.

The live charge

On July 9 the bench kiosk charged a real $1.99 on production, and the charge showed up in the card's banking app. It was refunded, for a lifetime net of $0.

A banking app showing a pending $1.99 charge from Corner Toronto Can on July 9
Screenshot from the cardholder's banking app on July 9, 2026.

Build numbers

The build ran 76 days, from the first commit on April 30 to the close on July 14.

76days, Apr 30 to Jul 14173commits57API routes$1.99live charge, Jul 976days, Apr 30 to Jul 14173commits57API routes$1.99live charge, Jul 9
Counts audited at the close-out commit, July 14, 2026.

Where the money goes on a $10 sale

About 70% of card sales at a Toronto corner store are debit taps, as modeled. On a $10 tap Corner earned a 10¢ fee and paid Stripe 15¢, so each one lost 5¢.

Shopperpays $10.00by debit tapStorekeeps $9.90Cornergets its 1% fee: 10¢pays Stripe: 15¢net: −5¢ a tap15¢Stripeflat 15¢ perdebit tapInteracnetwork, ~3.4¢Stripe keeps~11.6¢Shopperpays $10.00 by debitStorekeeps $9.90Cornergets its 1% fee: 10¢pays Stripe: 15¢net: −5¢ a tap15¢Stripeflat 15¢ perdebit tapInteracnetwork, ~3.4¢Stripe keeps~11.6¢
Stripe's flat Interac fee and the Interac network's switch and interchange rates, July 2026, on the charge shape Corner shipped.

The stores it was for

Toronto proper has about 1,375 corner stores. Moneris, Square and NRS already sell payment systems to them.

An independent convenience store in Toronto with a red Convenience sign and an ice freezer by the door
An independent corner store in Toronto, unconnected to Corner. Photo by Chicken4War on Wikimedia Commons, licensed CC BY-SA 4.0 and resized.

How many stores it takes

Charging stores Stripe's rates plus 1%, Corner breaks even at 125 to 150 stores, and that price loses to Moneris and Helcim. At a price that wins, break-even moves past 600 stores or never comes.

05001,0001,375all of Toronto properBreak-even at Stripe rates plus 1%: 125 to 150 storesStripe rates plus 1%:125 to 150 storesAt a price that wins stores:600 stores, or neverPilot: 0 of 6 stores signedPilot: 0 of 6 stores signed05001,0001,375all of TorontoAt a price that wins:600 stores, or neverStripe rates plus 1%:125 to 150 storesPilot: 0 of 6stores signed
Break-even for a two- or three-person company needing CA$500K a year in gross profit. POS viability research, July 2026.