Discover what people publish.
English · 简体中文
Explore gathers the public feeds of independent blogs and shows their latest posts as one stream, each linking straight back to the author's site. Any blog that publishes RSS, Atom or JSON Feed can join, starting with WordPress, Halo, Hugo and Hexo; Kite joins through the same open standards.
Explore keeps no post content. It stores the list of blogs; titles, dates and short excerpts are a cache that can be emptied and rebuilt from the feeds at any time. Readers get no cookies, no tracking and no third-party requests.
Explore is the discovery side of Kite Plus.
- Reading: the latest posts from every listed blog in one stream, filtered by language or topic; a directory with a page for each blog; the stream as RSS at
/feed.xmland the whole blog list as OPML at/blogs.opml. The interface is in Chinese and English. - Accounts, optional: follow blogs for a stream of your own, claim your blog, report a problem. Reading needs no account.
- Joining: authors submit a blog and its feed is checked on the spot, with what to fix if it fails.
explore check <url>runs the same check from a terminal. - Crawling: reads each blog's feed, and its sitemap for older posts, taking only the metadata in a post page's
<head>; follows robots.txt and robots meta tags, makes conditional requests and respects Retry-After; posts that link outside the blog's own site are dropped. - Admin console: review submissions, manage blogs and posts, handle takedowns and users, watch the crawl queue, and switch registration, submissions and crawling on or off.
0.1.0 is the first release. Until 1.0, a new release may still change configuration or behavior. The design lives in docs/design, written in Chinese.
Every release publishes two images for amd64 and arm64: ghcr.io/kite-plus/explore (the API, the crawler and database migrations) and ghcr.io/kite-plus/explore-web (the site). A server needs Docker with Compose, ports 80 and 443 open, and a domain whose DNS record points at it; Caddy gets the HTTPS certificate. No source code is needed.
-
Download the deployment files into an empty directory:
mkdir explore && cd explore base=https://raw.githubusercontent.com/kite-plus/explore/v0.1.5/deploy curl -fsSLO "$base/docker-compose.yaml" curl -fsSLO "$base/Caddyfile" curl -fsSL "$base/.env.example" -o .env
-
Edit
.env: setEXPLORE_VERSION=0.1.5, aPOSTGRES_PASSWORD(for example fromopenssl rand -hex 24) andEXPLORE_PUBLIC_URL. The file explains the optional settings. -
Start it:
docker compose up -d
-
Open
/adminon your domain right away. Until the first admin account exists, it shows a setup wizard: create the admin account, then choose whether to open registration and submissions. Whoever finishes the wizard first becomes the admin, so do it as soon as the site is up.
Upgrading: set EXPLORE_VERSION to the new release, then run docker compose pull && docker compose up -d. The database is migrated before the new version starts.
Backups: everything Explore keeps is in PostgreSQL. The post cache can be left out, since the crawler refills it:
docker compose exec -T postgres pg_dump -U explore --exclude-table-data=entries explore > explore.sqlTo put a reverse proxy you already run in place of Caddy, see docs/design/project-layout.md.
Every release also carries native builds: explore-<version>-<os>-<arch> is the one program behind the API, the crawler and database migrations, for Linux, macOS and Windows on amd64 and arm64, and explore-web-<version>.tar.gz is the site. You also need PostgreSQL 16, Node.js 22 and a reverse proxy:
- Set
EXPLORE_DATABASE_URLandEXPLORE_PUBLIC_URL, then runexplore migrate up. Run it again after every upgrade. - Keep
explore serve(on127.0.0.1:8080by default) andexplore workerrunning. SetEXPLORE_TRUSTED_PROXIES=127.0.0.1so rate limits still see readers' addresses behind the proxy and the site. - In the unpacked
explore-web-<version>directory, runnode dist/server/entry.mjswithEXPLORE_API_URL=http://127.0.0.1:8080,EXPLORE_PUBLIC_URL,HOST=127.0.0.1andPORT=4321. - Have the proxy send
/api/*,/feed.xml,/blogs.opml,/healthzand/readyzto serve and everything else to the site, asdeploy/Caddyfiledoes.
deploy/.env.example explains the other settings.
You need Go 1.26 and Docker, plus Node 22 and pnpm for the frontend.
make db-up
export EXPLORE_TEST_DATABASE_URL='postgres://explore:explore@127.0.0.1:5433/explore?sslmode=disable'
make check # formatting, vet, import rules, lint and tests
make web-test # build the frontend and test it against a stub APIChecking a blog's feed needs no database:
make build
./bin/explore check https://blog.example.com/Running the API and the worker locally is described in docs/design/project-layout.md.
Have an idea about how discovery should work? Open an issue to start the conversation.
Explore is licensed under the Apache License 2.0. The admin console is adapted from satnaing/shadcn-admin, which is MIT licensed; its license is kept in web/src/admin/LICENSE-shadcn-admin.txt.