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
4 changes: 2 additions & 2 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,15 @@
<meta property="og:type" content="website" />
<meta property="og:title" content="%BRAND_NAME%" />
<meta property="og:description" content="%BRAND_DESCRIPTION%" />
<meta property="og:image" content="%BRAND_HOMEPAGE%/og-image.png?v=2" />
<meta property="og:image" content="%BRAND_HOMEPAGE%/og-image.png?v=3" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:type" content="image/png" />
<meta property="og:image:alt" content="%BRAND_NAME% — %BRAND_DESCRIPTION%" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="%BRAND_NAME%" />
<meta name="twitter:description" content="%BRAND_DESCRIPTION%" />
<meta name="twitter:image" content="%BRAND_HOMEPAGE%/og-image.png?v=2" />
<meta name="twitter:image" content="%BRAND_HOMEPAGE%/og-image.png?v=3" />
</head>
<body>
<noscript
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "jank",
"version": "26.15.1",
"version": "26.15.2",
"description": "A TweetDeck-style multi-column deck for Nostr — just another nostr klient",
"type": "module",
"author": "DocNR",
Expand Down
Binary file modified public/og-image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
47 changes: 24 additions & 23 deletions scripts/og-image/og-image.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 3 additions & 3 deletions src/assets/Logo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { cn } from '@/lib/utils'
import JankMark from '@/components/JankMark'

/**
* Wordmark used in the expanded sidebar. Lowercase "jank" with tight
* Wordmark used in the expanded sidebar. Uppercase "JANK" with tight
* tracking. Paired with a placeholder `<JankMark>` glyph. The mark's
* stroke inherits `currentColor` and the wordmark inherits text color,
* so theme switching continues to drive presentation.
Expand All @@ -14,9 +14,9 @@ export default function Logo({ className }: { className?: string }) {
<span className={cn('inline-flex items-center gap-2 select-none', className)}>
<JankMark size={32} />
{/* Literal — intentionally not `BRAND.name`. The wordmark's visual
identity is the lowercase form; if the brand name ever changes,
identity is the uppercase form; if the brand name ever changes,
update this explicitly rather than auto-recasing BRAND.name. */}
<span className="text-2xl leading-none font-bold tracking-[0.02em] lowercase">jank</span>
<span className="text-2xl leading-none font-bold tracking-[0.02em]">JANK</span>
</span>
)
}
4 changes: 2 additions & 2 deletions src/branding.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
* `repository`, and `homepage` fields must be kept in sync manually.
*/
export const BRAND = {
name: 'jank',
shortName: 'jank',
name: 'JANK',
shortName: 'JANK',
tagline: 'just another nostr klient',
description: 'A TweetDeck-style multi-column deck for Nostr',
keywords: 'jank, nostr, deck, multi-column, web, client, relay, social, pwa',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ export default function MultiAccountConfirmModal({
<p>
<b>{displayName}</b> is currently paired with{' '}
{existingLabel(conflict.existingSignerType)}. Replacing with NostrConnect
rotates to a remote signer — you'll lose direct private-key access in jank.
rotates to a remote signer — you'll lose direct private-key access in JANK.
</p>
<p>Make sure you've backed up the key before continuing.</p>
</DialogDescription>
Expand Down
4 changes: 3 additions & 1 deletion src/components/AgentPairingWizard/index.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { BRAND } from '@/branding'
import {
Dialog,
DialogContent,
Expand Down Expand Up @@ -54,7 +55,8 @@ export default function AgentPairingWizard({ workspaceOwner, open, onClose }: Pr
<DialogTitle>{t('Pair an AI Agent')}</DialogTitle>
<DialogDescription>
{t(
'Your agent never gets your signing key — your signer still gates every event you publish. jank must stay open in a browser tab for your agent to work.'
'Your agent never gets your signing key — your signer still gates every event you publish. {{brand}} must stay open in a browser tab for your agent to work.',
{ brand: BRAND.name }
)}
</DialogDescription>
</DialogHeader>
Expand Down
5 changes: 4 additions & 1 deletion src/components/TopBar/MobileWarningBanner.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
* paddingTop accordingly and the dismiss propagates without a remount.
* - Fixed height of 2.5rem (h-10) keeps the layout calc trivial.
*/
import { BRAND } from '@/branding'
import { atom, useAtom } from 'jotai'
import { X } from 'lucide-react'
import { useTranslation } from 'react-i18next'
Expand Down Expand Up @@ -65,7 +66,9 @@ export default function MobileWarningBanner() {
<div className="min-w-0 flex-1 truncate">
<span className="font-semibold">{t('Mobile is under construction')}</span>{' '}
<span className="opacity-90">
{t('jank is best on desktop for now. Most things work — some rough edges.')}
{t('{{brand}} is best on desktop for now. Most things work — some rough edges.', {
brand: BRAND.name
})}
</span>
</div>
<button
Expand Down
2 changes: 1 addition & 1 deletion src/components/TopBar/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ export default function TopBar() {
type="button"
onClick={onBrandTap}
className="flex h-12 shrink-0 items-center justify-center px-2 transition-opacity hover:opacity-80"
aria-label="jank — back to deck"
aria-label="JANK — back to deck"
>
<JankMark size={28} />
</button>
Expand Down
5 changes: 4 additions & 1 deletion src/components/UpdatePrompt/index.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { BRAND } from '@/branding'
import { Button } from '@/components/ui/button'
import { useServiceWorkerUpdate } from '@/hooks/useServiceWorkerUpdate'
import { X } from 'lucide-react'
Expand Down Expand Up @@ -27,7 +28,9 @@ export default function UpdatePrompt(): JSX.Element | null {
aria-live="polite"
className="fixed inset-x-0 top-0 z-50 flex items-center justify-center gap-3 bg-primary px-4 py-2 text-primary-foreground shadow-md"
>
<span className="text-sm">{t('A new version of jank is available.')}</span>
<span className="text-sm">
{t('A new version of {{brand}} is available.', { brand: BRAND.name })}
</span>
<Button size="sm" variant="secondary" onClick={reload}>
{t('Reload')}
</Button>
Expand Down
5 changes: 4 additions & 1 deletion src/components/WhatsNew/index.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { BRAND } from '@/branding'
import { Button } from '@/components/ui/button'
import {
Dialog,
Expand Down Expand Up @@ -57,7 +58,9 @@ export default function WhatsNew(): JSX.Element | null {
<DialogContent>
<DialogHeader>
<DialogTitle>{t("What's new")}</DialogTitle>
<DialogDescription>{t('Recent updates to jank.')}</DialogDescription>
<DialogDescription>
{t('Recent updates to {{brand}}.', { brand: BRAND.name })}
</DialogDescription>
</DialogHeader>
<div className="space-y-4 max-h-[60vh] overflow-y-auto">
{result.notes.map((note) => (
Expand Down
10 changes: 9 additions & 1 deletion src/i18n/locales/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1099,6 +1099,14 @@ export default {
'Anyone can see this mute. Click to make it private.':
'Anyone can see this mute. Click to make it private.',
'Show all columns': 'Show all columns',
'Jump to column': 'Jump to column'
'Jump to column': 'Jump to column',
'Recent updates to {{brand}}.': 'Recent updates to {{brand}}.',
'A new version of {{brand}} is available.': 'A new version of {{brand}} is available.',
'{{brand}} is best on desktop for now. Most things work — some rough edges.':
'{{brand}} is best on desktop for now. Most things work — some rough edges.',
'Your agent never gets your signing key — your signer still gates every event you publish. {{brand}} must stay open in a browser tab for your agent to work.':
'Your agent never gets your signing key — your signer still gates every event you publish. {{brand}} must stay open in a browser tab for your agent to work.',
'Columns in this deck that view your other paired {{brand}} accounts (their npubs become visible to the agent)':
'Columns in this deck that view your other paired {{brand}} accounts (their npubs become visible to the agent)'
}
}
4 changes: 3 additions & 1 deletion src/pages/secondary/AgentsSettingsPage/index.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { BRAND } from '@/branding'
import AgentPairingWizard from '@/components/AgentPairingWizard'
import { Button } from '@/components/ui/button'
import {
Expand Down Expand Up @@ -114,7 +115,8 @@ const AgentsSettingsPage = forwardRef(({ index }: { index?: number }, ref) => {
<ul className="list-disc ps-5 space-y-1">
<li>
{t(
'Columns in this deck that view your other paired jank accounts (their npubs become visible to the agent)'
'Columns in this deck that view your other paired {{brand}} accounts (their npubs become visible to the agent)',
{ brand: BRAND.name }
)}
</li>
</ul>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ describe('BunkerSigner.login — reconnection does not block on the v3 probe', (
const meta = JSON.parse(params[3] as string)
// Keys are exactly name/url/image (use `image`, not imageURL/picture).
expect(Object.keys(meta).sort()).toEqual(['image', 'name', 'url'])
expect(meta.name).toBe('Jank')
expect(meta.name).toBe('JANK')
expect(meta.url).toBe('https://jank.army')
expect(meta.image).toBe('https://jank.army/apple-touch-icon.png')
})
Expand Down
4 changes: 2 additions & 2 deletions src/providers/NostrProvider/bunker.signer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export class BunkerSigner implements ISigner {
if (isInitialConnection) {
// Replicate nostr-tools' BunkerSigner.connect() but append a 4th param
// carrying jank's client metadata (name/url/image) so the remote signer
// (Clave/Amber/etc.) shows "Jank" instead of a generic app name. The
// (Clave/Amber/etc.) shows "JANK" instead of a generic app name. The
// library's connect() only sends [pubkey, secret] and exposes no metadata
// argument, so we issue the request ourselves. This mirrors the metadata
// jank already advertises in its nostrconnect:// URI.
Expand All @@ -48,7 +48,7 @@ export class BunkerSigner implements ISigner {
// params[3] is a JSON *string* (not a nested object), keys exactly
// name/url/image.
const clientMetadata = JSON.stringify({
name: 'Jank',
name: 'JANK',
url: BRAND.homepage,
image: `${BRAND.homepage}/apple-touch-icon.png`
})
Expand Down
8 changes: 8 additions & 0 deletions src/release-notes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@ export type ReleaseNote = {
}

export const RELEASE_NOTES: ReleaseNote[] = [
{
version: '26.15.2',
date: '2026-06-16',
highlights: [
'The link preview shown when you share the site now matches the default terminal look (green on black) instead of the old teal card.',
'The name is now styled as JANK across the app, including the name shown to your remote signer when you pair a bunker.'
]
},
{
version: '26.15.1',
date: '2026-06-16',
Expand Down
Loading