Rename the app to Keynectr

- Crate/binary: nostr-manager-backend -> keynectr
- Data directory: nost-feed-manager -> keynectr, migrated automatically
  on first data_dir() call (existing vaults, settings and backups move)
- Electron extraResources/spawn path, executableName, productName,
  window title and CLI usage strings updated to match
- Deliberately unchanged: crypto.rs KDF verifier string, so previously
  encrypted vault backups remain decryptable

Verified live: existing vault with two profiles migrated to
~/.local/share/keynectr and loads correctly.
This commit is contained in:
Avi 2026-08-23 10:22:25 -05:00
commit 7c6a085bf1
13 changed files with 108 additions and 264 deletions

View file

@ -76,10 +76,10 @@ let nextId = 1;
function resolveBackendPath(): string {
if (app.isPackaged) {
return path.join(process.resourcesPath, 'nostr-manager-backend');
return path.join(process.resourcesPath, 'keynectr');
}
// Development: the crate builds to <project>/target/release.
return path.join(app.getAppPath(), '..', 'target', 'release', 'nostr-manager-backend');
return path.join(app.getAppPath(), '..', 'target', 'release', 'keynectr');
}
function startBackend(): void {

View file

@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Nostr Feed Manager</title>
<title>Keynectr</title>
</head>
<body>
<div id="root"></div>

View file

@ -1,11 +1,11 @@
{
"name": "nost-feed-manager",
"name": "keynectr",
"version": "0.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "nost-feed-manager",
"name": "keynectr",
"version": "0.1.0",
"dependencies": {
"react": "^18.3.1",

View file

@ -1,5 +1,6 @@
{
"name": "nost-feed-manager",
"name": "keynectr",
"productName": "Keynectr",
"productName": "Nostr Feed Manager",
"version": "0.1.0",
"description": "A friendly Linux desktop app for managing Nostr profiles and publishing text notes.",
@ -58,8 +59,8 @@
],
"extraResources": [
{
"from": "../target/release/nostr-manager-backend",
"to": "nostr-manager-backend"
"from": "../target/release/keynectr",
"to": "keynectr"
}
],
"linux": {
@ -67,7 +68,7 @@
"dir"
],
"category": "Network",
"executableName": "nost-feed-manager"
"executableName": "keynectr"
}
}
}

View file

@ -11,7 +11,7 @@ describe('SettingsScreen', () => {
renderWithApp(<SettingsScreen />);
expect(
await screen.findByText('/home/user/.local/share/nost-feed-manager/profiles_vault.json'),
await screen.findByText('/home/user/.local/share/keynectr/profiles_vault.json'),
).toBeInTheDocument();
expect(screen.getByText('Storage is not encrypted')).toBeInTheDocument();
});

View file

@ -35,8 +35,8 @@ export function makeState(overrides?: Partial<AppState>): AppState {
};
return {
version: '0.1.0',
vault_path: '/home/user/.local/share/nost-feed-manager/profiles_vault.json',
settings_path: '/home/user/.local/share/nost-feed-manager/settings.json',
vault_path: '/home/user/.local/share/keynectr/profiles_vault.json',
settings_path: '/home/user/.local/share/keynectr/settings.json',
encrypted_storage: false,
vault_locked: false,
migrated_from: null,
@ -188,7 +188,7 @@ export function createApiMock(initial: AppState = makeState()): ApiMock {
},
),
backupNow: vi.fn(async () => ({
backup_path: '/home/user/.local/share/nost-feed-manager/profiles_vault.json.backup-1',
backup_path: '/home/user/.local/share/keynectr/profiles_vault.json.backup-1',
})),
setVaultPassword: vi.fn(async () => ({
...state,