telm
A zero-configuration, read-only admin console for Rails. Mount it, visit
/telm, and your entire schema is browsable — no per-model setup, no asset
pipeline integration, no generators to run per resource.
Status: early preview. The browse loop is complete — table directory, data tables (sorting, pagination, typed cells), record pages, association traversal. Search, the install generator, and general polish are still landing before 0.2. APIs and markup may change.
Install
bundle add telm
rails generate telm:install
The installer asks where the console should live (default /telm), mounts
the engine there, and writes a documented config/initializers/telm.rb
(with a working Devise check if Devise is present). Boot your server and
visit your chosen route.
Non-interactive setups can pass the route directly and skip the prompt:
rails generate telm:install --route=/admin
Requires Rails >= 7.1 and Ruby >= 3.2.
Authentication
With no configuration, telm allows access in development and refuses to render in production. To use it in production, configure an auth check:
# config/initializers/telm.rb
Telm.configure do |c|
c.authenticate_with do |controller|
controller.redirect_to "/" unless controller.current_user&.admin?
end
end
Configuration
Telm.configure do |c|
# Hide models entirely
c.excluded_models += ["LegacyAudit"]
# Columns matching /password|token|secret|otp|ssn|digest|api_key/i are
# masked by default. Add or remove "table.column" entries:
c.redacted_columns += ["users.recovery_phrase"]
c.unredacted_columns += ["webhooks.token_hint"]
end
What you get
- Automatic introspection — every ActiveRecord model with a table, found at first request. STI folds into the base class; a broken model is logged and excluded, never a crash.
- Read-only by construction — no write routes exist; queries are built from an allowlist and every user-supplied column name is validated against the introspected schema before it reaches SQL.
- Redaction on by default — sensitive columns render as
••••••; binary columns render as size badges, never raw bytes. - Self-contained UI — the design system (compiled CSS/JS and an Inter Variable font subset) ships inside the gem and is served by the engine. Your asset pipeline, JS entrypoints, and CSS are never touched.
Development
bin/setup
bundle exec rake # specs + rubocop
bundle exec puma spec/dummy/config.ru -p 9873 # seeded dummy app at /telm
rake telm:assets:build # rebuild the compiled design-system dist