And that's exactly why it's awesome: a real blockchain stack, playing dress-up as a coffee shop.

AlejoReyna/ArtisanalBrew

Nine live resources

Built in Azure.

Compute, data, messaging, storage, secrets, and delivery — moving as one estate.

Nine on-chain building blocks

Written on-chain.

Staking, rewards, smart accounts, intents, and agentic settlement across public test networks.

Running

Compute

prod-web

Blazor · scale 1–2

Running

Compute

prod-worker

Queue consumer · scale 1

Ready

Database

prod-pg

PostgreSQL 16

Active

Messaging

prod-sb

Two Service Bus queues

Available

Storage

tcst…mubaa

Blob · Standard LRS

Available

Secrets

tc-kv…mubaa

Key Vault · Standard

Available

Registry

prod-acr

Container Registry

Provisioned

Comms

prod-acs

Managed email relay

Idle

Compute

sepolia-aa

ERC-4337 bundler VM

Sepolia

ERC-4626

CafeLiquidStakingVault

Liquid staking + COFFEE rewards

Sepolia

Solidity

CafeFaucet

Rate-limited test-token claims

Sepolia

ERC-20

CAFE + COFFEE

Capped stake and reward tokens

Sepolia

ERC-4337 v0.7

Smart account stack

Factory, EntryPoint, paymaster

Sepolia

Escrow

AgenticCommerceEscrow

Fund, submit, evaluate, settle

Sepolia

ERC-8004

ERC8004RegistryFixture

Agent identity and reputation

Sepolia

ERC-7683

ERC7683ResolverFixture

Cross-chain intent lifecycle

Solana devnet

Anchor program

cafe-liquid-staking

Stake, mint stCAFE, claim rewards

BSC testnet

EVM suite

BSC mirror

Multichain parity deployment

The Path

One order, all the way down.

The estate above is the map. This is the route one checkout actually takes through it — traced from the source, not from the architecture diagram.

  1. 01

    POST /checkout

    Blazor Server circuit · Checkout.razor

    The wallet pays first. The ETH transfer is polled until Sepolia confirms it — no row is written against an unconfirmed payment.

  2. 02

    OrderPricingService.Calculate()

    Application layer · FluentValidation

    The request is validated, the coupon re-quoted server-side, and subtotal, shipping, tax and discount recomputed from scratch. Whatever the browser claimed the total was is discarded.

  3. 03

    orderRepository.AddAsync()

    EF Core · Postgres Flexible Server

    The order, its line items, and any coupon redemption are written together — one SaveChanges, one transaction, all of it or none of it.

    writesOrders · OrderItems · CouponRedemptions

  4. 04

    TransparencyService.CreatePendingRecordsForOrderAsync()

    Application layer · SHA-256

    Line items are sorted, joined, and hashed into a single order hash. Each item gets a record stamped with the chain id and network, status Pending, waiting to be anchored.

    writesTransparencyRecords

  5. 05

    ReceiptService.SendReceiptAsync()

    QuestPDF · Blob Storage · Communication Services

    A PDF is rendered in-process, uploaded to Blob Storage, and emailed through Azure's managed relay.

    writesReceipts

  6. 06

    order-processing

    Service Bus · OrderProcessingWorker

    The queue is provisioned and the worker holds an open receiver on it. Nothing publishes to it yet — it is the seam where the synchronous path above gets to become asynchronous.

Stops 01–05 all run inside the request. Stop 06 is provisioned and listening but nothing publishes to it yet — checkout still writes synchronously, and the queue is the seam for the day it shouldn't.

The Schema

Every table, on the record.

Not a diagram someone drew once and forgot. Everything below is read out of the live EF Core model at request time — if a migration changes the database, this section changes with it, whether or not anyone remembers to update the copy.

31

Tables

329

Columns

13

Foreign keys

17

Rows, right now

Check it yourself

Everything on this page comes from one public, unauthenticated endpoint. No key, no account — the same JSON that renders the diagram is yours to pull.

curl https://cafe.alexisrs.dev/api/transparency/schema
/api/transparency/schema /api/transparency/stats
  • Structure and row counts only — no row contents are exposed through this endpoint.
  • ASP.NET Identity tables (AspNetUsers, AspNetRoles, and friends) are withheld.
  • Row counts are read live from the running database and cached for 60 seconds.

The Recipe

How it's built.

  1. 01 · DOMAIN

    Entities and enums — the vocabulary of the café.

  2. 02 · APPLICATION

    Services, DTOs, validation — the recipes.

  3. 03 · INFRASTRUCTURE

    EF Core on PostgreSQL, plus Azure storage, messaging, and email.

  4. 04 · WEB

    Blazor Web App on .NET 10, rendered interactively — the counter.

  5. 05 · WORKER

    A background service consuming order-processing messages — the back room.

dotnet 10 · blazor server · clean architecture · xunit + testcontainers

The Pour

Served from the cloud.

$ git push origin main

→ github actions · docker build

→ push · azure container registry

→ deploy · azure container apps

✓ live at cafe.alexisreyna.dev

Container Apps

Consumption plan, running the Blazor app and the worker.

Postgres Flexible Server

The system of record, via EF Core.

Service Bus

Order-processing queue, consumed by the Worker.

Key Vault

Secrets and connection strings, never in source.

Blob Storage

Product imagery and static assets.

Communication Email

Order confirmations and account emails.

0 Bicep modules provisioning the estate

Fictional coffee. Real craft.

Shop the beans Read the source
An unhandled error has occurred. Reload x

Rejoining the server...

Rejoin failed... trying again in seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please retry or reload the page.

Still there?

You've been inactive for a while. For your security, you'll be signed out in 60 seconds.