Omnom is a self-hosted, AGPL-3.0 web content preservation service written in Go that bookmarks pages together with browser-rendered snapshots, aggregates feeds, and follows ActivityPub streams, built for individuals and small teams who want their reading, archiving, and fediverse following to live on infrastructure they control.
What it is
Omnom is an open-source web application that saves the web as the browser actually renders it. Rather than storing a link or a text extract, it captures the displayed content of dynamic pages, so a bookmark retains the page as it appeared at the moment of capture, including multimedia that is stored locally rather than hotlinked. On top of that capture engine it layers three roles that are usually served by three separate tools: bookmarking, an RSS/Atom reader, and an ActivityPub client, all behind one multiuser web interface with a documented API and a companion browser addon. The project lives in the self-hosted and fediverse ecosystem, and it is funded through NGI Zero Core, a fund established by NLnet with support from the European Commission's Next Generation Internet program.
The concrete problem it solves is link rot and page drift. A conventional bookmark points at a URL that may later change, move behind a paywall, or disappear entirely, and a feed reader tells you something was published without keeping a durable copy of what was published. Omnom replaces that split between a bookmark manager, a snapshot utility, and a feed reader by capturing content at read time and keeping it: the same URL can hold multiple snapshots over time, each with a resource summary and compare/diff views, so changes to a page are visible rather than lost. Filtering by date, free text search in content, tags, users, domains, and URLs makes the resulting archive searchable instead of merely stored.
Key capabilities
- Capture of websites as the browser renders them, which preserves the displayed content of dynamic pages as well.
- Multiple snapshots of the same URL, with resource summary and compare/diff views between captures.
- RSS/Atom feed aggregation, refreshable through the
update-feeds command.
- Fediverse and ActivityPub support, documented on the project wiki.
- Multiuser web interface with locally saved multimedia content.
- Flexible filtering by date, free text search in content, tags, users, domains, and URLs.
- Documented API, plus a command line tool with
create-bookmark, create-config, create-token, create-user, diff-html, generate-api-docs-md, set-token, show-unread, show-user, update-feeds, and validate-html.
- Browser addon published for Firefox and for Chrome/Chromium.
Who uses it and how
- Self-hosters running a single instance for personal archiving, starting the service with
./omnom listen and creating bookmarks either through the web interface, the browser addon, or ./omnom create-bookmark.
- Small multiuser deployments behind a reverse proxy, where the authenticated username is passed in a
Remote-User header and trusted by setting remote_user_header in config.yml.
- Fediverse participants who follow ActivityPub streams from inside the same interface where their bookmarks and feeds live, rather than through a separate client.
- Feed readers who aggregate RSS and Atom sources and keep the retrieved pages alongside the feed entries.
- API consumers and integrators, using the documented API and
generate-api-docs-md to work against the instance programmatically.
- Translators contributing localizations through the project's Weblate instance.
Getting started
A single file binary release is published on the releases page and needs only chmod +x before running; a Docker image is also available with details on the project wiki. For local builds, Go 1.24 or newer is required, followed by go get -u, go build, ./omnom create-config config.yml, and ./omnom listen.
How it compares
No comparable paid products are listed in the facts for this registry entry, and no alternative open-source tools are named either, so Omnom stands alone in this registry as a self-hosted preservation, feed, and fediverse service. Readers looking for a direct analogue should treat the wiki's feature and Fediverse support pages, rather than this page, as the source of truth.
When to use it — and when not to
A self-hoster must operate the web application and its configuration file, and must supply a working SMTP configuration in config.yml if email-based one time login tokens are wanted; without SMTP, tokens have to be generated from the command line with ./omnom create-token [username] login. Omnom does not store passwords at all, so anyone who expects conventional username and password accounts, or who does not want to run and maintain a server, is better served elsewhere, and remote user header authentication cannot be combined with OAuth or open signups. The main weakness visible in the facts is documentation depth: much of the operational detail, including Docker, fediverse support, and the API, lives on the external wiki rather than in the README, so setup requires following links.
project readme (upstream, from github) — read inline
Omnom

A web content preservation service
- Bookmark with website snapshots
- Aggregate feeds
- Follow ActivityPub streams
Check out our wiki for more information.
Features
- Self hosted
- Bookmarking
- RSS reader
- Fediverse/ActivityPub support
- Websites are captured as your browser renders it - saves the displayed content of dynamic pages as well
- Multiple snapshots of the same URL with resource summary and compare/diff views
- Web interface with multiuser support
- Locally saved multimedia content
- Flexible filtering - by date, free text search in content, tags, users, domains, URLs, etc..
- Documented API
Browser addon
Omnom browser addon is available for
Installation
Single file binary release is available here. (Don't forget to chmod +x)
Docker image is also available available, more details here.
Local build
go >= 1.24 required
- Checkout the repo and execute
go get -u in the root directory
- Run
go build
Setup & run
- Run
./omnom help to list the available commands
- Execute
./omnom listen to start the web application
Configuration
Settings can be configured in config.yml config file - don't forget to restart webapp after updating.
Execute ./omnom create-config config.yml to generate a configuration file with the default configuration values.
User handling
Omnom does not store passwords. Login requires one time login token, OAuth, or a remote user header.
Login tokens can be requested via email (this requires a valid SMTP configuration in config.yml) through the web interface or can be generated from command line using the ./omnom create-token [username] login.
If you use Omnom behind a reverse proxy with authentication, you can pass the logged-in username in an HTTP header like Remote-User to automatically log in. Omnom can be configured to trust the header by setting the remote_user_header option in config.yml. Remote user header authentication can't be used with OAuth or open signups.
Command line tool
Basic management actions are available using the command line tool (go run omnom.go or go build; ./omnom)
Available Commands
create-bookmark create new bookmark
create-config create default configuration file
create-token create new login/addon token for a user
create-user create new user
diff-html diff-html FILE1 FILE2
generate-api-docs-md Generate Markdown API documentation
help Help about any command
listen start server
set-token set new login/addon token for a user
show-unread show unread details
show-user show user details
update-feeds update RSS/Atom feeds
validate-html validate-html FILE
completion Generate the autocompletion script for the specified shell
Translations
To contribute to localizations, please visit our weblate

Bugs
Bugs or suggestions? Visit the issue tracker or join our discord server
License
AGPLv3
Funding
This project is funded through NGI Zero Core, a fund established by NLnet with financial support from the European Commission's Next Generation Internet program. Learn more at the NLnet project page.
