- Ruby web app that converts websites into RSS 2.0 feeds.
- Built with Roda backend + Astro frontend, using the html2rss gem (+
html2rss-configs). - Frontend: Modern Astro-based UI with component architecture, served alongside Ruby backend.
Search these pages before using them. Find examples, plugins, UI components, and configuration options.
- If available, find source locally in:
../html2rss. - source code on github: https://github.com/html2rss/html2rss
- https://docs.rubocop.org/rubocop/cops.html
- https://docs.rubocop.org/rubocop-rspec/cops_rspec.html
- https://rspec.info/features/3-13/rspec-expectations/built-in-matchers/
- https://www.betterspecs.org/
Fix rubocop RSpec/MultipleExpectations adding rspec tag :aggregate_failures.
- ✅ Organise Roda routes via dedicated modules (e.g.
Html2rss::Web::Routes::*), keeping the main app class thin. - ✅ Keep helper modules minimal: define entrypoints with
class << selfand push implementation helpers underprivate; avoidmodule_functionunless mirroring existing conventions. - ✅ Validate all inputs. Pass outbound requests through SSRF filter.
- ✅ Add caching headers where appropriate (
Rack::Cache). - ✅ Errors: friendly messages for users, detailed logging internally.
- ✅ Frontend: Use Astro components in
frontend/src/. Keep it simple. - ✅ CSS: Use frontend styles provided by Astro Starlight.
- ✅ Specs: RSpec for Ruby, build tests for frontend.
- ✅ When a spec needs to tweak environment variables, wrap the example in
ClimateControl.modifyso state is restored automatically.
- ❌ Don't use Ruby's URI class or addressable gem directly. Strictly use
Html2rss::Urlonly. - ❌ Don't bypass SSRF filter or weaken CSP.
- ❌ Don't add databases, ORMs, or background jobs.
- ❌ Don't leak stack traces or secrets in responses.
- ❌ Don't reach into private API with
send(...); expose what you need at the module level instead. - ❌ Don't modify
frontend/dist/- it's generated by build process. - ❌ NEVER expose the auth token a user provides.
RACK_ENV– environmentAUTO_SOURCE_ENABLED,AUTO_SOURCE_USERNAME,AUTO_SOURCE_PASSWORD,AUTO_SOURCE_ALLOWED_ORIGINSHEALTH_CHECK_USERNAME,HEALTH_CHECK_PASSWORDSENTRY_DSN(optional)
- Run
ruby -c app.rbto check syntax - Run
bundle exec rspecto verify tests - Check
bundle installremoves unused dependencies
- Add
# frozen_string_literal: true - Follow RuboCop style
- YARD doc comments for public methods