// every artist's site is a node in the network // no central server owns the data contracts (arbitrum) 0x5d269008...642A ArtistRegistryV2 // identity + follow graph 0x1EE18468...1E1 Praxis // projects + ERC-6909 credentials 0xC334ab27...15B BlogRegistry // on-chain blog posts 0x39BAd247...8604 PraxisInvites // invite codes + referral chain 0xEfdCccb7...4E4 LibraryRegistry // shared knowledge (IPFS-backed) 0x0f1BF14e...6dEE PraxisMedia // soulbound media tokens + splits messaging XMTP v7 // peer-to-peer, end-to-end encrypted // DMs + group chats for project teams indexer Ponder v0.7 // GraphQL API for all on-chain data hosting Docker containers // one per artist, bind-mounted code Traefik // auto TLS, reverse proxy navigation soft-SPA // fetch+replace, preserves player state persistent audio player // bottom bar, survives page navigation i18n 12 languages // EN ES FR PT DE AR ZH JA KO HI SW RU auto-detect + manual switcher // RTL support for Arabic tests 169 Foundry tests // unit + fork tests across 7 contracts
| contract | address | purpose |
|---|---|---|
| ArtistRegistryV2 | 0x5d2690087B2D9bec3668406E0e79830343f3642A | identity + follow graph |
| Praxis | 0x1EE184687A3C91efA50579C2e5354385fC6781E1 | tiered funding, ERC-6909 credentials, dispute window, revenue sharing |
| BlogRegistry | 0xC334ab27631e960DE046fe2AD534a827dEa2715B | on-chain blog posts with comments |
| PraxisInvites | 0x39BAd247d181bdEFd20355112aF0bf8070898604 | invite codes, referral tracking |
| LibraryRegistry | 0xEfdCccb79b7E0ee54A5E93Ca02115fC7f813d4E4 | shared knowledge library (IPFS) |
| PraxisMedia | 0x0f1BF14e09258837EB7a2b73A754F69638646dEE | soulbound media tokens, revenue splits |
all verified on arbiscan. all open source.
1. identity register on-chain, wallet = login, permanent + portable 2. social follow graph, mutual follows unlock messaging 3. messaging XMTP encrypted DMs + group chats, send ETH in-chat 4. projects propose + fund with tiers, revenue sharing, dispute window 5. library shared knowledge base, IPFS-backed PDFs/articles, tagging 6. journal encrypted private writing, AES-256-GCM, wallet-derived key 7. feed on-chain blog posts, comments, activity timeline, infinite scroll
PROPOSED // artist proposes project with team + splits + tiers + location // tiers: tickets (transferable) + backer credits (soulbound) // optional: revenue sharing commitment to funders | v fundTier(projectId, tierId, qty) FUNDED // goal met. team confirms. | v confirmProject(projectId) // proposer + majority of collaborators CONFIRMED | v completeProject(projectId) COMPLETING // 3-day dispute window // funders can call dispute() -- if >50% of funded amount objects: // -> CANCELLED -> everyone refunds | v finalizeProject(projectId) // after 3 days, no majority dispute COMPLETED // funds distribute per splits (pull pattern) // soulbound CONTRIBUTOR tokens mint to team // soulbound PRODUCER tokens already minted to funders REVENUE SHARING (optional) // if enabled, team sends revenue back to the contract: depositRevenue(projectId) // funders claim proportional share: claimRevenue(projectId)
// ERC-6909 multi-token (cheaper than ERC-1155, no callbacks) // same standard as Uniswap v4 token id (256-bit packed) [type 8] [projectId 64] [tierId 32] [serial 152] types (Praxis contract) 1 = TICKET // transferable -- "i'm going to this show" 2 = PRODUCER // soulbound -- "i funded this project" 3 = CONTRIBUTOR // soulbound -- "i worked on this project" types (PraxisMedia contract) MEDIA = soulbound // "i own this media" -- no transfers, no secondary market soulbound enforcement transfer() checks tokenId >> 248 type > 1 -> revert // single bit-shift, no storage lookup
// PraxisMedia: soulbound media tokens with revenue splits // artists list media for sale, collectors purchase, no resale listing list(title, ipfsCid, metadataCid, price, maxSupply) list(..., collaborators[], splits[]) // with revenue splits // set price, max supply, optional collaborator splits purchasing purchase(mediaId) payable // mints soulbound token to buyer // distributes ETH per split percentages // no transfers -- your collection is yours alone management setPrice(mediaId, newPrice) setMaxSupply(mediaId, newMax) withdraw() // pull accumulated revenue personal collection /collection page shows all owned media + credentials // soulbound tokens prove ownership without speculation // support artists directly, no middlemen, no secondary market
default minimal text, clean CV layout musician larger album art, prominent name, inline player visual image grid, wide canvas, gallery-first writer generous typography, reading-optimized, narrow measure performer stage/event-oriented, credits-first, resume layout filmmaker video-forward, project stills, cinematic // 6 templates -- onboarding auto-selects based on artist type // changeable anytime via settings panel
// 10 content modules, each with CV + highlights rendering // artists enable/disable/reorder via settings panel music aliases, albums, tracks (IPFS), streaming links credits theater, film, tv, dance, comedy, opera, music technology engineering projects, roles, descriptions gallery images (IPFS), exhibitions, series writing publications, reading list film works, festivals, video audio episodes, tracks (IPFS) education events, workshops, residencies store items, crypto payments video generic video module, any artist type // settings panel: identity, modules, highlights, theme, AI editor // all edits go through PUT /api/site -> rebuild
languages EN ES FR PT DE AR ZH JA KO HI SW RU detection localStorage('praxis-lang') > navigator.language > 'en' switcher dropdown in top bar (landing + all artist sites) RTL full layout flip for Arabic architecture landing: landing/i18n/*.json (114 keys) sites: public/i18n/*.json (349 keys) module: public/js/i18n.js t(key, vars), data-i18n attrs // UI chrome translates, user content does not // artists write in whatever language they want
frontend vanilla JS, ES modules, no React, no bundler blockchain viem (via CDN), Arbitrum messaging XMTP v7 (via CDN), DMs + group chats indexer Ponder v0.7 (GraphQL) payments Peer.xyz (Venmo/PayPal onramp, sell via extension sidebar) server Node.js containers Docker (per-artist, bind-mounted code) proxy Traefik (auto TLS, Let's Encrypt) testing Foundry (169 tests, unit + fork across 7 contracts) domains Namecheap API (search + purchase + DNS) storage IPFS via Pinata (images, audio, PDFs) i18n 12 languages, auto-detect, RTL support player persistent audio player, bottom bar, survives navigation navigation soft-SPA (fetch+replace main content, preserves player) images dynamic resizer (sharp), thumbnails for lists/grids cache client-side sessionStorage, TTL tiers, immutable IPFS cache
embed on any site to show it's part of the network:
// html <a href="https://ourpraxis.network" style="display:inline-block; padding:0.2em 0.8em;border:1px solid #1a1a1a;font-family:monospace; font-size:0.75em;color:#666;text-decoration:none; letter-spacing:0.05em">praxis</a>