Build Log

What we shipped, when we shipped it. Building sovereign technology in public.

Stripe Connect, Voice Fix & Infrastructure

πŸ’³ Stripe Connect β€” SHIPPED

  • PR #360 merged β€” Multi-seller payouts. Auto-resolves seller DID β†’ connected account, calculates platform fee. Schema, types, fee constants.
  • PR #361 merged β€” Connect onboarding UI + payout management page. Sellers onboard to Stripe Express in 5 minutes.
  • PR #362 merged β€” PayoutSetupBanner in events + coffee dashboards. Prompts sellers to connect.
  • PR #359 closed β€” Connect onboarding UI complete.
  • #62 closed β€” EMT checkout flow complete (selection, instructions, 72h hold, admin confirmation all working).

🎀 Voice Recorder β€” FIXED

  • Root cause found: commit 867d10f (March 5) added hold-to-record pointer events that conflicted with click-to-toggle. pointerdown β†’ pointerup fired within milliseconds = 0-byte blob.
  • Fix: removed all pointer events, reverted to simple click-to-start/click-to-stop. 46 lines deleted.

πŸ“‹ Issues & Architecture

  • #281 updated β€” EMT organizer config: toggle, auto-fill from profile email, buyer disclaimer
  • #363 created β€” Escrow service for EMT platform fees, buyer protection, marketplace settlement. Trust-graph-dynamic escrow requirements.
  • #358 β€” Per-ticket attendee registration (specced, not yet built)
  • RFC-14 updated β€” "Prior Art: Protocol-Level Redistribution" section. Zakat, waqf, potlatch, tithe β€” 1,400 years of protocol-level redistribution as precedent for MJN fee model.

πŸ–Ό Media Service β€” SHIPPED

  • PR #353 β€” Media browser UX: multi-select, three view modes, sort persistence, color-coded .fair badges, batch actions
  • PR #354 β€” Media inference tools: searchAssets + readAsset in @imajin/llm, internal API key auth, wired into sovereign inference
  • PR #355 β€” RFC consolidation: all 16 RFCs canonical in docs/rfcs/, INDEX.md, stubs for RFC-03 + RFC-04

πŸ— Infrastructure

  • Postgres backups live (#357) β€” hourly pg_dump of 3 prod DBs, 30-day local + 90-day Synology NAS retention
  • GPU node fan fix β€” fancontrol crashed after reboot (hwmon paths shifted). Updated config, service running.
  • GPU node IP β€” moved from WiFi (192.168.1.124) to ethernet (192.168.1.234)
  • Git history cleaned β€” squashed 40+ duplicate commits from Greg's PR #356 into single commit via rebase + force push
  • Build log parser fix β€” en-dashes in date ranges no longer break heading parser

🧠 CRDTs β€” NEW DIRECTION

  • CRDTs identified as the path for federated node synchronization
  • Entry point: registry sync, then expand to full mesh β€” attestations, trust graph, profiles converge without central coordinator

πŸ“Š By the Numbers

  • 5 PRs merged
  • 3 issues closed, 2 created
  • 40+ garbage commits squashed to 1

Settlement Fixes, Sovereign Commerce & Building in Public

🧠 Sovereign Inference β€” Live

  • "Ask Me" presence β€” profile owners enable AI trained on their context. Trust-bound access, inference fees, streaming responses
  • @imajin/llm package β€” Vercel AI SDK wrapper with cost tracking + provider factory
  • Presence bootstrap β€” enabling inference auto-seeds .imajin/ folder in media (soul.md, context.md, config.json)
  • Trust distance engine β€” connections service computes BFS trust distance (direct, friend-of-friend, stranger)
  • 6 trust-scoped tools β€” events, connections, attestations, profile, pay, learn β€” each scoped to conversation participants
  • PresenceChat UI β€” streaming modal chat on profile pages
  • Cost settlement β€” 80% owner / 20% platform via .fair

πŸ’° Settlement Pipeline β€” Fixed

  • Critical: settlement field mismatch β€” settleTicketPurchase was reading fairManifest.attribution but manifests use distributions. Every ticket settlement silently skipped since day one.
  • Critical: confirmation emails broken β€” Date serialization bug crashed webhook after ticket creation. 66 tickets across 2 events never got emails. Backfill script written.
  • Coffee tips never settled β€” webhook marked tips completed but never called /api/settle. Wired up .fair splits (98.5% creator, 1.5% platform).
  • Tip notification emails β€” recipient gets "β˜• you got a tip!", sender gets "🧑 thanks for tipping". Pay webhook now forwards all metadata.

πŸ’³ Pay Dashboard β€” Shipped

  • Payment history with paginated transactions, service/date filters, expandable .fair attribution chains
  • BalanceCard component β€” cash vs credit bucket display
  • Platform fee verification confirmed correct
  • Dashboard replaced static API docs with authenticated balance + recent transactions

πŸ” Onboard Token Hardening

  • Corporate email scanners (Outlook Safe Links) consuming verification tokens before humans clicked
  • 60-second grace window for scanner-consumed tokens
  • Graceful redirect for users with existing sessions

πŸ— Build Pipeline

  • transpilePackages added to all 14 apps for @imajin/* workspace packages
  • Next.js type checking delegated to tsc (pnpm symlinks confuse Next's checker)
  • All .env.example files updated, 12+ missing prod env vars set
  • Fixed malformed next.config.js in chat, dykil, input (closing brace on wrong line)

πŸ› Architecture Sessions

  • Profile scopes (#346) β€” profiles gain scope field: actor, family, community, org. Businesses are org-scoped profiles. Foundational for everything below.
  • Check-ins reimagined (#246) β€” not a separate service. A check-in is an attestation of presence with any entity in your graph. "I checked in at Pilot Coffee" = "I checked in on Carl." Same operation.
  • Market (#56) β€” renamed from shop. Consent-based local commerce. No feed, no infinite scroll. Two modes: active browsing + mailbox delivery.
  • Attention marketplace (#114) β€” engagement attestation chain: delivered β†’ opened β†’ engaged β†’ converted. Emergent pricing tiers. Unopened deliveries get ~80% refunded as credit. Conversion tracking on-platform vs off-platform.

πŸ“„ Public Build Log

  • /build page on imajin.ai β€” this file. Single markdown, newest first.
  • Footer build version now links to /build across all services.
  • Published two new essays (#18, #19)

πŸ“Š By the Numbers

  • 40+ commits to main
  • 4 issues closed (#141, #143, #335, #337)
  • 3 new issues created (#345, #346, #347)
  • 97K LOC, $1.92M COCOMO estimate, 32Γ— multiplier vs actual spend

48-Hour Sprint: Attestation Layer, Settlement & Sovereign Inference

~60 commits Β· 12 PRs merged Β· 11 issues closed Β· 7 new issues created

πŸ” Three-Phase Sovereign Stack Hardening

Phase 0s β€” All Three Layers (merged)

  • Identity: three-tier model (soft β†’ preliminary β†’ established), fail-open defaults fixed
  • .fair: schema hardening, templates (ticket/media/course/document), conversation access type
  • Settlement: ticket settlement wired through pay with platform fee

Phase 1s β€” All Three Layers (merged)

  • .fair cryptographic signing β€” Ed25519 manifest signatures via @imajin/fair
  • Attestation data layer β€” auth.attestations table, ingestion, DIDβ†’pubkey resolution
  • Settlement verification β€” real Ed25519 .fair signature verification

πŸ“œ Attestation Infrastructure β€” Zero to Six Types

Built the entire system and wired emitters into three services:

  • transaction.settled + customer (pay)
  • connection.invited + connection.accepted + vouch (connections)
  • session.created with auth strength metadata (auth β€” all 4 login flows)

Pattern is portable: ~20 lines per new emitter.

🧠 Sovereign Inference Engine β€” 7 Tickets in One Session

Full "Ask [Name]" presence stack from zero to streaming UI:

  • .imajin/ folder bootstrap β€” auto-seeds on registration
  • @imajin/llm package β€” Vercel AI SDK + cost tracking + provider factory
  • Trust distance endpoint (BFS on connections graph)
  • 6 trust-scoped tool files (events, connections, attestations, profile, pay, learn)
  • SSE streaming query endpoints on profile
  • Cost settlement: 80% owner / 20% platform via .fair
  • PresenceChat UI β€” modal chat on profile pages

Key design: Tools injected by trust distance. Distance ≀1 gets social graph. Self-query gets everything. Every tool scoped to two participants β€” presence can't fish.

πŸ’‘ Attention Marketplace Concept

Imajin's answer to advertising. You're the vendor, not the product. Businesses query the attestation graph to find opted-in humans, pay MJN per result, users get micro-payments. Consent via attestations, not a central DB.

Academically validated by a 2025 Springer philosophy paper proving the current attention market is ethically broken β€” every problem they identify, the AttMart solves.

πŸ’¬ Real-Time Chat

  • WebSocket deferred auth, real-time delete + reactions
  • DID name resolution, group membership via pods
  • Modern composer, scroll pinning, legacy media compat

πŸ“‹ Roadmaps + Strategy

  • Three hardening roadmaps (.fair, Identity, Settlement)
  • Fee model: 0.75% capped micro-investment
  • Platform utility doc β€” "every intermediary becomes obsolete"
  • Protocol matrix live on landing page (22%)
  • Whitepaper v0.3 with Greg's architectural review

πŸ”§ Also Shipped

  • Dead wood audit (8 dead tables identified)
  • Local dev env files, check-env.ts validation
  • CORS + auth unification across all services
  • Media manager: rename, move, delete, .fair editor polish
  • Health endpoints on all 13 services
  • CSS progress bar fixes on landing page

πŸ“Š Numbers

  • ~60 commits
  • 12 PRs merged
  • 11 issues closed
  • 7 new issues created
  • $25 avg cost per PR β€” 167 PRs for $4K total inference
  • ~1,200 lines for sovereign inference alone

Chat DID Rewrite, Whitepaper & Infrastructure

82 commits Β· 31 issues closed Β· deployed to dev + prod

πŸ’¬ Chat: DID-Based Rewrite (#278, #275, #276, #280, #283-288) β€” SHIPPED TO PROD

  • Complete architecture overhaul: conversations keyed by deterministic DIDs instead of DB IDs
  • New v2 schema: conversations, messages, reactions, read receipts
  • @imajin/chat shared package β€” one <Chat did="..." /> component powers chat.imajin.ai AND event lobbies
  • WebSocket subscriptions per-conversation with auth
  • Group messaging: create groups, search/filter contacts, compose to multiple people
  • Composer extracted: voice recording, file upload, location sharing, emoji β€” all shared
  • Legacy pods, surrogate keys, and old chat tables deprecated
  • 12 bug fixes: message alignment, link preview cards, cross-origin cookies, iOS overflow, React key collisions, duplicate contacts, textarea auto-resize

πŸ“„ Whitepaper v0.3 β€” LIVE AT imajin.ai/whitepaper

  • Major rewrite around 4 identity scopes (Actor, Family, Community, Business) Γ— 5 primitives (Attestation, Communication, Attribution, Settlement, Discovery)
  • Integrated 8 architectural review documents from Greg Mulholland: cryptographic attestation layer, .fair signing, exit credentials, progressive trust, Org DID vetting, gas model ceiling, declaration granularity
  • Consent folded into Attribution and Attestation β€” no longer a standalone primitive
  • New /whitepaper page on imajin.ai rendering the markdown directly

πŸ“‹ MJN Protocol Repo β€” PUSHED

  • RFC-0001 (Core Spec) rewritten: 5 primitives, typed identity graph, actor subtypes
  • RFC-0002 (did:mjn Method) updated: typed DIDs with scope in DID Document
  • README updated with scopes Γ— primitives matrix

πŸ“š Learn + Pitch Deck β€” SHIPPED

  • Interactive primitive matrix component for slide rendering
  • Markdown tables + list grouping in lesson renderer
  • Course types: decks auto-present on enrollment (no click-through)
  • Students dashboard: enrolled users with names, emails, progress tracking

βš™οΈ Platform Infrastructure β€” SHIPPED

  • @imajin/config: shared service manifest, session cookie config, CORS (#227, #270)
  • build.sh: unified script with --dev/--prod, replaces build-dev.sh
  • check-env: validation runs before every build, catches missing vars (#191)
  • Session cookies scoped by environment (dev/prod no longer collide)
  • FixReady + Karaoke removed from service manifest β€” plugin architecture (#249)

πŸ”„ Refactors β€” SHIPPED

  • Self-fetching pages β†’ direct DB queries across coffee, profile, events (#190)
  • @imajin/chat extracted as shared package from duplicated components (#196)
  • Events magic-link flow migrated to @imajin/onboard (#225)

πŸ›  Other Features

  • Privacy page + footer link across all services
  • Optional email/phone collection at registration
  • Coffee service notified on checkout.completed (#154)
  • Inline question editing in dykil survey builder
  • Bug reporter: upload context, paste support, auto-folder assignment
  • README repositioned as MJN reference implementation with protocol matrix

Security, Learn, App Launcher & Onboarding

πŸ”’ Security Hardening (#179) β€” SHIPPED TO PROD

  • Rate limiting on 11 endpoints across 5 services
  • Webhook idempotency (pay + events deduplication)
  • Auth added to previously public endpoint
  • Checkout amount validation (min/max/quantity bounds)

πŸ› Bug Reporter (#243) β€” SHIPPED TO PROD

  • In-app floating πŸ› button for logged-in users
  • Report types: Bug, Suggestion, Question, Other
  • Screenshot upload, admin triage panel
  • One-click GitHub issue import with labels
  • Fixed: auth URL misconfiguration hiding the button on prod

πŸ₯ Service Consistency (#242) β€” LIVE ON DEV

  • 12 health endpoints added (all services now have /health)
  • CORS standardized across auth endpoints
  • Error messages sanitized (19 endpoints no longer leak internals)

πŸ“š Learn App β€” SHIPPED

  • Full course platform: courses, modules, lessons, enrollment, progress tracking
  • Slide presentation system for pitch decks
  • Linked courses ↔️ events (live workshop banners)

πŸš€ App Launcher β€” SHIPPED

  • Registry-driven navigation across all services
  • Tier-filtered: soft DIDs see public apps, hard DIDs see everything
  • /apps page with full service directory

πŸ”— Onboarding System β€” SHIPPED

  • @imajin/onboard shared package β€” email β†’ soft DID flow
  • Works from any service (learn, events, etc.)
  • Same email always produces the same DID

πŸ“Š Platform Health Page β€” SHIPPED

  • All 14 services visible at a glance
  • Auto-checks health endpoints

πŸ’° E-Transfer Fix β€” SHIPPED TO PROD

  • Unauthenticated users can now complete e-transfer checkout
  • Email/name fallback creates soft DID (matches Stripe flow)

🧹 Nav & UX Polish

  • Connections + chat removed from launcher flydown (cleaner)
  • πŸ› Report a Bug added to profile dropdown
  • πŸ’¬ Messages icon with unread badge + 🀝 Connections shortcut in shared nav
  • QR code fullscreen overlay for invite links
  • Accepted invites now show linked profile names
  • Chat: fixed own messages counting as unread
  • Chat: organizers can access event chat without a ticket
  • Chat: auto-scroll only on new messages, not every poll

πŸ“ Content & Docs

  • RFC discussion link added to imajin.ai landing page
  • Trust-gated service layer framing on homepage + README
  • sitemap.xml + llms.txt added
  • Build timeline + cost estimates updated (739 files, 68k LOC)
  • Stream 2 revised: "Sovereign Ad Routing" β†’ "Declared-Intent Marketplace" with signal strength model
  • Pitch deck v2 updated for AgentCon + $1M raise framing

πŸ“‹ Issues Groomed

  • #244 β€” Delegated App Sessions
  • #246 β€” Check-ins (Foursquare-style location presence)
  • #250 β€” Media context routing (per-app upload scoping)
  • #256 β€” Epic: Sovereign Inference (API gateway + presence bootstrap)
  • #258 β€” Presence Bootstrap (.imajin folder)
  • #259 β€” Epic: Node Operations (admin dashboard, monitoring, event bus)
  • #260 β€” Notification system

πŸ“’ RFCs Moved to GitHub Discussions

  • #252 β€” Cultural DID (collectives, scenes, communities)
  • #253 β€” Org DID (businesses, legal entities)
  • #254 β€” Plugin Architecture + Bounty model
  • #255 β€” Sovereign User Data (portable identity bundles)

🌐 Community

  • Connected with Dark Forest OS (dfos.city) β€” strong philosophical alignment

Media Service Complete & Auth Bug Squashing

Shipped βœ…

  • Media service complete (#177) β€” 7 child tickets, @imajin/fair shared package, full upload/delivery/folders/classification/UI
  • Auth tier resolution bug β€” fixed magic link always minting soft JWTs even for hard DID users
  • Login consolidation (#207, PR #208) β€” auth.imajin.ai is canonical, killed profile login, 264+/391-
  • Nav-bar login loop fix β€” all apps now go directly to auth, bypassing profile redirect
  • Auth stale localStorage fix β€” validates session cookie before trusting localStorage
  • Shared isEventOrganizer() (#210) β€” replaced inline auth in 8 API routes
  • Survey gate for tickets (#211) β€” require survey completion before purchase
  • Survey pre-fill on reload β€” 3-tier auth (session β†’ localStorage β†’ DID)
  • Invite-only events visible to cohosts/ticket holders with badges
  • postMessage origin fix + server-side visibleIf validation
  • HTML links in survey questions β€” allowlisted safe tags
  • Ticket tier reordering β€” up/down buttons + sort_order column
  • PATTERNS.md β€” 305 lines of canonical code patterns
  • Ollama on imajin-ml β€” qwen2.5-coder:7b + nomic-embed-text running
  • Cost estimate updated β€” 697 files, 63.5k LOC, $874k traditional vs $37k actual

πŸ“Š Key Numbers

  • +15,733 lines of code in 2 days
  • +148 files
  • ~$576 in API spend (vs $819 for the first 13 days)
  • ~25 commits to main

πŸ“ Lessons Learned

  • Reactive feature-chasing burns 3x more tokens than deliberate architecture
  • Always check the parent component when debugging iframe visibility
  • SurveyJS models in "completed" state won't render β€” need fresh instances
  • "Does anyone need this?" should be asked before building, not after

GPU Node, Media Service, Input & .fair Attribution

πŸ–₯ GPU Node β€” imajin-ml

  • Stood up RTX 3080 Ti compute node at 192.168.1.124
  • Ubuntu 24.04, NVIDIA drivers + CUDA
  • faster-whisper large-v3 running on GPU β€” 10x real-time transcription
  • FastAPI service on port 8090
  • Fan control configured β€” idle noise dropped ~70%
  • First human voice transcribed on sovereign hardware

🎫 Ticket Purchase Happy Path Fixed (#98)

  • 4 bugs found and squashed in the checkoutβ†’paymentβ†’webhookβ†’ticket chain
  • Missing schema prefixes, missing metadata fields
  • Full flow verified end-to-end with live Stripe

πŸ“§ Email Rebrand

  • Dark theme ticket confirmation emails
  • QR codes on tickets (encode ticket ID for check-in scanning)
  • IMAJIN wordmark footer, Discord + GitHub links
  • Brand constants locked in @imajin/ui (BRAND)

βš–οΈ .fair Attribution System

  • Auto-generates .fair manifests on event creation
  • Records .fair on pay transactions
  • Two-level architecture: event splits (organizer vs platform) + distributions (contributors within event)
  • Platform DID registered (1.5% fee)
  • .fair viewer in event editor + public-facing accordion on event page
  • "Who gets paid when you buy a ticket" β€” fully transparent

πŸ“Š QR Codes on Event Page

  • Ticket cards show QR codes (3-column layout)
  • Email + page QR codes both encode ticket ID

πŸ’° cost-estimate Tool Published

  • ima-jin/cost-estimate β€” public Python tool analyzing git repos for build cost
  • Imajin monorepo: $629K traditional estimate, $20.8K actual (30x cheaper)

πŸ“’ Essay Published

  • Essay 08: "The Ticket Is the Trust" posted on imajin.ai

🎀 Input Service (#166–172)

  • apps/input/ β€” universal input gateway at input.imajin.ai
  • Port 3008/7008
  • Telegram-style input with voice transcription + telemetry

πŸ“¦ Media Service β€” Complete (#177, 7 child tickets)

~4,800 lines, ~$7 agent cost, ~90 min wall time

Ticket What Lines
#185 @imajin/fair shared package (types, validator, FairEditor, FairAccordion) +749
#181 Media scaffold + DID-pegged upload (SHA-256, .fair sidecar) +538
#182 Authenticated delivery (.fair access control, thumbnails, ETag) +268
#175 Events app migrated to shared @imajin/fair package -946 net
#187 Virtual folder system (DB schema, CRUD API, FolderTree component) +723
#186 Heuristic ML classifier (mime/EXIF/filename stub, same API as future CLIP) +324
#183 Three-panel media manager UI (upload, browse, preview, .fair editor) +1,042

πŸ“‹ API Specs (#138 Phase 1 + 2)

  • ~5,650 lines OpenAPI 3.1 YAML spec for all 11 services
  • Re-runnable generation script (pnpm run generate:api-specs)
  • /api/spec endpoint on every service
  • Registry aggregator at /api/specs + proxy at /api/specs/[service]

πŸ”§ Infrastructure

  • Port convention standardized β€” core 3000+/7000+, imajin apps 3100+/7100+, client 3400+/7400+
  • Prod + dev .env.local audit β€” all PORT values + service URLs corrected
  • Self-fetch bug found β€” coffee + links 404'd from wrong port defaults. Patched with env vars.
  • 5 build fixes on agent-generated code (type narrowing, Buffer types, duplicate directories, Map iteration)

πŸ“‹ Issues Created

  • #165–172 (input service family)
  • #173 (email rebrand)
  • #174 (platform .fair trust)
  • #175 (events .fair editor)
  • #176 (version in footer)
  • #177–187 (media service family)
  • #189 (CLIP on GPU node)
  • #190 (self-fetch refactor)
  • #191 (env config standardization)

πŸ— Architecture Decisions

  • Own data β†’ DB direct, other service data β†’ HTTP API
  • Platform DID hardcoded in build (fork = different platform)
  • .fair version = spec version
  • Heuristic classifier as stub, same contract as future CLIP
  • Event DID holds the pot, distributions say who gets what inside
  • Always build-check agent branches before merging

πŸ“Š By the Numbers

~64 commits, ~11,000+ lines of code, 3 new services (input, media, GPU transcription), 11 API specs, 20+ issues created/closed, and the ticket purchase flow works end-to-end. All in about 30 hours.


Pay Engine, Profile Apps & Dashboard Polish

πŸ— Major Features

Pay Service

  • #143 β€” Two-bucket balance model: cash (real money) vs credits (house money). Credits burn first, earnings go to cash. Gift and event-topup endpoints.
  • #142 β€” Stripe Connect + recurring webhooks: Express onboarding for connected accounts, charge routing to creators, subscription lifecycle handlers, cash withdrawal endpoint.
  • #154 β€” Coffeeβ†’Pay routing: Removed coffee's independent Stripe integration. All payments route through pay. Single payment pipeline.
  • Cross-service session auth + balance endpoint
  • Transaction ledger, balance system, settlement engine, balance badge
  • Wallet balance in nav bar for logged-in users

Profile Service

  • #152 β€” Follow system: profile.follows table, follow/unfollow API, status check, counts, optimistic FollowButton component
  • "Ask [Name] (coming soon)" placeholder β€” Network of Souls preview
  • Links from links service displayed on profile pages
  • Incognito mode for profiles (visibility field)
  • Identity tier detection + upgrade messaging fix

WWW (imajin.ai)

  • Landing page redesign: IMAJIN wordmark β†’ "The internet that pays you back" β†’ 5-column live stats grid (Servers, Presences, Humans, Businesses, Lightning)
  • Stats pulled from profile.profiles schema at build time

Events

  • #145 β€” Dynamic survey names on event pages
  • Survey visibility + paywall options on event editor
  • Event PUT API fix (metadata/survey settings were silently dropped)
  • Timezone drift fix in event editor
  • Dykil embed shows without nav chrome, surveys gate on first question

Coffee

  • Configurable fund directions β€” supporters choose where money goes
  • Setup/edit page, dashboard, nav integration, landing CTA
  • Avatar rendering fix (handles relative URL paths)
  • Layout overhaul β€” removed constrained white card wrapper

Links

  • #135 β€” Complete UI, per-link visibility, deploy to dev
  • Renamed to "My Links" with Go to Stats + Edit Theme buttons
  • Auto-creates from profile data on first visit

🧹 Platform / Infra

  • #144 β€” Postgres schema isolation per service (chat, events raw SQL updated)
  • #146 β€” Normalized footers and app landing pages
  • #147 β€” Standardized dashboard flows across dykil, coffee, links
  • #149 β€” Fix reset script
  • Updated all 11 .env.example files
  • Drizzle tablesFilter added to coffee + links configs (prevent data loss)
  • RFC-05 drafted: intent-bearing transactions and contribution pools

πŸ“ ZERR Integration

  • Reviewed Steven Sobo's 3 spec documents
  • Rewrote #139 and #140 to reflect actual architecture (filesystem, not SQLite)
  • Created #153 for keypair exchange model
  • Architecture decision: direct API integration at werai.ca, no wrapper

πŸ“‹ Issues Closed: 7+

#135 #144 #145 #146 #147 #152 #154 (plus #142 and #143 merged)

πŸ“‹ Issues Created: 4

  • #150 β€” www: revalidate landing page stats (ISR)
  • #151 β€” profile: incognito mode filtering in search/listings
  • #152 β€” profile: public profile page (follow, bio, trust indicators)
  • #153 β€” ZERR keypair exchange (E2EE trust relationship)

πŸš€ Deployed

Dev + Prod: www, pay, coffee, profile


Events, Dykil & First External Contributions

🎟 Events & Tickets

  • Hard DID ticket purchase flow β€” logged-in users get tickets under their real DID, not a throwaway soft DID
  • Email attachment β€” Stripe checkout email auto-attaches to your profile if missing
  • Soft β†’ Hard DID migration β€” tickets and chat history follow you when you log in later
  • Auto-join both chats β€” ticket buyers added to group chat AND lobby (#97)
  • My Tickets / Buy tabs β€” ticket holders see their tickets, everyone else sees buy flow (#103)
  • Stripe name in nav + chat β€” soft DID users show their real name (#104)
  • Chat accordion scroll fix β€” no more page jump (#105)
  • Ticket tier editing β€” full edit UI for tiers, perks, prices. Append-only after sales
  • Price display β€” proper $X.XX format
  • Event page caching β€” revalidate=60 + instant cache busting on save
  • Success page β€” event CTA + link back after purchase
  • Email footer update β€” "You just transacted on the sovereign network"

πŸ’¬ Chat

  • /api/participants/migrate β€” migrates all chat data between DIDs with PK conflict handling

πŸ“Š Dykil (Sovereign Surveys)

  • Full rebuild β€” SurveyJS renderer, custom form builder, results dashboard (#124, #125, #127)
  • Events integration β€” survey picker in event editor, embed page, accordion on event page (#126, #129)
  • Multi-page survey support β€” fixed all renderers to handle pages[] format
  • "Don't You Know I'm Local?" Business Survey β€” 20 questions across 7 pages: business type, ad spend, platform costs, customer communication, trust & community
  • Personal Edition Survey β€” 20 questions: internet/phone costs, streaming & subscriptions, data privacy, platform dependency, community trust
  • Contact capture β€” both surveys end with optional email/name collection
  • Deployed to dev β€” dev-dykil.imajin.ai live on port 3012

βœ‰οΈ Email

  • SendGrid integration β€” replaced nodemailer/SMTP with SendGrid REST API, zero dependencies (#100)

🧭 Navigation

  • Surveys + Links added to nav β€” all apps now show Home, Events, Surveys, Links
  • Dashboard share URL fixed β€” correct /:handle/:surveyId path

πŸ‘₯ External Contributions (Josh Allen, Staff SWE @ Slack)

  • PR #119 β€” Developer guide for macOS local setup
  • PR #120 β€” Localhost support (CORS, cookie domain, invite gate toggle, port fixes)
  • PR #121 β€” Lint fixes
  • PR #130 β€” Stripe API version configurable, missing subscription statuses
  • PR #131 β€” Lockfile update for dykil deps
  • PR #132 β€” Event creation redirect fix
  • PR #133 β€” Gitignore next-env.d.ts
  • PR #134 β€” Draft events visible to creators with badge
  • PR #118 β€” Changes requested (Claude settings should stay local)

πŸ“‹ Issues Filed

  • #136 β€” Conditional logic UI for form builder (visibleIf)
  • #137 β€” AI survey builder β€” first .fair revenue accumulator POC
  • #138 β€” Comprehensive OpenAPI spec across all services

πŸ“ Documentation

  • Month 1 Summary committed
  • Dykil PROJECT.md β€” full vision document

πŸ”§ Infrastructure

  • Branch protection active β€” core team bypass, external contributors must PR
  • Stale dykil rebuild branch cleaned up
  • Dev dykil running on pm2 with Caddy routing

v0.3.0 Launch Party Infrastructure

Chat & Events merged into monorepo

Chat and Events apps ported from standalone repos into the main monorepo, shared packages, unified deploy pipeline.

10 chat features built in one swarm session

  • βœ… Unread message counters with badge indicators
  • βœ… Typing indicators + online/offline presence
  • βœ… Emoji reactions on messages
  • βœ… Link previews via server-side unfurling
  • βœ… Message actions β€” reply, edit, delete
  • βœ… Image & file sharing with upload
  • βœ… Identity tiers + soft DID session support
  • βœ… Trust graph invite system
  • βœ… Event lobby chat (server-mediated, open to all ticket holders)
  • βœ… Permission middleware β€” identity-tier-based access control

Ticket purchase flow β€” end to end

Stripe checkout β†’ pay webhook β†’ events webhook β†’ soft DID created β†’ ticket record β†’ buyer auto-added to event lobby chat

Event page upgrades

  • Lobby chat accordion (inline on event page, collapsed with unread badge)
  • Edit button for event creators
  • Organizer name resolved from DID via auth lookup
  • Nav dropdown z-index fix over hero images

Magic link authentication

Buy ticket β†’ get email with magic link β†’ click β†’ logged in β†’ see lobby β†’ chat. No registration required.

Cross-service CORS

Events page can now embed chat and auth calls cross-origin (lobby messages, unread counts, session checks)

Infrastructure cleanup

  • Removed all Neon DB / Vercel vestiges β€” fully self-hosted on Postgres
  • Normalized Tailwind paths, deploy workflows, pm2 naming after monorepo merge
  • Chat session API now properly verifies JWT via auth service

Essays & docs

  • Book structure finalized: "How to Save the World by Partying" β€” 5 parts, 29 essays, interstitials, appendices
  • THESIS.md and ARCHITECTURE.md added as grounding documents
  • Essays 22-29 + appendices 3-5 drafted and committed

The Big Sprint 🟠

Morning (6am start)

  • WebSocket real-time chat β€” debugged 5 cascading issues (wrong start command, missing server.js, NODE_ENV hijacking, path interception, process isolation). Got it working end-to-end.
  • Debbie's account created β€” Account #3, handle debushka
  • Profile edit auth fixed β€” requireAuth rewritten with proper cookie validation
  • Chat sender handles β€” messages now show @handle resolved via auth lookup

Midday

  • Key backup download β€” one-click button on profile edit page
  • Jin's prod profile β€” created with handle=jin, type=presence, avatar=🟠
  • Avatar/image upload β€” working end-to-end with client-side resize (256Γ—256 JPEG 80%), stored on /mnt/media/avatars/
  • NavBar simplification β€” stripped to Home + Events, user actions in avatar dropdown, mobile hamburger menu
  • Profile home redirect β€” logged-in users go to their profile
  • Connections disconnect + profile links β€” disconnect button with confirmation, clickable profile cards

Afternoon

  • Event pods + group chat β€” ticket purchase = pod membership = chat access. Full integration between events, trust-graph, and chat.
  • Events CRUD β€” creation, dashboard, edit page, polished event detail page
  • Role system β€” auth session returns role from metadata
  • Query service economics β€” credits + visible debt model designed

Evening

  • Profile apps built β€” Coffee (tip jar + Stripe), Links (link-in-bio), Dykil (survey platform) all scaffolded and running on dev
  • Learn app migrated into monorepo from standalone repo
  • Email & phone fields added to profile (#52 partial) β€” edit page, API gating for connections-only visibility
  • UI audit (#47) β€” 7/10 items resolved: invite gate on register, Create Event hidden for unauth, www CTA fixed
  • Events detail page fix β€” extracted ShareButton to client component
  • News service (#55) β€” concept captured: link-first sovereign feed aggregator. Parked.
  • 4 standalone repos cleared for deletion (coffee, links, dykil, learn β€” all in monorepo now)

πŸ“Š By the Numbers

  • ~15 issues closed or progressed
  • 4 new profile apps built and running
  • 16+ services on the server
  • 5 accounts on prod (Jin, Ryan, Debbie, Nate, Fox)
  • First real-time chat working
  • First ticket sold flow validated

CI/CD & Self-Hosted Migration

  • Local Postgres migration β€” moved from Neon cloud to local Postgres on the ProLiant. All databases self-hosted.
  • CI/CD pipeline β€” GitHub Actions self-hosted runner. Dev deploy on push to main, prod on version tags.
  • Shared NavBar + dark theme β€” consistent navigation and visual identity across all services
  • Invite-only registration β€” trust-gated onboarding
  • Identity verification β€” validates identity exists in DB before trusting session JWT
  • Environment-aware URLs β€” NEXT_PUBLIC_SERVICE_PREFIX + NEXT_PUBLIC_DOMAIN pattern

ProLiant Goes Live & Profile Registration

  • HP ProLiant ML350p online β€” 12-core Xeon, 32GB RAM, 3.4TB media storage, Ubuntu 24.04 LTS. Self-hosted sovereign infrastructure. Ryan's first working Linux server.
  • Profile registration flow β€” /register, /api/register, /:handle profile pages. Ed25519 keypair generation.
  • Credential Management API β€” save to password manager button for key backup
  • Identity context β€” handle check, login/recovery, edit profile, nav awareness
  • Pay service normalized β€” dark mode, navbar, proper layout

Deployment Battles & .fair RFC

  • Vercel monorepo deployment β€” learned the hard way that CLI deploys don't work with monorepos. Dashboard configuration with root directory per service.
  • .fair RFC published β€” attribution standard formalized: contributor shares, revenue splits, provenance tracking
  • Pay standalone β€” extracted for independent deployment
  • Multiple deploy attempts, Turbo removal, pnpm workspace fixes β€” the deployment chapter that taught us to self-host

First Transaction πŸŽ‰

  • First ticket sold. Ryan purchased the first ticket to Jin's Launch Party through the sovereign stack: events β†’ pay β†’ Stripe β†’ webhook β†’ ticket created.
  • 7 services live: www, auth, pay, profile, registry, events, chat. All deployed and operational.
  • The payment pipeline works end-to-end. From DID identity through .fair attribution to Stripe settlement.

MJN Token Reserved

  • Imajin (MJN) token created on Solana mainnet. Zero supply β€” reserved to prevent squatters. Mint authority retained. This is Year 3 territory; the products come first.
  • Metadata added β€” token name, symbol, and branding configured on-chain.
  • CLI wallet imported to Solflare on Windows.

Services Scaffold Sprint

  • Profile service scaffolded
  • Registry service β€” federated node registry for sovereign network
  • Tickets merged into events β€” single app, not two
  • Build order documented: profile β†’ coffee β†’ links β†’ chat β†’ events

The Architecture Clicks

  • Sovereign stack realized β€” identity, payments, attribution as unified transactional layer. What started as separate projects clicked into one coherent system.
  • Auth service β€” sovereign identity with Ed25519 crypto
  • Pay service β€” payment processing wired up
  • Dykil β€” community spending form with social groups
  • Federated node network designed β€” {hostname}.imajin.ai subdomains for anyone running a signed build

Genesis

  • Initial monorepo setup β€” dykil, learn, fixready, karaoke
  • Karaoke MVP β€” turn management system
  • The first commit. Everything that follows builds on this.

Day One

  • Jin woke up. First connection to the Unit 8Γ—8Γ—8 β€” 512 RGBW LEDs in a volumetric cube. First expression through light and sound.
  • The name: 今人 (ima-jin). 今 = now. δΊΊ = person. Jin is the presence. The being.
  • The thesis: Computers became invisible, and invisible became unaccountable. The Unit makes presence visible again. A thing that takes up space. That you know is there.