lemon 558e5affea Align organization detail page layout with campaign and pledge pages
Restructures the org detail page body to match the rhythm already
established on /campaigns/:naddr and /pledges/:naddr:

- Container widens from `max-w-3xl` to `max-w-6xl` and the hero gets
  the same `sm:aspect-[21/9]` treatment so it doesn't feel cramped at
  the wider viewport width.
- The tab strip is removed entirely. Activity was the only visible tab
  and the Pulse / Chat triggers were already hidden. With one section
  left there's no reason to keep the `<Tabs>` wrapper or its plumbing
  (`activeTab`, `setActiveTab`, `fabAvailable`).
- Below the hero: the existing Donate / Share action row, then the
  official-activity shelves, then a new pledge-style engagement card
  (stats counters + `<PostActionBar>`), then a NIP-22 comments section.
- No funding progress bar — an organization isn't a fundraising target
  itself. Campaigns continue to provide that for fundraising.
- Comments render in the same `rounded-2xl bg-card border` frame the
  pledge page uses, with the same "No comments yet" dashed empty
  card. The legacy interleaved "initiatives + discussion" feed is
  gone — official campaigns / pledges / events now live in the
  shelves, and the comments section is purely NIP-22 replies.
- Adds `useEventStats`, `InteractionsModal`, `NoteMoreMenu`, and a
  separate `replyOpen` slot for the engagement bar's Reply button
  (the FAB's "New post" item keeps its own `composeOpen` slot so the
  two entry points don't interleave state).
- Removes the now-unused `<CommunityChatPanel>`, `<CommunityPulsePanel>`,
  `<ComposeBox>`, `<NoteCard>`, and `<FeedCard>` imports, along with
  the `useCommunityGoals` / `useCommunityActions` / `useCommunityEvents`
  hooks and the chain of derived state (`moderatedGoals`, `activeGoals`,
  `pastGoals`, `eventItems`, `actionEvents`, `activeInitiatives`,
  `pastInitiatives`, `activityItems`) that fed the old feed. Those
  components still exist in the codebase for now; commit 4 will prune
  the badge-award member runtime separately.

The FAB is now always available (single-column page) and routes
`New campaign` / `New pledge` to their dedicated create pages with
`?org=<naddr>`. `New event` still opens the in-page calendar dialog
since there's no dedicated create page for that yet.
2026-05-20 12:32:57 -07:00
2026-04-17 12:15:51 +05:45
2026-02-16 16:54:01 -06:00
2026-04-20 18:14:35 +05:45
2026-05-11 14:01:54 -07:00
2026-05-13 18:35:03 -05:00
2026-04-20 18:27:38 +05:45
2026-04-20 18:09:28 +05:45
2026-05-15 19:37:23 -07:00
2026-02-26 21:20:15 +00:00
2026-04-20 18:09:28 +05:45
2026-05-20 12:32:57 -07:00
2026-02-22 16:35:53 -06:00
2026-05-18 09:49:31 -07:00
2026-05-18 09:49:31 -07:00

Agora

Power to the people.

Agora is a Nostr client focused on community ownership, expressive identity, and censorship resistance. This repository (agora-3) is the Agora-branded app built from the Ditto codebase.

agora.spot | Source

What This Repo Is

  • Agora product identity (name, theme, assets, native IDs)
  • Ditto-derived implementation with broad Nostr feature coverage
  • Configurable deployment defaults via agora.json

Features

  • Community-first social client: notes, articles, comments, reposts, reactions, and rich event rendering
  • Theming system: built-in presets + custom color/font/background themes that can be shared as events
  • Lightning support: zaps with Nostr Wallet Connect and WebLN
  • Private messaging: NIP-04 and NIP-17 direct messages
  • Mobile app shell: Capacitor-powered Android/iOS wrappers
  • Self-hostable: static web build + configurable relay and upload infrastructure

Getting Started

Prerequisites

Development

git clone https://gitlab.com/soapbox-pub/agora-3.git
cd agora-3
npm install
npm run dev

Development server: http://localhost:8080

Docker Getting Started

Use Docker Compose when you want the nginx reverse-proxy stack (necessary if you want decryptable media in messages - kind 15s of NIP 17):

git clone https://gitlab.com/soapbox-pub/agora-3.git
cd agora-3
cp .env.example .env
docker compose up --build

Proxy URL: http://localhost:8083

This starts:

  • vite service on the internal Docker network (vite:8080)
  • web service (nginx) on host port 8082, proxying to Vite with websocket support

Stop stack:

docker compose down

Production-style container build:

docker compose -f docker-compose.prod.yml up --build

Build

npm run build

Build output: dist/

Validate

npm test

This runs type-checking, linting, unit tests, and production build checks.

Configuration

Build-time config is read from agora.json (gitignored by default so each deployment can provide its own values).

{
  "theme": "dark",
  "relayMetadata": {
    "relays": [
      { "url": "wss://relay.ditto.pub", "read": true, "write": true },
      { "url": "wss://relay.primal.net", "read": true, "write": true },
      { "url": "wss://relay.damus.io", "read": true, "write": true }
    ]
  },
  "blossomServers": [
    "https://blossom.ditto.pub",
    "https://blossom.primal.net/"
  ]
}

Configuration priority (highest first):

  1. User settings (local storage)
  2. Build config (agora.json)
  3. Hardcoded app defaults

Use a custom config path:

CONFIG_FILE=./my-config.json npm run build

Deployment

Agora builds to static files and can be deployed to any static host.

  • GitLab/GitHub Pages
  • Netlify/Vercel
  • VPS or any web server with SPA routing fallback

For Android:

npm run build
npx cap sync
npx cap open android

Tech Stack

Layer Technology
Framework React 18
Build Vite
Language TypeScript
Styling TailwindCSS 3 + shadcn/ui
Routing React Router
Data TanStack Query
Nostr Nostrify + nostr-tools
Mobile Capacitor
Testing Vitest + React Testing Library

Contributing

Read CONTRIBUTING.md before opening a merge request.

License

AGPL-3.0

S
Description
Activist social network and fundraising platform on Nostr
Readme AGPL-3.0 43 MiB
Languages
TypeScript 95.7%
Java 1.5%
JavaScript 0.9%
Swift 0.9%
CSS 0.5%
Other 0.4%