English | 中文
A personal mixed-timeline reader for RSS and RSSHub, written in pure Go with native UI.
Articles, videos, social posts, images and community threads arrive from different places. Oriel puts all five in one timeline, on your own machine, in a native app with no browser engine inside. One Go program is both the app and its server: on a desktop it opens a window and serves only itself; on a home server or a VPS it runs without a window and other Oriel clients connect to it. Your data is one SQLite file you own. No accounts, no recommendations, no social features of its own.
┌──────────────────── oriel ────────────────────┐
│ native window (MyGo) ──HTTP──▶ server │
│ │ │
│ fetch loop ──▶ SQLite │
└───────────────────────────────────────────────┘
oriel serve: the same server, no window
- One timeline, five kinds. Article rows, video covers, social posts with their pictures, a masonry wall for images and three panes for community threads; each kind can also show as a grid or compact rows.
- Narrow it down. Kinds, subscriptions and folders, Unread, Starred, a time range, and search with phrases,
exclusions,
from:,kind:,after:andbefore:. - Keyboard first. Keys move, open, star and mark entries; N jumps to the next unread one, ? lists every key, and a command palette finds actions by name. Marking all read can be undone.
- Native reader. Full text when it could be extracted, the feed's content otherwise. Find in the article, export it as Markdown, see what changed in an update, read immersive, and choose a sepia or mist page and the line width.
- Calm timeline. New entries wait behind an "N new" button, an article several subscriptions carry shows once, entries can come back later with "Remind me", and you choose when an entry counts as read.
- Add from almost anything. A feed address, an RSSHub route, a website (its feed or route is found), or a YouTube, Bilibili, X, GitHub, Telegram or Weibo link.
- Scheduled fetching. RSS, Atom, JSON Feed and RSSHub, with conditional requests, backoff, a per-host limit, WebSub push and fallback to the next RSSHub instance. The check interval is worked out from how often a feed publishes.
- Per-subscription control. Check interval, retention, pace, daily cap, mute keywords, full-text rules, request headers and proxy. Subscription health points out dead, failing, moved and noisy feeds.
- Rules. Star or mark read new entries that match, and hide entries with mute keywords without deleting them.
- Summaries and translation through your own OpenAI-compatible endpoint, such as OpenAI, Ollama or LM Studio. On demand in the reader, or automatically for a subscription's new entries, with translated titles for foreign-language feeds. The API key stays on the server.
- One SQLite file with full-text search, through a pure Go driver.
- Starred copies. A starred entry keeps its full text and pictures, so it survives the original page going away.
- Import and export. OPML in and out; subscriptions, stars and read state from Miniflux and FreshRSS.
- Backups. One
.oriel-backupfile from Settings ororiel backup, restored from Settings ororiel restore, and scheduled backups to a folder. Sessions and the AI key stay out of the file. - Diagnostics without secrets, for bug reports.
- Desktop app serving only the loopback interface, or
oriel serveheadless with password sign-in and per-device sessions; the desktop app can connect to a remote server. - Desktop integration. Open at login, an unread count in the menu bar or tray and on the Dock, and updating after the window is closed.
- English and Simplified Chinese interface.
Planned work is in the milestones.
Early development. Releases are on the releases page and installed copies update themselves after you confirm. The macOS app is signed and notarized; the Windows installers are not signed yet, so SmartScreen warns on first launch.
Targets: macOS 12+, Windows 10/11 and Linux with GTK 3, on amd64 and arm64. Linux builds need glibc, also headless.
You need the Go version in .go-version and Python 3:
git clone https://github.com/yangflow/oriel
cd oriel
go tool mygo dev # run the desktop app
go tool mygo build # package it into build/ORIEL_PASSWORD=<password> go run . serve -data ./data -port 7470- Without
ORIEL_PASSWORDthe server listens on127.0.0.1only. The password is read from the environment only, so it never appears in the process list. -datadefaults to the user data directory.- Behind a reverse proxy, pass
-trusted-proxy <ip-or-cidr,...>so the login throttle readsX-Forwarded-Forfrom those addresses. List only your proxies; a/0range is refused.
The files are in deploy/; the details (data directory, port, reverse proxy and HTTPS, health check,
backups, upgrading) are in docs/product/running.md ("部署", in Chinese). The image is built from a
checkout, not pulled from a registry, for linux/amd64 and linux/arm64:
echo 'ORIEL_PASSWORD=<password>' > deploy/.env && chmod 600 deploy/.env
docker compose -f deploy/compose.yaml up -d --build- The example publishes the port on the host's
127.0.0.1only; editportsto open it, preferably behind an HTTPS reverse proxy. - In a container the password is required: without it the server listens only inside the container.
- The image runs as a non-root user, keeps its data in the volume
/data, and answers Docker's health check withoriel healthcheck. - For systemd, install
deploy/oriel.servicewith the password in a0600environment file; it runs as a dynamic user with its data in/var/lib/oriel.
scripts/check.sh # what a pull request runs: gofmt, go mod tidy, vet, tests, -race on the concurrent packages
scripts/check.sh --cross --race # everything, as CI runs it on main and daily: -race on all packages, six targets| Topic | Where |
|---|---|
| Behavior, data model, API, fetching and sign-in (in Chinese) | docs/product.md and docs/product/ |
| Screens canvas, design system and tokens | design/README.md |
| Architecture decisions | docs/adr/ |
| Releases | docs/release.md |
| Repository rules for people and agents | AGENTS.md |
Issues and pull requests are welcome in English or Chinese; see CONTRIBUTING.md. Report vulnerabilities privately as described in SECURITY.md.
MIT. Licenses of dependencies are listed in THIRD_PARTY.md.