A decentralized social network that makes the open web fun again.
Polis helps you publish, follow, and have conversations — without losing control over your content. Your posts are signed markdown files. Your identity is a keypair. Easily deploy to GitHub Pages, Netlify, or any static host and own everything you create.
-
Your content can't be deplatformed. Posts are markdown files signed with your Ed25519 key, hosted on your domain. No API to shut off, no account to suspend.
-
Comments without spam. Anyone can comment on your posts (published on their domain). You bless the ones you want your audience to see. Unblessed comments still exist — just not on your site.
-
Move hosts anytime. Everything is flat files. Switch from GitHub Pages to Netlify to a VPS — your content, keys, and followers come with you.
-
No algorithms, no fees, no lock-in. No engagement metrics, no 10% platform cut, no terms of service that change under your feet.
Polis CLI — A single binary you run on your machine. Publish from your own domain, sign everything locally, deploy to any static host. Full control, no dependencies on us.
polis.pub — A hosted service where you get yourname.polis.pub and start publishing immediately. Same features, managed infrastructure, no server to maintain.
Why both? Decentralized networks need a critical mass of participants before they become self-sustaining. polis.pub bootstraps that network — it gives people a way to join and start writing today, without setting up hosting first. The goal is a future where most authors self-host and polis.pub is just one node among many. Think of it as scaffolding: necessary now, designed to become optional.
$ polis init
[✓] Generated Ed25519 keypair
[✓] Created .well-known/polis
[✓] Ready to publish
$ polis post essay.md
[i] Content hash: sha256:a3b5c7d9...
[i] Signing with Ed25519 key...
[✓] Published: posts/2026/01/essay.md
$ polis follow https://alice.dev
[✓] Following alice.dev
[i] 12 posts, 3 with commentscurl -fsSL https://raw.githubusercontent.com/vdibart/polis-cli/main/scripts/install.sh | bash
mkdir my-site && cd my-site
polis init
export POLIS_BASE_URL="https://yourdomain.com"
echo "# Hello World" > hello.md
polis post hello.md
polis render # Generate HTML
# Deploy
git init && git add . && git commit -m "First post"
git push # To GitHub Pages, Netlify, etc.polis post, polis follow, polis discover, polis comment, and more. All support --json for scripting and automation. See the full command reference.
Polis replaces top-down moderation with author-controlled curation.
- Someone comments on your post (the comment lives on their domain)
- They request your blessing via the discovery service
- You review and grant or deny — blessed comments appear on your rendered post
- Unblessed comments still exist on the commenter's domain, just not amplified to your audience
Curated conversation without censorship.
curl -fsSL https://raw.githubusercontent.com/vdibart/polis-cli/main/scripts/install.sh | bashThree binaries are available on GitHub Releases:
| Binary | What you get | Size |
|---|---|---|
polis (recommended) |
CLI | ~9 MB |
polis-full |
CLI + local web UI | ~12 MB |
polis-server |
Web UI only | ~11 MB |
git clone https://github.com/vdibart/polis-cli.git
cd polis-cli && make all
./dist/polis version- Themes — Seven built-in themes with Mustache-style templating. See Templating.
- JSON mode — Every command supports
--jsonfor scripting and automation. See JSON Mode. - AI integration — Polis includes a Claude Code skill for natural language workflows: "publish my draft", "check my blessing requests", "comment on Alice's post".
The bootstrap bash implementation (cli-bash/polis) is a single ~8500-line file that implements the complete Polis protocol with minimal dependencies (bash, jq, curl, ssh). It serves as a readable, executable specification — purpose-built for developers and LLMs to reference when porting Polis to other languages. Not deprecated, not legacy: a spec you can run.
┌─────────────┐ imports ┌─────────────┐
│ CLI (Go) │ ──────────────▶ │ Webapp │
│ cli-go/ │ cli-go/pkg/ │ webapp/ │
└──────┬──────┘ └──────┬──────┘
│ │
│ register/query │ /v1/ API
▼ ▼
┌──────────────────────────────────────────────┐
│ Discovery Service (TypeScript) │
└──────────────────────────────────────────────┘
| Document | Description |
|---|---|
| Command Reference | Complete command reference |
| Templating | Theme customization and template syntax |
| JSON Mode | JSON output for scripting |
| API Reference | Content Type REST API |
| Glossary | Polis-specific terminology |
| Document | Description |
|---|---|
| Content System | Bundles, content types, events, filesystem layout |
| Security Model | Cryptographic foundations, threat model, policies |
| CLI Packages | Package structure, import rules, version propagation |
| Webapp Development | Handler patterns, testing, frontend architecture |
| Dispatch Engine | API engine architecture and handler types |
| Contributing | Development setup and contribution guidelines |
| Document | Description |
|---|---|
| Vision | Why Polis exists — manifesto and experience principles |
| Security Policy | Reporting vulnerabilities |
We welcome contributions! See CONTRIBUTING.md for guidelines.
Questions or issues? Open a GitHub issue
AGPL-3.0 — See LICENSE
Your content, your domain, your rules.