Overview
Discover what makes Stringer powerful
Stringer is a lightweight, self‑hosted RSS reader built with Ruby on Rails and a PostgreSQL back‑end. It deliberately eschews external services, social networking hooks, or machine learning pipelines in favor of a deterministic, privacy‑first architecture. The core application exposes both a web UI and a Fever‑compatible REST API, allowing it to be paired with any mobile client that supports the Fever protocol. This dual‑mode interface makes Stringer a flexible integration point for developers who want to expose RSS content to custom front‑ends or third‑party readers without sacrificing control over data.
Backend
Database
Frontend
Containerization
Overview
Stringer is a lightweight, self‑hosted RSS reader built with Ruby on Rails and a PostgreSQL back‑end. It deliberately eschews external services, social networking hooks, or machine learning pipelines in favor of a deterministic, privacy‑first architecture. The core application exposes both a web UI and a Fever‑compatible REST API, allowing it to be paired with any mobile client that supports the Fever protocol. This dual‑mode interface makes Stringer a flexible integration point for developers who want to expose RSS content to custom front‑ends or third‑party readers without sacrificing control over data.
Architecture
- Backend: Ruby on Rails 7, leveraging ActiveRecord for ORM and ActionCable for real‑time updates. Background jobs are processed with GoodJob, which can use PostgreSQL’s
pg_jobtable or an external queue such as Sidekiq, giving developers the option to scale asynchronously. - Database: PostgreSQL is the sole data store, providing ACID guarantees for feed metadata, user credentials, and story content. Stringer ships with a schema that supports sharding via logical partitioning of stories by feed, which can be extended to multiple databases for horizontal scaling.
- Frontend: Backbone.js powers the client‑side MVC layer, enabling a single‑page experience with keyboard shortcuts and instant navigation. The UI is rendered server‑side for SEO and initial page load, then hydrated client‑side for interactivity.
- Containerization: Docker images are available in the repo, with a
docker-compose.ymlthat wires Rails, PostgreSQL, and GoodJob together. The Dockerfile is minimal, exposing only the necessary ports (default 5000) and environment variables (DATABASE_URL,LOCALE).
Core Capabilities
- Feed Management: CRUD operations for feeds, including automatic RSS/Atom parsing via the
feedjiragem. Developers can hook into feed ingestion with custom parsers or filters. - Story Lifecycle: Stories are stored in a
storiestable with status flags (read,starred). A rake task (cleanup_old_stories) demonstrates how to purge stale data programmatically. - API: The Fever clone exposes endpoints for authentication, fetching feeds, marking stories read/starred, and retrieving unread counts. The API is stateless and can be consumed by any HTTP client; authentication uses basic auth with a single user per instance.
- Internationalization: Locale files are stored in
config/locales, and theLOCALEenv var switches languages at runtime. Integration with LocaleApp allows community‑driven translations without code changes.
Deployment & Infrastructure
Stringer runs on any Ruby‑compatible environment: Heroku, VPS (Ubuntu/Debian), Docker, or OpenShift. The Heroku buildpack automatically installs dependencies and sets up the database via DATABASE_URL. For VPS deployments, the repo provides a VPS.md guide that assumes systemd and bundler. The Docker image can be orchestrated with Kubernetes or Docker‑Compose; the container exposes a single port and uses environment variables for configuration, making it straightforward to integrate with CI/CD pipelines. GoodJob’s background worker can be scaled horizontally by adding more pods or workers, and its PostgreSQL backend removes the need for a separate Redis instance.
Integration & Extensibility
- Plugins: While Stringer has no formal plugin API, its modular Rails structure allows developers to fork the repository and add custom controllers or background jobs. The
app/jobsfolder is a natural place to introduce new ingestion strategies. - Webhooks: The Fever API can be extended with custom endpoints; for example, a webhook that pushes new stories to a Slack channel or a custom notification service.
- Keyboard Shortcuts: The Backbone.js front‑end exposes
?for help, and developers can augment the shortcut map by adding new actions inapp/assets/javascripts/shortcuts.js. - Customization: Themes can be swapped by overriding CSS in
app/assets/stylesheets. Because the UI is rendered with ERB, developers can inject custom components or third‑party widgets.
Developer Experience
Stringer’s codebase is small and highly testable: RSpec covers the Ruby logic, while JavaScript tests run with rake test_js. The repository includes a comprehensive README and several documentation files (docs/Heroku.md, docs/VPS.md, docs/Docker.md) that walk through deployment scenarios. Community support is active via GitHub issues, and the project’s maintainability score on Code Climate indicates a clean architecture. The use of standard Rails conventions (routes, controllers, models) means that developers familiar with Rails can contribute quickly.
Use Cases
- Private Feed Hub – Deploy on a personal VPS to aggregate work blogs, tech news, and newsletters without exposing data to third‑party analytics.
- Custom Mobile Reader – Pair Stringer’s Fever API with a bespoke Android/iOS app that implements unique UX patterns or offline caching.
- Team Knowledge Base – Host a shared instance for internal documentation feeds, leveraging the
cleanup_old_storiesrake task to keep storage lean. - Embedded Widget – Embed the web UI in a corporate intranet, customizing the theme to match branding while retaining full control over data.
Advantages
- Privacy‑First: No external dependencies or telemetry; all data stays on the host.
- Performance: Rails + PostgreSQL provide fast query execution for feed lookups, while GoodJob handles background fetching
Open SourceReady to get started?
Join the community and start self-hosting Stringer today
Related Apps in other
Immich
Self‑hosted photo and video manager
Syncthing
Peer‑to‑peer file sync, no central server
Strapi
Open-source headless CMS for modern developers
reveal.js
Create stunning web‑based presentations with HTML, CSS and JavaScript
Stirling-PDF
Local web PDF editor with split, merge, convert and more
MinIO
Fast, S3-compatible object storage for AI and analytics
Weekly Views
Repository Health
Information
Explore More Apps
eLabFTW
Secure, collaborative electronic lab notebook and inventory system
Dashy
Central hub for self-hosted services
Ente
Secure, open‑source photo storage with end‑to‑end encryption
Typebot
Build advanced chatbots without code
Audiobookshelf
Self-hosted audiobook and podcast server
XBackBone
Lightweight PHP file manager for instant sharing
