diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 42ac0f4b..8c6bbb93 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -50,7 +50,7 @@ deploy-nsite: nsyte deploy ./dist -i --sec "$NSITE_NBUNKSEC" - --name ditto + --name agora --relays "wss://relay.ditto.pub,wss://relay.nsite.lol,wss://relay.dreamith.to,wss://relay.primal.net" --servers "https://blossom.primal.net,https://blossom.ditto.pub,https://blossom.dreamith.to" --fallback "/index.html" @@ -154,24 +154,24 @@ build-apk: # Copy APK to a predictable artifact path - mkdir -p artifacts - - cp android/app/build/outputs/apk/release/app-release.apk "artifacts/Ditto.apk" - - cp android/app/build/outputs/bundle/release/app-release.aab "artifacts/Ditto.aab" + - cp android/app/build/outputs/apk/release/app-release.apk "artifacts/Agora.apk" + - cp android/app/build/outputs/bundle/release/app-release.aab "artifacts/Agora.aab" - ls -lh artifacts/ # Upload to Generic Packages registry for a stable public download URL - | curl --fail --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \ - --upload-file "artifacts/Ditto.apk" \ - "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ditto/${CI_COMMIT_TAG}/Ditto-${CI_COMMIT_TAG}.apk" + --upload-file "artifacts/Agora.apk" \ + "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/agora/${CI_COMMIT_TAG}/Agora-${CI_COMMIT_TAG}.apk" - | curl --fail --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \ - --upload-file "artifacts/Ditto.aab" \ - "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ditto/${CI_COMMIT_TAG}/Ditto-${CI_COMMIT_TAG}.aab" + --upload-file "artifacts/Agora.aab" \ + "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/agora/${CI_COMMIT_TAG}/Agora-${CI_COMMIT_TAG}.aab" artifacts: paths: - - artifacts/Ditto.apk - - artifacts/Ditto.aab + - artifacts/Agora.apk + - artifacts/Agora.aab expire_in: 90 days cache: key: android-gradle @@ -194,7 +194,7 @@ release: VERSION="${CI_COMMIT_TAG#v}" RELEASE_NOTES=$(awk "/^## \\[${VERSION}\\]/{found=1; next} /^## \\[/{if(found) exit} found{print}" CHANGELOG.md) if [ -z "$RELEASE_NOTES" ]; then - RELEASE_NOTES="Ditto ${CI_COMMIT_TAG}" + RELEASE_NOTES="Agora ${CI_COMMIT_TAG}" fi - echo "$RELEASE_NOTES" > release-notes.md release: @@ -203,11 +203,11 @@ release: description: './release-notes.md' assets: links: - - name: Ditto-${CI_COMMIT_TAG}.apk - url: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ditto/${CI_COMMIT_TAG}/Ditto-${CI_COMMIT_TAG}.apk + - name: Agora-${CI_COMMIT_TAG}.apk + url: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/agora/${CI_COMMIT_TAG}/Agora-${CI_COMMIT_TAG}.apk link_type: package - - name: Ditto-${CI_COMMIT_TAG}.aab - url: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ditto/${CI_COMMIT_TAG}/Ditto-${CI_COMMIT_TAG}.aab + - name: Agora-${CI_COMMIT_TAG}.aab + url: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/agora/${CI_COMMIT_TAG}/Agora-${CI_COMMIT_TAG}.aab link_type: package publish-zapstore: @@ -230,7 +230,7 @@ publish-zapstore: - mkdir -p ~/.config/zsp/bunker-keys - echo "$ZAPSTORE_CLIENT_KEY" > ~/.config/zsp/bunker-keys/${BUNKER_PUBKEY}.key - - APK_PATH="artifacts/Ditto.apk" + - APK_PATH="artifacts/Agora.apk" - VERSION="${CI_COMMIT_TAG#v}" - sed -i "2i release_source:\ ./${APK_PATH}" zapstore.yaml - sed -i "2i version:\ ${VERSION}" zapstore.yaml @@ -252,8 +252,8 @@ publish-google-play: # Upload the AAB to Google Play production track - >- fastlane supply - --aab artifacts/Ditto.aab - --package_name pub.ditto.app + --aab artifacts/Agora.aab + --package_name pub.agora.app --track production --json_key /tmp/play-service-account.json --skip_upload_metadata diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 22568779..88de2aa7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,42 +1,42 @@ -# Contributing to Ditto +# Contributing to Agora -We welcome contributions, but we have high standards. Ditto is a carefully designed product with a specific vision, and every merge request must meet that bar. This guide exists to help you succeed. +We welcome contributions, but we have high standards. Agora is a carefully designed product with a specific vision, and every merge request must meet that bar. This guide exists to help you succeed. **Required reading before you start:** -- [Ditto Philosophy](https://about.ditto.pub/philosophy) -- the product vision. Your change must align with it. -- [Contributing Guide](https://about.ditto.pub/contributing) -- the upstream contribution process. +- [Agora Philosophy](https://agora.spot/philosophy) -- the product vision. Your change must align with it. +- [Contributing Guide](https://agora.spot/contributing) -- the upstream contribution process. - `AGENTS.md` in this repo -- the codebase conventions. Your AI tool should load this file. -## Understanding Ditto +## Understanding Agora -Ditto is a carnival, not a platform. Before contributing, you need to understand what that means. +Agora is a carnival, not a platform. Before contributing, you need to understand what that means. ### The product decision filter -Every change to Ditto should pass this test: +Every change to Agora should pass this test: -> *Does this make Ditto more magnetic, more threatening to the status quo, and more peaceful to inhabit?* +> *Does this make Agora more magnetic, more threatening to the status quo, and more peaceful to inhabit?* -- **Magnetic** -- Ditto attracts through experience, not ideology. People don't need to understand Nostr to love it. They need to feel something they haven't felt online since the early web. Features should be odd, intriguing, and captivating -- not generic social media clones. -- **Threatening to the status quo** -- Ditto threatens mainstream platforms when someone opens it and thinks: *"Why can't my platform do this?"* Theming, games, treasure hunts, interoperable micro-apps -- these are things walled gardens can't replicate. -- **Peaceful to inhabit** -- Ditto displaces argument with creation, conformity with expression, and consumption with participation. No ads, no engagement-optimized algorithms, no outrage incentives. +- **Magnetic** -- Agora attracts through experience, not ideology. People don't need to understand Nostr to love it. They need to feel something they haven't felt online since the early web. Features should be odd, intriguing, and captivating -- not generic social media clones. +- **Threatening to the status quo** -- Agora threatens mainstream platforms when someone opens it and thinks: *"Why can't my platform do this?"* Theming, games, treasure hunts, interoperable micro-apps -- these are things walled gardens can't replicate. +- **Peaceful to inhabit** -- Agora displaces argument with creation, conformity with expression, and consumption with participation. No ads, no engagement-optimized algorithms, no outrage incentives. If a change does all three, it belongs. If it only does one, think harder. If it does none, it doesn't belong here. -### What Ditto is NOT +### What Agora is NOT - A Twitter/X clone with decentralization bolted on - A place to replicate features that mainstream platforms already do well - A showcase for generic UI components or boilerplate social features -### What Ditto IS +### What Agora IS - A convergence point for interoperable Nostr experiences (games, treasure hunts, magic decks, themes, color moments, live streams, and things nobody has imagined yet) - A place where profiles feel like worlds, not business cards - The most fun you've had on the internet in years -Read the [full philosophy](https://about.ditto.pub/philosophy) for the complete vision. +Read the [full philosophy](https://agora.spot/philosophy) for the complete vision. ## What we accept @@ -46,15 +46,15 @@ One bug, one merge request. Fix exactly one thing. Don't bundle unrelated change ### New features and significant changes -Every feature MR must link to an existing open issue and clearly align with the [Ditto Philosophy](https://about.ditto.pub/philosophy). The philosophy alignment section in the MR template is where you make the case for why your change belongs in Ditto. If you can't articulate that clearly, the change probably doesn't belong. +Every feature MR must link to an existing open issue and clearly align with the [Agora Philosophy](https://agora.spot/philosophy). The philosophy alignment section in the MR template is where you make the case for why your change belongs in Agora. If you can't articulate that clearly, the change probably doesn't belong. If you have an idea for a feature that doesn't have an issue yet: -1. Build it as a standalone Nostr app first (see [Contributing Guide](https://about.ditto.pub/contributing)). +1. Build it as a standalone Nostr app first (see [Contributing Guide](https://agora.spot/contributing)). 2. Prove it works and get user feedback. 3. Open an issue to discuss integration. -**Feature MRs that don't link to an issue or don't align with the Ditto Philosophy will be closed.** Our open issues are our internal roadmap -- some require deep product context. If your implementation doesn't match the product vision, it will be closed regardless of code quality. +**Feature MRs that don't link to an issue or don't align with the Agora Philosophy will be closed.** Our open issues are our internal roadmap -- some require deep product context. If your implementation doesn't match the product vision, it will be closed regardless of code quality. ## Required tools @@ -80,7 +80,7 @@ Read `AGENTS.md` in the repo root. This is the single source of truth for how co ### 4. Read the philosophy -Read the [Ditto Philosophy](https://about.ditto.pub/philosophy). Ditto is a carnival, not a platform. Your change should feel like it belongs in Ditto -- not like it was transplanted from a generic social media template. Apply the product decision filter above. +Read the [Agora Philosophy](https://agora.spot/philosophy). Agora is a carnival, not a platform. Your change should feel like it belongs in Agora -- not like it was transplanted from a generic social media template. Apply the product decision filter above. ### 5. Plan before you code @@ -163,7 +163,7 @@ Fill out every field in the MR template. Incomplete MRs will not be reviewed. ## What gets your MR closed without review - No linked issue -- Feature MRs with no clear alignment with the [Ditto Philosophy](https://about.ditto.pub/philosophy) +- Feature MRs with no clear alignment with the [Agora Philosophy](https://agora.spot/philosophy) - Features that fail the product decision filter (not magnetic, not threatening to the status quo, not peaceful) - Incomplete MR template (missing checklist, screenshots, or preview URL) - Changes that go beyond what was asked for (scope creep) diff --git a/README.md b/README.md index 53b49c74..51a3fd1f 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ -# Ditto +# Agora -Your content. Your vibe. Your rules. A fun, customizable [Nostr](https://nostr.com/) client that puts you in control. +Power to the people. A customizable [Nostr](https://nostr.com/) client that puts identity and community ownership first. -**[ditto.pub](https://ditto.pub)** | **[Docs](https://docs.ditto.pub)** | **[Source](https://gitlab.com/soapbox-pub/ditto)** +**[agora.spot](https://agora.spot)** | **[Source](https://gitlab.com/soapbox-pub/agora-3)** ## About -Ditto is an open-source, decentralized social media client built on the Nostr protocol. It's designed for people who want to have fun online without feeding the Big Tech machine. Express yourself with custom themes, Lightning payments, and an ever-growing set of content types -- all while owning your identity and data. +Agora is an open-source, decentralized social media client built on the Nostr protocol. It is designed for people who want expressive, community-first social software without surrendering ownership of identity or data. Made by [Soapbox](https://soapbox.pub). @@ -30,8 +30,8 @@ Made by [Soapbox](https://soapbox.pub). ### Development ```sh -git clone https://gitlab.com/soapbox-pub/ditto.git -cd ditto +git clone https://gitlab.com/soapbox-pub/agora-3.git +cd agora-3 npm install npm run dev ``` @@ -56,17 +56,17 @@ npm test ## Configuration -Ditto is configured through a `ditto.json` file at the project root, read at build time. This file is gitignored so each deployment can have its own configuration. +Agora is configured through an `agora.json` file at the project root, read at build time. This file is gitignored so each deployment can have its own configuration. ```jsonc { "theme": "dark", "relayMetadata": { "relays": [ - { "url": "wss://relay.ditto.pub", "read": true, "write": true } + { "url": "wss://relay.agora.spot", "read": true, "write": true } ] }, - "blossomServers": ["https://blossom.ditto.pub"], + "blossomServers": ["https://blossom.agora.spot"], "feedSettings": { "showPosts": true, "showReposts": true, @@ -79,7 +79,7 @@ Ditto is configured through a `ditto.json` file at the project root, read at bui Configuration is resolved in three layers (highest priority first): 1. **User settings** stored in localStorage -2. **Build config** from `ditto.json` +2. **Build config** from `agora.json` 3. **Hardcoded defaults** Use an alternate config file path with: `CONFIG_FILE=./my-config.json npm run build` @@ -91,11 +91,11 @@ For self-hosted instances: - Replace `public/logo.svg` and `public/logo.png` with your logo - Update the app name in `index.html` and `public/manifest.webmanifest` - Replace `public/og-image.jpg` for social sharing previews -- Set default relays and upload servers in `ditto.json` +- Set default relays and upload servers in `agora.json` ## Deployment -Ditto builds to static files and can be deployed anywhere that serves HTML. +Agora builds to static files and can be deployed anywhere that serves HTML. - **GitHub Pages / GitLab Pages** -- Push to `main` and CI auto-deploys - **Netlify / Vercel** -- Connect your fork and deploy. A `_redirects` file is included for SPA routing @@ -143,11 +143,11 @@ public/ Static assets, icons, manifest We welcome contributions but have high standards. Please read the full [Contributing Guide](CONTRIBUTING.md) before submitting a merge request. The short version: - **Bug fixes**: One bug, one MR. Keep it small and focused. -- **New features**: Must link to an existing issue and align with the [Ditto Philosophy](https://about.ditto.pub/philosophy). +- **New features**: Must link to an existing issue and align with the product vision. - **Required**: Live preview URL, before/after screenshots, completed self-review checklist. - **Required tools**: Claude Opus 4.6 (or latest frontier model), an AI coding agent with plan mode. -Read the [Ditto Philosophy](https://about.ditto.pub/philosophy) to understand what Ditto is and isn't. +Read the project docs and `AGENTS.md` to understand what Agora is and isn't. ## License diff --git a/android/app/build.gradle b/android/app/build.gradle index a63c0332..f90b9b07 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -7,10 +7,10 @@ if (keystorePropertiesFile.exists()) { } android { - namespace = "pub.ditto.app" + namespace = "pub.agora.app" compileSdk = rootProject.ext.compileSdkVersion defaultConfig { - applicationId "pub.ditto.app" + applicationId "pub.agora.app" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 45a90195..47e64311 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -24,12 +24,12 @@ - + - + diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 56dddbf3..de9e93bf 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,7 +1,7 @@ - Ditto - Ditto - pub.ditto.app - pub.ditto.app + Agora + Agora + pub.agora.app + pub.agora.app diff --git a/capacitor.config.ts b/capacitor.config.ts index 4bec3586..bc552296 100644 --- a/capacitor.config.ts +++ b/capacitor.config.ts @@ -1,8 +1,8 @@ import type { CapacitorConfig } from '@capacitor/cli'; const config: CapacitorConfig = { - appId: 'pub.ditto.app', - appName: 'Ditto', + appId: 'pub.agora.app', + appName: 'Agora', webDir: 'dist', server: { androidScheme: 'https', @@ -16,7 +16,7 @@ const config: CapacitorConfig = { ios: { backgroundColor: '#14161f', contentInset: 'never', - scheme: 'Ditto' + scheme: 'Agora' }, plugins: { SystemBars: { diff --git a/index.html b/index.html index 66275ca6..6351b22e 100644 --- a/index.html +++ b/index.html @@ -1,43 +1,45 @@ - Ditto — Your content. Your vibe. Your rules. + Agora — Power to the people. - + - - - + + + - - + + - - - + + + - - - - + + + + + + - + - + -
+
-
-
+
+