{"id":36220517,"url":"https://github.com/aviflombaum/railspress-engine","last_synced_at":"2026-04-15T13:01:33.104Z","repository":{"id":329814001,"uuid":"1120728537","full_name":"aviflombaum/railspress-engine","owner":"aviflombaum","description":"Content management the Rails way. A simple blog and CMS engine for Rails apps.","archived":false,"fork":false,"pushed_at":"2026-04-14T17:14:00.000Z","size":2210,"stargazers_count":38,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-14T17:24:17.832Z","etag":null,"topics":["cms","rails","rails-engine"],"latest_commit_sha":null,"homepage":"https://railspress.org","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aviflombaum.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-12-21T20:27:18.000Z","updated_at":"2026-04-14T17:04:26.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/aviflombaum/railspress-engine","commit_stats":null,"previous_names":["aviflombaum/railspress-engine"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/aviflombaum/railspress-engine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aviflombaum%2Frailspress-engine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aviflombaum%2Frailspress-engine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aviflombaum%2Frailspress-engine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aviflombaum%2Frailspress-engine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aviflombaum","download_url":"https://codeload.github.com/aviflombaum/railspress-engine/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aviflombaum%2Frailspress-engine/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31842193,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-15T11:29:19.690Z","status":"ssl_error","status_checked_at":"2026-04-15T11:29:19.171Z","response_time":63,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cms","rails","rails-engine"],"created_at":"2026-01-11T04:56:10.333Z","updated_at":"2026-04-15T13:01:33.092Z","avatar_url":"https://github.com/aviflombaum.png","language":"Ruby","funding_links":[],"categories":["Ruby"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eRailsPress\u003c/strong\u003e\u003cbr\u003e\n  A mountable blog + CMS engine for Rails 8\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://rubygems.org/gems/railspress-engine\"\u003e\u003cimg src=\"https://img.shields.io/gem/v/railspress-engine.svg?style=flat\u0026bump=true\" alt=\"Gem Version\"\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Rails-8.1%2B-red.svg?style=flat\" alt=\"Rails 8.1+\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Ruby-3.3%2B-red.svg?style=flat\" alt=\"Ruby 3.3+\"\u003e\n  \u003ca href=\"https://osaasy.dev/\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-O'Saasy-blue.svg?style=flat\" alt=\"License\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\nRailsPress is a mountable Rails engine that gives your app a complete content management system — namespaced and isolated so it stays out of your way.\n\nYou can read more at [Railspress.org](https://railspress.org).\n\nIt manages three kinds of content:\n\n## Posts, Entities, and Blocks\n\n### Posts\n\nYour blog. Chronological content published over time — articles, news, announcements. Categories, tags, draft/published workflow.\n\n- Rich text editing with [Lexxy](https://github.com/basecamp/lexxy) + markdown mode toggle\n- Categories, tags, draft/published workflow\n- SEO metadata (meta title, meta description)\n- Reading time auto-calculation\n- Header images with focal point cropping\n- Import/export (markdown + YAML frontmatter)\n\n### Entities\n\nYour pages of structured content. A portfolio with projects, a collection of case studies, a resources page with links — anything with its own schema that isn't a blog post.\n\nYou define a regular ActiveRecord model, include `Railspress::Entity`, and RailsPress gives it a full admin interface with CRUD, search, pagination, image uploads, and tagging — no scaffolding or custom views required.\n\n- Define fields with `railspress_fields` DSL or let RailsPress auto-detect from your schema\n- Supports string, text, rich text, boolean, datetime, attachments, array fields, and more\n- Focal point image cropping for any attachment\n- Polymorphic tagging\n- Custom index columns, searchable fields, scopes\n- Generator: `rails generate railspress:entity Project title:string description:text`\n\n### Blocks\n\nThe copy and images on your site itself. Your homepage hero headline, an \"About Us\" blurb, a call-to-action, a footer tagline — the content that normally lives hardcoded in templates and requires a developer to change.\n\nBlocks are organized into **groups** (e.g., \"Homepage Hero\", \"Contact Info\") and each block is either text or an image. You reference them in your views and they become editable in the admin — or inline, right on the page.\n\n- Chainable Ruby API: `Railspress::CMS.find(\"Hero\").load(\"headline\").value`\n- View helpers: `cms_value(\"Hero\", \"headline\")` and `cms_element(\"Hero\", \"headline\")`\n- Inline editing — right-click any `cms_element` in the frontend to edit in place\n- Auto-versioning with full audit trail\n- Required blocks that can't be accidentally deleted\n- Image blocks with upload, hints, and focal points\n- Export/import block groups as ZIP\n\n### Why all three?\n\nMost content doesn't fit neatly into \"blog posts.\" A portfolio piece isn't a post. A homepage headline isn't a post. RailsPress gives you the right tool for each kind of content instead of forcing everything through one model.\n\n## Features\n\n**Admin Interface**\n- Dashboard with content stats and recent activity\n- Full CRUD for posts, categories, tags, block groups, blocks, and entities\n- Drag-and-drop image uploads with progress\n- Collapsible sidebar, responsive design\n- Vanilla CSS with BEM naming (`rp-` prefix) — no framework dependencies\n\n**Developer Experience**\n- Focal point image concern for any model: `focal_point_image :cover_photo`\n- CSS variable theming\n- Generators for installation and custom entities\n\n## Requirements\n\n- Rails 8.1+\n- Ruby 3.3+\n- ActionText\n- Active Storage\n\n## Installation\n\nEnsure ActionText and Active Storage are installed:\n\n```bash\nrails action_text:install\nrails active_storage:install\n```\n\nAdd to your Gemfile:\n\n```ruby\ngem \"railspress-engine\"\n```\n\nRun the install generator:\n\n```bash\nbundle install\nrails generate railspress:install\nrails db:migrate\n```\n\nMount the engine (the install generator does this automatically):\n\n```ruby\n# config/routes.rb\nRails.application.routes.draw do\n  mount Railspress::Engine =\u003e \"/railspress\"\nend\n```\n\n## Authentication\n\nThe admin interface is publicly accessible by default. Add authentication before deploying:\n\n```ruby\n# app/controllers/application_controller.rb\nclass ApplicationController \u003c ActionController::Base\n  before_action :authenticate_user!, if: :railspress_admin?\n\n  private\n\n  def railspress_admin?\n    request.path.start_with?(\"/railspress/admin\")\n  end\nend\n```\n\nSee [CONFIGURING.md](docs/CONFIGURING.md) for more authentication patterns including Devise integration.\n\n## Quick Start\n\nAccess the admin at `/railspress/admin`. From there you can manage posts, entities, and blocks.\n\n### Posts\n\nCreate posts with rich text, categories, tags, and header images. Build your own frontend controllers and views — see the [Blogging guide](docs/BLOGGING.md).\n\n### Entities\n\nGenerate a model and register it:\n\n```bash\nrails generate railspress:entity Project title:string client:string description:text\n```\n\n```ruby\nclass Project \u003c ApplicationRecord\n  include Railspress::Entity\n\n  railspress_config do |c|\n    c.admin_title = \"Projects\"\n    c.searchable_columns = [:title, :client]\n  end\nend\n```\n\nIt now has a full admin interface at `/railspress/admin/entities/projects`. See the [Entity System guide](docs/ENTITIES.md).\n\n### Blocks\n\nSet up inline editing for admins:\n\n```ruby\n# config/initializers/railspress.rb\nRailspress.configure do |config|\n  config.inline_editing_check = -\u003e(ctx) { ctx.current_user\u0026.admin? }\nend\n```\n\nReference blocks in your views:\n\n```erb\n\u003c%# Raw value (no editing wrapper) %\u003e\n\u003ch1\u003e\u003c%= cms_value(\"Homepage\", \"headline\") %\u003e\u003c/h1\u003e\n\n\u003c%# With inline editing (admins can right-click to edit in place) %\u003e\n\u003ch1\u003e\u003c%= cms_element(\"Homepage\", \"headline\") %\u003e\u003c/h1\u003e\n\n\u003cp\u003e\u003c%= cms_element(\"Homepage\", \"subheadline\") %\u003e\u003c/p\u003e\n\u003c%= image_tag cms_value(\"Homepage\", \"hero_image\"), alt: \"Hero\" %\u003e\n```\n\nCreate the \"Homepage\" group and its blocks in the admin at `/railspress/admin/content_groups`. See the [Inline Editing guide](docs/INLINE_EDITING.md).\n\n## Generators\n\n```bash\nrails generate railspress:install                    # Full setup\nrails generate railspress:entity Project title:string # Add a managed entity\n```\n\n## Documentation\n\n**Posts, Entities, and Blocks:**\n\n| Guide | Description |\n|-------|-------------|\n| [Building a Blog](docs/BLOGGING.md) | Frontend views, RSS, SEO for posts |\n| [Entity System](docs/ENTITIES.md) | Structured content pages (portfolios, case studies, etc.) |\n| [Blocks \u0026 Inline Editing](docs/INLINE_EDITING.md) | Editable site copy and images |\n\n**Everything else:**\n\n| Guide | Description |\n|-------|-------------|\n| [Reference](docs/README.md) | Models, routes, and API reference |\n| [Configuring](docs/CONFIGURING.md) | Authors, images, inline editing, and all options |\n| [Image Focal Points](docs/image-focal-point-system.md) | Smart cropping with focal points |\n| [Import/Export](docs/IMPORT_EXPORT.md) | Bulk operations for posts and CMS content |\n| [Theming](docs/THEMING.md) | CSS variable customization |\n| [Admin Helpers](docs/ADMIN_HELPERS.md) | View helper reference |\n| [Troubleshooting](docs/TROUBLESHOOTING.md) | Common issues |\n| [Upgrading](docs/UPGRADING.md) | Version upgrades and migrations |\n| [Changelog](CHANGELOG.md) | Version history |\n\n## Development\n\n```bash\nbundle install\ncd spec/dummy \u0026\u0026 bundle exec rails db:migrate \u0026\u0026 cd ../..\nbundle exec rspec\n```\n\n## License\n\nAvailable as open source under the terms of the [O'Saasy License](https://osaasy.dev/).\n\n## Trademarks\n\nThe Rails trademarks are the intellectual property of David Heinemeier Hansson, and exclusively licensed to the Rails Foundation. Uses of \"Rails\" and \"Ruby on Rails\" in this project are for identification purposes only and do not imply an endorsement by or affiliation with Rails, the trademark owner, or the Rails Foundation.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faviflombaum%2Frailspress-engine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faviflombaum%2Frailspress-engine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faviflombaum%2Frailspress-engine/lists"}