Rename Wrystr to Vega

Named after Jurij Vega (1754-1802), Slovenian mathematician who made
knowledge accessible through his logarithm tables. Rebrand before
OpenSats application (April 1).

- Product name, window title, identifiers, binary name all renamed
- Cargo package: wrystr -> vega, wrystr_lib -> vega_lib
- PKGBUILD: wrystr -> vega (new AUR package name)
- Release workflow: artifact names, release text updated
- README: new tagline referencing Jurij Vega
- DB migration: auto-renames wrystr.db -> vega.db on first launch
- Keyring service name kept as "wrystr" for backward compatibility
- localStorage keys kept as wrystr_* to preserve existing user data

Pending manual steps:
- Rename GitHub repo hoornet/wrystr -> hoornet/vega
- Create new AUR package vega-git, orphan wrystr-git
- Update local .desktop launcher
This commit is contained in:
Jure
2026-03-30 21:14:02 +02:00
parent 383634fb56
commit 5cbaa7b741
315 changed files with 12550 additions and 95 deletions

View File

@@ -35,7 +35,7 @@ function UpdateBanner() {
return (
<div className="flex items-center justify-between px-4 py-2 bg-accent/10 border-b border-accent/30 text-[12px] shrink-0">
<span className="text-text">
Wrystr {version} is available.{" "}
Vega {version} is available.{" "}
{error && <span className="text-danger ml-1">{error}</span>}
</span>
<div className="flex items-center gap-3">

View File

@@ -89,7 +89,7 @@ export function FountainCard({ seg }: { seg: ContentSegment }) {
<button
onClick={handlePlay}
className="shrink-0 w-8 h-8 rounded-full border border-border flex items-center justify-center hover:bg-accent/10 transition-colors"
title="Play in Wrystr"
title="Play in Vega"
>
<svg width="10" height="12" viewBox="0 0 10 12" fill="currentColor" className="text-accent ml-0.5">
<polygon points="0,0 10,6 0,12" />

View File

@@ -64,7 +64,7 @@ export function AudioBlock({ sources }: { sources: string[] }) {
</div>
<div className="min-w-0 flex-1">
<div className="text-[12px] text-text truncate">{name}</div>
<div className="text-[10px] text-text-dim">audio · play in wrystr</div>
<div className="text-[10px] text-text-dim">audio · play in vega</div>
</div>
</button>
);

View File

@@ -14,7 +14,7 @@ function Shell({ children }: { children: React.ReactNode }) {
return (
<div className="h-screen w-screen bg-bg flex items-center justify-center">
<div className="w-full max-w-md px-8">
<div className="text-text-dim text-[10px] font-bold tracking-[0.3em] uppercase mb-8">WRYSTR</div>
<div className="text-text-dim text-[10px] font-bold tracking-[0.3em] uppercase mb-8">VEGA</div>
{children}
</div>
</div>
@@ -34,9 +34,9 @@ function Body({ children }: { children: React.ReactNode }) {
function WelcomeStep({ onCreateNew, onHaveKey }: { onCreateNew: () => void; onHaveKey: () => void }) {
return (
<Shell>
<Heading>Welcome to Wrystr.</Heading>
<Heading>Welcome to Vega.</Heading>
<Body>
Wrystr is a Nostr client a social platform where you own your identity,
Vega is a Nostr client a social platform where you own your identity,
your content, and your social graph. No company can delete your account or
censor your posts.
</Body>
@@ -138,7 +138,7 @@ function BackupStep({ signer, onComplete }: { signer: NDKPrivateKeySigner; onCom
<Heading>Save your secret key.</Heading>
<Body>
Your <strong className="text-text">secret key</strong> is the only way to recover your
account. Save it in a password manager, notes app, or write it down. Wrystr never
account. Save it in a password manager, notes app, or write it down. Vega never
stores it if you lose it, your account is gone.
</Body>
@@ -187,7 +187,7 @@ function BackupStep({ signer, onComplete }: { signer: NDKPrivateKeySigner; onCom
disabled={!confirmed || saving}
className="w-full py-2.5 text-[13px] font-medium bg-accent hover:bg-accent-hover text-white transition-colors disabled:opacity-30 disabled:cursor-not-allowed"
>
{saving ? "Setting up…" : "Start using Wrystr"}
{saving ? "Setting up…" : "Start using Vega"}
</button>
</Shell>
);

View File

@@ -8,7 +8,7 @@ const DEV_PUBKEY = "c897e36007f7e52d52569439d43bffa903ea2fb845b84936f676b62e9e51
const LIGHTNING_ADDRESS = "harpos@getalby.com";
const BITCOIN_ADDRESS = "bc1qcgaupf80j28ca537xjlcs9dm9s03khezjs7crp";
const KOFI_URL = "https://ko-fi.com/jure";
const GITHUB_URL = "https://github.com/hoornet/wrystr";
const GITHUB_URL = "https://github.com/hoornet/vega";
const GITHUB_SPONSORS_URL = "https://github.com/sponsors/hoornet";
function CopyButton({ text }: { text: string }) {
@@ -50,9 +50,9 @@ export function AboutView() {
<div className="max-w-xl mx-auto px-6 py-8">
{/* Header */}
<div className="mb-8">
<h1 className="text-text text-lg font-medium tracking-tight mb-2">Support Wrystr</h1>
<h1 className="text-text text-lg font-medium tracking-tight mb-2">Support Vega</h1>
<p className="text-text-muted text-[13px] leading-relaxed">
Wrystr is free, open-source, and built by one person. If it's useful to you,
Vega is free, open-source, and built by one person. If it's useful to you,
any support a zap, a share, a star on GitHub genuinely helps.
</p>
</div>
@@ -61,7 +61,7 @@ export function AboutView() {
<section className="mb-8">
<h2 className="text-text-dim text-[10px] uppercase tracking-widest mb-3"> Zap the developer</h2>
<p className="text-text-muted text-[12px] mb-3">
Send sats directly from Wrystr using your connected Lightning wallet.
Send sats directly from Vega using your connected Lightning wallet.
</p>
<button
onClick={() => setShowZap(true)}
@@ -130,7 +130,7 @@ export function AboutView() {
{/* Version / About */}
<section className="border-t border-border pt-6">
<div className="text-text-dim text-[11px] space-y-1">
<div>Wrystr v{pkg.version} MIT License Copyright (c) 2026 Jure Sršen</div>
<div>Vega v{pkg.version} MIT License Copyright (c) 2026 Jure Sršen</div>
<div>
Built with{" "}
<a href="https://tauri.app" target="_blank" rel="noopener noreferrer" className="text-accent hover:text-accent-hover transition-colors">Tauri</a>

View File

@@ -183,7 +183,7 @@ function ExportSection() {
setErrorMsg(null);
try {
const filePath = await save({
defaultPath: `wrystr-export-${new Date().toISOString().slice(0, 10)}.json`,
defaultPath: `vega-export-${new Date().toISOString().slice(0, 10)}.json`,
filters: [{ name: "JSON", extensions: ["json"] }],
});
if (!filePath) {

View File

@@ -53,7 +53,7 @@ export function Sidebar() {
/* Expanded: brand on left, collapse chevron on right */
<>
<div className="flex flex-col">
<span className="text-sm font-bold tracking-widest text-text select-none">WRYSTR</span>
<span className="text-sm font-bold tracking-widest text-text select-none">VEGA</span>
<span className="text-text-dim text-[9px] font-mono opacity-50">v{pkg.version}</span>
</div>
<button

View File

@@ -2,7 +2,7 @@
const isDev = import.meta.env.DEV;
export const debug = {
log: (...args: unknown[]) => { if (isDev) console.log("[Wrystr]", ...args); },
warn: (...args: unknown[]) => { if (isDev) console.warn("[Wrystr]", ...args); },
error: (...args: unknown[]) => { if (isDev) console.error("[Wrystr]", ...args); },
log: (...args: unknown[]) => { if (isDev) console.log("[Vega]", ...args); },
warn: (...args: unknown[]) => { if (isDev) console.warn("[Vega]", ...args); },
error: (...args: unknown[]) => { if (isDev) console.error("[Vega]", ...args); },
};

View File

@@ -7,7 +7,7 @@ export function withTimeout<T>(promise: Promise<T>, ms: number, fallback: T): Pr
return Promise.race([
promise,
new Promise<T>((resolve) => setTimeout(() => {
console.warn(`[Wrystr] Fetch timed out after ${ms}ms`);
console.warn(`[Vega] Fetch timed out after ${ms}ms`);
resolve(fallback);
}, ms)),
]);
@@ -110,12 +110,12 @@ export async function resetNDK(): Promise<void> {
}
// Connect fresh
console.log("[Wrystr] NDK instance reset — connecting fresh relays");
console.log("[Vega] NDK instance reset — connecting fresh relays");
await ndk.connect();
await waitForConnectedRelay(ndk, 5000);
const relays = Array.from(ndk.pool?.relays?.values() ?? []);
const connected = relays.filter((r) => r.connected).length;
console.log(`[Wrystr] Fresh connection: ${connected}/${relays.length} relays connected`);
console.log(`[Vega] Fresh connection: ${connected}/${relays.length} relays connected`);
}
export function addRelay(url: string): void {
@@ -186,17 +186,17 @@ export async function ensureConnected(): Promise<boolean> {
return true; // Trust relay.connected — don't probe or disconnect
}
console.warn(`[Wrystr] No relays connected (${relays.length} in pool) — attempting reconnect`);
console.warn(`[Vega] No relays connected (${relays.length} in pool) — attempting reconnect`);
try {
await withTimeout(instance.connect(), 4000, undefined);
await waitForConnectedRelay(instance, 3000);
const after = Array.from(instance.pool?.relays?.values() ?? []);
const nowConnected = after.some((r) => r.connected);
console.log(`[Wrystr] Reconnect ${nowConnected ? "succeeded" : "failed"}`);
console.log(`[Vega] Reconnect ${nowConnected ? "succeeded" : "failed"}`);
return nowConnected;
} catch {
console.error("[Wrystr] Reconnect failed");
console.error("[Vega] Reconnect failed");
return false;
}
}

View File

@@ -16,7 +16,7 @@ async function getSearchNDK(): Promise<NDK> {
if (searchNDK) return searchNDK;
searchNDK = new NDK({ explicitRelayUrls: SEARCH_RELAYS });
searchNDKConnecting = searchNDK.connect().then(() => {
console.log("[Wrystr] Search relays connected");
console.log("[Vega] Search relays connected");
searchNDKConnecting = null;
});
await withTimeout(searchNDKConnecting, 5000, undefined);

View File

@@ -20,7 +20,7 @@ async function apiHeaders(): Promise<Record<string, string>> {
"X-Auth-Key": API_KEY,
"X-Auth-Date": apiHeaderTime,
"Authorization": hash,
"User-Agent": "Wrystr/1.0",
"User-Agent": "Vega/1.0",
};
}

View File

@@ -48,7 +48,7 @@ export async function uploadImage(file: File): Promise<string> {
* through Tauri's HTTP plugin, so we construct the raw bytes ourselves.
*/
function buildMultipart(fieldName: string, data: Uint8Array, fileName: string, mimeType: string): { body: Uint8Array; contentType: string } {
const boundary = "----WrystrUpload" + Math.random().toString(36).slice(2);
const boundary = "----VegaUpload" + Math.random().toString(36).slice(2);
const encoder = new TextEncoder();
const header = encoder.encode(

View File

@@ -202,7 +202,7 @@ export const useFeedStore = create<FeedState>((set, get) => ({
});
liveSub = sub;
console.log("[Wrystr] Live feed subscription started");
console.log("[Vega] Live feed subscription started");
},
loadTrendingFeed: async (force?: boolean) => {