Apps and art for the whole gang — start anywhere.
Four NFT collections on Solana, a Rust indexer that knows everything about them, and five web apps on top — all built in the open.
| Collection | Supply | Standard | Where |
|---|---|---|---|
| Piggy SOL Gang — ten thousand piggies, straight off the chain | 10,000 | Token Metadata | Magic Eden |
| Piggy Girl Gang — pretty, fierce and dressed for it | 5,000 | Token Metadata | Magic Eden |
| Piggy Gang — same ten thousand piggies, meaner art | 10,000 | Metaplex Core | Magic Eden |
| Pig Mud — something's coming | 2,073 | Token Metadata | Coming soon |
| — | SPL, 9 decimals | Solscan |
Piggy Gang is Piggy SOL Gang wearing new clothes: swapping burns the Token Metadata mint and creates a Metaplex Core asset with the same number. Same piggy, redrawn.
- One spec runs the whole stack. The indexer's OpenAPI file is frozen and hand-written; the explorer vendors a byte-identical copy, generates its typed client from it, and CI fails if the two drift apart. Changing the contract is always two commits — indexer first.
- The frontend shipped before the backend. With nothing configured, the explorer serves committed fixtures through the very same generated client the real API will use. One server-side variable switches it over.
- The database makes two owners unrepresentable. Ownership is stored as intervals with a GiST
EXCLUDEconstraint, so no NFT can have two open owners at once — not by convention, by the schema. - Search is quick. Filtering 10,000 NFTs by traits benches at a p50 of 40 ms on Postgres 17 — 5 ms for text search — against an acceptance bar of 100 ms.
- One package talks to Solana.
@wallet-standard/app, and nothing else: no web3.js, no wallet-adapter, no Buffer polyfill. The browser builds the transaction, the wallet signs it, the app just watches the signature. No key ever reaches a server. - Adding a collection is config, not code. One entry in
collections.tomlplus a mint list. Not a single on-chain address appears in Rust, SQL or tests. - Raffles are free, and provably fair. Entering never costs anything but gas. A Switchboard VRF picks the winner, and anyone can recompute the result from the published proof.
- We kept the art. The collections' original image host went dark. The metadata was re-hosted, the renders were committed, and what survives in these repos may be the only complete copy left.
| Repo | Lang | What it does | Status |
|---|---|---|---|
indexer |
Rust | Indexes every Piggy NFT — traits, owners and full history — and serves them over a REST API | 🔨 Building |
explorer |
TypeScript | Search the collections by trait, look up a wallet, read an NFT's history | 🧪 Preview · explorer.piggygang.net |
dressme |
TypeScript | Dress your piggy up in any traits you like and download the picture | ✅ Live · dressme.piggygang.net |
raffles |
TypeScript | Free raffles for holders — nobody ever pays to enter | 🧪 Preview · raffles.piggygang.net |
alpha-art |
TypeScript | alpha.art coming back as an open Solana marketplace | 🧪 Preview · alpha.art |
website |
TypeScript | The hub — every app and collection in one place | ✅ Live · piggygang.net |
Next up: Migration — swap your piggy to the new art.
The backend is Rust 1.90 — actix-web, sqlx and Postgres 17.6, deployed on Railway. Every frontend is the same shape on purpose: Next.js 16 App Router, React 19, Tailwind v4, Node 24 and pnpm 11, on Vercel. Clone one and you already know the next.
piggygang.net · Discord · X · GitHub
Piggy SOL Gang (10,000) · Piggy Girl Gang (5,000) · Piggy Gang (10,000 — same piggies, meaner art) · Pig Mud (2,073) · $PIGGY