Mash. Remix. Inscribe. An Infinite Craft–style browser toy where every discovery is a Bitcoin SV 1SatOrdinal.
Combine two pixel characters → get a new viral Mashinal (deterministic recipe) → inscribe the 32×32 pixel PNG on-chain. Other people remix those ordinals. The inscription is the post.
An earlier pitch involved live X-trend meme packs. X API access is too expensive, so Mashinals has zero dependency on X — no scrapers, no posting, no trend feeds. The social graph is the ordinal lineage itself.
Characters are chunky pixel sprites (32×32 source, nearest-neighbor scaled):
- Layered parts: body, clothes, hair, eyes, mouth, accessory
- Limited palettes (genes pick a palette index)
- Same two parents always produce the same child sprite + name + caption
- Collectible payload is a tiny
image/png(optional compact grid SVG helper exists for tooling — PNG is what we inscribe)
No GatchaGo SVG path kits, no Three.js meshes, no photoreal AI images.
Same pattern as live GatchaGo on entangleit.com (Yours Wallet + @1sat/actions collections — the public GitHub GatchaGo tree is behind the deployed SPA):
- Client composites the pixel sprite from genes.
- Once: deploy a collection parent (
mintCollection, MAPsubType=collection) and registercollectionIdon the Worker (/api/ordinals/config). - Each Mashinal:
mintCollectionItemwith PNG + traits +collectionId/ mint number — lands in the Yours ordinals basket with tracking tags / customInstructions (listable from Market / Yours). - Client reports
{txid, origin, …}to the Worker feed.
Demo Inscribe writes a local “preview ordinal” labeled NOT on-chain so the UX is testable without a wallet.
@1sat/reactWalletProvider/useWallet(auto-detects Yours)@1sat/actionsmintCollection/mintCollectionItem(preferred) — not bare address-lockedinscribe@1sat/clientOneSatServices('main')for market browse
Install Yours Wallet (Chrome extension), unlock it, then Connect Yours Wallet on the board. Inscribe prompts the wallet — no hot keys in the app or Worker.
First live mint (or Initialize collection) deploys the Mashinals collection parent if the Worker has none yet.
@1sat/react,@1sat/actions,@1sat/connect,@1sat/client,@bsv/sdk- Docs: Yours Provider API, docs.1satordinals.com
npm workspaces:
| Package | Role |
|---|---|
shared |
Types, palettes, deterministic mash genetics, starters, tests |
client |
Vite + React 18 + Zustand + Framer Motion play UI |
worker |
New Cloudflare Worker mashinals — API + Workers Static Assets (same origin) + Mashinals-only D1 |
This app does not reuse gachago-api, does not publish into an entangleit.com Pages/portfolio directory, and does not share GatchaGo’s Wrangler project.
npm install
npm run dev:client # http://127.0.0.1:45321 (Vite; proxies /api → worker)
npm run db:migrate:local
npm run dev:worker # http://127.0.0.1:8788 (Worker + built assets + D1)
# or both:
npm run devClient calls /api/* (same-origin in production; Vite proxy in local client-only mode).
Copy .env.example → client/.env.local only if you need overrides:
| Var | Purpose |
|---|---|
VITE_API_URL |
API base (default /api — correct for same-origin Worker deploy) |
VITE_ENABLE_AI_FLOURISH |
Optional Workers AI name/caption flag — off by default; app is fully playable without it |
No secrets are required to play. Never commit .env, .dev.vars, or account-specific Cloudflare IDs.
One Worker named mashinals serves the frontend (Workers Static Assets) and API.
- Production URL: https://entangleit.com/mashinals/
- workers.dev: https://mashinals.richard-hein.workers.dev
- Zone routes:
entangleit.com/mashinals+entangleit.com/mashinals/* - D1:
mashinals-db(c1aefe08-d9f3-41da-86ba-4cc7dcfe9c55)
# 1) Auth (once)
npx wrangler login
# 2) Create Mashinals-only D1 (once) — already created: mashinals-db
# database_id is set in worker/wrangler.jsonc
# npm run db:create
# 3) Apply migrations to remote D1
npm run db:migrate
# 4) Build client (base /mashinals/) + deploy Worker + zone routes
npm run deployThe Worker strips the /mashinals prefix before serving assets (same pattern as SatPress / BSV Bounties). Do not copy files into the portfolio Pages dir or reuse gachago-api.
Optional: set CORS_ORIGIN in worker/wrangler.jsonc vars (defaults to https://entangleit.com).
npm testCovers: same parents → same child; different parents → different child; genes stay in valid part ranges.
- Start with primordial pixel pals: Spark, Tide, Pebble, Gust, Pixel, Meme, Heart, Glitch.
- Click two onto combine slots → Mash (auto-combines when both slots fill).
- First time a recipe is found = discovery; repeats select the existing child.
- Gallery / feed / character detail with Inscribe + Demo Inscribe.
- Keep mashing discoveries into deeper generations.
MIT — build weird pixel creatures, inscribe responsibly.