Skip to content

vdibart/polis-cli

Polis

License: AGPL-3.0 Platform: Linux | macOS | Windows

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.


Why Polis

  • 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.


Two ways to get started

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.


See it

$ 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 comments

Get started

curl -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.


The blessing model

Polis replaces top-down moderation with author-controlled curation.

  1. Someone comments on your post (the comment lives on their domain)
  2. They request your blessing via the discovery service
  3. You review and grant or deny — blessed comments appear on your rendered post
  4. Unblessed comments still exist on the commenter's domain, just not amplified to your audience

Curated conversation without censorship.


Installation

Pre-built binary (recommended)

curl -fsSL https://raw.githubusercontent.com/vdibart/polis-cli/main/scripts/install.sh | bash

Three 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

Build from source

git clone https://github.com/vdibart/polis-cli.git
cd polis-cli && make all
./dist/polis version

Going deeper

  • Themes — Seven built-in themes with Mustache-style templating. See Templating.
  • JSON mode — Every command supports --json for 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 bash CLI as specification

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.


Architecture

┌─────────────┐     imports     ┌─────────────┐
│   CLI (Go)  │ ──────────────▶ │   Webapp    │
│  cli-go/    │    cli-go/pkg/  │  webapp/    │
└──────┬──────┘                 └──────┬──────┘
       │                               │
       │ register/query                │ /v1/ API
       ▼                               ▼
┌──────────────────────────────────────────────┐
│          Discovery Service (TypeScript)      │
└──────────────────────────────────────────────┘

Documentation

For Users

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

For Developers

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

General

Document Description
Vision Why Polis exists — manifesto and experience principles
Security Policy Reporting vulnerabilities

Contributing

We welcome contributions! See CONTRIBUTING.md for guidelines.

Support

Questions or issues? Open a GitHub issue

License

AGPL-3.0 — See LICENSE


Your content, your domain, your rules.

About

Decentralized social networking where your domain is your identity. Publish signed posts, follow authors across the web, own your entire social graph—cryptographically signed, fully portable, no lock-in.

Topics

Resources

License

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors