browse the protocol like its 2008 ibex.desertthunder.dev
ubuntu atproto svelte
7

Configure Feed

Select the types of activity you want to include in your feed.

feat: expose build version and repo links

Owais Jamil (Jun 17, 2026, 10:05 AM -0500) 3755b165 5f51fa45

+73 -20
+5
.changeset/swift-tigers-pay.md
··· 1 + --- 2 + 'intrepid-ibex': minor 3 + --- 4 + 5 + added more granular build details to About thie Computer
+22 -5
src/lib/components/AboutComputer.svelte
··· 1 1 <script lang="ts"> 2 2 import { accountSetup } from '$lib/atproto/setup.svelte'; 3 + import { buildCommitUrl, buildVersion } from '$lib/version'; 4 + import { REPO_URL } from '$lib/constants'; 3 5 </script> 4 6 5 7 <section class="about-computer" aria-labelledby="about-title"> ··· 27 29 <dd>at://</dd> 28 30 </div> 29 31 <div> 32 + <dt>Version</dt> 33 + <dd>{buildVersion.version}</dd> 34 + </div> 35 + <div> 36 + <dt>Commit</dt> 37 + <dd class="mono"> 38 + <a href={buildCommitUrl} target="_blank" rel="external">{buildVersion.commit}</a> 39 + </dd> 40 + </div> 41 + <div> 30 42 <dt>Account</dt> 31 43 <dd>{accountSetup.identity ? `@${accountSetup.identity.handle}` : 'No account configured'}</dd> 32 44 </div> 33 45 <div> 34 46 <dt>DID</dt> 35 - <dd>{accountSetup.identity?.did ?? '—'}</dd> 47 + <dd class="mono">{accountSetup.identity?.did ?? '—'}</dd> 36 48 </div> 37 49 <div> 38 50 <dt>PDS</dt> 39 - <dd>{accountSetup.identity?.pds ?? '—'}</dd> 51 + <dd class="mono">{accountSetup.identity?.pds ?? '—'}</dd> 40 52 </div> 41 53 </dl> 42 54 </div> 43 55 44 56 <p class="note"> 45 57 View the project on 46 - <a href="https://tangled.org/desertthunder.dev/ibex" target="_blank" rel="noreferrer">Tangled</a>. Atmosphere logos 47 - courtesy of 58 + <a href={REPO_URL} target="_blank" rel="external">Tangled</a>. Atmosphere logos courtesy of 48 59 <a href="https://tangled.org/cozylittle.house/atmologos" target="_blank" rel="noreferrer">atmologos</a>. 49 60 </p> 50 61 </section> ··· 126 137 font-size: var(--text-1); 127 138 } 128 139 129 - dl div:nth-last-child(-n + 2) dd { 140 + .mono { 130 141 font-family: var(--font-mono); 142 + } 143 + 144 + dd a { 145 + color: var(--blue-700); 146 + font-weight: 700; 147 + text-decoration: underline; 131 148 } 132 149 133 150 .note {
+3 -3
src/lib/components/StickyNote.svelte
··· 1 1 <script lang="ts"> 2 - import { version } from '$app/environment'; 2 + import { buildVersion } from '$lib/version'; 3 + import { REPO_URL } from '$lib/constants'; 3 4 let { onclose }: { onclose: () => void } = $props(); 4 - const sourceUrl = 'https://tangled.org/desertthunder.dev/ibex'; 5 5 </script> 6 6 7 7 <aside class="sticky-note" aria-label="Design note"> ··· 10 10 <p>This app is a recreation of the spirit of Ubuntu 8.10</p> 11 11 <hr /> 12 12 <p class="version-label"> 13 - <a href={sourceUrl} target="_blank" rel="noreferrer">{version}</a> 13 + <a href={REPO_URL} target="_blank" rel="external">{buildVersion.display}</a> 14 14 </p> 15 15 </aside> 16 16
+2 -1
src/lib/components/WelcomeScreen.svelte
··· 3 3 import { resolve } from '$app/paths'; 4 4 import { accountSetup } from '$lib/atproto/setup.svelte'; 5 5 import AboutComputer from '$lib/components/AboutComputer.svelte'; 6 + import { REPO_URL } from '$lib/constants'; 6 7 7 8 const quickLinks = [ 8 9 { ··· 23 24 label: 'Project source', 24 25 description: 'Visit the Tangled repo in a new tab.', 25 26 icon: '/icons/humanity/apps/web-browser.svg', 26 - href: 'https://tangled.org/desertthunder.dev/ibex', 27 + href: REPO_URL, 27 28 external: true 28 29 } 29 30 ] as const;
+1
src/lib/constants.ts
··· 1 + export const REPO_URL = 'https://tangled.org/desertthunder.dev/ibex';
+32
src/lib/version.ts
··· 1 + import { version as VERSION } from '$app/environment'; 2 + import { REPO_URL } from './constants'; 3 + 4 + export type BuildVersion = { display: string; commit: string; version: string }; 5 + 6 + const fallbackVersion: BuildVersion = { display: VERSION, commit: 'unknown', version: VERSION }; 7 + 8 + function isBuildVersion(value: unknown): value is BuildVersion { 9 + if (!value || typeof value !== 'object') return false; 10 + 11 + const candidate = value as Record<string, unknown>; 12 + return ( 13 + typeof candidate.display === 'string' && 14 + typeof candidate.commit === 'string' && 15 + typeof candidate.version === 'string' 16 + ); 17 + } 18 + 19 + function parseBuildVersion(value: string): BuildVersion { 20 + try { 21 + const parsed: unknown = JSON.parse(value); 22 + if (isBuildVersion(parsed)) return parsed; 23 + } catch (err) { 24 + console.warn(err instanceof Error ? err.message : String(err)); 25 + } 26 + 27 + return fallbackVersion; 28 + } 29 + 30 + export const buildVersion = parseBuildVersion(VERSION); 31 + 32 + export const buildCommitUrl = `${REPO_URL}/commit/${buildVersion.commit}`;
+8 -11
svelte.config.js
··· 4 4 import { mdsvex } from 'mdsvex'; 5 5 6 6 const packageJson = JSON.parse(fs.readFileSync(new URL('./package.json', import.meta.url), 'utf8')); 7 - const buildVersion = buildVersionLabel(packageJson.version); 7 + const buildVersion = buildVersionDetails(packageJson.version); 8 8 9 9 function getVersion(v) { 10 10 const verify = gitOutput(['rev-parse', '--verify', v]); ··· 12 12 return gitOutput(['describe', '--tags', '--abbrev=0', '--match', 'v[0-9]*']); 13 13 } 14 14 15 - function buildVersionLabel(version) { 15 + function buildVersionDetails(version) { 16 16 const versionTag = `v${version}`; 17 - const tag = getVersion(versionTag); 17 + const tag = getVersion(versionTag) ?? versionTag; 18 18 const count = gitOutput(tag ? ['rev-list', '--count', `${tag}..HEAD`] : ['rev-list', '--count', 'HEAD']) ?? '0'; 19 - 20 - if (count === '0') { 21 - return `v${version}`; 22 - } 23 - 24 - const commit = gitOutput(['rev-parse', '--short', 'HEAD']) ?? 'unknown'; 25 - return `v${version}-${count}+g${commit}`; 19 + const commit = gitOutput(['rev-parse', 'HEAD']) ?? 'unknown'; 20 + const shortCommit = gitOutput(['rev-parse', '--short', 'HEAD']) ?? 'unknown'; 21 + const display = count === '0' ? versionTag : `${versionTag}-${count}+g${shortCommit}`; 22 + return { display, commit, version: tag }; 26 23 } 27 24 28 25 function gitOutput(args) { ··· 38 35 extensions: ['.svelte', '.svx', '.md'], 39 36 preprocess: [mdsvex({ extensions: ['.svx', '.md'] })], 40 37 compilerOptions: { runes: ({ filename }) => (filename.split(/[/\\]/).includes('node_modules') ? undefined : true) }, 41 - kit: { adapter: adapter({ fallback: 'index.html' }), version: { name: buildVersion } } 38 + kit: { adapter: adapter({ fallback: 'index.html' }), version: { name: JSON.stringify(buildVersion) } } 42 39 }; 43 40 44 41 export default config;