Open source · self-hosted

A beautiful public face for yourRadicle node.

An open-source Next.js dashboard for radicle-httpd. Point it at your local seed and ship a polished public profile.

See it live

The same dashboard, running right here.

A live glance at the top of /profile on this node — open full size for the heatmap and repo grid.

https://radprofile.xyz/profile

Open full size →

Sovereign by default. Familiar by design.

Your data, your node

No SaaS account, no API key, no hosted backend. The dashboard talks to a Radicle daemon you control.

Bring your own host

Laptop, home server, VPS. Anywhere Node.js runs. Caddy + Cloudflare Tunnel publish it for free.

Modern dev hub feel

Generative avatar, search, sort, copy-as-clone. Familiar to anyone who's used a code-hosting profile.

Per-RID resilient

Works even when /repos returns empty. Configure the RIDs you care about and they show up.

Plain Next.js

App Router, Tailwind v4, lucide-react. Tweak the components, theme, fonts. No proprietary primitives.

No telemetry, no SaaS

Zero analytics, zero third-party scripts, zero hosted backend. Just static HTML rendered from your node.

Quickstart

Quickstart

Get it running, then point it at your repos.

1 · Run it
git clone <repo-url> radprofile
cd radprofile/dashboard
cp .env.example .env.local
npm install
npm run dev                  # http://localhost:3100
2 · Make it yours
# .env.local — make it yours
RADICLE_HTTP_BASE=http://127.0.0.1:8090
RADICLE_PROFILE_ALIAS=your_alias
RADICLE_DELEGATE_DID=did:key:z6Mk...
RADICLE_REPO_IDS=\
  rad:zAbCd...,\
  rad:zEfGh...

Self-host in three steps

Bring your own node — point this at it.

  1. 1

    Run a Radicle node + HTTP daemon

    rad node start && radicle-httpd --listen 0.0.0.0:8090

  2. 2

    Point the dashboard at it

    Set RADICLE_HTTP_BASE and an optional RADICLE_REPO_IDS.

  3. 3

    Build & start

    npm run build && npm start

FAQ

Common questions

Explorer opens but shows “NetworkError when attempting to fetch resource”
Links point at radicle.network/nodes/<seed>/<rid>. The Explorer page then asks that seed for your repo over the network. If the seed has not replicated your RID yet (or your browser blocks the request), fetches fail with that error. Set NEXT_PUBLIC_RADICLE_EXPLORER_NODE in env to a hostname that actually hosts your repository, try another public seed (e.g. iris.radicle.xyz, iris.radicle.network, or seed.radicle.dev), or wait for replication. You can also set NEXT_PUBLIC_RADICLE_EXPLORER_ORIGIN if you use a different Explorer deployment. Try a normal browser if an embedded preview blocks cross-site loads.
How is this different from Radicle Explorer?
Explorer is great for browsing one repository at a time on a shared seed (radicle.network). This dashboard is your personal homepage on the network: a curated profile of your repos, plus a whole-node view that respects pinning and search. Both read the same JSON API, so they’re complementary, not competing.
Do I need a public IP or a domain?
No. For local-only use, just npm run dev and visit localhost. To make it public, use Cloudflare Tunnel (free, no port-forward) or open ports 80/443 on your router. See the project repo’s infra/PUBLISH_WITH_CLOUDFLARE.md.
Can I host this without running my own Radicle node?
Yes — point RADICLE_HTTP_BASE at any reachable radicle-httpd. You give up sovereignty (you’re trusting that node’s data), but you can stand up a profile in minutes against e.g. a friend’s seed.
How do I update which repos appear on /profile?
Set RADICLE_REPO_IDS in your env to a comma-separated list of RIDs, or edit src/lib/profileRepos.ts and redeploy. The page fetches each one in parallel from /api/v1/repos/<rid>.
Why is /node empty even though I’ve seeded repositories?
The All tab calls /api/v1/repos?show=all — if that list is empty, your HTTP daemon’s node inventory may not match what you expect (wrong RADICLE_HTTP_BASE, different machine, or the daemon needs a restart). The Pinned tab uses show=pinned, which follows web.pinned.repositories in $RAD_HOME/config.json (often ~/.radicle/config.json). There is no rad pin command — add RIDs to that JSON array, then restart radicle-httpd if needed. For /profile, repos come from RADICLE_REPO_IDS in .env.local, not the pinned list.
What does it cost to run?
$0/month for the software (open source). Hosting cost is just your electricity if you self-host on a Mac/Pi/NUC, plus ~$10/yr per domain. No usage-based billing, no surprise charges, no SaaS account.

Ready to publish your node?

Clone it, point at radicle-httpd, and you’re live in about two minutes.

radprofile.xyz · A beautiful public face for your Radicle node