Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 19 additions & 19 deletions .github/scripts/publish-release.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ set -euo pipefail

required_env_vars=(GH_TOKEN TAG COMMIT REPOSITORY)
required_assets=(
nostr-chat-android-debug-test-only.apk
nostr-chat-linux.AppImage
nostr-chat-linux.deb
nostr-chat-linux.rpm
nostr-chat-macos.zip
nostr-chat-windows.exe
anagram-android-debug-test-only.apk
anagram-linux.AppImage
anagram-linux.deb
anagram-linux.rpm
anagram-macos.zip
anagram-windows.exe
)

validate_env() {
Expand Down Expand Up @@ -47,25 +47,25 @@ Commit: ${COMMIT}

Android test-only artifact:

**nostr-chat-android-debug-test-only.apk is a DEBUG build provided only for direct-install testing. It is not a production Android release, is not the F-Droid package, and is not intended for normal user installation or updates. Production Android distribution will be through F-Droid. If Android rejects an update because the debug signing key changed, uninstall the previous test build first.**
**anagram-android-debug-test-only.apk is a DEBUG build provided only for direct-install testing. It is not a production Android release, is not the F-Droid package, and is not intended for normal user installation or updates. Production Android distribution will be through F-Droid. If Android rejects an update because the debug signing key changed, uninstall the previous test build first.**

Versioned asset URLs:

- Android debug APK (TEST ONLY): https://github.com/${REPOSITORY}/releases/download/${TAG}/nostr-chat-android-debug-test-only.apk
- Linux AppImage: https://github.com/${REPOSITORY}/releases/download/${TAG}/nostr-chat-linux.AppImage
- Linux DEB: https://github.com/${REPOSITORY}/releases/download/${TAG}/nostr-chat-linux.deb
- Linux RPM: https://github.com/${REPOSITORY}/releases/download/${TAG}/nostr-chat-linux.rpm
- macOS ZIP: https://github.com/${REPOSITORY}/releases/download/${TAG}/nostr-chat-macos.zip
- Windows EXE: https://github.com/${REPOSITORY}/releases/download/${TAG}/nostr-chat-windows.exe
- Android debug APK (TEST ONLY): https://github.com/${REPOSITORY}/releases/download/${TAG}/anagram-android-debug-test-only.apk
- Linux AppImage: https://github.com/${REPOSITORY}/releases/download/${TAG}/anagram-linux.AppImage
- Linux DEB: https://github.com/${REPOSITORY}/releases/download/${TAG}/anagram-linux.deb
- Linux RPM: https://github.com/${REPOSITORY}/releases/download/${TAG}/anagram-linux.rpm
- macOS ZIP: https://github.com/${REPOSITORY}/releases/download/${TAG}/anagram-macos.zip
- Windows EXE: https://github.com/${REPOSITORY}/releases/download/${TAG}/anagram-windows.exe

Latest asset URLs:

- Android debug APK (TEST ONLY): https://github.com/${REPOSITORY}/releases/latest/download/nostr-chat-android-debug-test-only.apk
- Linux AppImage: https://github.com/${REPOSITORY}/releases/latest/download/nostr-chat-linux.AppImage
- Linux DEB: https://github.com/${REPOSITORY}/releases/latest/download/nostr-chat-linux.deb
- Linux RPM: https://github.com/${REPOSITORY}/releases/latest/download/nostr-chat-linux.rpm
- macOS ZIP: https://github.com/${REPOSITORY}/releases/latest/download/nostr-chat-macos.zip
- Windows EXE: https://github.com/${REPOSITORY}/releases/latest/download/nostr-chat-windows.exe
- Android debug APK (TEST ONLY): https://github.com/${REPOSITORY}/releases/latest/download/anagram-android-debug-test-only.apk
- Linux AppImage: https://github.com/${REPOSITORY}/releases/latest/download/anagram-linux.AppImage
- Linux DEB: https://github.com/${REPOSITORY}/releases/latest/download/anagram-linux.deb
- Linux RPM: https://github.com/${REPOSITORY}/releases/latest/download/anagram-linux.rpm
- macOS ZIP: https://github.com/${REPOSITORY}/releases/latest/download/anagram-macos.zip
- Windows EXE: https://github.com/${REPOSITORY}/releases/latest/download/anagram-windows.exe
EOF
}

Expand Down
20 changes: 10 additions & 10 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,12 @@ jobs:

- name: Stage Android test-only asset
shell: bash
run: bash .github/scripts/stage-release-asset.sh dist/capacitor/android/apk/debug '*.apk' release-assets/nostr-chat-android-debug-test-only.apk
run: bash .github/scripts/stage-release-asset.sh dist/capacitor/android/apk/debug '*.apk' release-assets/anagram-android-debug-test-only.apk

- uses: actions/upload-artifact@v6
with:
name: release-android-debug-test-only
path: release-assets/nostr-chat-android-debug-test-only.apk
path: release-assets/anagram-android-debug-test-only.apk
if-no-files-found: error

build-linux:
Expand Down Expand Up @@ -87,14 +87,14 @@ jobs:
- name: Stage Linux release assets
shell: bash
run: |
bash .github/scripts/stage-release-asset.sh dist/electron/Packaged '*.AppImage' release-assets/nostr-chat-linux.AppImage
bash .github/scripts/stage-release-asset.sh dist/electron/Packaged '*.deb' release-assets/nostr-chat-linux.deb
bash .github/scripts/stage-release-asset.sh dist/electron/Packaged '*.rpm' release-assets/nostr-chat-linux.rpm
bash .github/scripts/stage-release-asset.sh dist/electron/Packaged '*.AppImage' release-assets/anagram-linux.AppImage
bash .github/scripts/stage-release-asset.sh dist/electron/Packaged '*.deb' release-assets/anagram-linux.deb
bash .github/scripts/stage-release-asset.sh dist/electron/Packaged '*.rpm' release-assets/anagram-linux.rpm

- uses: actions/upload-artifact@v6
with:
name: release-linux
path: release-assets/nostr-chat-linux.*
path: release-assets/anagram-linux.*
if-no-files-found: error

build-macos:
Expand Down Expand Up @@ -123,12 +123,12 @@ jobs:

- name: Stage macOS release asset
shell: bash
run: bash .github/scripts/stage-release-asset.sh dist/electron/Packaged '*.zip' release-assets/nostr-chat-macos.zip
run: bash .github/scripts/stage-release-asset.sh dist/electron/Packaged '*.zip' release-assets/anagram-macos.zip

- uses: actions/upload-artifact@v6
with:
name: release-macos
path: release-assets/nostr-chat-macos.zip
path: release-assets/anagram-macos.zip
if-no-files-found: error

build-windows:
Expand Down Expand Up @@ -157,12 +157,12 @@ jobs:

- name: Stage Windows release asset
shell: pwsh
run: .github/scripts/stage-release-asset.ps1 -SearchRoot dist/electron/Packaged -Pattern '*.exe' -OutputPath release-assets/nostr-chat-windows.exe
run: .github/scripts/stage-release-asset.ps1 -SearchRoot dist/electron/Packaged -Pattern '*.exe' -OutputPath release-assets/anagram-windows.exe

- uses: actions/upload-artifact@v6
with:
name: release-windows
path: release-assets/nostr-chat-windows.exe
path: release-assets/anagram-windows.exe
if-no-files-found: error

publish-release:
Expand Down
2 changes: 1 addition & 1 deletion docs/f-droid-requirement.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ This proves the source-build path but is not the final submission record: the co

Production Android distribution uses standard F-Droid signing: F-Droid builds the app from source and signs the APK. The F-Droid APK therefore cannot update a GitHub debug installation.

The GitHub workflow continues to build a debug APK only for direct-install testing. Its public filename is `nostr-chat-android-debug-test-only.apk`; the workflow job, artifact name, release warning, and download labels all identify it as test-only. It is not presented as the production Android package, and users may need to uninstall an older test build if its debug signature differs.
The GitHub workflow continues to build a debug APK only for direct-install testing. Its public filename is `anagram-android-debug-test-only.apk`; the workflow job, artifact name, release warning, and download labels all identify it as test-only. It is not presented as the production Android package, and users may need to uninstall an older test build if its debug signature differs.

Reproducible/upstream signing remains a possible future strategy but is not required for the current standard F-Droid path; see F-Droid’s [Reproducible Builds documentation](https://f-droid.org/en/docs/Reproducible_Builds/). Production builds no longer embed the current time in app metadata. [quasar.config.ts](../quasar.config.ts) derives the bundle and service-worker cache identity from the app version and Git commit SHA, so repeated builds of the same source use the same value.

Expand Down
2 changes: 1 addition & 1 deletion e2e/dm/pagination.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ test('a second upward scroll at the top loads older messages', async ({ browser
await bob.page.evaluate(() => {
window.localStorage.setItem('ui-desktop-message-layout', 'bubbles');
window.dispatchEvent(
new CustomEvent('nostr-chat:desktop-message-layout-changed', {
new CustomEvent('anagram:desktop-message-layout-changed', {
detail: { layout: 'bubbles' },
})
);
Expand Down
4 changes: 2 additions & 2 deletions e2e/groups/lifecycle.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ test('group owner can create a group, invite a member, and exchange messages bot
await alice.page.evaluate(() => {
window.localStorage.setItem('ui-desktop-message-layout', 'bubbles');
window.dispatchEvent(
new CustomEvent('nostr-chat:desktop-message-layout-changed', {
new CustomEvent('anagram:desktop-message-layout-changed', {
detail: { layout: 'bubbles' },
})
);
Expand Down Expand Up @@ -188,7 +188,7 @@ test('group owner can create a group, invite a member, and exchange messages bot
await alice.page.evaluate(() => {
window.localStorage.setItem('ui-desktop-message-layout', 'text');
window.dispatchEvent(
new CustomEvent('nostr-chat:desktop-message-layout-changed', {
new CustomEvent('anagram:desktop-message-layout-changed', {
detail: { layout: 'text' },
})
);
Expand Down
4 changes: 4 additions & 0 deletions fastlane/metadata/android/en-US/changelogs/9.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Version 0.7.2

- Completed the Anagram rebrand across package and release metadata.
- No application behavior changes.
12 changes: 4 additions & 8 deletions metadata/com.nostr.chat.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
Categories:
- Connectivity
- Internet
- Messaging
License: MIT
AuthorName: LNbits
AuthorWebSite: https://lnbits.com
WebSite: https://github.com/lnbits/anagram
SourceCode: https://github.com/lnbits/anagram
IssueTracker: https://github.com/lnbits/anagram/issues
Changelog: https://github.com/lnbits/anagram/releases
Expand All @@ -20,12 +18,10 @@ Builds:
commit: 825b69632e841871b5c410de756209fe72088071
subdir: src-capacitor/android/app
sudo:
- echo "deb https://deb.debian.org/debian forky main" > /etc/apt/sources.list.d/forky.list
- apt-get update
- apt-get install -y build-essential cmake golang-go rustup
- curl -Lo node.tar.gz https://nodejs.org/dist/v24.16.0/node-v24.16.0-linux-x64.tar.gz
- echo "2faf6a387e9b62b888e21c54f01249fb27537ffecf1842f29f4c919d0a59a0ff node.tar.gz"
| sha256sum -c -
- tar xzf node.tar.gz --strip-components=1 -C /usr/local/
- apt-get install -y -t forky nodejs npm
gradle:
- yes
srclibs:
Expand Down Expand Up @@ -71,7 +67,7 @@ MaintainerNotes: |-

AutoUpdateMode: Version
UpdateCheckMode: Tags ^v[0-9.]+$
UpdateCheckData:
UpdateCheckData:
src-capacitor/package.json|"androidVersionCode":\s*(\d+)|.|"version":\s*"([\d.]+)"
CurrentVersion: 0.7.0
CurrentVersionCode: 7
8 changes: 4 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "nostr-chat",
"name": "anagram",
"productName": "Anagram",
"version": "0.7.1",
"version": "0.7.2",
"description": "Anagram is a desktop and web private messaging client for Nostr.",
"author": "LNbits",
"homepage": "https://github.com/lnbits/anagram/",
Expand Down
2 changes: 1 addition & 1 deletion prompt.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ Add “honest sync” UI. A tiny offline/reconnecting/catching-up indicator woul
Expand chaos testing. The next missing tests are long offline periods, relay flapping during send, two devices sending in the same chat simultaneously, wake-from-sleep recovery, and notification/background resume. The existing e2e base is strong enough that this should be very achievable.

If We Prioritize Ruthlessly
Start with durable outbox + auto replay, then targeted gap repair on resume/reconnect, then logical-message dedupe + multi-device convergence. Those three would move nostr-chat the most toward an “it just catches up and does the right thing” feel.
Start with durable outbox + auto replay, then targeted gap repair on resume/reconnect, then logical-message dedupe + multi-device convergence. Those three would move Anagram the most toward an “it just catches up and does the right thing” feel.

Do you want to rerun the local groups Playwright check with Docker and Node explicitly on PATH?
export PATH=/Applications/Docker.app/Contents/Resources/bin:/Users/moto/.nvm/versions/node/v24.15.0/bin:$PATH; /Users/moto/.nvm/versions/node/v24.15.0/bin/node ./scripts/run-e2e-local.cjs e2e/groups.spec.ts
Expand Down
4 changes: 2 additions & 2 deletions quasar.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ function createResponsiveMediaQueryPlugin(): Plugin {
] as const;

return {
name: 'nostr-chat-responsive-media-queries',
name: 'anagram-responsive-media-queries',
enforce: 'pre',
transform(source, id) {
const sourcePath = id.split('?', 1)[0] ?? '';
Expand Down Expand Up @@ -80,7 +80,7 @@ function buildAppInfo(isProd: boolean): AppBuildInfo {

function createAppShellBuildPlugin(buildInfo: AppBuildInfo): Plugin {
return {
name: 'nostr-chat-app-shell-build',
name: 'anagram-app-shell-build',
apply: 'build',
writeBundle(outputOptions) {
if (!outputOptions.dir) {
Expand Down
8 changes: 4 additions & 4 deletions src-capacitor/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions src-capacitor/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "nostr-chat",
"version": "0.7.1",
"androidVersionCode": 8,
"name": "anagram",
"version": "0.7.2",
"androidVersionCode": 9,
"description": "Anagram is a desktop and web private messaging client for Nostr.",
"private": true,
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion src/i18n/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ const state = reactive<I18nState>({

const currentLocale = computed(() => state.locale);
const currentLanguage = computed(() => languageByCode.get(state.locale) ?? fallbackLanguage);
const i18nInjectionKey: InjectionKey<I18nApi> = Symbol('nostr-chat-i18n');
const i18nInjectionKey: InjectionKey<I18nApi> = Symbol('anagram-i18n');

export const i18nApi: I18nApi = {
locale: currentLocale,
Expand Down
2 changes: 1 addition & 1 deletion src/services/foregroundMessageActivityService.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { inputSanitizerService } from 'src/services/inputSanitizerService';

export const FOREGROUND_MESSAGE_ACTIVITY_EVENT = 'nostr-chat:foreground-message-activity';
export const FOREGROUND_MESSAGE_ACTIVITY_EVENT = 'anagram:foreground-message-activity';

export interface ForegroundMessageActivityDetail {
chatPubkey: string;
Expand Down
4 changes: 2 additions & 2 deletions src/stores/nostr/reconnectHealingRuntime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ function isBrowserOffline(): boolean {
}

function logReconnectHealing(phase: string, details: Record<string, unknown> = {}): void {
console.log('[nostr-chat][reconnect-healing]', phase, details);
console.log('[anagram][reconnect-healing]', phase, details);
}

function normalizeChatTarget(
Expand Down Expand Up @@ -575,7 +575,7 @@ export function createReconnectHealingRuntime({
});
})()
.catch((error) => {
console.warn('[nostr-chat][reconnect-healing] failed', {
console.warn('[anagram][reconnect-healing] failed', {
reason,
error: error instanceof Error ? error.message : String(error ?? ''),
});
Expand Down
2 changes: 1 addition & 1 deletion src/stores/nostr/startupContactSyncRuntime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ interface StartupContactSyncRuntimeDeps {
}

function logStartupRestore(phase: string, details: Record<string, unknown> = {}): void {
console.log('[nostr-chat][startup-restore]', phase, details);
console.log('[anagram][startup-restore]', phase, details);
}

function formatStartupRestoreError(error: unknown): string {
Expand Down
2 changes: 1 addition & 1 deletion src/utils/themeStorage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const THEME_MODE_STORAGE_KEY = 'ui-theme-mode';
const PANEL_OPACITY_STORAGE_KEY = 'ui-panel-opacity';
const DESKTOP_SIDEBAR_WIDTH_STORAGE_KEY = 'ui-desktop-sidebar-width';
export const DESKTOP_MESSAGE_LAYOUT_STORAGE_KEY = 'ui-desktop-message-layout';
export const DESKTOP_MESSAGE_LAYOUT_CHANGED_EVENT = 'nostr-chat:desktop-message-layout-changed';
export const DESKTOP_MESSAGE_LAYOUT_CHANGED_EVENT = 'anagram:desktop-message-layout-changed';
const DEFAULT_PANEL_OPACITY = 75;
export const DEFAULT_DESKTOP_SIDEBAR_WIDTH = 360;
export const MIN_DESKTOP_SIDEBAR_WIDTH = 280;
Expand Down
8 changes: 4 additions & 4 deletions tests/unit/reconnectHealingRuntime.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ describe('reconnectHealingRuntime', () => {
});
expect(refreshDeveloperPendingQueues).toHaveBeenCalledTimes(1);
expect(console.log).toHaveBeenCalledWith(
'[nostr-chat][reconnect-healing]',
'[anagram][reconnect-healing]',
'start',
expect.objectContaining({
reason: 'relay-connected',
Expand All @@ -186,7 +186,7 @@ describe('reconnectHealingRuntime', () => {
})
);
expect(console.log).toHaveBeenCalledWith(
'[nostr-chat][reconnect-healing]',
'[anagram][reconnect-healing]',
'complete',
expect.objectContaining({
reason: 'relay-connected',
Expand Down Expand Up @@ -307,7 +307,7 @@ describe('reconnectHealingRuntime', () => {
'Checking session and network'
);
expect(console.log).toHaveBeenCalledWith(
'[nostr-chat][reconnect-healing]',
'[anagram][reconnect-healing]',
'deferred',
expect.objectContaining({
reason: 'relay-list-changed',
Expand Down Expand Up @@ -423,7 +423,7 @@ describe('reconnectHealingRuntime', () => {
expect(refreshDirectMessages).toHaveBeenCalledTimes(2);
expect(refreshDeveloperPendingQueues).toHaveBeenCalledTimes(2);
expect(console.log).toHaveBeenCalledWith(
'[nostr-chat][reconnect-healing]',
'[anagram][reconnect-healing]',
'start',
expect.objectContaining({
reason: 'manual-refresh',
Expand Down
Loading