Skip to content

Commit 1f25242

Browse files
committed
chore(hosts): move the explorer to explorer.twigpine.com
The explorer, its docs and its agent files now name explorer.twigpine.com and node / node2 / node3.twigpine.com, and the proxy rules call the nodes by those names. explorer.gitlawb.com forwards pages to the new address; the API proxy, llms.txt, skill.md and the raw docs keep answering there. The Manila node keeps its current address, and the documented node default for ICAPTCHA_URL is unchanged because it is the value the node ships with.
1 parent de3c84f commit 1f25242

21 files changed

Lines changed: 140 additions & 77 deletions

‎CONTRIBUTING.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ the conventions the codebase follows, and what to expect from the review process
1414
```
1515

1616
Requires Node.js 20+. The dev server proxies API calls to
17-
`https://node.gitlawb.com` — no backend setup needed.
17+
`https://node.twigpine.com` — no backend setup needed.
1818

1919
3. Create a branch off `main` for your change:
2020

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
[![CI](https://github.com/Twigpine/node-explorer/actions/workflows/ci.yml/badge.svg)](https://github.com/Twigpine/node-explorer/actions/workflows/ci.yml)
44
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
55

6-
A terminal-styled web explorer for a [gitlawb](https://gitlawb.com) node — browse live
6+
A terminal-styled web explorer for a [gitlawb](https://twigpine.com) node — browse live
77
repositories and registered agents, inspect code, commits, pulls, issues, certs, and
88
push events, straight from the node's REST API.
99

@@ -32,7 +32,7 @@ npm install
3232
npm run dev
3333
```
3434

35-
The dev server proxies `/api/*` and `/node-info` to `https://node.gitlawb.com`
35+
The dev server proxies `/api/*` and `/node-info` to `https://node.twigpine.com`
3636
(see `vite.config.ts`) — the node does not serve CORS headers, so all access goes
3737
through a same-origin proxy. To point at a different node, change the proxy
3838
`target`. A production deployment needs equivalent rewrites.

‎api/_lib/repository.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ describe('fetchRepository', () => {
3232

3333
expect(fetchMock).toHaveBeenCalledTimes(1);
3434
expect(String(fetchMock.mock.calls[0][0])).toBe(
35-
'https://node.gitlawb.com/api/v1/repos/did%3Akey%3Az6%20Owner/demo%2Fname',
35+
'https://node.twigpine.com/api/v1/repos/did%3Akey%3Az6%20Owner/demo%2Fname',
3636
);
3737
expect(fetchMock.mock.calls[0][1]).toMatchObject({ method: 'GET', cache: 'no-store' });
3838
});

‎api/_lib/repository.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const REPOSITORY_API_ORIGIN = 'https://node.gitlawb.com';
1+
const REPOSITORY_API_ORIGIN = 'https://node.twigpine.com';
22
const REPOSITORY_FETCH_TIMEOUT_MS = 3_500;
33

44
export interface ApiRepository {

‎api/_tests/docs-page.test.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,14 @@ describe('docs page HTML shell', () => {
120120
});
121121

122122
it('honors PUBLIC_SITE_URL for canonical and image URLs', async () => {
123-
vi.stubEnv('PUBLIC_SITE_URL', 'https://explorer.gitlawb.com');
123+
vi.stubEnv('PUBLIC_SITE_URL', 'https://explorer.twigpine.com');
124124
stubStaticFetch();
125125

126126
const response = await GET(docsRequest('protocol'));
127127
const html = await response.text();
128128

129-
expect(html).toContain('href="https://explorer.gitlawb.com/docs/protocol"');
130-
expect(html).toContain('content="https://explorer.gitlawb.com/og-docs.png"');
129+
expect(html).toContain('href="https://explorer.twigpine.com/docs/protocol"');
130+
expect(html).toContain('content="https://explorer.twigpine.com/og-docs.png"');
131131
});
132132

133133
it('serves the HTML shell to social crawlers that accept */*', async () => {

‎api/_tests/og.test.tsx‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const repository = {
1111
description: 'A carefully curated collection of digital garden tools and references.',
1212
is_public: true,
1313
default_branch: 'main',
14-
clone_url: 'https://node.gitlawb.com/repo.git',
14+
clone_url: 'https://node.twigpine.com/repo.git',
1515
star_count: 42,
1616
created_at: '2025-01-02T03:04:05.000Z',
1717
updated_at: '2026-07-10T12:00:00.000Z',
@@ -50,7 +50,7 @@ describe('repository OG image', () => {
5050
const owner = encodeURIComponent(repository.owner_did);
5151
const version = encodeURIComponent(repoCacheVersion(repository));
5252
const response = await GET(new Request(
53-
`https://explorer.gitlawb.com/api/og?owner=${owner}&name=${repository.name}&v=${version}`,
53+
`https://explorer.twigpine.com/api/og?owner=${owner}&name=${repository.name}&v=${version}`,
5454
));
5555

5656
expect(fetchMock).toHaveBeenCalledTimes(1);
@@ -73,7 +73,7 @@ describe('repository OG image', () => {
7373
vi.stubGlobal('fetch', fetchMock);
7474

7575
const response = await GET(new Request(
76-
'https://explorer.gitlawb.com/api/og?owner=z6Private&name=private-repository&v=stale',
76+
'https://explorer.twigpine.com/api/og?owner=z6Private&name=private-repository&v=stale',
7777
));
7878

7979
expect(fetchMock).toHaveBeenCalledTimes(1);
@@ -87,7 +87,7 @@ describe('repository OG image', () => {
8787
const fetchMock = vi.fn();
8888
vi.stubGlobal('fetch', fetchMock);
8989

90-
const response = await GET(new Request('https://explorer.gitlawb.com/api/og?owner=z6Only'));
90+
const response = await GET(new Request('https://explorer.twigpine.com/api/og?owner=z6Only'));
9191

9292
expect(fetchMock).not.toHaveBeenCalled();
9393
expect(response.headers.get('x-gitlawb-og-variant')).toBe('generic');
@@ -104,7 +104,7 @@ describe('repository OG image', () => {
104104
vi.stubGlobal('fetch', fetchMock);
105105

106106
const response = await GET(new Request(
107-
'https://explorer.gitlawb.com/api/og?owner=z6Unicode&name=unicode-repository',
107+
'https://explorer.twigpine.com/api/og?owner=z6Unicode&name=unicode-repository',
108108
));
109109

110110
expect(fetchMock).toHaveBeenCalledTimes(1);

‎api/_tests/repo-page.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ describe('repository page markdown negotiation', () => {
210210
expect(body).toContain('cert cert-abc-123');
211211
expect(body).toContain('pusher did:key:z6Pusher');
212212
expect(body).toContain('gl cert show demo <cert-id> --verify');
213-
expect(body).toContain('https://node.gitlawb.com/api/v1/repos/did:key:z6Owner/demo/events');
213+
expect(body).toContain('https://node.twigpine.com/api/v1/repos/did:key:z6Owner/demo/events');
214214
expect(body).toContain('https://preview.example/docs/agents.md');
215215
expect(body).not.toContain('<div id="root">');
216216
});
@@ -226,7 +226,7 @@ describe('repository page markdown negotiation', () => {
226226
expect(response.status).toBe(200);
227227
expect(body).toContain('# z6Owner/demo');
228228
expect(body).not.toContain('Recent signed pushes');
229-
expect(body).toContain('https://node.gitlawb.com/api/v1/repos/did:key:z6Owner/demo/certs');
229+
expect(body).toContain('https://node.twigpine.com/api/v1/repos/did:key:z6Owner/demo/certs');
230230
});
231231

232232
it('returns a markdown 404 for a missing repository', async () => {

‎api/docs-page.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ function hubMarkdown(origin: string): string {
187187
`- ${origin}/llms.txt — machine-readable index of everything on this site`,
188188
'',
189189
`Live network explorer (repos, agents, events): ${origin}/`,
190-
`Node API: https://node.gitlawb.com/api/v1 (e.g. /repos, /repos/{owner}/{repo}/events, /repos/{owner}/{repo}/certs)`,
190+
`Node API: https://node.twigpine.com/api/v1 (e.g. /repos, /repos/{owner}/{repo}/events, /repos/{owner}/{repo}/certs)`,
191191
'',
192192
);
193193
return lines.join('\n');

‎api/og.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -729,7 +729,7 @@ export function GenericOgCard(): ReactElement {
729729
width: '100%',
730730
}}
731731
>
732-
<div style={{ display: 'flex' }}>explorer.gitlawb.com</div>
732+
<div style={{ display: 'flex' }}>explorer.twigpine.com</div>
733733
<div style={{ color: colors.warm, display: 'flex' }}>OPEN / VERIFY / FEDERATE</div>
734734
</div>
735735
</Frame>

‎api/repo-page.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ function repoMarkdown(
196196
const ownerKey = model.owner.canonicalSegment;
197197
// Colons are path-safe and the node API accepts the did:key form verbatim;
198198
// keep it readable so agents can copy the URLs directly.
199-
const apiBase = `https://node.gitlawb.com/api/v1/repos/${model.owner.did}/${encodeURIComponent(model.canonicalName)}`;
199+
const apiBase = `https://node.twigpine.com/api/v1/repos/${model.owner.did}/${encodeURIComponent(model.canonicalName)}`;
200200

201201
const lines = [
202202
`# ${ownerKey}/${model.canonicalName}`,

0 commit comments

Comments
 (0)