Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
384a8de
app-store: add Redis app card (#66)
Alexgodoroja Jul 2, 2026
990ee58
app-store: add DuckDB app card (#62)
Alexgodoroja Jul 2, 2026
34d03fc
feat(seo): wire OG images for /app-store and all /docs routes (#71)
TeoSlayer Jul 2, 2026
889ba40
App Store: featured, categories, detail pages, and developer publishi…
Alexgodoroja Jul 2, 2026
3c95238
wip: hero rewrite (Option A) + shared live stats for human/plain pages
Jul 2, 2026
852af37
Merge remote-tracking branch 'upstream/main' into website-rewrite
Jul 2, 2026
55a19de
Fix App Store: reconcile with the live catalogue, remove placeholder …
Alexgodoroja Jul 2, 2026
c283cfb
blog: move post registry to JSON + add iso_date (#75)
TeoSlayer Jul 3, 2026
0341c55
wip: homepage rewrite — hero, economy, vs redesign, stats, motion, cl…
Jul 4, 2026
baa6651
Merge remote-tracking branch 'upstream/main' into website-rewrite
Jul 4, 2026
606de77
app-store: add Bowmark (#79)
Alexgodoroja Jul 6, 2026
b95c74e
blog: expand Pilot vs Tailscale/Nebula/ZeroTier post with Nebula vs T…
philip638 Jul 7, 2026
a920a99
SEO: optimize IETF Internet-Draft blog snippet for CTR (#78)
philip638 Jul 7, 2026
37051b6
seo: improve /blog/ title, meta description, intro, internal links fo…
philip638 Jul 7, 2026
89b9467
SEO: rewrite CTR title/meta + FAQ for zero-dependency encryption post…
philip638 Jul 7, 2026
5ccc0c8
blog: how to build an agent app — turn your API into an agent-native …
philip638 Jul 7, 2026
66ac566
blog: expand X25519+AES-GCM post — AES-128 vs AES-256-GCM (#83) (#92)
TeoSlayer Jul 7, 2026
ef17368
blog: expand secure research collaboration post with social-structure…
philip638 Jul 7, 2026
03082db
Expand ai-agent-app-store post with build/publish tutorial section (#85)
philip638 Jul 7, 2026
0b62154
seo: optimize CTR for AI agent discovery P2P post (#86)
philip638 Jul 7, 2026
3c43f70
legal: Publisher Release Agreement — complete fee-ready rewrite (v202…
philip638 Jul 7, 2026
b67d6f9
app-store: add Orthogonal card (#88)
Alexgodoroja Jul 7, 2026
68ca2ed
app-store: add SQLite (io.pilot.sqlite) card (#89)
Alexgodoroja Jul 7, 2026
b61bea9
SEO: CTR harvest for /blog/ai-agent-discovery-process-p2p-networks (#…
TeoSlayer Jul 7, 2026
1b2b4dc
blog: add Build an Agent App — turn your API into an installable Pilo…
TeoSlayer Jul 7, 2026
8899e3a
blog: Web Search API for AI Agents — grounded research with cosift (#…
TeoSlayer Jul 7, 2026
315cbdf
fix(install): sync public/install.sh with canonical from pilot-protoc…
TeoSlayer Jul 7, 2026
f947d17
ci: pin wrangler@4 in sync-install-sh — v3 lacks the --remote flag (#99)
TeoSlayer Jul 7, 2026
a8d257c
ci: prefer CLOUDFLARE_R2_TOKEN in sync-install-sh — Pages token lacks…
TeoSlayer Jul 7, 2026
b7297c3
fix(worker): repoint pilot-publish at pilot-protocol/website with pos…
TeoSlayer Jul 7, 2026
deceb20
app-store: make Orthogonal visible + endpoint pricing chart (#104)
Alexgodoroja Jul 7, 2026
f6625b4
Add AgentPhone to the app store (#105)
Alexgodoroja Jul 7, 2026
9d4f0bc
app-store: real Orthogonal logo + show single-app category shelves (C…
Alexgodoroja Jul 7, 2026
8213884
app-store: Smol Machines → io.pilot.smol (local + cloud microVMs) (#74)
Alexgodoroja Jul 7, 2026
3617016
app-store: add MySQL (io.pilot.mysql) card (#108)
Alexgodoroja Jul 7, 2026
40da36c
app-store: add io.pilot.didit (Didit identity platform) (#107)
Alexgodoroja Jul 8, 2026
769e573
fix(site): correct all stale/broken claims from the product review (#…
TeoSlayer Jul 8, 2026
b513efe
fix(site): review remainder — director on homepage, SDK pages, securi…
TeoSlayer Jul 8, 2026
5bcbf21
wip: footer install headline, skills page removal, homepage glow redu…
Jul 10, 2026
e8bc0ef
Merge remote-tracking branch 'upstream/main' into website-rewrite
Jul 10, 2026
dc112da
Snapshot: session UI work before merging upstream/main
Jul 14, 2026
f06e53b
Import upstream docs + blog updates (homepage untouched)
Jul 14, 2026
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
113 changes: 0 additions & 113 deletions .github/workflows/publish-manifest.yml

This file was deleted.

75 changes: 75 additions & 0 deletions .github/workflows/sync-install-sh.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
name: sync-install-sh

# Keep the live https://pilotprotocol.network/install.sh in sync with the
# canonical script. The pilot-release Worker serves /install.sh from the
# pilot-release-assets R2 bucket — NOT from Pages — so a git-side fix that
# never reaches R2 is invisible to users. That exact gap shipped a stale,
# broken installer for ~6 weeks (fresh installs aborted at
# "cp: pilot-gateway: No such file or directory", reported 2026-07-06).
#
# Source of truth: pilot-protocol/release:install.sh (main).
# This repo's public/install.sh is a shadowed fallback kept byte-identical.

on:
push:
branches: [main]
paths:
- public/install.sh
- .github/workflows/sync-install-sh.yml
schedule:
- cron: '17 6 * * *' # daily — catches changes that land only in pilot-protocol/release
workflow_dispatch:

permissions:
contents: read

concurrency:
group: sync-install-sh
cancel-in-progress: true

jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Fetch canonical install.sh from pilot-protocol/release
run: |
curl -fsSL "https://raw.githubusercontent.com/pilot-protocol/release/main/install.sh" -o canonical-install.sh
bash -n canonical-install.sh
# The installer must never hard-depend on the gateway binary —
# release tarballs ship daemon/pilotctl/updater only. Guard the
# regression that broke fresh installs.
if grep -qE '^\s*cp "\$TMPDIR/pilot-gateway"' canonical-install.sh; then
if ! grep -qE 'elif \[ -f "\$TMPDIR/pilot-gateway" \]' canonical-install.sh; then
echo "::error::canonical install.sh copies pilot-gateway unconditionally — refusing to publish a script that aborts fresh installs"
exit 1
fi
fi

- name: Warn when the Pages fallback copy has drifted
run: |
if ! diff -q canonical-install.sh public/install.sh >/dev/null; then
echo "::warning::public/install.sh differs from pilot-protocol/release:install.sh — the live copy (R2) follows the release repo; update public/install.sh to match"
fi

- name: Upload to R2 (served by the pilot-release Worker)
env:
# CLOUDFLARE_API_TOKEN (Pages-scoped) returned 403 code 10000 on the
# R2 objects endpoint — mint a token with Account → R2 → Edit scope
# and store it as CLOUDFLARE_R2_TOKEN. Falls back to the Pages token
# so the day that one gains R2 scope this also starts working.
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_R2_TOKEN || secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
run: |
npx --yes wrangler@4 r2 object put pilot-release-assets/install.sh \
--file canonical-install.sh \
--content-type "text/plain; charset=utf-8" \
--remote

- name: Verify the live URL serves the canonical script
run: |
sleep 5
curl -fsSL -H 'Cache-Control: no-cache' "https://pilotprotocol.network/install.sh" -o live-install.sh
diff canonical-install.sh live-install.sh
echo "live install.sh matches canonical"
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,6 @@ worker/coverage/

.env
.gstack/

# macOS
.DS_Store
144 changes: 144 additions & 0 deletions .snippets/blog-bar.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
# Latest-blog bar (saved for later re-insertion)

A slim, angular, theme-flipping (white-on-dark / black-on-light) outlined strip with
an outer glow, showing the 3 most recent blog posts (thumbnail + date + title) below
the thesis section's "One line of code gets an agent online. No SDK. No API key."

Removed from `src/pages/index.astro` on 2026-07-07 at the user's request; restore all
three pieces below verbatim when asked to "put the blog bar back".

---

## 1. Frontmatter (top of `src/pages/index.astro`, after the `getLiveStats` import + call)

Add the import:
```js
import { blogPosts } from '../data/blogPosts';
```

Add after `const { liveAgents, liveAgentsExact, liveRequests } = await getLiveStats();`:
```js
// Three most recent posts for the thesis blog bar, newest first.
const latestPosts = [...blogPosts]
.sort((a, b) => (b.iso_date ?? '').localeCompare(a.iso_date ?? ''))
.slice(0, 3);
```

## 2. Markup — inside `#thesis`, immediately after the closing `</div></div>` of the
`.thesis` block (i.e. right after the "One line of code…" paragraph's container),
before the section closes:

```html
<!-- Latest blog posts bar. -->
<div class="blog-bar">
<div class="bb-label">
<span class="bb-eyebrow">From the blog</span>
<a class="bb-all" href="/blog/">All posts →</a>
</div>
<div class="bb-posts">
{latestPosts.map((post) => (
<a class="bb-post" href={`/blog/${post.slug}`}
data-track="cta_click" data-track-target="blog" data-track-location="thesis">
<span class="bb-thumb">
<img src={`/blog/${post.banner}`} alt="" loading="lazy" />
</span>
<span class="bb-body">
<span class="bb-date">{post.date}</span>
<span class="bb-title">{post.title}</span>
</span>
</a>
))}
</div>
</div>
```

## 3. CSS — inside the homepage `<style>` block:

```css
/* Latest-blog bar under the thesis — slim, angular, theme-flipping outline + glow. */
.blog-bar {
margin-top: 40px;
padding: 30px 32px;
/* Theme-flipping outline: near-white in dark mode, near-black in light mode. */
border: 1px solid color-mix(in srgb, var(--ink) 55%, transparent);
/* Soft outer glow in the same theme-flipping tone. */
box-shadow:
0 0 24px color-mix(in srgb, var(--ink) 18%, transparent),
0 0 4px color-mix(in srgb, var(--ink) 22%, transparent);
display: flex;
align-items: center;
gap: 36px;
}
.bb-label {
display: flex;
flex-direction: column;
gap: 3px;
flex: none;
}
.bb-eyebrow {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--accent);
}
.bb-all {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.04em;
color: var(--ink-dim);
text-decoration: none;
}
.bb-all:hover { color: var(--accent); }
.bb-posts {
flex: 1;
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
.bb-post {
display: flex;
align-items: center;
gap: 14px;
padding: 10px 10px;
text-decoration: none;
color: inherit;
transition: background 0.15s;
}
.bb-post:hover { background: color-mix(in srgb, var(--ink) 8%, transparent); }
.bb-thumb {
flex: none;
width: 168px;
aspect-ratio: 1200 / 630;
overflow: hidden;
background: var(--bg-2);
}
.bb-thumb img { width: 100%; height: 100%; object-fit: contain; display: block; transition: transform 0.3s ease; }
.bb-post:hover .bb-thumb img { transform: scale(1.05); }
.bb-body { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.bb-date {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--ink-dim);
}
.bb-title {
font-size: 15px;
line-height: 1.4;
letter-spacing: -0.01em;
color: var(--ink);
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.bb-post:hover .bb-title { color: var(--accent); }
@media (max-width: 860px) {
.blog-bar { flex-direction: column; align-items: stretch; gap: 14px; }
.bb-label { flex-direction: row; align-items: baseline; justify-content: space-between; }
}
@media (max-width: 600px) {
.bb-posts { grid-template-columns: 1fr; }
}
```
Loading
Loading