back to praxis

docs

architecture

// 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

contracts

contractaddresspurpose
ArtistRegistryV20x5d2690087B2D9bec3668406E0e79830343f3642Aidentity + follow graph
Praxis0x1EE184687A3C91efA50579C2e5354385fC6781E1tiered funding, ERC-6909 credentials, dispute window, revenue sharing
BlogRegistry0xC334ab27631e960DE046fe2AD534a827dEa2715Bon-chain blog posts with comments
PraxisInvites0x39BAd247d181bdEFd20355112aF0bf8070898604invite codes, referral tracking
LibraryRegistry0xEfdCccb79b7E0ee54A5E93Ca02115fC7f813d4E4shared knowledge library (IPFS)
PraxisMedia0x0f1BF14e09258837EB7a2b73A754F69638646dEEsoulbound media tokens, revenue splits

all verified on arbiscan. all open source.

seven layers

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

project lifecycle

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)

token design

// 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

media marketplace

// 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

templates

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

module system

// 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

i18n

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

stack

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

praxis badge

embed on any site to show it's part of the network:

praxis
// 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>

source

github.com/taayyohh/praxis

169 tests. 7 contracts. all verified. all open source.