[
        {
          "id": "blog-2026-04-recuerd0-api-release",
          "title": "Recuerd0 Now Reads Like a Filesystem",
          "collection": {
            "label": "posts",
            "name": "Blog"
          },
          "categories": "Announcements, Product",
          "tags": "",
          "url": "/blog/2026/04/recuerd0-api-release/",
          "content": "The new Recuerd0 API release teaches the memory store to behave like a filesystem — so AI agents already fluent in grep, glob, and read need no new vocabulary.\n\n\n\nRecuerd0 is the persistent memory store for AI coding agents built by Maquina, and this release reshapes how agents read from it. When an AI agent reaches into Recuerd0 for context, the bottleneck has never been storage. It has been how much the agent has to pull back to get to the one fact it needs. A 2,000-line transcript should not have to fit within the agent’s context window to answer “did we decide to use Postgres?” The new release fixes that — and a handful of other long-standing rough edges — by giving the API the same primitives every coding agent already knows: glob, grep, and ranged read.\n\nHere is what is new.\n\nFile-tool API: glob, grep, and ranged read on memories\n\nThe biggest shift in this release is conceptual. Memories are no longer monolithic blobs that you fetch whole. They are addressable like files.\n\nGlob. The browse and list endpoints accept a title glob pattern. * matches any sequence of characters, ? matches a single character. Combined with tags, source, category, and workspace_id, the agent can narrow a thousand memories down to the dozen worth looking at without reading any bodies.\n\nGET /memories.json?title=Meeting*&amp;tags=design,api&amp;category=decision\n\n\nRanged read. GET /workspaces/:id/memories/:id.json now accepts line_start and line_end (1-based, inclusive). The response always echoes total_lines, so the client knows how much memory is available and can compute a tail window in a single follow-up call.\n\nGET /workspaces/1/memories/42.json?line_start=40&amp;line_end=55\n\n\nThere is no head= or tail= parameter — and that is deliberate. line_start=1&amp;line_end=20 is “head 20”; line_start=(total_lines - 19)&amp;line_end=total_lines is “tail 20”. One verb covers both, and the client never has to learn a parallel vocabulary for the same operation.\n\nGrep with line numbers. ?mode=grep&amp;q=&lt;query&gt; switches the same endpoint into a grep response. Instead of returning the body, it returns an array of matches:\n\n{\n  \"content\": {\n    \"total_lines\": 2174,\n    \"matches\": [\n      {\n        \"line_number\": 1247,\n        \"line\": \"Decided: Postgres for the analytics warehouse, SQLite for everything else.\",\n        \"context_before\": [\"## Database choice\"],\n        \"context_after\": [\"Reason: ops simplicity outweighs the JOIN ceiling for our scale.\"]\n      }\n    ]\n  }\n}\n\n\nOptional context, before, and after parameters control how many surrounding lines to return — capped at 10 each, like grep -C, -B, and -A. The full-text search endpoint (/search.json) supports the same grep mode for cross-memory queries.\n\nThe two-step recipe the agent should reach for: first, use grep to locate the line numbers; then issue a follow-up line_start/line_end call to fetch only the surrounding window. A 2,000-line memory becomes a 20-line answer.\n\nMemory categories\n\nEvery memory now carries a category: decision, discovery, preference, or general (the default). It is a small thing, but it changes how an agent reasons about what it is reading. A decision is load-bearing — something the team chose and is sticking with. A discovery is a fact about the world. A preference is taste. The agent does not have to infer the difference from prose; it is right there in the metadata, filterable from any list endpoint.\n\nGET /memories.json?category=decision&amp;sort=updated_at\n\n\nCross-workspace memory links\n\nMemories can now reference each other across workspaces with first-class “see also” links. The Rails decision in your Backend workspace can point to the deployment write-up in Infrastructure without copying anything. Each memory’s response includes a links_count so the agent knows there is more context one hop away, and dedicated endpoints under /memories/:id/links let it list and traverse them.\n\nThis is the connective tissue for context that lives in more than one place — which, in practice, is most context worth keeping.\n\nWorkspace wake-up endpoint\n\nA new endpoint, GET /workspaces/:id/context.json, returns a compact “wake-up” payload for an agent starting a fresh session: workspace metadata, recent memory titles, and the highlights an agent should know about before it does anything else. It is the answer to “you are picking up where you left off, here is the room you just walked into.”\n\nPair it with a Claude Code session-start hook and a new conversation begins with the right context already loaded — no manual recuerd0 memory list dance, no asking the user to repeat themselves.\n\nHTTP caching across the API\n\nAll read endpoints now emit ETag and Last-Modified headers and respect conditional requests. A client that sends If-None-Match for a memory it already has receives a 304 Not Modified response with an empty body. For agents that re-fetch the same workspace several times in a session, this is a meaningful drop in tokens shipped over the wire — and a meaningful drop in load on the database.\n\nGrep and ranged-read responses are correctly bypassed by the cache, since they are derived from query parameters that change with each call.\n\nCLI: recuerd0 memory read\n\nThe recuerd0-cli gains a memory read command group that wraps the new endpoints so a human (or a terminal-bound agent) can use them without hand-crafting URLs:\n\nrecuerd0 memory read head 42 --lines 20\nrecuerd0 memory read tail 42 --lines 20\nrecuerd0 memory read lines 42 --start 100 --end 140\nrecuerd0 memory read grep 42 \"Postgres\" --context 2 --pretty\n\n\nIn --pretty mode, the grep subcommand emits a breadcrumb for each hit, suggesting the exact memory read lines, followed by a call to fetch a window around it. The two-step pattern is right there in the output — no thinking required.\n\nAgent guidance baked in\n\nThe Claude Code recuerd0 agent skill now ships guidance for when to use the new primitives, not just how. The dedup-before-write protocol prefers memory read grep over memory show for large candidates. The workflow guidelines tell the agent: when total_lines &gt; ~200, grep first and fetch a window — reserve full reads for memories you genuinely need in their entirety.\n\nThe point of teaching these patterns to the agent is the same as the point of adding them to the API in the first place: make the cheap thing the obvious thing.\n\nDocumentation\n\nEvery endpoint above is documented in the public API reference, and the CLI reference on recuerd0.ai has been updated to match. The grep→fetch-window workflow is called out as a recipe in both places, with worked examples.\n\nWhy this release matters\n\nCoding agents are getting fluent. They already know how to use glob, grep, and read — those primitives are how they navigate filesystems every day. Recuerd0’s job is not to invent a new vocabulary for context retrieval; it is to look enough like a filesystem that agents do not have to learn one.\n\nThis release is that bet, made concrete. A memory is now something you can grep. A workspace is now something you can wake up in. A long transcript no longer has to fit entirely within a context window just so the agent can quote one line from it.\n\nGet the update\n\n\n  SaaS users on recuerd0.ai: the new endpoints are live now. No action needed.\n  Self-hosters: pull the latest recuerd0 image (or git pull and redeploy with Kamal). Run migrations to pick up the new category column and the memory_links table.\n  CLI users: you must update to the latest version to get the new memory read commands — brew upgrade recuerd0-cli (or grab the latest binary from recuerd0-cli releases). Older CLI versions will not expose the new functionality.\n  Claude Code users: update the recuerd0 plugin from the Claude Code marketplace to pick up the new agent guidance and command reference. Without the plugin update, the agent will keep using the old memory show flow instead of the new grep-first patterns.\n\n\nFrequently asked questions\n\nHow do I grep a Recuerd0 memory?\nSend GET /workspaces/:id/memories/:id.json?mode=grep&amp;q=&lt;query&gt;. The response returns line numbers and surrounding context instead of the full body. From the CLI: recuerd0 memory read grep &lt;id&gt; \"&lt;query&gt;\" --context 2.\n\nWhat is the difference between ranged read and grep mode?\nGrep mode finds where a string appears (returns matching line numbers with context). Ranged read fetches what is at known line numbers via line_start and line_end. The recommended workflow is grep first to locate, then ranged read to fetch a window.\n\nDo I have to update the CLI and Claude Code plugin?\nYes. The new memory read commands ship in the latest recuerd0-cli, and the grep-first agent guidance ships in the updated recuerd0 plugin in the Claude Code marketplace. Older versions will keep working but won’t expose the new endpoints.\n\nWhat are memory categories used for?\nEach memory is tagged as decision, discovery, preference, or general. Agents (and humans) can filter by category to find load-bearing decisions without sifting through general notes.\n\nDoes HTTP caching apply to grep queries?\nNo. ETag/Last-Modified caching applies to whole-memory and list reads. Grep and ranged-read responses are derived from query parameters and bypass the cache by design.\n\nRelated reading\n\n\n  Announcing Recuerd0 — the original launch and the problem we set out to solve.\n  Recuerd0 source code is now available — how to self-host under OSASSY.\n  Maquina open-source projects — the rest of the Rails and AI tooling we maintain.\n\n\n\n\nRecuerd0 is built by Maquina. Source available under OSASSY license."
        },
        {
          "id": "blog-2026-03-mvp-creator-from-idea-to-documents",
          "title": "MVP Creator: From Idea to Documents in Three Prompts",
          "collection": {
            "label": "posts",
            "name": "Blog"
          },
          "categories": "Announcements, Tools",
          "tags": "",
          "url": "/blog/2026/03/mvp-creator-from-idea-to-documents/",
          "content": "Before writing a single line of code, I need to understand what I’m building. Not abstractly — concretely: who the users are, what the real problem is, what the app is called, what voice it has, what technical decisions I’m making from the start. For a long time, that work happened informally — in scattered notes, in my head, or spread across different roles on a team: product knowledge in one conversation, brand direction in another, architecture in some document nobody kept updated. Now I formalize it with an agent called MVP Creator.\n\nIn this video — the first in a series about my personal process with AI — I show how I use MVP Creator to generate the complete set of foundation documents for a new project: research report, business plan, brand guide, and technical guide. All of it with three prompts, from an initial idea to documentation ready to hand off to Claude Code.\n\n\n\n\n\n\n\nThe Three Prompts\n\nThe example in the video is a photo delivery platform for professional photographers. These are the exact prompts I use, in order.\n\n\n\nPrompt 1 — The Idea and Context\n\nHelp me create an MVP for a photo delivery platform for professional photographers.\nThink of it as a private gallery where photographers deliver finished work to clients.\n\nThe core concept: a photographer creates a Project (for a client or personal work),\norganizes photos into Collections within that project, and shares the gallery via\nsingle-use expirable links. Invited clients can view, comment, like, and download\nphotos in their preferred quality.\n\nKey features:\n- Projects with collections and high-resolution photo uploads\n- Active Storage for thumbnail + quality variants (low/medium/high)\n- Reorderable photos within collections, cover photo per collection\n- Shareable links: single-use, expire in 7 days, create read-only sessions\n- Download: single photo or multi-select as zip, with quality choice\n\nTarget users: freelance and studio photographers in Latin America\nLanguage: Spanish-first, English secondary\nApp name: I'm thinking \"Liminal\" — open to suggestions\n\nResearch these competitors: https://www.pic-time.com and\nhttps://www.picdrop.com/web — also look at how Google Drive handles\nshared folder UX as a reference point.\n\nUse the MVP Creator skill to generate the full documentation set.\n\n\nWith this prompt the agent launches competitor research, runs through the discovery questions, and generates the four foundation documents: research report, business plan, brand guide, and technical guide.\n\n\n\nPrompt 2 — Brand Voice\n\nBased on everything we've defined about Liminal — the LATAM market, photographers\ndelivering work to clients, the quiet confidence of the name itself — write a brand\nvoice document.\n\nThe voice should feel like a photographer who has found their style and doesn't need\nto announce it. Not austere, but economical. Someone who chooses words the way they\nchoose light — deliberately, with care for what gets left out as much as what stays in.\n\nProfessionalism here means craft, not corporate. The app handles something personal\n— a photographer's finished work, a client's important memories. The voice should\nhonor that weight without becoming precious about it.\n\nInfluences: the way Magnum Photos writes about their work. The directness of a good\nphoto caption. Not the breathless enthusiasm of a SaaS landing page.\n\nThe document should include:\n- Core personality traits (3–4, with explanation)\n- Tone spectrum (when to be warmer vs. more spare)\n- Vocabulary: words we use, words we avoid\n- UI microcopy examples (button labels, empty states, error messages)\n- Both Spanish and English examples side by side\n\n\nThis second prompt goes straight to the character of the app. A brand voice guide is a document that rarely gets produced in an MVP phase — and it’s one of the most useful when the time comes to write microcopy or define how the app speaks to its users.\n\n\n\nPrompt 3 — UI Mocks\n\nUsing the frontend-design skill, create UI mocks for Liminal's critical screens.\nPull from the brand guide already established and the brand voice: quiet craft,\ndeliberate, editorial — not SaaS.\n\nPrioritize these screens in order:\n\nClient-facing (unauthenticated, via share link):\n1. Gallery landing — the first thing a client sees when they open their link.\n2. Collection view — browsing photos within a collection, with like, comment,\n   and download interactions visible.\n3. Download selection — choosing photos and quality before downloading as zip.\n\nPhotographer-facing (authenticated):\n4. Project dashboard — list of projects with status at a glance.\n5. Collection editor — uploading photos, reordering, setting cover photo.\n6. Share link manager — creating and tracking links, seeing which have been used.\n\nFor each screen:\n- Design for desktop first, note mobile considerations\n- Show real placeholder content — no Lorem Ipsum\n- Embed a short design rationale note explaining the key decision made for that screen\n\nAesthetic direction: editorial photography magazine meets quiet utility. The UI\nshould feel like it was designed by someone who photographs, not someone who ships\ndashboards.\n\n\nThe third prompt uses the frontend-design skill together with Maquina Components to generate HTML mocks of the critical screens. The result isn’t a Figma file — it’s a functional visual reference, coherent with the brand guide, before opening the editor.\n\n\n\nThe Result\n\nThree prompts. Six documents. Mocks of the main screens. All the context needed to hand off to Claude Code and start generating code with direction.\n\nIt’s the same process I used to build Resto, a personal finance app based on the Japanese Kakeibo method.\n\nThe video runs 40 minutes. It’s not an accelerated demo — it’s the real process, iterations and corrections included.\n\n\n\nInstallation\n\nAll plugins are available in the maquina-app/rails-claude-code repository. Full documentation at MVP Creator — Documentation.\n\nTo install MVP Creator in Claude Code:\n\n# Add the marketplace\n/plugin marketplace add maquina-app/rails-claude-code\n\n# Install the plugin\n/plugin install mvp-creator@maquina\n\n\nTo install the full set of plugins used in this series:\n\n/plugin install rails-simplifier@maquina\n/plugin install rails-upgrade-assistant@maquina\n/plugin install maquina-ui-standards@maquina\n/plugin install mvp-creator@maquina\n/plugin install better-stimulus@maquina\n/plugin install spec-driven-development@maquina\n\n\nFor the Claude graphical interface, download the repository as a zip, extract the mvp-creator folder, rename the extension to .skill, and drag it into the Claude window to install it."
        },
        {
          "id": "blog-2026-03-maquina-generators-production-ready-rails-setup",
          "title": "Maquina Generators: From rails new to Production-Ready",
          "collection": {
            "label": "posts",
            "name": "Blog"
          },
          "categories": "Announcements, Release",
          "tags": "",
          "url": "/blog/2026/03/maquina-generators-production-ready-rails-setup/",
          "content": "Every Rails project starts the same way. You run rails new, you get a clean app with sensible defaults, and then you do the setup work before you can write application code. Authentication with signup and multi-tenancy. Rate limiting. Background jobs with a dashboard. Error tracking. Mailer templates. Security headers. It’s repetitive, sure, but it’s the work that gets your app to the point where you can build the thing you actually sat down to build.\n\nI’ve done this enough times to know exactly what’s coming. The order changes, the names of the models drift slightly, but the shape of the work is identical. It’s not that Rails is missing anything — it’s that the space between rails new and “ready to build features” is full of choices that are mostly already made. You just have to type them out each time.\n\nMaquina Generators automate that setup. One command after rails new, and you have authentication, multi-tenancy, roles, job processing, error tracking, request protection, and ops dashboards. All generated into your app as plain Rails code. No runtime dependency.\n\nWhat Maquina Generators Do\n\nThe gem lives in your development group. It generates standalone application code — models, controllers, views, migrations, initializers, mailers — and then you can delete the gem. Nothing it produces requires the gem at runtime. No engine mounts, no middleware injection, no monkey patches. Just files in your app that you own completely.\n\nThe workflow is five commands:\n\nrails new myapp --css tailwind\nbundle add maquina-generators --group development\nrails generate maquina:app --auth clave\nbin/rails db:migrate\nbin/dev\n\n\nThat’s it. Auth with email verification codes, an Account model with roles, Rack Attack blocking scanners and throttling logins, Solid Queue with a Procfile, Solid Errors catching exceptions, Mission Control monitoring your jobs — all wired up, all running.\n\n\n\nSeven generators handle the pieces:\n\n\n  \n    \n      Generator\n      Purpose\n    \n  \n  \n    \n      App\n      Full application setup — orchestrates everything below\n    \n    \n      Clave\n      Passwordless email-code authentication\n    \n    \n      Registration\n      Password-based auth with accounts and roles\n    \n    \n      Rack Attack\n      Request protection and IP throttling\n    \n    \n      Solid Queue\n      Background job processing with separate database\n    \n    \n      Solid Errors\n      Error tracking dashboard\n    \n    \n      Mission Control\n      Job queue monitoring dashboard\n    \n  \n\n\nThe App generator is the orchestrator. It runs whichever auth generator you choose, then all the infrastructure generators in sequence. You can also run each generator independently if you only need part of the stack.\n\nThe full documentation covers every generator, option, and generated file in detail.\n\nTwo Authentication Options\n\nRails 8’s built-in rails generate authentication gives you login. It doesn’t give you signup. It doesn’t give you accounts, roles, or multi-tenancy. For most applications, login alone isn’t enough.\n\nMaquina Generators offer two complete authentication systems that pick up where Rails leaves off.\n\nClave: Passwordless\n\nClave implements passwordless authentication using email verification codes. The user enters their email, receives a 6-digit hexadecimal code, enters the code, and they’re in. No passwords to store, no password resets to build, no complexity requirements to argue about.\n\nUser enters email → receives 6-digit code → enters code → signed in\n\n\nCodes expire in 15 minutes. There’s a 15-minute cooldown before a resend. Login attempts are rate-limited to 10 per 3 minutes. Sessions last 30 days by default. Plus characters are blocked in email addresses to prevent alias attacks.\n\nBeyond sign-in, Clave generates a full multi-tenancy layer. Every user belongs to an Account. The first user who creates an account becomes its admin. A role enum — admin or member — handles authorization from there.\n\nCurrent.user          # The signed-in user\nCurrent.account       # The user's account\nCurrent.user.admin?   # Check role\n\n\nYou scope queries through the account, and cross-tenant access is prevented at the model level:\n\n@projects = Current.account.projects\n\n\nClave generates models, controllers, a mailer with HTML and text templates, a daily cleanup job for expired sessions and codes, a test helper with sign_in_as(user), and full i18n support in English and Spanish.\n\nRegistration: Password-Based\n\nIf you prefer passwords, the Registration generator builds on Rails 8’s authentication. It runs rails generate authentication first, then adds what’s missing: an Account model, belongs_to :account on User, the role enum, a RegistrationsController that creates an Account and User in a single transaction, and Tailwind-styled views.\n\nclass RegistrationsController &lt; ApplicationController\n  allow_unauthenticated_access\n  rate_limit to: 10, within: 3.minutes, only: :create\n\n  def create\n    ActiveRecord::Base.transaction do\n      account = Account.create!(name: params[:account_name])\n      user = account.users.create!(\n        name: params[:name],\n        email_address: params[:email_address],\n        password: params[:password],\n        role: :admin\n      )\n    end\n    start_new_session_for user\n    redirect_to root_path\n  end\nend\n\n\n\n\nSame Current.user, Current.account, and role-based authorization as Clave. The multi-tenancy pattern is identical — only the sign-in mechanism differs.\n\nThe generators documentation covers every option, model, and controller for both auth systems.\n\nThe Ops Layer\n\nAuthentication is the most visible piece, but the App generator does more than auth. It sets up a complete operational layer that most Rails apps need but few have on day one.\n\nRack Attack gets configured with real-world defaults. PHP file requests, WordPress scanning paths, .env and .git probes — all blocked immediately. Sensitive paths like /cgi-bin, /phpmyadmin, and /actuator return 403. General traffic is throttled to 300 requests per 5 minutes per IP, with asset paths exempted. Login endpoints get tighter limits: 5 attempts per 20 seconds.\n\nSolid Queue is set up as the Active Job backend with its own SQLite database, a Procfile entry for the worker process, and a recurring schedule that runs the authentication cleanup job daily at 3am. The configuration lives in config/solid_queue.yml — three worker threads, half-second polling, standard dispatching.\n\nSolid Errors and Mission Control Jobs get mounted as dashboards with custom Tailwind views. Mission Control alone has 41 view files — job listings, queue status, worker monitoring, recurring task management — all styled to match your application instead of looking like a default engine mount.\n\nBoth dashboards share the same HTTP basic auth credentials:\n\n# bin/rails credentials:edit\nbackstage:\n  username: admin\n  password: your_secure_password\n\n\nOne set of credentials, stored in Rails credentials. Environment variable fallbacks if you prefer. After running the generators, you have /admin/solid_errors and /admin/mission_control_jobs working from the first bin/dev.\n\n\n\nThe App generator also sets up multi-database configuration — separate SQLite databases for the queue, cache, cable, and errors — installs Active Storage and Action Text, configures Turbo morphing, adds brakeman and Standard for code quality, and creates a HomeController with a root route. It’s the full post-rails new checklist, automated.\n\nOwn the Code\n\nThis is the part that matters most. Maquina Generators is a development-only gem. It generates code into your application and then it’s done. You can — and should — delete it from your Gemfile once you’ve run the generators.\n\n# Gemfile — remove after generating\ngroup :development do\n  gem \"maquina-generators\"\nend\n\n\nEvery file it produces is a standard Rails file in a standard location. Models in app/models, controllers in app/controllers, views in app/views, initializers in config/initializers. No engine, no namespace, no gem dependency at runtime. If you want to change how sessions expire, you edit app/controllers/concerns/authentication.rb. If you want different Rack Attack rules, you edit config/initializers/rack_attack.rb. If you want to add a third role beyond admin and member, you update the enum on User.\n\nThere’s no DSL to learn, no configuration file to maintain, no version upgrades to track. The generated code follows Rails conventions because it is Rails code. You can read every line, understand every decision, and change anything that doesn’t fit your project.\n\nThis connects to the broader Maquina ecosystem. The generators set up the foundation — auth, security, ops tooling. Maquina Components handles the UI layer with ViewComponent-based partials that the App generator installs automatically. When you start building features on top of this foundation, Rails Simplifier keeps AI-generated code idiomatic, and the MCP Server gives AI tools visibility into your codebase structure.\n\nEach tool is independent. Use one, use all, use none. No lock-in at any layer.\n\nGet Started\n\nInstall the gem and run the app generator:\n\nrails new myapp --css tailwind\ncd myapp\nbundle add maquina-generators --group development\nrails generate maquina:app --auth clave\nbin/rails db:migrate\nbin/dev\n\n\nChoose --auth clave for passwordless, --auth registration for passwords, or --auth none if you want the infrastructure without authentication.\n\nFull documentation is at maquina.app/documentation/generators. Source code is on GitHub."
        },
        {
          "id": "blog-2026-02-recuerd0-source-code-now-available",
          "title": "Recuerd0 Source Code Is Now Available",
          "collection": {
            "label": "posts",
            "name": "Blog"
          },
          "categories": "Announcements, Product",
          "tags": "",
          "url": "/blog/2026/02/recuerd0-source-code-now-available/",
          "content": "The self-hosted promise is fulfilled — Recuerd0’s source code is on GitHub.\n\n\n\nWhen we announced Recuerd0, we said the self-hosted version would be available pretty soon. Today it is. The full source code is on GitHub under the OSASSY license.\n\nThis is not a stripped-down edition. It’s the same codebase that runs recuerd0.ai — every feature, every endpoint, every migration.\n\nUnder the hood\n\nRecuerd0 is a Rails 8.1 application running on Ruby 4.0. The entire stack leans into the One Person Framework philosophy: minimize infrastructure, eliminate external dependencies, ship with confidence.\n\nSQLite for everything. Data, cache, queue, and cable — all backed by SQLite. No Postgres. No Redis. Solid Queue handles background jobs, Solid Cache handles caching, and Solid Cable handles WebSocket connections. One database engine, zero extra services.\n\nNo Node.js. The frontend uses Propshaft for asset delivery and Importmaps for JavaScript modules. Hotwire (Turbo + Stimulus) handles interactivity. Tailwind CSS 4 handles styling. The entire frontend pipeline runs without a JS build step.\n\nFull-text search with FTS5. Search is powered by SQLite’s FTS5 extension — no vector database, no embeddings, no RAG pipeline. The index updates on every write, returns results in milliseconds, and is fully deterministic. The agent decides what to search for; the database does the rest.\n\nMemory versioning. Every memory supports a flat branching model — create new versions from any point in history. Soft deletion with 30-day retention means nothing disappears by accident.\n\nMulti-tenancy. The Account model supports multiple tenants. In single-tenant mode (the default for self-hosted), public registration is disabled — you control who has access.\n\nUI components. The interface is built with the maquina-components gem, the same component library used across all Maquina projects.\n\nGetting started\n\nTwo paths to self-host:\n\nDocker image. Pull the ready-to-use Docker image and deploy. Configure your environment variables and you’re running.\n\nFrom source. Clone the repository, configure Kamal 2.x, and deploy to your server. The included Dockerfile and Kamal configuration handle the rest. Thruster sits in front of Puma, and SOLID_QUEUE_IN_PUMA=true runs background jobs in-process — one container, one process, everything included.\n\nSingle-tenant mode is the default. No public registration, no setup wizard. Deploy, create your account, start curating context.\n\nLicense\n\nRecuerd0 is released under the OSASSY license. It’s essentially MIT with one restriction: you can’t take the code and offer it as a competing hosted service. The same model 37signals uses. Deploy it on your infrastructure, modify it, use it internally — free forever.\n\nNot interested in self-hosting?\n\nRecuerd0 SaaS is $15/month for up to 10 users — managed hosting, automatic backups, and updates. Read the full product announcement for the complete story.\n\nThe source is on GitHub. Do what you want with it.\n\nView the repository →\n\n\n\nRecuerd0 is built by Maquina. Source available under OSASSY license."
        },
        {
          "id": "blog-2026-02-announcing-recuerd0",
          "title": "Announcing Recuerd0: A Knowledge Base for AI Tool Context",
          "collection": {
            "label": "posts",
            "name": "Blog"
          },
          "categories": "Announcements, Product",
          "tags": "",
          "url": "/blog/2026/02/announcing-recuerd0/",
          "content": "Organize, version, and serve project context to any LLM — from Claude Code to Cursor to ChatGPT.\n\n\n\nEvery AI coding tool starts each session with amnesia. Your architecture decisions, naming conventions, and deployment quirks — none of it carries over. You re-explain the same context with the same tools every single day.\n\nThe common workarounds are CLAUDE.md files, .cursorrules, AGENTS.md — each tool with its own configuration format. You end up duplicating knowledge across multiple places. They drift apart. Your Claude Code config says one thing; your Cursor rules say another.\n\nRecuerd0 is a dedicated knowledge base for managing the context your AI tools consume. You curate project knowledge once and serve it to every tool via REST API.\n\n\n\nHow it works\n\nWorkspaces group knowledge by project or domain. Backend conventions in one workspace, frontend patterns in another, org-wide standards in a shared workspace.\n\n\n\nMemories are versioned markdown documents with titles, tags, and full history. When conventions evolve, you create a new version — like Git for context. Branch from any version, track how decisions changed, and never lose the rationale.\n\n\n\nAccess is through a REST API with Bearer token authentication. Any tool that can make an HTTP request reads from the same source. There’s also a CLI for terminal workflows and a Claude Code plugin for tighter integration.\n\nSearch uses the database’s full-text search with millisecond performance. No embeddings, no vector database, no RAG pipeline. The agent decides what to search for and how to refine the search. The index updates on every write, is deterministic, and requires zero infrastructure beyond the database.\n\nArchitecture decisions\n\nHuman-curated, not auto-captured. Automatic knowledge capture sounds appealing, but it produces noisy results — context-specific fixes that don’t generalize, contradictory items as conventions evolve. The human decides what’s worth persisting. The team reviews and evolves it.\n\nTool-agnostic by design. We built an API, not a plugin for one tool. Your knowledge base survives any tool change. Claude Code, Cursor, ChatGPT, Windsurf, custom scripts, CI/CD pipelines — same context, same source.\n\nSmall and focused. Recuerd0 is designed for a small set of focused memories per workspace philosophy, not thousands of files. The constraint forces curation. When the workspace is focused, the right answer is obvious without sophisticated search algorithms.\n\nPricing\n\nRecuerd0 SaaS is $15/month for up to 10 users. Managed hosting, automatic backups, updates, and email support. Create an account and start in minutes at recuerd0.ai.\n\nTeams of 6 or more can contact us for custom plans.\n\nSelf-hosted is available under the OSASSY license — the same model 37signals uses for Fizzy. It’s essentially MIT with one addition: you can’t take the code and offer it as a competing hosted service. Deploy on your server, modify the code, use it internally — free forever.\n\nThe self-hosted version is not available at launch, but it will be available pretty soon.\n\nGet started\n\nThe API documentation covers every endpoint. The CLI reference has installation and commands. The agent workflows guide shows how to integrate with Claude Code, Cursor, and other tools.\n\nContext engineering has become a core developer skill. It deserves a dedicated tool.\n\nStart with Recuerd0 SaaS →\n\n\n\nRecuerd0 is built by Maquina. Source available under OSASSY license."
        },
        {
          "id": "blog-2026-02-maquina-components-0-4-0-turbo-compatibility",
          "title": "Maquina Components 0.4.0: Taming Turbo",
          "collection": {
            "label": "posts",
            "name": "Blog"
          },
          "categories": "Announcements, Release",
          "tags": "",
          "url": "/blog/2026/02/maquina-components-0-4-0-turbo-compatibility/",
          "content": "I was working on a Rails application—standard CRUD with a sidebar and a few interactive menus. Everything worked on first load. Then I navigated away and came back. The sidebar was gone. I opened a dropdown, clicked a Turbo link, hit the back button. The dropdown was still open, sitting there on top of a page that had already moved on.\n\nIf you’ve built anything with Turbo and Stimulus beyond basic forms, you’ve likely seen this. Components work fine on full page loads, but Turbo introduces a different lifecycle. Pages get cached mid-state, morphs overwrite client-side changes with stale server HTML, and your UI ends up stuck in states it should have left behind.\n\nFixing this in Maquina Components is what version 0.4.0 is about.\n\nThe Teardown Pattern\n\nThe core problem is described well by Better Stimulus. When Turbo navigates away from a page, it takes a snapshot of the DOM before leaving. When the user returns, Turbo shows that snapshot first. Any DOM changes your Stimulus controllers made—open menus, expanded panels, loading classes—get frozen into the cache.\n\nThe standard Stimulus disconnect callback handles general cleanup, but it doesn’t distinguish between “the element was removed from the DOM” and “Turbo is about to cache this page.” You need both.\n\nThe Teardown pattern adds a teardown method to controllers, triggered by Turbo’s turbo:before-cache event. Every controller that manipulates the DOM can opt in, resetting its visual state before Turbo takes the snapshot. This keeps disconnect clean for general lifecycle concerns and gives Turbo-specific rollback its own dedicated path.\n\nThis release applies that pattern across the interactive components in the library.\n\nSidebar: Three Problems at Once\n\nThe sidebar was the hardest to get right. It had three separate issues interacting with each other.\n\nRandom IDs broke morphing. The sidebar generated IDs like sidebar-a3f9b2 on every render. Turbo’s idiomorph algorithm matches elements by ID—when the ID changes every time, idiomorph can’t find the element and treats it as new. Every morph was destroying and recreating the sidebar from scratch. The fix: deterministic IDs. sidebar-left and sidebar-right, consistent across renders. The sidebar provider also gets a stable ID (sidebar-provider by default).\n\nMorphs overwrote client state. The sidebar stores its open/closed state in a cookie so it persists across page loads. During a Turbo morph, the server sends back HTML with the default state—it doesn’t know about the cookie. Idiomorph applies the server HTML, and the sidebar collapses even though the user had it open.\n\nThe fix adds a turbo:before-morph-element listener with a _morphing guard flag. When a morph happens, the controller reads the cookie (the source of truth on the client), reasserts the correct state, and strips the sidebar-loading class that the server HTML reintroduces.\n\nLayout shift on desktop. When Stimulus initialized and switched the sidebar from its mobile offcanvas mode to the desktop collapsible mode, there was a visible jump. The transition happened after the browser had already painted. This release smooths that handoff so the mode switch doesn’t cause a flash.\n\nThe Yield Trap\n\nThe second category of fixes has nothing to do with Turbo. It’s a Rails rendering behavior that caught me off guard.\n\nNine partials in the library used the standard block pattern:\n\n&lt;%= render \"components/card/description\" do %&gt;\n  &lt;p&gt;Custom HTML&lt;/p&gt;\n&lt;% end %&gt;\n\n\nThis works when you always pass a block. But render the partial without a block and yield inside it doesn’t return nothing—it renders the entire page’s content into the partial. Rails treats the missing block as a signal to yield the page-level content instead.\n\nThe result: components rendering the full page body inside a card title or a toast message. It only shows up in specific usage patterns, and when it does, the output looks completely wrong with no obvious cause.\n\nThe fix replaces yield with an explicit content: parameter in all nine affected partials:\n\n\n  card/title, card/description\n  alert/title, alert/description\n  toast/title, toast/description\n  combobox/label, toast (main), toaster\n\n\nThe five toast helper methods no longer accept blocks either.\n\nBreaking Changes\n\nThis is a minor version bump with breaking changes:\n\n\n  Block syntax removed for the 9 partials listed above. Use content: capture { ... } instead of do ... end.\n  Toast helpers no longer accept blocks. Use the content: parameter.\n  Sidebar IDs changed from sidebar-&lt;random_hex&gt; to sidebar-left / sidebar-right.\n  Sidebar provider now has a stable id attribute (sidebar-provider by default).\n\n\nMigration\n\nThe content parameter change is mechanical. Find every block-style call to the affected partials and wrap the content with capture:\n\n&lt;%= render \"components/card/description\" do %&gt;\n  &lt;p&gt;Custom HTML&lt;/p&gt;\n&lt;% end %&gt;\n\n&lt;%= render \"components/card/description\",\n      content: capture { %&gt;\n  &lt;p&gt;Custom HTML&lt;/p&gt;\n&lt;% } %&gt;\n\n\nFor sidebar IDs, if you reference specific sidebar element IDs in JavaScript or tests, update them to sidebar-left or sidebar-right.\n\nUpgrading\n\nbundle update maquina_components\n\n\nWhat This Reinforced\n\nTurbo is not a transparent layer over page loads. It’s a different execution model. Any Stimulus controller that touches the DOM needs to account for caching, morphing, and the gap between what the server renders and what the client has changed since. The Teardown pattern should be the default starting point for any controller that does more than read values.\n\nThe yield behavior in Rails partials was a genuine surprise. It’s documented, but it’s a quiet trap when you have optional block content. Explicit parameters are safer.\n\nDocumentation\n\n\n  Component Documentation\n  Sidebar\n  Card\n  Alert\n  Toast\n  Combobox\n\n\nSource\n\n\n  Maquina Components\n  Full Changelog\n  Better Stimulus: Teardown Pattern"
        },
        {
          "id": "blog-2026-01-maquina-0-3-1-calendar-date-picker-claude-skills",
          "title": "Maquina 0.3.1: Calendar, Date Picker & Claude Code Skills",
          "collection": {
            "label": "posts",
            "name": "Blog"
          },
          "categories": "Announcements, Release",
          "tags": "",
          "url": "/blog/2026/01/maquina-0-3-1-calendar-date-picker-claude-skills/",
          "content": "This month brings updates across the Maquina ecosystem: new Calendar and Date Picker components for Rails, two Claude Code skills for AI-assisted development, and live interactive previews for all components in the documentation.\n\nMaquina Components 0.3.1\n\nBuilding on version 0.3.0, this release adds two components for date selection: Calendar and Date Picker.\n\nCalendar\n\nAn inline calendar for single date or range selection. Useful when you need the full calendar visible—booking flows, availability displays, or any context where date proximity matters.\n\n&lt;%= render \"components/calendar\",\n      mode: :range,\n      selected: Date.today,\n      selected_end: Date.today + 5 %&gt;\n\n\nFor form integration, the calendar generates hidden inputs automatically:\n\n&lt;%= form_with model: @booking do |f| %&gt;\n  &lt;%= render \"components/calendar\",\n        mode: :range,\n        input_name: \"booking[check_in]\",\n        input_name_end: \"booking[check_out]\" %&gt;\n&lt;% end %&gt;\n\n\nFeatures: Single or range selection, min/max date constraints, disabled dates, week start configuration, and direct form integration with hidden inputs.\n\nDate Picker\n\nA button that opens a calendar in a popover. Better for forms where space is limited and you don’t need the calendar always visible.\n\n&lt;%= render \"components/date_picker\",\n      mode: :single,\n      placeholder: \"Select a date\",\n      input_name: \"event[date]\" %&gt;\n\n\nRange selection works the same way:\n\n&lt;%= render \"components/date_picker\",\n      mode: :range,\n      placeholder: \"Select date range\",\n      input_name: \"start_date\",\n      input_name_end: \"end_date\" %&gt;\n\n\nFeatures: Single or range selection, pre-selected date display, min/max boundaries, disabled state, and customizable placeholders.\n\nWhen to Use Which\n\n\n  \n    \n      Use Case\n      Component\n    \n  \n  \n    \n      Booking calendar with visible availability\n      Calendar\n    \n    \n      Date field in a form\n      Date Picker\n    \n    \n      Date range with context (prices, events)\n      Calendar\n    \n    \n      Quick date selection in limited space\n      Date Picker\n    \n  \n\n\nLive Previews\n\n\n\nThe documentation site now includes live, interactive previews for all components. Visit any component page in the documentation to see working examples in light and dark themes, multiple color variations, and code ready to copy.\n\nFor a complete showcase, the live demo application shows all components working together with sample data.\n\nUpgrading\n\nbundle update maquina_components\n\n\nNo generator changes required for existing installations.\n\nClaude Code Skills\n\nTwo new skills for AI-assisted Rails development.\n\nMaquina UI Standards\n\nTeaches Claude how to build UIs with maquina_components. Without guidance, Claude generates generic Rails patterns—plain divs, inline styles, inconsistent markup. With this skill, Claude generates code using your actual component library.\n\nIncludes: Component catalog with 20+ components, form patterns, layout patterns, Turbo integration, and accessibility guidelines.\n\n/plugin marketplace add maquina-app/rails-claude-code\n/plugin install maquina-ui-standards@maquina\n\n\nAsk Claude “Create a users index view with a table” and get:\n\n&lt;%= render \"components/card\" do %&gt;\n  &lt;%= render \"components/card/header\" do %&gt;\n    &lt;%= render \"components/card/title\", text: \"Users\" %&gt;\n  &lt;% end %&gt;\n  &lt;%= render \"components/card/content\" do %&gt;\n    &lt;%= render \"components/table\" do |t| %&gt;\n      &lt;% t.header do %&gt;\n        &lt;% t.head_cell \"Name\" %&gt;\n        &lt;% t.head_cell \"Email\" %&gt;\n      &lt;% end %&gt;\n    &lt;% end %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\n\nDocumentation: Maquina UI Standards\n\nRails Simplifier\n\nRefines Rails code following 37signals patterns and the One Person Framework philosophy.\n\nWhat it does: Converts service objects to model methods, transforms custom actions to CRUD resources, moves logic from controllers to models, detects N+1 queries, and applies Rails conventions like I18n and Time.current.\n\n/plugin marketplace add maquina-app/rails-claude-code\n/plugin install rails-simplifier@maquina\n\n\nExample prompts:\n\n&gt; Review recent changes using the rails-simplifier agent\n&gt; Use rails-simplifier to review the bookings controller\n\n\nDocumentation: Rails Simplifier\n\nSource\n\nAll projects are MIT licensed:\n\n\n  Maquina Components\n  Rails Claude Code Skills"
        },
        {
          "id": "blog-2026-01-claude-skill-for-maquina-components",
          "title": "Claude Skill for Maquina Components",
          "collection": {
            "label": "posts",
            "name": "Blog"
          },
          "categories": "Announcements, Tools",
          "tags": "",
          "url": "/blog/2026/01/claude-skill-for-maquina-components/",
          "content": "When I started extracting and standardizing maquina_components from real production applications, I was also experimenting with AI-assisted development. The two efforts ran in parallel—building a consistent component library while trying to get Claude to help me use it.\n\nThe results were mixed. Every time I asked Claude to build a view or implement a form, it was back and forth. “Use the card partial, not a div.” “The input needs a data attribute.” “That’s not how the combobox works.” I spent as much time correcting the AI as I would have spent writing the code myself.\n\nThe same friction appeared when writing specs. I’d describe a feature and Claude would suggest generic Rails patterns instead of the components I had available. It didn’t know about the library. How could it?\n\nThe Skill Experiment\n\nWhen Anthropic released the Skills functionality, I wondered if it was the right tool for this problem. Skills let you teach Claude project-specific knowledge—conventions, patterns, APIs. Exactly what was missing.\n\nI created a first version: a structured reference with component examples, form patterns, layout conventions, and Turbo integration guides. Added it to my projects and started using it.\n\nIt worked. Claude started generating code that matched my conventions. The combobox had proper keyboard navigation. Forms used the right data attributes. Turbo Streams updated components correctly. The back-and-forth dropped significantly.\n\nI kept the skill private. It was tied to my workflow, my projects. Not ready for others.\n\nMaking It Public\n\nYesterday I published Maquina Components 0.3.0 with Combobox and Toast. Shortly after, someone asked if I had an MCP server for the components.\n\nI replied that I had something better—a Claude Skill that I’d been using for while now. It was working great with the gem.\n\nSo I decided to open source it.\n\nWhat the Skill Provides\n\nA complete reference for building UIs with maquina_components:\n\n\n  \n    \n      Reference\n      Purpose\n    \n  \n  \n    \n      Component catalog\n      All 15+ components with ERB examples\n    \n    \n      Form patterns\n      Validation, error handling, inline layouts\n    \n    \n      Layout patterns\n      Sidebar navigation, page structure\n    \n    \n      Turbo integration\n      Frames, Streams, component updates\n    \n    \n      Spec checklist\n      Review criteria for UI quality\n    \n  \n\n\nInstallation\n\nCreate a skills directory in your Rails project:\n\ncd your-rails-app\nmkdir -p .claude/skills\n\n\nDownload the skill from the maquina_components repository and copy it to .claude/skills/maquina-ui-standards/.\n\nThen update your CLAUDE.md to reference it:\n\n## UI Components\n\nThis project uses maquina_components for UI. Before implementing views,\nforms, or interactive components, read the UI standards skill:\n\n.claude/skills/maquina-ui-standards/SKILL.md\n\nAlways consult the skill when:\n- Creating or modifying views\n- Implementing forms\n- Adding interactive components\n- Building layouts with sidebar/header patterns\n- Working with Turbo Streams that update UI\n\n\nUsage\n\nOnce installed, ask Claude naturally:\n\nCreate the users index view with a table showing name, email, and status.\n\n\nImplement the project form with name, description, and a framework combobox.\n\n\nReview this view against the maquina UI standards and suggest improvements.\n\n\nThe generated code matches what you’d write manually—just faster, and without the back-and-forth.\n\nSource\n\nThe skill is included in the maquina_components repository under MIT license. Updates follow gem releases."
        },
        {
          "id": "blog-2026-01-maquina-components-0.3.0-combobox-and-toast",
          "title": "Maquina Components 0.3.0: Combobox and Toast",
          "collection": {
            "label": "posts",
            "name": "Blog"
          },
          "categories": "Announcements, Release",
          "tags": "",
          "url": "/blog/2026/01/maquina-components-0.3.0-combobox-and-toast/",
          "content": "Version 0.3.0 of Maquina Components adds two frequently requested interactive components: Combobox and Toast.\n\nBoth components follow the same philosophy as the rest of the library—ERB partials, Tailwind CSS, and Stimulus controllers only where necessary.\n\nCombobox\n\n\n\nAn autocomplete input with a searchable dropdown list. Useful when selecting from many options—countries, users, tags, or any list that benefits from filtering.\n\n&lt;%= combobox placeholder: \"Select framework...\" do |cb| %&gt;\n  &lt;% cb.trigger %&gt;\n  &lt;% cb.content do %&gt;\n    &lt;% cb.input placeholder: \"Search...\" %&gt;\n    &lt;% cb.list do %&gt;\n      &lt;% cb.option value: \"rails\" do %&gt;Ruby on Rails&lt;% end %&gt;\n      &lt;% cb.option value: \"django\" do %&gt;Django&lt;% end %&gt;\n      &lt;% cb.option value: \"phoenix\" do %&gt;Phoenix&lt;% end %&gt;\n    &lt;% end %&gt;\n    &lt;% cb.empty %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\n\nFor simpler use cases, the data-driven helper builds the entire structure from an array:\n\n&lt;%= combobox_simple placeholder: \"Select country...\",\n                     name: \"user[country]\",\n                     options: Country.all.map { |c| { value: c.code, label: c.name } } %&gt;\n\n\nFeatures\n\n\n  Keyboard navigation (arrows, Home, End, Escape)\n  Real-time filtering as you type\n  Grouped options with labels and separators\n  Multiple width and alignment options\n  Full ARIA support (role=\"combobox\", role=\"listbox\")\n\n\nRequirements\n\nThe Combobox uses the HTML5 Popover API for light-dismiss behavior. Most modern browsers support it natively:\n\n\n  \n    \n      Browser\n      Version\n    \n  \n  \n    \n      Chrome\n      114+\n    \n    \n      Edge\n      114+\n    \n    \n      Safari\n      17+\n    \n    \n      Firefox\n      125+\n    \n  \n\n\nFor older browsers, add the popover polyfill:\n\nnpm install @oddbird/popover-polyfill\n\n\n// app/javascript/application.js\nimport \"@oddbird/popover-polyfill\"\n\n\nToast\n\n\n\nNon-intrusive notifications that appear temporarily and dismiss automatically. Ideal for form submission feedback, background task completion, or any transient message.\n\nServer-Side with Flash Messages\n\nThe most common pattern—render Rails flash messages as toasts:\n\n&lt;%= render \"components/toaster\", position: :bottom_right do %&gt;\n  &lt;%= toast_flash_messages %&gt;\n&lt;% end %&gt;\n\n\n# In your controller\nflash[:success] = \"Profile updated successfully!\"\nredirect_to @user\n\n\nFlash types map automatically to toast variants: :success, :error, :warning, :info.\n\nJavaScript API\n\nFor dynamic notifications without a page reload:\n\nToast.success(\"Changes saved!\")\n\nToast.error(\"Connection lost\", {\n  description: \"Please check your internet connection.\"\n})\n\nToast.warning(\"Session expiring\", { duration: 10000 })\n\n// Dismiss programmatically\nconst id = Toast.info(\"Processing...\")\nToast.dismiss(id)\n\n\nWith Turbo Streams\n\nAppend toasts to the container in Turbo Stream responses:\n\n&lt;%= turbo_stream.append \"toaster\" do %&gt;\n  &lt;%= toast :success, \"Post published!\" %&gt;\n&lt;% end %&gt;\n\n\nFeatures\n\n\n  Five variants: default, success, info, warning, error\n  Auto-dismiss with configurable duration (pauses on hover)\n  Six positioning options (corners and center edges)\n  Optional action buttons for undo/view operations\n  Full keyboard accessibility\n\n\nRequirements\n\nToast requires Stimulus for the auto-dismiss timer and JavaScript API. Add the controller to your Stimulus application:\n\n// app/javascript/application.js\nimport { Application } from \"@hotwired/stimulus\"\nimport { eagerLoadControllersFrom } from \"@hotwired/stimulus-loading\"\n\nconst application = Application.start()\neagerLoadControllersFrom(\"controllers\", application)\n\n\nUpgrading\n\nbundle update maquina_components\n\n\nNo generator changes are required. Both components use the existing theme variables.\n\nSee Them in Action\n\nTo explore Combobox, Toast, and all other components with demo data, clone the repository and run the dummy application:\n\ngit clone https://github.com/maquina-app/maquina_components.git\ncd maquina_components/test/dummy\nbin/dev\n\n\nThen visit http://localhost:5300 to interact with the full component showcase.\n\nDocumentation\n\n\n  Combobox documentation\n  Toast documentation\n  Full component list\n\n\nSource\n\nThe gem is MIT licensed. Source and issues on GitHub."
        },
        {
          "id": "blog-2025-12-rails-mcp-server-1-5-0-security-hardening",
          "title": "Rails MCP Server 1.5.0: Security Hardening and Sandboxed Environment Support",
          "collection": {
            "label": "posts",
            "name": "Blog"
          },
          "categories": "Announcements, Release, AI Tools",
          "tags": "",
          "url": "/blog/2025/12/rails-mcp-server-1-5-0-security-hardening/",
          "content": "Open source projects get better when people contribute back. Rails MCP Server 1.5.0 is a direct result of that—a release shaped significantly by a community contribution that I didn’t write.\n\nThe most important change in this version is a comprehensive security overhaul contributed by GitHub user hellvinz through PR #25. It’s the kind of work that doesn’t get enough recognition.\n\nThe Security Contribution\n\nWhen you give an AI model access to your codebase through MCP tools, security matters. The execute_ruby sandbox already restricted dangerous operations, but the file-accessing analyzers needed more rigorous input validation.\n\nPathValidator Module\n\nA centralized validation layer now protects all file-accessing analyzers. Path traversal attempts are blocked. Sensitive files are filtered automatically. The implementation is clean:\n\n# Path traversal attempts are blocked\nget_file(path: \"../../../etc/passwd\")\n# =&gt; \"Access denied: Path is outside the project directory\"\n\n# Sensitive files are filtered\nlist_files(pattern: \"config/*.key\")\n# =&gt; master.key, credentials.yml.enc excluded from results\n\n\nThe validator catches:\n\n  Path traversal attacks (../ sequences)\n  Absolute path access outside the project\n  Attempts to read sensitive files (master.key, credentials.yml.enc, .env)\n\n\nInjection Prevention\n\nShell commands now use IO.popen with array arguments instead of string interpolation. Table names in schema queries are validated against a strict pattern. These changes close potential injection vectors that existed in earlier versions.\n\nCI Infrastructure\n\nBeyond the code changes, hellvinz added security infrastructure I should have set up from the start:\n\n  Dependabot for dependency updates\n  CodeQL for static analysis\n  OpenSSF Scorecard integration\n  A proper SECURITY.md for vulnerability reporting\n\n\nThis kind of contribution takes real effort. Reviewing an unfamiliar codebase, identifying gaps, implementing fixes that don’t break existing functionality, unglamorous work that makes the project better for everyone who uses it.\n\nI’m grateful for the contribution.\n\nSandboxed Environment Support\n\nAI coding agents increasingly run in sandboxed environments—containers or restricted shells where they can only access the current project directory. GitHub Copilot Agent and Claude Code Agent both work this way.\n\nPrevious versions of Rails MCP Server assumed access to a user home directory for configuration files. That doesn’t work in a sandbox.\n\nThe --single-project flag solves this. It tells the server to use the current working directory as the only project, skipping configuration files entirely:\n\nrails-mcp-server --single-project\n\n\nGitHub Copilot Agent configuration goes in .vscode/mcp.json:\n\n{\n  \"servers\": {\n    \"rails-mcp\": {\n      \"command\": \"rails-mcp-server\",\n      \"args\": [\"--single-project\"]\n    }\n  }\n}\n\n\nClaude Code Agent can use the same flag. The server detects it’s running in a Rails directory and works immediately—no setup required.\n\nThis also simplifies CI/CD pipelines and any environment where you want the server to just work with the current directory.\n\nThe Copilot Agent documentation covers the setup in detail.\n\nSimplified Project Configuration\n\nPrevious versions required manual configuration in ~/.config/rails-mcp/projects.yml. That still works, but 1.5.0 adds flexibility:\n\n\n  \n    \n      Method\n      Use Case\n    \n  \n  \n    \n      --single-project flag\n      Sandboxed agents (Copilot, Claude Code), CI/CD\n    \n    \n      RAILS_MCP_PROJECT_PATH env var\n      Explicit path control\n    \n    \n      Auto-detection\n      Finds Rails apps from Gemfile, engines from gemspec\n    \n    \n      projects.yml\n      Multiple projects with named references\n    \n  \n\n\nThe server now auto-detects Rails applications by checking for a Gemfile with the rails gem, and Rails engines by looking for gemspec files with Rails dependencies. When only one project is available, it switches automatically.\n\nRails 8.1 Compatibility\n\nRails 8.1 changed the internal callback API. The analyze_controller_views tool was calling callback.options to extract :only and :except conditions, but that method no longer exists.\n\nThe fix maintains backward compatibility:\n\ncallbacks: controller._process_action_callbacks.map { |cb|\n  h = { kind: cb.kind.to_s, filter: cb.filter.to_s }\n  if cb.respond_to?(:options)\n    h[:only] = Array(cb.options[:only]).map(&amp;:to_s)\n    h[:except] = Array(cb.options[:except]).map(&amp;:to_s)\n  end\n  h\n}\n\n\nThis works with Rails 6.0 through 8.1. The callback conditions are extracted when available, omitted when not.\n\nOther Changes\n\nError messages now include hints. When you ask for a model named users instead of User, the error explains the naming convention. Small things that reduce friction.\n\nParameter passing in execute_tool is fixed. The params schema now generates correctly for MCP clients, so tools like analyze_models can actually receive their parameters. This was a real bug that made the tool harder to use than it should have been.\n\nInput validation for load_guide prevents path traversal in guide names. Another gap that hellvinz’s security review prompted me to address.\n\nBreaking Change\n\nThe load_guide analyzer renamed its parameter from guides to library:\n\n# Before (1.4.x)\nexecute_tool(\"load_guide\", { guides: \"rails\", guide: \"active_record\" })\n\n# After (1.5.0)\nexecute_tool(\"load_guide\", { library: \"rails\", guide: \"active_record\" })\n\n\nThe change clarifies that you’re selecting a documentation library (rails, turbo, stimulus, kamal, custom), not multiple guides. It’s a small breaking change, but the naming is more accurate.\n\nUpgrading\n\ngem update rails-mcp-server\n\n\nIf you’re using Claude Desktop, restart it to pick up the new version. The server binary path in your configuration doesn’t change.\n\nFor new installations:\n\ngem install rails-mcp-server\nrails-mcp-config\n\n\nThe interactive configuration tool handles Claude Desktop setup, project registration, and guide downloads.\n\nWhat’s Next\n\nThe MCP specification continues to evolve. As more AI tools adopt the protocol, Rails MCP Server will adapt to support them.\n\nIf you find issues or have ideas, the issue tracker is open. Pull requests are welcome. As this release shows, community contributions make a real difference—sometimes more than you might expect.\n\nLinks\n\n\n  GitHub Repository\n  RubyGems\n  Documentation\n  AI Agent Guide\n  Copilot Agent Setup"
        },
        {
          "id": "blog-2025-12-announcing-maquina-components-opinionated-ul-for-rails-applications",
          "title": "Announcing Maquina Components: Opinionated Ul for Rails Applications",
          "collection": {
            "label": "posts",
            "name": "Blog"
          },
          "categories": "Announcements, Release",
          "tags": "",
          "url": "/blog/2025/12/announcing-maquina-components-opinionated-ul-for-rails-applications/",
          "content": "Rails has opinions about most things. Database migrations, routing, asset handling, background jobs. But when it comes to building user interfaces, you’re on your own.\n\nThe framework gives you excellent primitives: importmaps, Stimulus, Turbo. But no default components. No standard way to build a button, a card, or a data table. Every Rails developer reinvents these from scratch.\n\nMaquina Components is my attempt to fill this gap—not the definitive solution, but one practical approach that works for how I build applications.\n\nWhy This Exists\n\nI started building components inspired by shadcn/ui for production Rails applications—dashboards, admin interfaces, internal tools. Over time, these components spread across multiple projects and became inconsistent: different APIs, different styling approaches, different levels of completeness.\n\nIt was time to extract the elements I use most and give them a cohesive API and consistent styling.\n\nThe Technical Choices\n\nI chose ERB partials with Tailwind CSS and Stimulus controllers for interactive elements. For static components like form inputs, pure CSS with data attributes is enough.\n\n&lt;%= render \"components/card\" do %&gt;\n  &lt;%= render \"components/card/header\" do %&gt;\n    &lt;%= render \"components/card/title\", text: \"Projects\" %&gt;\n  &lt;% end %&gt;\n  &lt;%= render \"components/card/content\" do %&gt;\n    &lt;%= render \"components/table\", collection: @projects %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\n\nI’m aware of alternatives like ViewComponent and Phlex. The projects I extracted these components from didn’t use them. I see the benefits of using a Ruby class to render UI, but bringing either library into a project is a commitment—not all teams are ready to make it.\n\nThe reason isn’t technical. It’s the perception of moving away from “the Rails way.” ERB partials are what Rails developers learn first. They’re simple, they work, and everyone understands them immediately.\n\nWhat’s Included\n\nTwelve components extracted from production applications:\n\n\n  \n    \n      Category\n      Components\n    \n  \n  \n    \n      Layout\n      Sidebar, Header\n    \n    \n      Content\n      Card, Alert, Badge, Table, Empty State\n    \n    \n      Navigation\n      Breadcrumbs, Dropdown Menu, Pagination\n    \n    \n      Interactive\n      Toggle Group\n    \n    \n      Forms\n      Input, Select, Checkbox, Button (via data attributes)\n    \n  \n\n\nEach component follows the shadcn/ui theming convention with CSS variables. Light and dark mode work out of the box.\n\nComposability Over Convenience\n\nThese components are intentionally small. A card is five partials: wrapper, header, title, description, content, footer. That’s more code to write than a single &lt;%= card(...) %&gt; helper.\n\nBut composition is the point. You take these partials and build larger, application-specific components. A ProjectCard that combines Card + Badge + Button. A UserTable that extends Table with custom columns. There are no limits because you own the abstraction layer.\n\nWhat I Didn’t Build\n\nI didn’t port shadcn/ui one-to-one. I extracted only the components I actually use. This is a practical toolkit, not a complete design system.\n\nIf you need modals, tooltips, date pickers, or complex form builders—those aren’t here yet. They might come later if I need them in my own projects.\n\nThe Rails Frontend Landscape\n\nThere’s no single UI kit that dominates Rails development. The community has fragmented across different approaches:\n\n\n  ViewComponent and Phlex for Ruby-based component abstractions\n  Inertia.js for React/Vue integration\n  Various shadcn/ui ports with different philosophies\n\n\nEvil Martians has written extensively about modern frontend in Rails. Their work with ViewComponent and Inertia.js is excellent, but those approaches add dependencies I prefer to avoid.\n\nMaquina Components takes a different path: standard ERB, standard Tailwind, minimal JavaScript. If you’re building server-rendered Rails applications and want components that don’t require learning a new paradigm, this might work for you.\n\nAlternatives\n\nIf this approach doesn’t resonate, here are alternatives worth exploring:\n\n\n  RailsUI — Premium UI templates and components\n  RailsBlocks — Copy-paste components for Rails\n  shadcn-rails — Another shadcn/ui port\n  Inertia Rails Starter — React/Vue with Inertia\n\n\nGetting Started\n\nbundle add maquina_components\nrails generate maquina_components:install\n\n\nThe generator adds the engine CSS, theme variables, and a helper file for icon customization.\n\nBrowse the documentation for examples and API details. The test/dummy application in the repository shows all components with demo data.\n\nOpen Source\n\nMaquina Components is MIT licensed. The source is on GitHub.\n\nIf you try it and have feedback, I’d like to hear it. If this isn’t for you, that’s okay too. Rails is big enough for many approaches."
        },
        {
          "id": "404",
          "title": "Page Not Found - Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/404",
          "content": "Recuerd0\n          \n          \n            Documentation\n          \n          \n            Open Source\n          \n          \n            Blog\n          \n      \n\n      \n        mobile-nav#toggle\">\n          \n            \n          \n        \n      \n    \n  \n\n\n\n      \n        404\n        \n          Page not found\n        \n        \n          Sorry, we couldn't find the page you're looking for.\n        \n        \n          \n            Go home\n          \n        \n      \n    \n  \n\n  \n  \n    \n\n    \n      \n        \n          \n              \n                \n                  \n                    \n  \n\n                  \n                \n              \n\n              \n                  \n                    Products\n                    \n                        \n                          \n                            Recuerd0 \n                          \n                        \n                    \n                  \n                  \n                    Open Source\n                    \n                        \n                          \n                            Documentation \n                          \n                        \n                        \n                          \n                            Generators \n                          \n                        \n                        \n                          \n                            Components \n                          \n                        \n                        \n                          \n                            All Projects \n                          \n                        \n                    \n                  \n                  \n                    Company\n                    \n                        \n                          \n                            Blog \n                          \n                        \n                    \n                  \n                  \n                    Resources\n                    \n                        \n                          \n                            GitHub \n                          \n                        \n                        \n                          \n                            RubyGems \n                          \n                        \n                    \n                  \n              \n            \n          \n\n          \n            \n              \n              \n              \n              \n            \n\n            \n              \n                \n                  &copy; 2026 Maquina. Mario Alberto Chávez Cárdenas"
        },
        {
          "id": "500",
          "title": "Server Error - Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/500",
          "content": "Recuerd0\n          \n          \n            Documentation\n          \n          \n            Open Source\n          \n          \n            Blog\n          \n      \n\n      \n        mobile-nav#toggle\">\n          \n            \n          \n        \n      \n    \n  \n\n\n\n      \n        500\n        \n          Something went wrong\n        \n        \n          We're experiencing technical difficulties. Please try again later.\n        \n        \n          \n            Go home\n          \n        \n      \n    \n  \n\n  \n  \n    \n\n    \n      \n        \n          \n              \n                \n                  \n                    \n  \n\n                  \n                \n              \n\n              \n                  \n                    Products\n                    \n                        \n                          \n                            Recuerd0 \n                          \n                        \n                    \n                  \n                  \n                    Open Source\n                    \n                        \n                          \n                            Documentation \n                          \n                        \n                        \n                          \n                            Generators \n                          \n                        \n                        \n                          \n                            Components \n                          \n                        \n                        \n                          \n                            All Projects \n                          \n                        \n                    \n                  \n                  \n                    Company\n                    \n                        \n                          \n                            Blog \n                          \n                        \n                    \n                  \n                  \n                    Resources\n                    \n                        \n                          \n                            GitHub \n                          \n                        \n                        \n                          \n                            RubyGems \n                          \n                        \n                    \n                  \n              \n            \n          \n\n          \n            \n              \n              \n              \n              \n            \n\n            \n              \n                \n                  &copy; 2026 Maquina. Mario Alberto Chávez Cárdenas"
        },
        {
          "id": "blog",
          "title": "Blog — Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/blog/",
          "content": "Featured\n        \n\n        \n            \n                \n\n              \n                \n                  Tuesday, April 7, 2026\n                \n\n                \n                  \n                    \n                    Recuerd0 Now Reads Like a Filesystem\n                  \n                \n\n                \n                  Recuerd0&#39;s API now lets AI agents grep, glob, and read memories in line ranges — the same primitives Claude Code already uses. Plus categories, links, and caching.\n                \n\n                  \n                      \n\n                    \n                      Mario Alberto Chávez Cárdenas\n                    \n                  \n              \n            \n            \n                \n\n              \n                \n                  Monday, March 23, 2026\n                \n\n                \n                  \n                    \n                    MVP Creator: From Idea to Documents in Three Prompts\n                  \n                \n\n                \n                  Use MVP Creator, a Claude Code plugin, to generate research reports, business plans, brand guides, and technical specs for new Rails projects. Three prompts, six documents.\n                \n\n                  \n                      \n\n                    \n                      Mario Alberto Chávez Cárdenas\n                    \n                  \n              \n            \n            \n                \n\n              \n                \n                  Friday, March 13, 2026\n                \n\n                \n                  \n                    \n                    Maquina Generators: From rails new to Production-Ready\n                  \n                \n\n                \n                  Rails generators for authentication, job queues, error tracking, and security. No runtime dependency — generate once, own the code forever.\n                \n\n                  \n                      \n\n                    \n                      Mario Alberto Chávez Cárdenas\n                    \n                  \n              \n            \n        \n      \n    \n  \n\n\n  \n    \n      \n        All categories\n        \n          \n        \n      \n\n      \n        \n          \n\n          \n        \n        RSS Feed\n      \n    \n\n    \n        \n          \n            \n              Tuesday, April 7, 2026\n            \n\n              \n                  \n\n                \n                  Mario Alberto Chávez Cárdenas\n                \n              \n          \n\n          \n            \n              Recuerd0 Now Reads Like a Filesystem\n            \n\n            \n              Recuerd0&#39;s API now lets AI agents grep, glob, and read memories in line ranges — the same primitives Claude Code already uses. Plus categories, links, and caching.\n            \n\n            \n              \n                \n                Read more\n                \n                  \n                \n              \n            \n          \n        \n        \n          \n            \n              Monday, March 23, 2026\n            \n\n              \n                  \n\n                \n                  Mario Alberto Chávez Cárdenas\n                \n              \n          \n\n          \n            \n              MVP Creator: From Idea to Documents in Three Prompts\n            \n\n            \n              Use MVP Creator, a Claude Code plugin, to generate research reports, business plans, brand guides, and technical specs for new Rails projects. Three prompts, six documents.\n            \n\n            \n              \n                \n                Read more\n                \n                  \n                \n              \n            \n          \n        \n        \n          \n            \n              Friday, March 13, 2026\n            \n\n              \n                  \n\n                \n                  Mario Alberto Chávez Cárdenas\n                \n              \n          \n\n          \n            \n              Maquina Generators: From rails new to Production-Ready\n            \n\n            \n              Rails generators for authentication, job queues, error tracking, and security. No runtime dependency — generate once, own the code forever.\n            \n\n            \n              \n                \n                Read more\n                \n                  \n                \n              \n            \n          \n        \n        \n          \n            \n              Saturday, February 21, 2026\n            \n\n              \n                  \n\n                \n                  Mario Alberto Chávez Cárdenas\n                \n              \n          \n\n          \n            \n              Recuerd0 Source Code Is Now Available\n            \n\n            \n              The Recuerd0 source code is now on GitHub. Built with Rails 8, SQLite, and Hotwire — here&#39;s a look under the hood.\n            \n\n            \n              \n                \n                Read more\n                \n                  \n                \n              \n            \n          \n        \n        \n          \n            \n              Sunday, February 15, 2026\n            \n\n              \n                  \n\n                \n                  Mario Alberto Chávez Cárdenas\n                \n              \n          \n\n          \n            \n              Announcing Recuerd0: A Knowledge Base for AI Tool Context\n            \n\n            \n              Versioned knowledge base for AI coding tools. Curate project context once, serve it via REST API to Claude Code, Cursor, and ChatGPT. SaaS or self-hosted.\n            \n\n            \n              \n                \n                Read more\n                \n                  \n                \n              \n            \n          \n        \n        \n          \n            \n              Friday, February 13, 2026\n            \n\n              \n                  \n\n                \n                  Mario Alberto Chávez Cárdenas\n                \n              \n          \n\n          \n            \n              Maquina Components 0.4.0: Taming Turbo\n            \n\n            \n              Turbo Drive and Morph compatibility fixes for sidebars, plus a Rails partial rendering fix for block content in 9 components.\n            \n\n            \n              \n                \n                Read more\n                \n                  \n                \n              \n            \n          \n        \n        \n          \n            \n              Friday, January 23, 2026\n            \n\n              \n                  \n\n                \n                  Mario Alberto Chávez Cárdenas\n                \n              \n          \n\n          \n            \n              Maquina 0.3.1: Calendar, Date Picker &amp; Claude Code Skills\n            \n\n            \n              Maquina Components 0.3.1 adds Calendar and Date Picker for Rails. Plus Claude Code skills for consistent UI generation and Rails code simplification.\n            \n\n            \n              \n                \n                Read more\n                \n                  \n                \n              \n            \n          \n        \n        \n          \n            \n              Thursday, January 8, 2026\n            \n\n              \n                  \n\n                \n                  Mario Alberto Chávez Cárdenas\n                \n              \n          \n\n          \n            \n              Claude Skill for Maquina Components\n            \n\n            \n              Teach Claude how to build consistent UIs in Rails applications using maquina_components. A skill for AI-assisted development.\n            \n\n            \n              \n                \n                Read more\n                \n                  \n                \n              \n            \n          \n        \n        \n          \n            \n              Wednesday, January 7, 2026\n            \n\n              \n                  \n\n                \n                  Mario Alberto Chávez Cárdenas\n                \n              \n          \n\n          \n            \n              Maquina Components 0.3.0: Combobox and Toast\n            \n\n            \n              Two new interactive components for Rails applications. Searchable dropdowns and non-intrusive notifications.\n            \n\n            \n              \n                \n                Read more\n                \n                  \n                \n              \n            \n          \n        \n        \n          \n            \n              Monday, December 29, 2025\n            \n\n              \n                  \n\n                \n                  Mario Alberto Chávez Cárdenas\n                \n              \n          \n\n          \n            \n              Rails MCP Server 1.5.0: Security Hardening and Sandboxed Environment Support\n            \n\n            \n              Version 1.5.0 brings comprehensive security improvements from community contributor hellvinz, plus support for sandboxed AI agents like GitHub Copilot and Claude Code.\n            \n\n            \n              \n                \n                Read more\n                \n                  \n                \n              \n            \n          \n        \n        \n          \n            \n              Tuesday, December 16, 2025\n            \n\n              \n                  \n\n                \n                  Mario Alberto Chávez Cárdenas\n                \n              \n          \n\n          \n            \n              Announcing Maquina Components: Opinionated Ul for Rails Applications\n            \n\n            \n              Production-ready ERB partials styled with Tailwind CSS 4.0. Extracted from real applications.\n            \n\n            \n              \n                \n                Read more"
        },
        {
          "id": "company",
          "title": "About Maquina — Open Source Rails Tools & Philosophy",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/company/",
          "content": "Recuerd0\n              \n              \n                Documentation\n              \n              \n                Open Source\n              \n              \n                Blog\n              \n          \n\n          \n            mobile-nav#toggle\"\n            >\n              \n                \n              \n            \n          \n        \n      \n    \n  \n\n\n    \n  \n    \n      \n        \n          Empowering Rails developers everywhere.\n        \n        \n          We're building the tools that make multi-tenant Rails applications accessible to every developer.\n        \n\n        \n          \n            Our mission\n            \n              At Maquina, we believe that building multi-tenant applications shouldn't require months of boilerplate code or expensive SaaS subscriptions. Every Rails developer should have access to professional-grade tools for building modern applications.\n            \n            \n              Maquina was born from years of experience building production Rails applications. We've distilled the best patterns and practices into a single, cohesive framework that gets out of your way and lets you focus on what makes your application unique.\n            \n          \n\n          \n            \n              \n                \n                  \n                \n              \n              \n                \n                  \n                \n              \n              \n                \n                  \n                \n              \n              \n                \n                  \n                \n              \n            \n          \n\n          \n            The Numbers\n            \n            \n              \n                License\n                MIT\n              \n              \n                Open Source\n                100%\n              \n              \n                Rails Version\n                7+\n              \n              \n                Ruby Version\n                3.2+\n              \n            \n          \n        \n      \n    \n\n    \n      \n        Our Story\n        \n          Built by developers, for developers.\n        \n        \n          Maquina is the result of years of building Rails applications and learning what patterns work best.\n        \n\n        \n          \n            \n              After building dozens of multi-tenant Rails applications, we noticed the same patterns emerging over and over: authentication flows, organization management, role-based access control, and UI components that needed to be rebuilt for every project.\n            \n            \n              We decided to distill these patterns into a single, cohesive framework. Maquina follows Rails conventions, embraces Hotwire for modern interactivity without JavaScript complexity, and provides beautiful UI components built with ViewComponent and Tailwind CSS.\n            \n            \n              \n                Read the docs\n              \n            \n          \n          \n            \n              \n                \n                  \n                \n                Open Source on GitHub\n              \n            \n          \n        \n      \n    \n\n    \n      \n        Our Values\n        \n          Principles that guide us.\n        \n        \n          Everything we build is guided by these core principles.\n        \n\n        Core Principles\n        \n\n        \n          \n            \n              \n                \n              \n            \n            Convention over configuration\n            \n              Follow Rails conventions whenever possible. Sensible defaults mean less code to write and maintain. We believe the best code is the code you don't have to write.\n            \n          \n          \n            \n              \n                \n              \n            \n            Security first\n            \n              Security is not an afterthought. Every feature is designed with security best practices from the start. Authentication, authorization, and data isolation are core to the framework.\n            \n          \n          \n            \n              \n                \n              \n            \n            Documentation matters\n            \n              Great software deserves great documentation. We invest heavily in guides, examples, and API references. If it's not documented, it doesn't exist.\n            \n          \n          \n            \n              \n                \n              \n            \n            Community driven\n            \n              Built by the community, for the community. Every contribution matters and every voice is heard. We're committed to building in the open with transparency.\n            \n          \n        \n      \n    \n\n    \n      \n        Get Involved\n        \n          Join our open source community.\n        \n        \n          We welcome contributions of all kinds. Whether it's code, documentation, or feedback, every contribution helps make Maquina better for everyone.\n        \n\n        \n          \n            Ways to contribute\n            \n              \n                \n                  \n                  \n                \n                \n                  \n                    Contribution type\n                    Link\n                  \n                \n                \n                  \n                    \n                      \n                        Code\n                      \n                    \n                  \n                  \n                    Submit a pull request\n                    \n                      \n                        View\n                      \n                    \n                  \n                  \n                    Report a bug\n                    \n                      \n                        View\n                      \n                    \n                  \n                  \n                    \n                      \n                        Community\n                      \n                    \n                  \n                  \n                    Join the discussion\n                    \n                      \n                        View\n                      \n                    \n                  \n                  \n                    Star on GitHub\n                    \n                      \n                        View\n                      \n                    \n                  \n                \n              \n            \n          \n\n          \n            \n            \n              \n                \n                  Open source is not just about code. It's about building a community of developers who share knowledge and help each other grow.\n                \n              \n              \n                The Maquina Team\n                \n                  \n                    Open Source Contributors\n                  \n                \n              \n            \n          \n        \n      \n    \n  \n  \n    \n\n    \n      \n        \n          \n              \n                \n                  \n                    \n  \n\n                  \n                \n              \n\n              \n                  \n                    Products\n                    \n                        \n                          \n                            Recuerd0 \n                          \n                        \n                    \n                  \n                  \n                    Open Source\n                    \n                        \n                          \n                            Documentation \n                          \n                        \n                        \n                          \n                            Generators \n                          \n                        \n                        \n                          \n                            Components \n                          \n                        \n                        \n                          \n                            All Projects \n                          \n                        \n                    \n                  \n                  \n                    Company\n                    \n                        \n                          \n                            Blog \n                          \n                        \n                    \n                  \n                  \n                    Resources\n                    \n                        \n                          \n                            GitHub \n                          \n                        \n                        \n                          \n                            RubyGems \n                          \n                        \n                    \n                  \n              \n            \n          \n\n          \n            \n              \n              \n              \n              \n            \n\n            \n              \n                \n                  &copy; 2026 Maquina. Mario Alberto Chávez Cárdenas"
        },
        {
          "id": "documentation-ai-tools",
          "title": "AI Tools — Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/ai-tools/",
          "content": "MCP servers, Claude Code plugins, and AI integrations that connect LLMs to your Rails development workflow. Analyze code, access documentation, and coordinate changes across tools.\n\n\n\nAvailable Tools\n\nMCP Servers\n\n\n  \n    \n      Rails MCP Server\n    \n    \n      Let LLMs analyze models, routes, schemas, and execute Ruby code.\n    \n  \n\n  \n    \n      Neovim MCP Server\n    \n    \n      Read and update Neovim buffers from AI assistants.\n    \n  \n\n\nClaude Code Plugins\n\n\n  \n    \n      Rails Simplifier\n    \n    \n      Code simplification following 37signals patterns and One Person Framework.\n    \n  \n\n  \n    \n      Rails Upgrade Assistant\n    \n    \n      Generate upgrade guides for Rails 6.0 through 8.1.\n    \n  \n\n  \n    \n      Maquina UI Standards\n    \n    \n      Build consistent UIs with maquina_components.\n    \n  \n\n  \n    \n      MVP Creator\n    \n    \n      Research, plan, and document MVPs for Rails applications.\n    \n  \n\n\n\n\nWhat is MCP?\n\nThe Model Context Protocol (MCP) is a standardized way for AI models to interact with their environment. It defines how models request and use tools, access resources, and maintain context.\n\nMCP servers expose tools that AI assistants can call:\n\n# Example: AI assistant analyzes a Rails model\nexecute_tool(tool_name: \"analyze_models\", params: { model_name: \"User\" })\n\n\nSupported Clients\n\n\n  Claude Desktop\n  Any MCP-compatible client\n  Custom integrations via HTTP/SSE mode\n\n\n\n\nWhat are Claude Code Plugins?\n\nClaude Code plugins extend Claude’s capabilities within your development environment. They can be installed from marketplaces and provide:\n\n\n  Agents — Specialized AI assistants for specific tasks\n  Skills — Knowledge modules that teach Claude project-specific patterns\n  Commands — Custom slash commands for workflows\n\n\nInstalling Plugins\n\n# Add the marketplace\n/plugin marketplace add maquina-app/rails-claude-code\n\n# Install a plugin\n/plugin install rails-simplifier@maquina\n\n\n\n\nGetting Started\n\nWith MCP Servers\n\n1. Install an MCP Server\n\ngem install rails-mcp-server\n\n\n2. Configure Your Client\n\nFor Claude Desktop, add to claude_desktop_config.json:\n\n{\n  \"mcpServers\": {\n    \"railsMcpServer\": {\n      \"command\": \"rails-mcp-server\"\n    }\n  }\n}\n\n\n3. Start Using Tools\n\nIn Claude Desktop, the MCP server tools become available automatically. Ask Claude to:\n\n\n  “Analyze the User model in my Rails project”\n  “Show me the routes for the orders controller”\n  “What’s the database schema for the products table?”\n\n\nWith Claude Code Plugins\n\n1. Add the Marketplace\n\n/plugin marketplace add maquina-app/rails-claude-code\n\n\n2. Install Plugins\n\n/plugin install rails-simplifier@maquina\n/plugin install rails-upgrade-assistant@maquina\n/plugin install maquina-ui-standards@maquina\n/plugin install mvp-creator@maquina\n\n\n3. Use the Agents\n\n&gt; Review recent changes using the rails-simplifier agent\n&gt; Upgrade my Rails app to 8.1\n&gt; Create a users index view with maquina components\n\n\n\n\nArchitecture\n\nMCP Communication\n\nMCP servers communicate via JSON-RPC 2.0:\n\n\n  \n    \n      Mode\n      Use Case\n    \n  \n  \n    \n      STDIO\n      Direct integration with Claude Desktop\n    \n    \n      HTTP/SSE\n      Web-based clients, remote access\n    \n  \n\n\nPlugin Structure\n\nClaude Code plugins follow a standard structure:\n\nplugin-name/\n├── agents/           # AI agent definitions\n│   └── agent.md\n├── skills/           # Knowledge modules\n│   └── SKILL.md\n├── commands/         # Custom slash commands\n│   └── command.md\n└── references/       # Documentation\n    └── *.md\n\n\n\n\nTool Reference\n\n\n  \n    \n      Tool\n      Type\n      Purpose\n    \n  \n  \n    \n      Rails MCP Server\n      MCP Server\n      Code analysis and Ruby execution\n    \n    \n      Neovim MCP Server\n      MCP Server\n      Editor buffer coordination\n    \n    \n      Rails Simplifier\n      Plugin\n      Code simplification with 37signals patterns\n    \n    \n      Rails Upgrade Assistant\n      Plugin\n      Rails 6.0–8.1 upgrade planning\n    \n    \n      Maquina UI Standards\n      Plugin\n      UI component generation\n    \n    \n      MVP Creator\n      Plugin\n      MVP research, planning, and documentation\n    \n  \n\n\n\n\nTeam Installation\n\nFor consistent tooling across your team, add to .claude/settings.json:\n\n{\n  \"extraKnownMarketplaces\": {\n    \"maquina\": {\n      \"source\": {\n        \"source\": \"github\",\n        \"repo\": \"maquina-app/rails-claude-code\"\n      }\n    }\n  },\n  \"enabledPlugins\": [\n    \"rails-simplifier@maquina\",\n    \"rails-upgrade-assistant@maquina\",\n    \"maquina-ui-standards@maquina\",\n    \"mvp-creator@maquina\"\n  ]\n}\n\n\nCommit this file to your repository. Team members get the same plugins automatically."
        },
        {
          "id": "documentation-ai-tools-maquina-ui-standards",
          "title": "Maquina UI Standards — Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/ai-tools/maquina-ui-standards/",
          "content": "A Claude Code plugin that teaches Claude how to build UIs with maquina_components — ERB partials styled with Tailwind CSS 4 and data attributes, inspired by shadcn/ui.\n\n\n\nWhat Is This?\n\nA Claude Code skill that provides:\n\n\n  Component catalog — All 15+ components with ERB examples\n  Form patterns — Validation, error handling, inline layouts\n  Layout patterns — Sidebar navigation, page structure\n  Turbo integration — Frames, Streams, component updates\n  Spec checklist — Review criteria for UI quality\n\n\nWhen installed, Claude generates code that matches your component conventions without back-and-forth corrections.\n\n\n\nThe Problem It Solves\n\nWithout the skill, asking Claude to build a view results in generic Rails patterns:\n\n&lt;div class=\"card\"&gt;\n  &lt;h2&gt;&lt;%= @user.name %&gt;&lt;/h2&gt;\n&lt;/div&gt;\n\n\nWith the skill, Claude uses your actual components:\n\n&lt;%= render \"components/card\" do %&gt;\n  &lt;%= render \"components/card/header\" do %&gt;\n    &lt;%= render \"components/card/title\", text: @user.name %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\n\nThe skill eliminates the “use the card partial, not a div” corrections that slow down AI-assisted development.\n\n\n\nQuick Start\n\n1. Add the Marketplace\n\n/plugin marketplace add maquina-app/rails-claude-code\n\n\n2. Install the Plugin\n\n/plugin install maquina-ui-standards@maquina\n\n\n3. Start Building\n\n&gt; Create the users index view with a table showing name, email, and status\n\n\n\n\nRequirements\n\nThe maquina_components gem must be installed in your Rails application:\n\nbundle add maquina_components\nrails generate maquina_components:install\n\n\n\n\nWhat It Provides\n\n\n  \n    \n      Reference\n      Purpose\n    \n  \n  \n    \n      Component catalog\n      All available components with ERB examples\n    \n    \n      Form patterns\n      Validation states, error handling, inline layouts\n    \n    \n      Layout patterns\n      Sidebar navigation, page headers, content areas\n    \n    \n      Turbo integration\n      Frames, Streams, and component updates\n    \n    \n      Spec checklist\n      Accessibility and consistency review criteria\n    \n  \n\n\n\n\nUsage Examples\n\nCreate a View\n\n&gt; Create the users index view with a table showing name, email, and status\n\n\nClaude generates:\n\n&lt;%= render \"components/page_header\", title: \"Users\", description: \"Manage team members\" %&gt;\n\n&lt;%= render \"components/card\" do %&gt;\n  &lt;%= render \"components/card/content\" do %&gt;\n    &lt;table data-component=\"table\"&gt;\n      &lt;thead&gt;\n        &lt;tr&gt;\n          &lt;th&gt;Name&lt;/th&gt;\n          &lt;th&gt;Email&lt;/th&gt;\n          &lt;th&gt;Status&lt;/th&gt;\n        &lt;/tr&gt;\n      &lt;/thead&gt;\n      &lt;tbody&gt;\n        &lt;% @users.each do |user| %&gt;\n          &lt;tr&gt;\n            &lt;td&gt;&lt;%= user.name %&gt;&lt;/td&gt;\n            &lt;td&gt;&lt;%= user.email %&gt;&lt;/td&gt;\n            &lt;td&gt;\n              &lt;%= render \"components/badge\",\n                variant: user.active? ? :success : :secondary do %&gt;\n                &lt;%= user.active? ? \"Active\" : \"Inactive\" %&gt;\n              &lt;% end %&gt;\n            &lt;/td&gt;\n          &lt;/tr&gt;\n        &lt;% end %&gt;\n      &lt;/tbody&gt;\n    &lt;/table&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\n\nImplement a Form\n\n&gt; Implement the project form with name, description, and a framework combobox\n\n\nClaude generates:\n\n&lt;%= form_with model: @project do |form| %&gt;\n  &lt;div class=\"space-y-4\"&gt;\n    &lt;div&gt;\n      &lt;%= form.label :name %&gt;\n      &lt;%= form.text_field :name, data: { field: true } %&gt;\n    &lt;/div&gt;\n\n    &lt;div&gt;\n      &lt;%= form.label :description %&gt;\n      &lt;%= form.text_area :description, data: { field: true }, rows: 4 %&gt;\n    &lt;/div&gt;\n\n    &lt;div&gt;\n      &lt;%= form.label :framework_id %&gt;\n      &lt;%= render \"components/combobox\",\n        name: \"project[framework_id]\",\n        selected_value: @project.framework_id,\n        options: @frameworks.map { |f| { value: f.id, label: f.name } },\n        placeholder: \"Select a framework\" %&gt;\n    &lt;/div&gt;\n\n    &lt;div class=\"flex justify-end gap-2\"&gt;\n      &lt;%= link_to \"Cancel\", projects_path,\n        data: { component: \"button\", variant: \"outline\" } %&gt;\n      &lt;%= form.submit \"Save\",\n        data: { component: \"button\", variant: \"primary\" } %&gt;\n    &lt;/div&gt;\n  &lt;/div&gt;\n&lt;% end %&gt;\n\n\nReview Existing Code\n\n&gt; Review this view against the maquina UI standards and suggest improvements\n\n\nClaude checks for:\n\n  Proper component usage instead of raw HTML\n  Correct data attributes on form fields\n  Accessibility attributes\n  Consistent spacing and layout patterns\n  Turbo Frame and Stream integration\n\n\n\n\nComponent Patterns\n\nPartial Components\n\nComponents rendered as partials with strict locals:\n\n&lt;%# Card with header and content %&gt;\n&lt;%= render \"components/card\" do %&gt;\n  &lt;%= render \"components/card/header\" do %&gt;\n    &lt;%= render \"components/card/title\", text: \"Appointments\" %&gt;\n    &lt;%= render \"components/card/description\", text: \"Manage your schedule\" %&gt;\n  &lt;% end %&gt;\n  &lt;%= render \"components/card/content\" do %&gt;\n    &lt;!-- Content here --&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\n\nData Attribute Components\n\nForm elements and buttons use data attributes for styling:\n\n&lt;%# Text input %&gt;\n&lt;%= form.text_field :name, data: { field: true } %&gt;\n\n&lt;%# Button %&gt;\n&lt;%= link_to \"Edit\", edit_path,\n  data: { component: \"button\", variant: \"outline\", size: \"sm\" } %&gt;\n\n&lt;%# Badge %&gt;\n&lt;%= render \"components/badge\", variant: :success do %&gt;\n  Active\n&lt;% end %&gt;\n\n\nLayout Patterns\n\n&lt;%# Sidebar layout %&gt;\n&lt;%= render \"components/sidebar/provider\", state: sidebar_state do %&gt;\n  &lt;%= render \"components/sidebar\" do %&gt;\n    &lt;%= render \"components/sidebar/header\" do %&gt;\n      &lt;!-- Logo --&gt;\n    &lt;% end %&gt;\n    &lt;%= render \"components/sidebar/content\" do %&gt;\n      &lt;%= render \"components/sidebar/group\", title: \"Navigation\" do %&gt;\n        &lt;%= render \"components/sidebar/menu\" do %&gt;\n          &lt;%= render \"components/sidebar/menu_item\" do %&gt;\n            &lt;%= render \"components/sidebar/menu_link\",\n              href: dashboard_path,\n              icon: :home,\n              label: \"Dashboard\",\n              active: current_page?(dashboard_path) %&gt;\n          &lt;% end %&gt;\n        &lt;% end %&gt;\n      &lt;% end %&gt;\n    &lt;% end %&gt;\n  &lt;% end %&gt;\n\n  &lt;%= render \"components/sidebar/inset\" do %&gt;\n    &lt;%= yield %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\n\n\n\nPackage Contents\n\nmaquina-ui-standards/\n├── agents/maquina-ui-standards.md    # Main skill\n├── QUICKSTART.md                      # Quick reference\n└── references/\n    ├── component-catalog.md           # All available components\n    ├── form-patterns.md               # Validation, error handling\n    ├── layout-patterns.md             # Pages, dashboards\n    ├── turbo-integration.md           # Frames, streams\n    └── spec-checklist.md              # Accessibility, consistency\n\n\n\n\nTeam Installation\n\nAdd to your project’s .claude/settings.json:\n\n{\n  \"extraKnownMarketplaces\": {\n    \"maquina\": {\n      \"source\": {\n        \"source\": \"github\",\n        \"repo\": \"maquina-app/rails-claude-code\"\n      }\n    }\n  },\n  \"enabledPlugins\": [\n    \"maquina-ui-standards@maquina\"\n  ]\n}\n\n\n\n\nAlternative: Claude Skill Installation\n\nIf you prefer using Claude Skills instead of the plugin system, copy the skill to your project:\n\nmkdir -p .claude/skills\n# Copy from maquina_components repository\ncp -r skill .claude/skills/maquina-ui-standards\n\n\nThen reference it in your CLAUDE.md:\n\n## UI Components\n\nThis project uses maquina_components for UI. Before implementing views,\nforms, or interactive components, read the UI standards skill:\n\n.claude/skills/maquina-ui-standards/SKILL.md\n\nAlways consult the skill when:\n- Creating or modifying views\n- Implementing forms\n- Adding interactive components\n- Building layouts with sidebar/header patterns\n- Working with Turbo Streams that update UI\n\n\n\n\nNext Steps\n\n\n  \n    \n      GitHub Repository\n    \n    \n      View source code and contribute.\n    \n  \n\n  \n    \n      Component Documentation\n    \n    \n      Browse all maquina_components.\n    \n  \n\n  \n    \n      Announcement Post\n    \n    \n      Read about the skill's development.\n    \n  \n\n  \n    \n      maquina_components Gem\n    \n    \n      Install the component library."
        },
        {
          "id": "documentation-ai-tools-mvp-creator",
          "title": "MVP Creator — Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/ai-tools/mvp-creator/",
          "content": "A Claude Code plugin that creates comprehensive MVP documentation for Rails applications through guided research and discovery. Go from idea to implementation-ready deliverables.\n\n\n\nWhat Is This?\n\nA Claude Code agent that:\n\n\n  Researches your topic using web search and competitive analysis\n  Guides you through discovery questions to refine the MVP scope\n  Generates a Research Report with market context and competitor landscape\n  Produces an MVP Business Plan with feature priorities and user stories\n  Creates a Brand Guide with visual identity and tone of voice\n  Builds a Technical Guide with architecture decisions and Rails conventions\n  Configures Claude Setup (CLAUDE.md, .mcp.json, commands) for development handoff\n\n\n\n\nThe Workflow\n\n\n  \n    \n      Step\n      What Happens\n    \n  \n  \n    \n      1. Topic/Idea\n      You describe your app concept or business idea\n    \n    \n      2. Research\n      Agent researches competitors, market, and technology landscape\n    \n    \n      3. Discovery Questions\n      Interactive Q&amp;A to refine scope, audience, and priorities\n    \n    \n      4. Generate Deliverables\n      Five documents produced in sequence\n    \n    \n      5. Handoff\n      Ready for Spec-Driven Development to begin implementation\n    \n  \n\n\nThe agent walks you through each step interactively. You provide context and make decisions — the agent handles research, structure, and writing.\n\n\n\nQuick Start\n\n1. Add the Marketplace\n\n/plugin marketplace add maquina-app/rails-claude-code\n\n\n2. Install the Plugin\n\n/plugin install mvp-creator@maquina\n\n\n3. Start Creating\n\n&gt; I have an idea for a project management app\n\n\n\n\nDeliverables\n\nEvery MVP session produces five documents:\n\n\n  \n    \n      Deliverable\n      Description\n    \n  \n  \n    \n      Research Report\n      Competitor analysis, market overview, feature comparison\n    \n    \n      MVP Business Plan\n      Vision, feature priorities, user flows, success metrics\n    \n    \n      Brand Guide\n      Logo direction, colors, typography, components, voice\n    \n    \n      Technical Guide\n      Architecture, patterns, data models, code style\n    \n    \n      Claude Setup\n      CLAUDE.md, .mcp.json, and commands for Claude Desktop/Code\n    \n  \n\n\nResearch Report\n\nThe agent searches the web for competitors, analyzes their features, pricing, and positioning. You get a structured comparison that informs every subsequent deliverable.\n\nMVP Business Plan\n\nDefines what to build first. Includes prioritized features, user stories, and success metrics. Scoped to what a single developer can ship.\n\nBrand Guide\n\nVisual identity decisions: color palette, typography, component styling, and tone of voice. Ready to apply when building the UI.\n\nTechnical Guide\n\nRails-specific architecture: models, associations, authentication approach, API patterns, and testing strategy. Follows 37signals conventions.\n\nClaude Setup\n\nPre-configured CLAUDE.md with project context, .mcp.json for MCP server integration, and custom commands. Drop these into your new Rails project and start building with full AI context.\n\n\n\nUsage Examples\n\nStart from an Idea\n\n&gt; I have an idea for a project management app\n\n\nThe agent begins with research, then asks discovery questions to shape the MVP.\n\nPlan a SaaS Product\n\n&gt; Help me plan a SaaS for freelancers\n\n\nThe agent treats this as a full MVP session — research, discovery, and all five deliverables.\n\nResearch Competitors\n\n&gt; Research competitors for a booking system\n\n\nThe agent focuses on the research phase and produces a detailed competitor analysis.\n\nCreate a Business Plan\n\n&gt; Create a business plan for my app idea\n\n\nSkips research if you already know the market. Goes straight to discovery and deliverables.\n\nDesign a Brand\n\n&gt; Design a brand for my Rails project\n\n\nGenerates the Brand Guide deliverable with color palette, typography, and voice guidelines.\n\n\n\nPackage Contents\n\nmvp-creator/\n├── agents/mvp-creator.md               # Main agent\n├── QUICKSTART.md                        # Quick reference\n├── scripts/\n│   └── init.sh                          # Project initialization\n└── references/\n    ├── rails-philosophy.md              # Rails conventions and principles\n    ├── rails-ui-patterns.md             # UI design patterns\n    ├── rails-api-patterns.md            # API design patterns\n    ├── rails-implementation-patterns.md # Implementation guidelines\n    └── deliverable-templates/           # Templates for all 5 deliverables\n        ├── research-report.md\n        ├── mvp-business-plan.md\n        ├── brand-guide.md\n        ├── technical-guide.md\n        └── claude-setup.md\n\n\n\n\nTeam Installation\n\nAdd to your project’s .claude/settings.json:\n\n{\n  \"extraKnownMarketplaces\": {\n    \"maquina\": {\n      \"source\": {\n        \"source\": \"github\",\n        \"repo\": \"maquina-app/rails-claude-code\"\n      }\n    }\n  },\n  \"enabledPlugins\": [\n    \"mvp-creator@maquina\"\n  ]\n}\n\n\n\n\nNext Steps\n\n\n  \n    \n      GitHub Repository\n    \n    \n      View source code and contribute.\n    \n  \n\n  \n    \n      Spec-Driven Development\n    \n    \n      Continue from MVP to implementation with SDD.\n    \n  \n\n  \n    \n      Announcement Post\n    \n    \n      Watch the full 40-minute walkthrough video."
        },
        {
          "id": "documentation-ai-tools-nvim-mcp-server",
          "title": "Neovim MCP Server — Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/ai-tools/nvim-mcp-server/",
          "content": "A Ruby implementation of a Model Context Protocol (MCP) server for Neovim integration. Coordinate file changes between your editor and AI assistants by reading and updating Neovim buffers directly.\n\n\n\nWhat is MCP?\n\nThe Model Context Protocol (MCP) is a standardized way for AI models to interact with their environment. It defines how models request and use tools, access resources, and maintain context.\n\nThe Neovim MCP Server exposes your editor’s buffers to AI assistants, enabling them to read file contents and push changes directly into your editing session.\n\n\n\nFeatures\n\n\n  Read buffer contents from Neovim\n  Update buffer contents with new code\n  Coordinate changes between AI assistants and your editor\n  Works with Claude Desktop and other MCP clients\n  STDIO and HTTP server modes\n\n\n\n\nQuick Start\n\n1. Install the Gem\n\ngem install nvim-mcp-server\n\n\n2. Configure Neovim\n\nAdd to your init.lua to start the RPC server:\n\n-- Start the Neovim RPC server on a socket\nvim.fn.serverstart('/tmp/nvim-mcp.sock')\n\n\nOr start Neovim with a socket:\n\nnvim --listen /tmp/nvim-mcp.sock\n\n\n3. Configure Claude Desktop\n\nAdd to claude_desktop_config.json:\n\n{\n  \"mcpServers\": {\n    \"nvimMcpServer\": {\n      \"command\": \"nvim-mcp-server\",\n      \"args\": [\"--socket\", \"/tmp/nvim-mcp.sock\"]\n    }\n  }\n}\n\n\n\n\nAvailable Tools\n\nThe server provides 2 tools for buffer management.\n\n\n  \n    \n      Tool\n      Description\n    \n  \n  \n    \n      get_project_buffers\n      Get contents of all open buffers\n    \n    \n      update_buffer\n      Update a buffer with new content\n    \n  \n\n\nGet Project Buffers\n\nReturns the contents of all buffers currently open in Neovim:\n\nget_project_buffers()\n\n\nResponse includes file paths and their contents, allowing AI assistants to understand your current working context.\n\nUpdate Buffer\n\nUpdates a specific buffer with new content:\n\nupdate_buffer(file_path: \"/path/to/file.rb\", content: \"new content here\")\n\n\nThe changes appear immediately in Neovim, ready for you to review, modify, or save.\n\n\n\nServer Modes\n\nSTDIO Mode (Default)\n\nFor direct integration with Claude Desktop:\n\nnvim-mcp-server --socket /tmp/nvim-mcp.sock\n\n\nHTTP Mode\n\nFor HTTP endpoints with JSON-RPC and SSE:\n\nnvim-mcp-server --mode http --socket /tmp/nvim-mcp.sock\nnvim-mcp-server --mode http --socket /tmp/nvim-mcp.sock -p 8080\n\n\nEndpoints:\n\n  JSON-RPC: http://localhost:6030/mcp/messages\n  SSE: http://localhost:6030/mcp/sse\n\n\n\n\nNeovim Configuration\n\nSocket Setup\n\nThe MCP server communicates with Neovim via RPC over a Unix socket. Configure Neovim to listen:\n\nOption 1: In init.lua (recommended)\n\n-- Always start the socket server\nvim.fn.serverstart('/tmp/nvim-mcp.sock')\n\n\nOption 2: Shell alias\n\nalias nvim='nvim --listen /tmp/nvim-mcp.sock'\n\n\nOption 3: Per-session\n\nnvim --listen /tmp/nvim-mcp.sock\n\n\nMultiple Neovim Instances\n\nFor multiple Neovim instances, use unique socket paths:\n\n-- In init.lua\nlocal socket_path = '/tmp/nvim-mcp-' .. vim.fn.getpid() .. '.sock'\nvim.fn.serverstart(socket_path)\nprint('Neovim socket: ' .. socket_path)\n\n\nThen specify the socket when starting the MCP server:\n\nnvim-mcp-server --socket /tmp/nvim-mcp-12345.sock\n\n\n\n\nRuby Version Manager Users\n\nClaude Desktop bypasses version manager initialization. Use the Ruby shim path:\n\n{\n  \"mcpServers\": {\n    \"nvimMcpServer\": {\n      \"command\": \"/home/your_user/.rbenv/shims/ruby\",\n      \"args\": [\n        \"/path/to/nvim-mcp-server/exe/nvim-mcp-server\",\n        \"--socket\",\n        \"/tmp/nvim-mcp.sock\"\n      ]\n    }\n  }\n}\n\n\n\n\nTesting and Debugging\n\nUse MCP Inspector to test the server:\n\nnpm -g install @modelcontextprotocol/inspector\nnpx @modelcontextprotocol/inspector nvim-mcp-server --socket /tmp/nvim-mcp.sock\n\n\nThe Inspector UI lets you:\n\n  See available tools\n  Execute tool calls interactively\n  View request and response details\n  Debug issues in real-time\n\n\nVerify Neovim Socket\n\nCheck that Neovim is listening:\n\n# Should show the socket file\nls -la /tmp/nvim-mcp.sock\n\n\nFrom within Neovim, verify the server address:\n\n:echo v:servername\n\n\n\n\nUse Cases\n\nCode Review Workflow\n\n\n  Open files in Neovim\n  Ask Claude to review the open buffers\n  Claude reads via get_project_buffers\n  Claude suggests changes via update_buffer\n  Review changes in Neovim before saving\n\n\nAI-Assisted Editing\n\nCombine with other MCP servers for powerful workflows:\n\n\n  Use Rails MCP Server to understand your codebase\n  Use Neovim MCP Server to apply changes directly to your editor\n  Review and refine changes before committing\n\n\n\n\nNext Steps\n\n\n  \n    \n      GitHub Repository\n    \n    \n      Source code, issues, and contribution guidelines.\n    \n  \n\n  \n    \n      Rails MCP Server\n    \n    \n      Analyze models, routes, and schemas in your Rails projects."
        },
        {
          "id": "documentation-ai-tools-rails-mcp-server",
          "title": "Rails MCP Server — Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/ai-tools/rails-mcp-server/",
          "content": "A Ruby implementation of a Model Context Protocol (MCP) server for Rails projects. Let LLMs interact with your Rails codebase through code analysis, exploration, and development assistance.\n\nCurrent Version: 1.5.0\n\n\n\nWhat is MCP?\n\nThe Model Context Protocol (MCP) is a standardized way for AI models to interact with their environment. It defines a structured method for models to request and use tools, access resources, and maintain context during interactions.\n\nRails MCP Server implements the MCP specification to give AI models access to Rails projects for code analysis, exploration, and assistance.\n\n\n\nFeatures\n\n\n  Manage multiple Rails projects with auto-detection\n  Browse project files and structures\n  View Rails routes with filtering\n  Inspect model information and relationships (Prism static analysis)\n  Get database schema information\n  Analyze controller-view relationships\n  Analyze environment configurations\n  Execute sandboxed Ruby code for custom queries\n  Access Rails, Turbo, Stimulus, and Kamal documentation\n  Context-efficient architecture with progressive tool discovery\n  GitHub Copilot Agent support (v1.5.0+)\n  Rails 8.1+ compatibility (v1.5.0+)\n\n\n\n\nQuick Start\n\n1. Install the Gem\n\ngem install rails-mcp-server\n\n\n2. Configure Projects\n\nOption A: Interactive configuration\n\nrails-mcp-config\n\n\nThis provides a TUI for managing projects, downloading guides, and configuring Claude Desktop.\n\nOption B: Single-project mode (v1.5.0+)\n\nFor quick usage with the current directory:\n\ncd /path/to/your/rails/app\nrails-mcp-server --single-project\n\n\nOption C: Environment variable (v1.5.0+)\n\nexport RAILS_MCP_PROJECT_PATH=/path/to/your/rails/app\nrails-mcp-server\n\n\n3. Configure Your AI Client\n\nClaude Desktop\n\nSelect “Claude Desktop integration” in the configuration tool, or manually add to claude_desktop_config.json:\n\n{\n  \"mcpServers\": {\n    \"railsMcpServer\": {\n      \"command\": \"ruby\",\n      \"args\": [\"/path/to/rails-mcp-server/exe/rails-mcp-server\"]\n    }\n  }\n}\n\n\nGitHub Copilot Agent (v1.5.0+)\n\nSee the Copilot Agent Setup Guide for detailed instructions.\n\n\n\nProject Detection (v1.5.0+)\n\nThe server uses priority-based project detection:\n\n\n  \n    \n      Priority\n      Method\n      Description\n    \n  \n  \n    \n      1 (Highest)\n      RAILS_MCP_PROJECT_PATH env var\n      Explicit path to project\n    \n    \n      2\n      --single-project flag\n      Uses current working directory\n    \n    \n      3\n      Auto-detection\n      Detects Rails apps (Gemfile) or engines (gemspec)\n    \n    \n      4 (Lowest)\n      projects.yml\n      Traditional multi-project configuration\n    \n  \n\n\nWhen only one project is configured, the server auto-switches to it.\n\n\n\nAvailable Tools\n\nThe server provides 4 registered tools plus internal analyzers accessible via execute_tool.\n\nRegistered Tools\n\n\n  \n    \n      Tool\n      Description\n    \n  \n  \n    \n      switch_project\n      Change the active Rails project\n    \n    \n      search_tools\n      Discover available tools by category or keyword\n    \n    \n      execute_tool\n      Invoke internal analyzers by name\n    \n    \n      execute_ruby\n      Execute sandboxed Ruby code in project context\n    \n  \n\n\nInternal Analyzers\n\n\n  \n    \n      Analyzer\n      Description\n    \n  \n  \n    \n      project_info\n      Project information, Rails version, directory structure\n    \n    \n      list_files\n      List files matching a pattern\n    \n    \n      get_file\n      Retrieve file content\n    \n    \n      get_routes\n      Rails routes with filtering\n    \n    \n      analyze_models\n      Active Record models with associations and validations\n    \n    \n      get_schema\n      Database schema information\n    \n    \n      analyze_controller_views\n      Controller-view relationships\n    \n    \n      analyze_environment_config\n      Environment configuration analysis\n    \n    \n      load_guide\n      Load documentation guides\n    \n  \n\n\n\n\nUsage Examples\n\nSwitch Project\n\nswitch_project(project_name: \"my_rails_app\")\n\n\nGet Routes\n\nexecute_tool(tool_name: \"get_routes\")\nexecute_tool(tool_name: \"get_routes\", params: { controller: \"users\" })\nexecute_tool(tool_name: \"get_routes\", params: { verb: \"POST\" })\n\n\nAnalyze Models\n\nexecute_tool(tool_name: \"analyze_models\")\nexecute_tool(tool_name: \"analyze_models\", params: { model_name: \"User\" })\nexecute_tool(tool_name: \"analyze_models\", params: { model_name: \"User\", analysis_type: \"full\" })\n\n\nTips:\n\n  Use CamelCase singular: User, BlogPost, OrderItem\n  Use analysis_type: \"full\" to include Prism static analysis (callbacks, scopes, methods)\n\n\nGet Schema\n\nexecute_tool(tool_name: \"get_schema\")\nexecute_tool(tool_name: \"get_schema\", params: { table_name: \"users\" })\nexecute_tool(tool_name: \"get_schema\", params: { detail_level: \"tables\" })\n\n\nTips:\n\n  Use snake_case plural: users, blog_posts, order_items\n  Use detail_level: \"tables\" for a quick table list\n\n\nExecute Ruby\n\nexecute_ruby(code: \"puts read_file('Gemfile')\")\nexecute_ruby(code: \"list_files('app/models/**/*.rb').each { |f| puts f }\")\n\n\nAvailable helpers in execute_ruby:\n\n\n  \n    \n      Helper\n      Description\n    \n  \n  \n    \n      read_file(path)\n      Read a file safely\n    \n    \n      file_exists?(path)\n      Check if a file exists\n    \n    \n      list_files(pattern)\n      Glob files matching pattern\n    \n    \n      project_root\n      Get the project root path\n    \n  \n\n\nImportant: Always use puts to see output from execute_ruby.\n\n\n\nServer Modes\n\nSTDIO Mode (Default)\n\nFor direct integration with Claude Desktop:\n\nrails-mcp-server\n\n\nSingle-Project Mode (v1.5.0+)\n\nFor working with the current directory only:\n\ncd /path/to/rails/app\nrails-mcp-server --single-project\n\n\nHTTP Mode\n\nFor HTTP endpoints with JSON-RPC and SSE:\n\nrails-mcp-server --mode http\nrails-mcp-server --mode http -p 8080\nrails-mcp-server --mode http --bind-all  # Allow LAN access\n\n\nEndpoints:\n\n  JSON-RPC: http://localhost:6029/mcp/messages\n  SSE: http://localhost:6029/mcp/sse\n\n\n\n\nConfiguration\n\nEnvironment Variable (v1.5.0+)\n\nSet the project path explicitly:\n\nexport RAILS_MCP_PROJECT_PATH=~/projects/my-rails-app\nrails-mcp-server\n\n\nManual Project Configuration\n\nEdit ~/.config/rails-mcp/projects.yml:\n\nstore: \"~/projects/store\"\nblog: \"~/projects/rails-blog\"\necommerce: \"/full/path/to/ecommerce-app\"\n\n\nRuby Version Manager Users\n\nClaude Desktop bypasses version manager initialization. Use the Ruby shim path:\n\n{\n  \"mcpServers\": {\n    \"railsMcpServer\": {\n      \"command\": \"/home/your_user/.rbenv/shims/ruby\",\n      \"args\": [\"/path/to/rails-mcp-server/exe/rails-mcp-server\"]\n    }\n  }\n}\n\n\nThe rails-mcp-config tool detects this automatically.\n\n\n\nDocumentation Resources\n\nAccess comprehensive documentation through load_guide:\n\nexecute_tool(tool_name: \"load_guide\", params: { library: \"rails\" })\nexecute_tool(tool_name: \"load_guide\", params: { library: \"rails\", guide: \"getting_started\" })\nexecute_tool(tool_name: \"load_guide\", params: { library: \"rails\", guide: \"active_record_basics\" })\nexecute_tool(tool_name: \"load_guide\", params: { library: \"turbo\" })\nexecute_tool(tool_name: \"load_guide\", params: { library: \"stimulus\" })\nexecute_tool(tool_name: \"load_guide\", params: { library: \"kamal\" })\nexecute_tool(tool_name: \"load_guide\", params: { library: \"custom\" })\n\n\nAvailable libraries:\n\n\n  \n    \n      Library\n      Content\n    \n  \n  \n    \n      rails\n      Official Rails Guides\n    \n    \n      turbo\n      Hotwire Turbo handbook and reference\n    \n    \n      stimulus\n      Stimulus handbook and reference\n    \n    \n      kamal\n      Kamal deployment documentation\n    \n    \n      custom\n      User-added custom guides\n    \n  \n\n\nDownload guides using the configuration tool:\n\nrails-mcp-config\n# Select \"Download guides\"\n\n\n\n  Breaking Change in v1.5.0: The guides parameter was renamed to library.\n  \n    Old: params: { guides: \"rails\" }\n    New: params: { library: \"rails\" }\n  \n\n\n\n\nAnalyzer Parameter Reference\n\n\n  \n    \n      Analyzer\n      Required\n      Optional Parameters\n    \n  \n  \n    \n      project_info\n      -\n      max_depth, include_files, detail_level\n    \n    \n      list_files\n      -\n      directory, pattern\n    \n    \n      get_file\n      path\n      -\n    \n    \n      get_routes\n      -\n      controller, verb, path_contains, named_only, detail_level\n    \n    \n      analyze_models\n      -\n      model_name, model_names, detail_level, analysis_type\n    \n    \n      get_schema\n      -\n      table_name, table_names, detail_level\n    \n    \n      analyze_controller_views\n      -\n      controller_name, detail_level, analysis_type\n    \n    \n      analyze_environment_config\n      -\n      (none)\n    \n    \n      load_guide\n      library\n      guide\n    \n  \n\n\nCommon Parameter Values\n\ndetail_level:\n\n  names - Minimal output (just names/paths)\n  summary - Compact overview\n  full - Complete details (default)\n\n\nanalysis_type (for models and controllers):\n\n  introspection - Uses Rails runtime APIs (default)\n  static - Uses Prism AST parsing\n  full - Both introspection and static analysis\n\n\n\n\nUsing with MCP Proxy\n\nFor STDIO-only clients that need HTTP/SSE capabilities:\n\n# Start server in HTTP mode\nrails-mcp-server --mode http\n\n# Install and run MCP proxy\nnpm install -g mcp-remote\nnpx mcp-remote http://localhost:6029/mcp/sse\n\n\nConfigure Claude Desktop to use the proxy:\n\n{\n  \"mcpServers\": {\n    \"railsMcpServer\": {\n      \"command\": \"npx\",\n      \"args\": [\"mcp-remote\", \"http://localhost:6029/mcp/sse\"]\n    }\n  }\n}\n\n\n\n\nTesting and Debugging\n\nUse MCP Inspector to test the server:\n\nnpm -g install @modelcontextprotocol/inspector\nnpx @modelcontextprotocol/inspector /path/to/rails-mcp-server\n\n\nThe Inspector UI lets you:\n\n  See all available tools\n  Execute tool calls interactively\n  View request and response details\n  Debug issues in real-time\n\n\n\n\nSecurity\n\nSandbox Protections\n\nThe execute_ruby sandbox prevents:\n\n\n  File writes and modifications\n  System calls and shell commands\n  Network access\n  Reading sensitive files (.env, credentials, master.key, etc.)\n\n\nInput Validation (v1.5.0+)\n\nAll file-accessing analyzers use centralized input validation:\n\n\n  Path traversal prevention - Blocks ../ and absolute paths\n  Sensitive file protection - Filters master.key, credentials.yml.enc, .env files\n  Shell injection prevention - Uses safe argument passing\n  SQL injection prevention - Validates table names in schema queries\n\n\n\n\nCompatibility\n\n\n  \n    \n      Component\n      Supported Versions\n    \n  \n  \n    \n      Ruby\n      3.2+\n    \n    \n      Rails (target projects)\n      6.0+\n    \n    \n      Rails 8.1.1+\n      Full support (v1.5.0+)\n    \n    \n      Claude Desktop\n      Supported\n    \n    \n      GitHub Copilot Agent\n      Supported (v1.5.0+)\n    \n    \n      Other MCP Clients\n      Via STDIO or HTTP mode\n    \n  \n\n\n\n\nChangelog Highlights (v1.5.0)\n\nNew Features:\n\n  GitHub Copilot Agent support\n  --single-project flag for single-project mode\n  RAILS_MCP_PROJECT_PATH environment variable\n  Auto-detection of Rails apps and engines\n  Auto-switch when only one project configured\n\n\nBug Fixes:\n\n  Fixed Rails 8.1.1 callback introspection compatibility\n  Fixed execute_tool params schema for MCP clients\n  Improved error messages with helpful tips\n\n\nSecurity:\n\n  Added PathValidator for centralized input sanitization\n  Added CI security infrastructure (Dependabot, CodeQL, OpenSSF Scorecard)\n\n\nBreaking Changes:\n\n  load_guide parameter renamed: guides → library\n\n\n\n\nNext Steps\n\n\n  \n    \n      GitHub Repository\n    \n    \n      Source code, issues, and contribution guidelines.\n    \n  \n\n  \n    \n      AI Agent Guide\n    \n    \n      Comprehensive guide for AI agents using this server.\n    \n  \n\n  \n    \n      GitHub Copilot Setup\n    \n    \n      Configure Rails MCP Server with GitHub Copilot Agent.\n    \n  \n\n  \n    \n      RubyGems\n    \n    \n      Install the latest version from RubyGems."
        },
        {
          "id": "documentation-ai-tools-rails-simplifier",
          "title": "Rails Simplifier — Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/ai-tools/rails-simplifier/",
          "content": "A Claude Code plugin that refines Ruby on Rails code following 37signals patterns and the One Person Framework philosophy. Transform complex code into clean, maintainable Rails conventions.\n\n\n\nWhat Is This?\n\nA Claude Code agent that:\n\n\n  Simplifies service objects into rich model methods and concerns\n  Converts custom controller actions to CRUD resources\n  Transforms boolean state columns into state records\n  Optimizes fat controllers into thin controllers with model methods\n  Applies Rails best practices like I18n, Time.current, and eager loading\n  Detects N+1 queries and suggests fixes\n\n\n\n\nPhilosophy\n\nThe One Person Framework\n\nFrom DHH (December 2021):\n\n\n  “A toolkit so powerful that it allows a single individual to create modern applications upon which they might build a competitive business.”\n\n\nConceptual Compression\n\nFrom RailsConf 2018:\n\n\n  “Like a video codec that throws away irrelevant details such that you might download the film in real-time.”\n\n\nVanilla Rails is Plenty\n\nFrom Jorge Manrubia at 37signals:\n\n\n  “If you have the luxury of starting a new Rails app today, go vanilla.”\n\n\n\n\nQuick Start\n\n1. Add the Marketplace\n\n/plugin marketplace add maquina-app/rails-claude-code\n\n\n2. Install the Plugin\n\n/plugin install rails-simplifier@maquina\n\n\n3. Start Simplifying\n\n&gt; Review recent changes using the rails-simplifier agent\n\n\n\n\nWhat It Simplifies\n\n\n  \n    \n      Pattern\n      Simplification\n    \n  \n  \n    \n      Service objects\n      Rich model methods + concerns\n    \n    \n      Custom controller actions\n      CRUD resources\n    \n    \n      Boolean state columns\n      State records (has_one :closure)\n    \n    \n      Fat controllers\n      Thin controllers, model methods\n    \n    \n      Time.now\n      Time.current\n    \n    \n      Hardcoded strings\n      I18n keys\n    \n    \n      N+1 queries\n      includes / preload\n    \n    \n      Date tests without travel_to\n      Freeze time to fixture\n    \n  \n\n\n\n\nUsage Examples\n\nReview Recent Changes\n\n&gt; Review recent changes using the rails-simplifier agent\n\n\nThe agent analyzes your recent commits and suggests simplifications based on 37signals patterns.\n\nReview a Specific Controller\n\n&gt; Use rails-simplifier to review the bookings controller\n\n\nReview a Model\n\n&gt; Use rails-simplifier to review the Order model\n\n\nFull Project Review\n\n&gt; Run rails-simplifier on the app directory\n\n\n\n\nSimplification Patterns\n\nService Objects to Model Methods\n\nBefore:\n\n# app/services/order_processor.rb\nclass OrderProcessor\n  def initialize(order)\n    @order = order\n  end\n\n  def process\n    @order.update(processed_at: Time.current)\n    @order.line_items.each(&amp;:fulfill)\n    OrderMailer.confirmation(@order).deliver_later\n  end\nend\n\n# In controller\nOrderProcessor.new(@order).process\n\n\nAfter:\n\n# app/models/order.rb\nclass Order &lt; ApplicationRecord\n  def process!\n    update(processed_at: Time.current)\n    line_items.each(&amp;:fulfill)\n    OrderMailer.confirmation(self).deliver_later\n  end\nend\n\n# In controller\n@order.process!\n\n\nBoolean States to State Records\n\nBefore:\n\nclass Post &lt; ApplicationRecord\n  scope :published, -&gt; { where(published: true) }\n  scope :draft, -&gt; { where(published: false) }\nend\n\n\nAfter:\n\nclass Post &lt; ApplicationRecord\n  has_one :publication\n\n  scope :published, -&gt; { joins(:publication) }\n  scope :draft, -&gt; { where.missing(:publication) }\n\n  def publish!\n    create_publication!\n  end\n\n  def unpublish!\n    publication&amp;.destroy\n  end\nend\n\n\nCustom Actions to CRUD\n\nBefore:\n\n# config/routes.rb\nresources :posts do\n  member do\n    post :publish\n    post :unpublish\n    post :archive\n  end\nend\n\n# app/controllers/posts_controller.rb\ndef publish\n  @post.update(published: true)\n  redirect_to @post\nend\n\n\nAfter:\n\n# config/routes.rb\nresources :posts do\n  resource :publication, only: [:create, :destroy]\n  resource :archival, only: [:create, :destroy]\nend\n\n# app/controllers/publications_controller.rb\nclass PublicationsController &lt; ApplicationController\n  def create\n    @post = Post.find(params[:post_id])\n    @post.create_publication!\n    redirect_to @post\n  end\n\n  def destroy\n    @post = Post.find(params[:post_id])\n    @post.publication.destroy\n    redirect_to @post\n  end\nend\n\n\nN+1 Query Detection\n\nBefore:\n\ndef index\n  @posts = Post.all\nend\n\n# In view: @posts.each { |post| post.author.name }\n\n\nAfter:\n\ndef index\n  @posts = Post.includes(:author)\nend\n\n\n\n\nTeam Installation\n\nAdd to your project’s .claude/settings.json:\n\n{\n  \"extraKnownMarketplaces\": {\n    \"maquina\": {\n      \"source\": {\n        \"source\": \"github\",\n        \"repo\": \"maquina-app/rails-claude-code\"\n      }\n    }\n  },\n  \"enabledPlugins\": [\n    \"rails-simplifier@maquina\"\n  ]\n}\n\n\n\n\nResources\n\n\n  37signals Rails Patterns — Collection of patterns from 37signals\n  Jorge Manrubia’s Blog — Rails architecture insights\n  Rails Doctrine — The philosophy behind Rails\n\n\n\n\nNext Steps\n\n\n  \n    \n      GitHub Repository\n    \n    \n      View source code and contribute.\n    \n  \n\n  \n    \n      Rails MCP Server\n    \n    \n      Enhance analysis with MCP tools."
        },
        {
          "id": "documentation-ai-tools-rails-upgrade-skill",
          "title": "Rails Upgrade Skill — Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/ai-tools/rails-upgrade-skill/",
          "content": "A comprehensive Claude skill that helps you upgrade Ruby on Rails applications through any version from 6.0 to 8.1.1. Built on official Rails CHANGELOGs and integrated with MCP tools for automatic project analysis.\n\n\n\nWhat Is This?\n\nA Claude skill that:\n\n\n  Analyzes your Rails project automatically using Rails MCP tools\n  Detects your current version and target version\n  Plans single-hop or multi-hop upgrade paths\n  Identifies breaking changes specific to your code\n  Preserves custom configurations with warnings\n  Generates comprehensive upgrade reports\n  Updates files interactively via Neovim (optional)\n  Based on official Rails CHANGELOGs from GitHub\n\n\n\n\nQuick Start\n\n1. Install the Plugin\n\n/plugin marketplace add maquina-app/rails-claude-code\n/plugin install rails-upgrade-assistant@maquina\n\n\n2. Connect MCP Servers\n\nRequired: Rails MCP Server\n\ngem install rails-mcp-server\n\n\nThe Rails MCP Server analyzes your models, routes, schemas, and executes read-only Ruby code in your Rails context. Installation guide\n\nOptional: Neovim MCP Server\n\ngem install nvim-mcp-server\n\n\nEnables interactive file updates directly in your editor. Installation guide\n\n3. Start Upgrading\n\nSay to Claude:\n\n\"Upgrade my Rails app to 8.1\"\n\n\nClaude will:\n\n\n  Detect your current Rails version\n  Plan the upgrade path (single or multi-hop)\n  Analyze your project for custom code\n  Generate comprehensive upgrade report\n  Provide step-by-step instructions\n  Optionally update files interactively\n\n\n\n\nSupported Upgrade Paths\n\n\n  \n    \n      From\n      To\n      Hops\n      Breaking Changes\n      Difficulty\n    \n  \n  \n    \n      8.0.x\n      8.1.1\n      1\n      8 changes\n      Easy\n    \n    \n      7.2.x\n      8.0.4\n      1\n      13 changes\n      Hard\n    \n    \n      7.1.x\n      7.2.3\n      1\n      38 changes\n      Medium\n    \n    \n      7.0.x\n      7.1.6\n      1\n      12 changes\n      Medium\n    \n    \n      6.1.x\n      7.0.0\n      1\n      17 changes\n      Hard\n    \n    \n      6.0.x\n      6.1.0\n      1\n      18 changes\n      Medium\n    \n    \n      6.0.x\n      8.1.1\n      6\n      106 changes\n      Very Hard\n    \n  \n\n\nSequential Upgrades Required\n\nRails upgrades must be sequential:\n\nCorrect: 6.0 → 6.1 → 7.0 → 7.1 → 7.2 → 8.0 → 8.1\nWrong:   6.0 → 7.0 (skips 6.1)\n\n\nFor multi-hop upgrades, Claude will:\n\n\n  Explain the sequential requirement\n  Plan all intermediate hops\n  Generate separate reports for each hop\n  Guide you through completing each hop before moving to next\n\n\n\n\nOperating Modes\n\nMode 1: Report-Only (Recommended)\n\nBest for understanding what needs to change before making edits.\n\n\"Upgrade my Rails app from 7.2 to 8.0\"\n\n\nClaude will:\n\n\n  Call railsMcpServer:project_info to detect current version\n  Load appropriate version guide(s)\n  Analyze your project files for custom code\n  Identify breaking changes affecting your code\n  Generate comprehensive upgrade report\n\n\nYou remain in control and apply changes manually.\n\nMode 2: Interactive with Neovim\n\nBest for experienced users who want live file updates.\n\nRequirements:\n\n\n  Files open in Neovim\n  Neovim socket at /tmp/nvim-{project_name}.sock\n  Neovim MCP server connected\n\n\n\"Upgrade to Rails 8.1 in interactive mode with project 'myapp'\"\n\n\nClaude will:\n\n\n  Generate full upgrade report\n  Check which files are open in Neovim\n  For each file needing changes:\n    \n      Show current code (OLD)\n      Show proposed code (NEW)\n      Ask for approval before updating\n    \n  \n  Verify each change applied successfully\n  Summarize all changes made\n\n\nMode 3: Query-Specific\n\nBest for specific questions about changes.\n\n\"What ActiveRecord changes are in Rails 8.0?\"\n\"How do I handle the SSL configuration change?\"\n\"What breaking changes affect my models?\"\n\"Will my Redis cache work after upgrading to 8.0?\"\n\n\n\n\nMCP Tools Integration\n\nThe skill uses these Rails MCP tools to understand your project:\n\n\n  \n    \n      Tool\n      Purpose\n    \n  \n  \n    \n      project_info\n      Detect version, structure, Ruby version\n    \n    \n      list_files\n      Find configuration files, models, initializers\n    \n    \n      get_file\n      Read files for custom configurations\n    \n    \n      analyze_models\n      Review associations, validations, callbacks\n    \n    \n      get_schema\n      Check database tables, columns, indexes\n    \n    \n      get_routes\n      Map HTTP routes and middleware\n    \n  \n\n\n\n\nKey Breaking Changes by Version\n\nRails 8.0 → 8.1\n\nHigh impact:\n\n\n  SSL configuration now commented out (affects non-Kamal deploys)\n  Database pool: renamed to max_connections:\n  bundler-audit script required\n\n\nRails 7.2 → 8.0\n\nHigh impact:\n\n\n  Asset pipeline: Sprockets → Propshaft\n  Solid gems: New defaults for cache/queue/cable\n  Multi-database config required for Solid gems\n\n\nRails 7.1 → 7.2\n\nHigh impact:\n\n\n  Transaction-aware job enqueuing (behavior change)\n  ActiveRecord::Base.connection deprecated\n  show_exceptions changed from boolean to symbol\n  Rails.application.secrets removed\n\n\nRails 7.0 → 7.1\n\nHigh impact:\n\n\n  cache_classes → enable_reloading (inverted logic)\n  Force SSL now default in production\n  SQLite database moved to storage/\n\n\nRails 6.1 → 7.0\n\nHigh impact:\n\n\n  Zeitwerk autoloader required (Classic removed)\n  rails command replaces rake for most tasks\n  Spring removed from default Gemfile\n  ActiveSupport::Dependencies autoloading deprecated\n\n\nRails 6.0 → 6.1\n\nHigh impact:\n\n\n  Per-database connection handling changes\n  ActiveRecord::Base#connection pool behavior updated\n  Hotwire (Turbo + Stimulus) introduced as default frontend\n  rails db:prepare added as preferred setup command\n\n\n\n\nCustom Code Detection\n\nThe skill automatically detects and warns about customizations:\n\nDatabase Configuration\n\n# Custom SQLite path detected in config/database.yml\n# Current: database: db/development.sqlite3\n# Rails 7.1+: database: storage/development.sqlite3\n# Action: Review and update path\n\n\nSSL Middleware\n\n# Custom SSL middleware detected in config/application.rb\n# Line 23: middleware.use CustomSSLMiddleware\n# Rails 7.1+: May conflict with config.force_ssl = true\n# Action: Review compatibility\n\n\nAutoload Paths\n\n# Custom autoload_paths in config/application.rb\n# Line 15: config.autoload_paths &lt;&lt; Rails.root.join('lib')\n# Rails 7.1+: lib/ autoloaded by default (config.autoload_lib)\n# Action: Remove manual path to avoid conflicts\n\n\nAsset Pipeline\n\n# Custom Sprockets processors detected\n# Files: lib/assets/processors/custom_minifier.rb\n# Rails 8.0+: Propshaft doesn't support processors\n# Action: Migrate to different approach or keep Sprockets\n\n\n\n\nWhat You Get\n\nEvery upgrade request generates a detailed report:\n\n1. Executive Summary\n\n\n  Current and target versions\n  Number of breaking changes\n  Estimated time and risk assessment\n\n\n2. Project Analysis\n\n\n  Your Rails version and structure\n  Files that need updating\n  Custom configurations detected\n\n\n3. Breaking Changes (Prioritized)\n\n\n  HIGH Priority: Will cause app to fail\n  MEDIUM Priority: Should address soon\n  LOW Priority: Optional improvements\n\n\n4. Code Examples (OLD vs NEW)\n\n# OLD (Rails 7.2)\nconfig.action_dispatch.show_exceptions = true\n\n# NEW (Rails 7.2+)\nconfig.action_dispatch.show_exceptions = :all\n\n\n5. Step-by-Step Migration Guide\n\n\n  Phase-by-phase breakdown\n  Time estimates per phase\n  Testing checkpoints\n\n\n6. Testing Checklist\n\n\n  Unit test guidance\n  Integration test scenarios\n  Manual testing checklist\n\n\n\n\nPre-Upgrade Checklist\n\nBefore starting any upgrade:\n\nCritical:\n\n\n  All tests currently passing\n  Database backed up\n  Application under version control\n  Staging environment available\n  Rollback plan documented\n\n\nImportant:\n\n\n  Rails MCP server connected\n  Current version confirmed\n  Dependencies reviewed for compatibility\n  Custom code documented\n\n\n\n\nPackage Contents\n\nrails-upgrade-assistant/\n├── SKILL.md                    Entry point\n├── workflows/                  How to generate deliverables\n├── examples/                   Real usage scenarios\n├── reference/                  Quick reference\n├── version-guides/             Rails version details\n├── templates/                  Report templates\n└── detection-scripts/          Pattern definitions\n\n\nVersion Guides\n\n\n  upgrade-6.0-to-6.1.md - 18 breaking changes\n  upgrade-6.1-to-7.0.md - 17 breaking changes\n  upgrade-7.0-to-7.1.md - 12 breaking changes\n  upgrade-7.1-to-7.2.md - 38 breaking changes\n  upgrade-7.2-to-8.0.md - 13 breaking changes\n  upgrade-8.0-to-8.1.md - 8 breaking changes\n\n\n\n\nUsage Examples\n\nSimple Upgrade\n\n\"Upgrade my Rails app to 8.1\"\n\n\nWith Specific Details\n\n\"Upgrade my Rails app from 7.2 to 8.0\"\n\n\nRisk Assessment Only\n\n\"Assess upgrade impact from 7.2 to 8.0\"\n\n\nComponent-Specific Questions\n\n\"What ActiveRecord changes are in Rails 8.0?\"\n\"Show me all configuration file changes for 7.2\"\n\n\n\n\nNext Steps\n\n\n  \n    \n      GitHub Repository\n    \n    \n      Download the skill package and view documentation.\n    \n  \n\n  \n    \n      Rails MCP Server\n    \n    \n      Required for automatic project analysis."
        },
        {
          "id": "documentation-components-alert",
          "title": "Alert — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/alert/",
          "content": "Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\nUsage\n\n&lt;%= render &quot;components/alert&quot;, icon: :info do %&gt;\n  &lt;%= render &quot;components/alert/title&quot;, text: &quot;Heads up!&quot; %&gt;\n  &lt;%= render &quot;components/alert/description&quot;, text: &quot;You can add components using the CLI.&quot; %&gt;\n&lt;% end %&gt;\n\nExamples\n\nDestructive\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/alert&quot;, variant: :destructive, icon: :triangle_alert do %&gt;\n  &lt;%= render &quot;components/alert/title&quot;, text: &quot;Error&quot; %&gt;\n  &lt;%= render &quot;components/alert/description&quot;, text: &quot;Your session has expired.&quot; %&gt;\n&lt;% end %&gt;\n\nSuccess\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/alert&quot;, variant: :success, icon: :check_circle do %&gt;\n  &lt;%= render &quot;components/alert/title&quot;, text: &quot;Success&quot; %&gt;\n  &lt;%= render &quot;components/alert/description&quot;, text: &quot;Your changes have been saved.&quot; %&gt;\n&lt;% end %&gt;\n\nWarning\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/alert&quot;, variant: :warning, icon: :triangle_alert do %&gt;\n  &lt;%= render &quot;components/alert/title&quot;, text: &quot;Warning&quot; %&gt;\n  &lt;%= render &quot;components/alert/description&quot;, text: &quot;This action cannot be undone.&quot; %&gt;\n&lt;% end %&gt;\n\nAPI Reference\n\nAlert\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      variant\n      Symbol\n      :default\n      :default, :destructive, :success, :warning\n    \n    \n      icon\n      Symbol\n      nil\n      Icon name to display\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nAlert Title\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      text\n      String\n      nil\n      Title text\n    \n    \n      content\n      String\n      nil\n      HTML content via capture\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nAlert Description\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      text\n      String\n      nil\n      Description text\n    \n    \n      content\n      String\n      nil\n      HTML content via capture\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes"
        },
        {
          "id": "documentation-components-badge",
          "title": "Badge — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/badge/",
          "content": "Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\nUsage\n\n&lt;%= render &quot;components/badge&quot; do %&gt;\n  Badge\n&lt;% end %&gt;\n\nExamples\n\nVariants\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/badge&quot;, variant: :primary do %&gt;Primary&lt;% end %&gt;\n&lt;%= render &quot;components/badge&quot;, variant: :secondary do %&gt;Secondary&lt;% end %&gt;\n&lt;%= render &quot;components/badge&quot;, variant: :destructive do %&gt;Destructive&lt;% end %&gt;\n&lt;%= render &quot;components/badge&quot;, variant: :success do %&gt;Success&lt;% end %&gt;\n&lt;%= render &quot;components/badge&quot;, variant: :warning do %&gt;Warning&lt;% end %&gt;\n&lt;%= render &quot;components/badge&quot;, variant: :outline do %&gt;Outline&lt;% end %&gt;\n\nSizes\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/badge&quot;, size: :sm do %&gt;Small&lt;% end %&gt;\n&lt;%= render &quot;components/badge&quot;, size: :md do %&gt;Medium&lt;% end %&gt;\n&lt;%= render &quot;components/badge&quot;, size: :lg do %&gt;Large&lt;% end %&gt;\n\nWith Icons\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/badge&quot;, variant: :success do %&gt;\n  &lt;%= icon_for :check, class: &quot;size-3&quot; %&gt;\n  Verified\n&lt;% end %&gt;\n\n&lt;%= render &quot;components/badge&quot;, variant: :warning do %&gt;\n  &lt;%= icon_for :clock, class: &quot;size-3&quot; %&gt;\n  Pending\n&lt;% end %&gt;\n\nAPI Reference\n\nBadge\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      variant\n      Symbol\n      :default\n      :default, :primary, :secondary, :destructive, :success, :warning, :outline\n    \n    \n      size\n      Symbol\n      :md\n      :sm, :md, :lg\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes"
        },
        {
          "id": "documentation-components-breadcrumbs",
          "title": "Breadcrumbs — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/breadcrumbs/",
          "content": "Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\nUsage\n\n&lt;%= render &quot;components/breadcrumbs&quot; do %&gt;\n  &lt;%= render &quot;components/breadcrumbs/list&quot; do %&gt;\n    &lt;%= render &quot;components/breadcrumbs/item&quot; do %&gt;\n      &lt;%= render &quot;components/breadcrumbs/link&quot;, href: &quot;/&quot; do %&gt;Home&lt;% end %&gt;\n    &lt;% end %&gt;\n    &lt;%= render &quot;components/breadcrumbs/separator&quot; %&gt;\n    &lt;%= render &quot;components/breadcrumbs/item&quot; do %&gt;\n      &lt;%= render &quot;components/breadcrumbs/link&quot;, href: &quot;/components&quot; do %&gt;Components&lt;% end %&gt;\n    &lt;% end %&gt;\n    &lt;%= render &quot;components/breadcrumbs/separator&quot; %&gt;\n    &lt;%= render &quot;components/breadcrumbs/item&quot; do %&gt;\n      &lt;%= render &quot;components/breadcrumbs/page&quot; do %&gt;Breadcrumbs&lt;% end %&gt;\n    &lt;% end %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nUsing Helper\n\n&lt;%= breadcrumbs({&quot;Home&quot; =&gt; root_path, &quot;Users&quot; =&gt; users_path}, &quot;John Doe&quot;) %&gt;\n\nExamples\n\nWith Icons\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/breadcrumbs/link&quot;, href: &quot;/&quot; do %&gt;\n  &lt;%= icon_for(:home, class: &quot;size-4&quot;) %&gt;\n  Home\n&lt;% end %&gt;\n\nCustom Separators\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/breadcrumbs/separator&quot;, icon: :slash %&gt;\n&lt;%= render &quot;components/breadcrumbs/separator&quot;, icon: :arrow_right %&gt;\n\nWith Ellipsis\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/breadcrumbs/item&quot; do %&gt;\n  &lt;%= render &quot;components/breadcrumbs/ellipsis&quot; %&gt;\n&lt;% end %&gt;\n\nResponsive\n\n&lt;%= responsive_breadcrumbs(\n  {&quot;Home&quot; =&gt; &quot;/&quot;, &quot;Docs&quot; =&gt; &quot;/docs&quot;, &quot;Components&quot; =&gt; &quot;/components&quot;},\n  &quot;Breadcrumbs&quot;\n) %&gt;\n\nAPI Reference\n\nBreadcrumbs\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      responsive\n      Boolean\n      false\n      Enable auto-collapse on narrow screens\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nBreadcrumbs List\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nBreadcrumbs Item\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nBreadcrumbs Link\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      href\n      String\n      required\n      Link destination\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nBreadcrumbs Page\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nBreadcrumbs Separator\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      icon\n      Symbol\n      :chevron_right\n      Icon name, or :custom to use block\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nBreadcrumbs Ellipsis\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes"
        },
        {
          "id": "documentation-components-calendar",
          "title": "Calendar — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/calendar/",
          "content": "Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\nUsage\n\n&lt;%= render &quot;components/calendar&quot; %&gt;\n\nWith Selected Date\n\n&lt;%= render &quot;components/calendar&quot;, selected: Date.today %&gt;\n\nExamples\n\nSingle Selection\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/calendar&quot;,\n      mode: :single,\n      selected: Date.today %&gt;\n\nRange Selection\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/calendar&quot;,\n      mode: :range,\n      selected: Date.today,\n      selected_end: Date.today + 5 %&gt;\n\nWith Date Constraints\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/calendar&quot;,\n      min_date: Date.today,\n      max_date: Date.today + 14 %&gt;\n\nWeek Starting Monday\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/calendar&quot;,\n      week_starts_on: :monday %&gt;\n\nForm Integration\n\n&lt;%= form_with model: @event do |f| %&gt;\n  &lt;%= render &quot;components/calendar&quot;,\n        selected: @event.date,\n        input_name: &quot;event[date]&quot; %&gt;\n&lt;% end %&gt;\n\nRange Form Integration\n\n&lt;%= render &quot;components/calendar&quot;,\n      mode: :range,\n      input_name: &quot;booking[check_in]&quot;,\n      input_name_end: &quot;booking[check_out]&quot; %&gt;\n\nAPI Reference\n\nCalendar\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      selected\n      Date, String\n      nil\n      Selected start date\n    \n    \n      selected_end\n      Date, String\n      nil\n      Selected end date (range mode)\n    \n    \n      month\n      Integer\n      nil\n      Display month (1-12)\n    \n    \n      year\n      Integer\n      nil\n      Display year\n    \n    \n      mode\n      Symbol\n      :single\n      :single or :range\n    \n    \n      min_date\n      Date, String\n      nil\n      Minimum selectable date\n    \n    \n      max_date\n      Date, String\n      nil\n      Maximum selectable date\n    \n    \n      disabled_dates\n      Array\n      []\n      Dates to disable\n    \n    \n      show_outside_days\n      Boolean\n      true\n      Show days from adjacent months\n    \n    \n      week_starts_on\n      Symbol\n      :sunday\n      :sunday or :monday\n    \n    \n      cell_size\n      String\n      nil\n      Custom cell size CSS value\n    \n    \n      input_name\n      String\n      nil\n      Hidden input name for forms\n    \n    \n      input_name_end\n      String\n      nil\n      End date hidden input name\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nCalendar Header\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      month\n      Integer\n      required\n      Display month\n    \n    \n      year\n      Integer\n      required\n      Display year\n    \n    \n      month_name\n      String\n      required\n      Formatted month name\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes"
        },
        {
          "id": "documentation-components-card",
          "title": "Card — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/card/",
          "content": "Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\nUsage\n\n&lt;%= render &quot;components/card&quot; do %&gt;\n  &lt;%= render &quot;components/card/header&quot; do %&gt;\n    &lt;%= render &quot;components/card/title&quot;, text: &quot;Card Title&quot; %&gt;\n    &lt;%= render &quot;components/card/description&quot;, text: &quot;Card description.&quot; %&gt;\n  &lt;% end %&gt;\n  &lt;%= render &quot;components/card/content&quot; do %&gt;\n    &lt;p&gt;Card content goes here.&lt;/p&gt;\n  &lt;% end %&gt;\n  &lt;%= render &quot;components/card/footer&quot; do %&gt;\n    &lt;button data-component=&quot;button&quot; data-variant=&quot;primary&quot;&gt;Save&lt;/button&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nExamples\n\nSimple Card\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/card&quot; do %&gt;\n  &lt;%= render &quot;components/card/content&quot;, spacing: :full do %&gt;\n    &lt;p&gt;A simple card with just content.&lt;/p&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nWith Header Action\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/card&quot; do %&gt;\n  &lt;%= render &quot;components/card/header&quot;, layout: :row do %&gt;\n    &lt;div&gt;\n      &lt;%= render &quot;components/card/title&quot;, text: &quot;Team Members&quot; %&gt;\n      &lt;%= render &quot;components/card/description&quot;, text: &quot;Manage your team.&quot; %&gt;\n    &lt;/div&gt;\n    &lt;%= render &quot;components/card/action&quot; do %&gt;\n      &lt;button data-component=&quot;button&quot; data-variant=&quot;primary&quot; data-size=&quot;sm&quot;&gt;Add&lt;/button&gt;\n    &lt;% end %&gt;\n  &lt;% end %&gt;\n  &lt;%= render &quot;components/card/content&quot; do %&gt;\n    &lt;p class=&quot;text-sm text-muted-foreground&quot;&gt;No members yet.&lt;/p&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nWith Footer\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/card&quot; do %&gt;\n  &lt;%= render &quot;components/card/header&quot; do %&gt;\n    &lt;%= render &quot;components/card/title&quot;, text: &quot;Settings&quot; %&gt;\n  &lt;% end %&gt;\n  &lt;%= render &quot;components/card/content&quot; do %&gt;\n    &lt;p&gt;Configure your preferences.&lt;/p&gt;\n  &lt;% end %&gt;\n  &lt;%= render &quot;components/card/footer&quot;, align: :end do %&gt;\n    &lt;button data-component=&quot;button&quot; data-variant=&quot;outline&quot;&gt;Cancel&lt;/button&gt;\n    &lt;button data-component=&quot;button&quot; data-variant=&quot;primary&quot;&gt;Save&lt;/button&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nAPI Reference\n\nCard\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nCard Header\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      layout\n      Symbol\n      :column\n      :column or :row\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nCard Title\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      text\n      String\n      nil\n      Title text\n    \n    \n      content\n      String\n      nil\n      HTML content via capture\n    \n    \n      size\n      Symbol\n      :default\n      :default or :sm\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nCard Description\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      text\n      String\n      nil\n      Description text\n    \n    \n      content\n      String\n      nil\n      HTML content via capture\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nCard Action\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nCard Content\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      spacing\n      Symbol\n      :default\n      :default or :full (when no header)\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nCard Footer\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      align\n      Symbol\n      :start\n      :start, :center, :end, :between\n    \n    \n      spacing\n      Symbol\n      :default\n      :default or :full (when no content)\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes"
        },
        {
          "id": "documentation-components-combobox",
          "title": "Combobox — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/combobox/",
          "content": "Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\nUsage\n\n&lt;%= render &quot;components/combobox&quot;, placeholder: &quot;Select...&quot; do |combobox_id| %&gt;\n  &lt;%= render &quot;components/combobox/trigger&quot;, for_id: combobox_id, placeholder: &quot;Select...&quot; %&gt;\n\n  &lt;%= render &quot;components/combobox/content&quot;, id: combobox_id do %&gt;\n    &lt;%= render &quot;components/combobox/input&quot;, placeholder: &quot;Search...&quot; %&gt;\n\n    &lt;%= render &quot;components/combobox/list&quot; do %&gt;\n      &lt;%= render &quot;components/combobox/option&quot;, value: &quot;one&quot; do %&gt;Option One&lt;% end %&gt;\n      &lt;%= render &quot;components/combobox/option&quot;, value: &quot;two&quot; do %&gt;Option Two&lt;% end %&gt;\n    &lt;% end %&gt;\n\n    &lt;%= render &quot;components/combobox/empty&quot; %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nExamples\n\nWith Selection\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/combobox/option&quot;, value: &quot;active&quot;, selected: true do %&gt;Active&lt;% end %&gt;\n&lt;%= render &quot;components/combobox/option&quot;, value: &quot;archived&quot;, disabled: true do %&gt;Archived&lt;% end %&gt;\n\nWith Groups\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/combobox/list&quot; do %&gt;\n  &lt;%= render &quot;components/combobox/group&quot; do %&gt;\n    &lt;%= render &quot;components/combobox/label&quot;, text: &quot;Backend&quot; %&gt;\n    &lt;%= render &quot;components/combobox/option&quot;, value: &quot;ruby&quot; do %&gt;Ruby&lt;% end %&gt;\n  &lt;% end %&gt;\n\n  &lt;%= render &quot;components/combobox/separator&quot; %&gt;\n\n  &lt;%= render &quot;components/combobox/group&quot; do %&gt;\n    &lt;%= render &quot;components/combobox/label&quot;, text: &quot;Frontend&quot; %&gt;\n    &lt;%= render &quot;components/combobox/option&quot;, value: &quot;js&quot; do %&gt;JavaScript&lt;% end %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nAPI Reference\n\nCombobox\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      id\n      String\n      nil\n      Custom ID, auto-generated if nil\n    \n    \n      name\n      String\n      nil\n      Form input name\n    \n    \n      value\n      String\n      nil\n      Pre-selected value\n    \n    \n      placeholder\n      String\n      \"Select...\"\n      Placeholder text\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nCombobox Trigger\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      for_id\n      String\n      required\n      ID of content popover\n    \n    \n      placeholder\n      String\n      \"Select...\"\n      Placeholder text\n    \n    \n      variant\n      Symbol\n      :outline\n      Button variant\n    \n    \n      size\n      Symbol\n      :default\n      Button size\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nCombobox Content\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      id\n      String\n      required\n      Popover ID\n    \n    \n      align\n      Symbol\n      :start\n      :start, :center, :end\n    \n    \n      width\n      Symbol\n      :default\n      :sm, :default, :md, :lg, :full\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nCombobox Input\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      placeholder\n      String\n      \"Search...\"\n      Search placeholder\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nCombobox Option\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      value\n      String\n      required\n      Option value\n    \n    \n      selected\n      Boolean\n      false\n      Whether selected\n    \n    \n      disabled\n      Boolean\n      false\n      Whether disabled\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nCombobox Empty\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      text\n      String\n      \"No results found.\"\n      Empty state message\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nCombobox Group\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nCombobox Label\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      text\n      String\n      nil\n      Label text\n    \n    \n      content\n      String\n      nil\n      HTML content via capture\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nCombobox List\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes"
        },
        {
          "id": "documentation-components-date-picker",
          "title": "Date Picker — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/date-picker/",
          "content": "Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\nUsage\n\n&lt;%= render &quot;components/date_picker&quot;,\n      mode: :single,\n      placeholder: &quot;Select a date&quot;,\n      input_name: &quot;event_date&quot; %&gt;\n\nExamples\n\nRange Selection\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/date_picker&quot;,\n      mode: :range,\n      placeholder: &quot;Select date range&quot;,\n      input_name: &quot;start_date&quot;,\n      input_name_end: &quot;end_date&quot; %&gt;\n\nWith Pre-selected Date\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/date_picker&quot;,\n      mode: :single,\n      selected: Date.today,\n      input_name: &quot;event_date&quot; %&gt;\n\nWith Date Constraints\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/date_picker&quot;,\n      min_date: Date.today,\n      max_date: Date.today + 30,\n      placeholder: &quot;Select within 30 days&quot; %&gt;\n\nDisabled\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/date_picker&quot;,\n      selected: Date.today,\n      disabled: true %&gt;\n\nAPI Reference\n\nDate Picker\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      selected\n      Date, String\n      nil\n      Pre-selected date\n    \n    \n      selected_end\n      Date, String\n      nil\n      End date for range mode\n    \n    \n      mode\n      Symbol\n      :single\n      :single or :range\n    \n    \n      min_date\n      Date, String\n      nil\n      Minimum selectable date\n    \n    \n      max_date\n      Date, String\n      nil\n      Maximum selectable date\n    \n    \n      disabled_dates\n      Array\n      []\n      Array of dates to disable\n    \n    \n      show_outside_days\n      Boolean\n      true\n      Show days from adjacent months\n    \n    \n      week_starts_on\n      Symbol\n      :sunday\n      :sunday or :monday\n    \n    \n      placeholder\n      String\n      nil\n      Placeholder text\n    \n    \n      input_name\n      String\n      nil\n      Name for hidden form input\n    \n    \n      input_name_end\n      String\n      nil\n      End date input name (range mode)\n    \n    \n      id\n      String\n      nil\n      Custom ID, auto-generated if nil\n    \n    \n      disabled\n      Boolean\n      false\n      Whether disabled\n    \n    \n      required\n      Boolean\n      false\n      Mark input as required\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nTurbo Drive\n\nThe date picker controller automatically closes the popover before Turbo caches the page. No configuration is needed — pressing the browser back button will always show the date picker in its closed state."
        },
        {
          "id": "documentation-components-dropdown-menu",
          "title": "Dropdown Menu — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/dropdown-menu/",
          "content": "Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\nUsage\n\n&lt;%= render &quot;components/dropdown_menu&quot; do %&gt;\n  &lt;%= render &quot;components/dropdown_menu/trigger&quot; do %&gt;Open Menu&lt;% end %&gt;\n\n  &lt;%= render &quot;components/dropdown_menu/content&quot; do %&gt;\n    &lt;%= render &quot;components/dropdown_menu/item&quot;, href: &quot;#&quot; do %&gt;Profile&lt;% end %&gt;\n    &lt;%= render &quot;components/dropdown_menu/item&quot;, href: &quot;#&quot; do %&gt;Settings&lt;% end %&gt;\n    &lt;%= render &quot;components/dropdown_menu/separator&quot; %&gt;\n    &lt;%= render &quot;components/dropdown_menu/item&quot;, href: &quot;#&quot; do %&gt;Logout&lt;% end %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nExamples\n\nWith Icons\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/dropdown_menu/item&quot;, href: &quot;#&quot; do %&gt;\n  &lt;%= icon_for :user, class: &quot;size-4&quot; %&gt;\n  Profile\n&lt;% end %&gt;\n&lt;%= render &quot;components/dropdown_menu/item&quot;, href: &quot;#&quot;, variant: :destructive do %&gt;\n  &lt;%= icon_for :log_out, class: &quot;size-4&quot; %&gt;\n  Logout\n&lt;% end %&gt;\n\nWith Shortcuts\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/dropdown_menu/item&quot;, href: &quot;#&quot; do %&gt;\n  Undo\n  &lt;%= render &quot;components/dropdown_menu/shortcut&quot; do %&gt;⌘Z&lt;% end %&gt;\n&lt;% end %&gt;\n\nIcon Trigger\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/dropdown_menu/trigger&quot;, as_child: true do %&gt;\n  &lt;button type=&quot;button&quot;\n          data-component=&quot;button&quot;\n          data-variant=&quot;ghost&quot;\n          data-size=&quot;icon&quot;\n          data-dropdown-menu-target=&quot;trigger&quot;\n          data-action=&quot;dropdown-menu#toggle&quot;\n          aria-haspopup=&quot;menu&quot;\n          aria-expanded=&quot;false&quot;&gt;\n    &lt;%= icon_for :more_horizontal, class: &quot;size-4&quot; %&gt;\n  &lt;/button&gt;\n&lt;% end %&gt;\n\nAPI Reference\n\nDropdown Menu\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nDropdown Menu Trigger\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      variant\n      Symbol\n      :outline\n      Button variant when as_child is false\n    \n    \n      size\n      Symbol\n      :default\n      Button size when as_child is false\n    \n    \n      as_child\n      Boolean\n      false\n      Use custom trigger markup\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nDropdown Menu Content\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      align\n      Symbol\n      :start\n      :start, :center, :end\n    \n    \n      side\n      Symbol\n      :bottom\n      :top, :bottom, :left, :right\n    \n    \n      width\n      Symbol\n      :default\n      :default, :sm, :md, :lg\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nDropdown Menu Item\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      href\n      String\n      nil\n      URL, renders link if provided\n    \n    \n      method\n      Symbol\n      nil\n      HTTP method (:delete, :post, etc.)\n    \n    \n      variant\n      Symbol\n      :default\n      :default or :destructive\n    \n    \n      disabled\n      Boolean\n      false\n      Whether disabled\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nDropdown Menu Label\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      text\n      String\n      nil\n      Label text, or use block\n    \n    \n      inset\n      Boolean\n      false\n      Align with icon items\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nDropdown Menu Separator\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nDropdown Menu Group\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nDropdown Menu Shortcut\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      text\n      String\n      nil\n      Shortcut text, or use block\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes"
        },
        {
          "id": "documentation-components-empty",
          "title": "Empty — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/empty/",
          "content": "Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\nUsage\n\n&lt;%= render &quot;components/empty&quot; do %&gt;\n  &lt;%= render &quot;components/empty/header&quot; do %&gt;\n    &lt;%= render &quot;components/empty/media&quot;, icon: :inbox %&gt;\n    &lt;%= render &quot;components/empty/title&quot;, text: &quot;No messages&quot; %&gt;\n    &lt;%= render &quot;components/empty/description&quot;, text: &quot;Messages you receive will appear here.&quot; %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nExamples\n\nWith Action\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/empty&quot; do %&gt;\n  &lt;%= render &quot;components/empty/header&quot; do %&gt;\n    &lt;%= render &quot;components/empty/media&quot;, icon: :folder %&gt;\n    &lt;%= render &quot;components/empty/title&quot;, text: &quot;No projects yet&quot; %&gt;\n    &lt;%= render &quot;components/empty/description&quot;, text: &quot;Get started by creating your first project.&quot; %&gt;\n  &lt;% end %&gt;\n  &lt;%= render &quot;components/empty/content&quot; do %&gt;\n    &lt;button data-component=&quot;button&quot; data-variant=&quot;primary&quot;&gt;Create project&lt;/button&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nOutline Variant\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/empty&quot;, variant: :outline do %&gt;\n  &lt;%= render &quot;components/empty/header&quot; do %&gt;\n    &lt;%= render &quot;components/empty/media&quot;, icon: :upload %&gt;\n    &lt;%= render &quot;components/empty/title&quot;, text: &quot;Drop files here&quot; %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nCompact Size\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/empty&quot;, size: :compact do %&gt;\n  &lt;%= render &quot;components/empty/header&quot; do %&gt;\n    &lt;%= render &quot;components/empty/media&quot;, icon: :search %&gt;\n    &lt;%= render &quot;components/empty/title&quot;, text: &quot;No results found&quot; %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nAPI Reference\n\nEmpty\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      variant\n      Symbol\n      :default\n      :default or :outline\n    \n    \n      size\n      Symbol\n      :default\n      :default or :compact\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nEmpty Header\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nEmpty Media\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      icon\n      Symbol\n      nil\n      Icon name, or use block\n    \n    \n      variant\n      Symbol\n      :icon\n      :icon or :avatar\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nEmpty Title\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      text\n      String\n      nil\n      Title text, or use block\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nEmpty Description\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      text\n      String\n      nil\n      Description text, or use block\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nEmpty Content\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes"
        },
        {
          "id": "documentation-components-form",
          "title": "Form — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/form/",
          "content": "Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\nUsage\n\n&lt;%= form_with model: @user, data: { component: &quot;form&quot; } do |f| %&gt;\n  &lt;div data-form-part=&quot;group&quot;&gt;\n    &lt;%= f.label :email, data: { component: &quot;label&quot; } %&gt;\n    &lt;%= f.email_field :email, data: { component: &quot;input&quot; }, placeholder: &quot;you@example.com&quot; %&gt;\n  &lt;/div&gt;\n\n  &lt;%= f.submit &quot;Sign in&quot;, data: { component: &quot;button&quot;, variant: &quot;primary&quot; } %&gt;\n&lt;% end %&gt;\n\nExamples\n\nInput\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= f.text_field :name, data: { component: &quot;input&quot; }, placeholder: &quot;Full name&quot; %&gt;\n&lt;%= f.text_field :name, data: { component: &quot;input&quot;, size: &quot;sm&quot; } %&gt;\n&lt;%= f.text_field :name, data: { component: &quot;input&quot;, size: &quot;lg&quot; } %&gt;\n\nTextarea\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= f.text_area :bio, data: { component: &quot;textarea&quot; }, rows: 4 %&gt;\n\nSelect\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= f.select :country, options, {}, data: { component: &quot;select&quot; } %&gt;\n\nCheckbox\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;label class=&quot;flex items-center gap-2&quot;&gt;\n  &lt;%= f.check_box :terms, data: { component: &quot;checkbox&quot; } %&gt;\n  &lt;span class=&quot;text-sm&quot;&gt;Accept terms&lt;/span&gt;\n&lt;/label&gt;\n\nRadio\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;label class=&quot;flex items-center gap-2&quot;&gt;\n  &lt;%= f.radio_button :plan, &quot;pro&quot;, data: { component: &quot;radio&quot; } %&gt;\n  &lt;span class=&quot;text-sm&quot;&gt;Pro&lt;/span&gt;\n&lt;/label&gt;\n\nSwitch\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;label class=&quot;flex items-center gap-3&quot;&gt;\n  &lt;%= f.check_box :notifications, data: { component: &quot;switch&quot; } %&gt;\n  &lt;span class=&quot;text-sm&quot;&gt;Enable notifications&lt;/span&gt;\n&lt;/label&gt;\n\nButton\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;button data-component=&quot;button&quot; data-variant=&quot;primary&quot;&gt;Primary&lt;/button&gt;\n&lt;button data-component=&quot;button&quot; data-variant=&quot;secondary&quot;&gt;Secondary&lt;/button&gt;\n&lt;button data-component=&quot;button&quot; data-variant=&quot;destructive&quot;&gt;Destructive&lt;/button&gt;\n&lt;button data-component=&quot;button&quot; data-variant=&quot;outline&quot;&gt;Outline&lt;/button&gt;\n&lt;button data-component=&quot;button&quot; data-variant=&quot;ghost&quot;&gt;Ghost&lt;/button&gt;\n&lt;button data-component=&quot;button&quot; data-variant=&quot;link&quot;&gt;Link&lt;/button&gt;\n\nAPI Reference\n\nForm Container\n\n\n  \n    \n      Attribute\n      Description\n    \n  \n  \n    \n      data-component=\"form\"\n      Grid layout with gap\n    \n    \n      data-form-part=\"group\"\n      Field group container\n    \n    \n      data-form-part=\"description\"\n      Help text styling\n    \n    \n      data-form-part=\"error\"\n      Error message styling\n    \n    \n      data-form-part=\"actions\"\n      Submit area container\n    \n  \n\n\n\nInput\n\n\n  \n    \n      Attribute\n      Values\n      Description\n    \n  \n  \n    \n      data-component\n      input\n      Text input styling\n    \n    \n      data-size\n      sm, lg\n      Size variant\n    \n  \n\n\n\nTextarea\n\n\n  \n    \n      Attribute\n      Values\n      Description\n    \n  \n  \n    \n      data-component\n      textarea\n      Textarea styling\n    \n  \n\n\n\nSelect\n\n\n  \n    \n      Attribute\n      Values\n      Description\n    \n  \n  \n    \n      data-component\n      select\n      Native select styling\n    \n  \n\n\n\nCheckbox\n\n\n  \n    \n      Attribute\n      Values\n      Description\n    \n  \n  \n    \n      data-component\n      checkbox\n      Checkbox styling\n    \n  \n\n\n\nRadio\n\n\n  \n    \n      Attribute\n      Values\n      Description\n    \n  \n  \n    \n      data-component\n      radio\n      Radio button styling\n    \n  \n\n\n\nSwitch\n\n\n  \n    \n      Attribute\n      Values\n      Description\n    \n  \n  \n    \n      data-component\n      switch\n      Toggle switch styling\n    \n  \n\n\n\nLabel\n\n\n  \n    \n      Attribute\n      Values\n      Description\n    \n  \n  \n    \n      data-component\n      label\n      Label styling\n    \n    \n      data-required\n      (presence)\n      Shows required indicator\n    \n  \n\n\n\nButton\n\n\n  \n    \n      Attribute\n      Values\n      Description\n    \n  \n  \n    \n      data-component\n      button\n      Button styling\n    \n    \n      data-variant\n      primary, secondary, destructive, outline, ghost, link\n      Visual style\n    \n    \n      data-size\n      sm, lg, icon, icon-sm, icon-lg\n      Size variant"
        },
        {
          "id": "documentation-components-header",
          "title": "Header — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/header/",
          "content": "Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\nUsage\n\n&lt;%= render &quot;components/header&quot; do %&gt;\n  &lt;h1 data-header-part=&quot;title&quot;&gt;Dashboard&lt;/h1&gt;\n&lt;% end %&gt;\n\nExamples\n\nWith Breadcrumbs\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/header&quot; do %&gt;\n  &lt;%= render &quot;components/breadcrumbs&quot; do %&gt;\n    &lt;%= render &quot;components/breadcrumbs/list&quot; do %&gt;\n      &lt;%= render &quot;components/breadcrumbs/item&quot; do %&gt;\n        &lt;%= render &quot;components/breadcrumbs/link&quot;, href: &quot;#&quot; do %&gt;Dashboard&lt;% end %&gt;\n      &lt;% end %&gt;\n      &lt;%= render &quot;components/breadcrumbs/separator&quot; %&gt;\n      &lt;%= render &quot;components/breadcrumbs/item&quot; do %&gt;\n        &lt;%= render &quot;components/breadcrumbs/page&quot; do %&gt;Settings&lt;% end %&gt;\n      &lt;% end %&gt;\n    &lt;% end %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nWith Actions\n\n\n\n  \n    \n      Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\n&lt;%= render &quot;components/header&quot; do %&gt;\n  &lt;h1 data-header-part=&quot;title&quot;&gt;Projects&lt;/h1&gt;\n\n  &lt;div data-header-part=&quot;actions&quot;&gt;\n    &lt;button data-component=&quot;button&quot; data-variant=&quot;outline&quot; data-size=&quot;sm&quot;&gt;Cancel&lt;/button&gt;\n    &lt;button data-component=&quot;button&quot; data-variant=&quot;primary&quot; data-size=&quot;sm&quot;&gt;Save&lt;/button&gt;\n  &lt;/div&gt;\n&lt;% end %&gt;\n\nAPI Reference\n\nHeader\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nData Attributes\n\n\n  \n    \n      Attribute\n      Element\n      Description\n    \n  \n  \n    \n      data-component=\"header\"\n      header\n      Main container\n    \n    \n      data-header-part=\"inner\"\n      div\n      Inner flex container\n    \n    \n      data-header-part=\"title\"\n      h1/span\n      Title text styling\n    \n    \n      data-header-part=\"actions\"\n      div\n      Right-aligned actions container"
        },
        {
          "id": "documentation-components-header",
          "title": "Header — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/header/",
          "content": "Quick Reference\n\nParameters\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      **html_options\n      Hash\n      {}\n      HTML attributes (id:, data:, etc.)\n    \n  \n\n\nData Attributes\n\nComponent Identifier\n\n\n  \n    \n      Attribute\n      Element\n      Description\n    \n  \n  \n    \n      data-component=\"header\"\n      &lt;header&gt;\n      Main component identifier\n    \n  \n\n\n\n\nBasic Usage\n\n&lt;%= render \"components/header\" do %&gt;\n  &lt;%= render \"components/sidebar/trigger\" %&gt;\n  &lt;%= render \"components/separator\", orientation: :vertical %&gt;\n  &lt;%= breadcrumbs({\"Dashboard\" =&gt; dashboard_path}, @page_title) %&gt;\n&lt;% end %&gt;\n\n\n\n\nExamples\n\nWith Breadcrumbs\n\n&lt;%= render \"components/header\" do %&gt;\n  &lt;%= render \"components/sidebar/trigger\" %&gt;\n  &lt;%= render \"components/separator\", orientation: :vertical %&gt;\n  &lt;%= breadcrumbs(\n    {\"Dashboard\" =&gt; dashboard_path, \"Users\" =&gt; users_path},\n    \"John Doe\"\n  ) %&gt;\n&lt;% end %&gt;\n\n\nWith Actions\n\n&lt;%= render \"components/header\" do %&gt;\n  &lt;%= render \"components/sidebar/trigger\" %&gt;\n  &lt;%= render \"components/separator\", orientation: :vertical %&gt;\n  &lt;%= breadcrumbs({\"Projects\" =&gt; projects_path}, @project.name) %&gt;\n  \n  &lt;div class=\"ml-auto flex items-center gap-2\"&gt;\n    &lt;%= link_to \"Edit\", edit_project_path(@project), data: { component: \"button\", variant: \"outline\", size: \"sm\" } %&gt;\n    &lt;%= link_to \"Delete\", project_path(@project), data: { component: \"button\", variant: \"destructive\", size: \"sm\" }, method: :delete %&gt;\n  &lt;/div&gt;\n&lt;% end %&gt;\n\n\nWith Search\n\n&lt;%= render \"components/header\" do %&gt;\n  &lt;%= render \"components/sidebar/trigger\" %&gt;\n  &lt;%= render \"components/separator\", orientation: :vertical %&gt;\n  \n  &lt;div class=\"flex-1 max-w-md\"&gt;\n    &lt;%= form_with url: search_path, method: :get, class: \"relative\" do |f| %&gt;\n      &lt;%= icon_for :search, class: \"absolute left-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground\" %&gt;\n      &lt;%= f.search_field :q, data: { component: \"input\" }, class: \"pl-10 h-8\", placeholder: \"Search...\" %&gt;\n    &lt;% end %&gt;\n  &lt;/div&gt;\n  \n  &lt;div class=\"ml-auto flex items-center gap-2\"&gt;\n    &lt;%= render \"components/dropdown_menu\" do %&gt;\n    &lt;% end %&gt;\n  &lt;/div&gt;\n&lt;% end %&gt;\n\n\nSimple Page Title\n\n&lt;%= render \"components/header\" do %&gt;\n  &lt;%= render \"components/sidebar/trigger\" %&gt;\n  &lt;%= render \"components/separator\", orientation: :vertical %&gt;\n  &lt;h1 class=\"text-sm font-medium\"&gt;Dashboard&lt;/h1&gt;\n&lt;% end %&gt;\n\n\n\n\nReal-World Patterns\n\nStandard App Header\n\n&lt;%= render \"components/header\" do %&gt;\n  &lt;%= render \"components/sidebar/trigger\" %&gt;\n  &lt;%= render \"components/separator\", orientation: :vertical %&gt;\n  \n  &lt;%= responsive_breadcrumbs(@breadcrumb_links, @breadcrumb_current) %&gt;\n  \n  &lt;div class=\"ml-auto flex items-center gap-3\"&gt;\n    &lt;button type=\"button\" data-component=\"button\" data-variant=\"ghost\" data-size=\"icon-sm\" class=\"relative\"&gt;\n      &lt;%= icon_for :bell, class: \"size-4\" %&gt;\n      &lt;span class=\"absolute -top-1 -right-1 size-4 rounded-full bg-destructive text-destructive-foreground text-xs flex items-center justify-center\"&gt;3&lt;/span&gt;\n    &lt;/button&gt;\n    \n    &lt;%= dropdown_menu do |menu| %&gt;\n      &lt;% menu.trigger variant: :ghost, size: :sm do %&gt;\n        &lt;%= image_tag current_user.avatar, class: \"size-6 rounded-full\" %&gt;\n      &lt;% end %&gt;\n      &lt;% menu.content align: :end do %&gt;\n        &lt;% menu.label { current_user.name } %&gt;\n        &lt;% menu.separator %&gt;\n        &lt;% menu.item \"Profile\", href: profile_path, icon: :user %&gt;\n        &lt;% menu.item \"Settings\", href: settings_path, icon: :settings %&gt;\n        &lt;% menu.separator %&gt;\n        &lt;% menu.item \"Logout\", href: logout_path, method: :delete, icon: :log_out %&gt;\n      &lt;% end %&gt;\n    &lt;% end %&gt;\n  &lt;/div&gt;\n&lt;% end %&gt;\n\n\nWith Tabs\n\n&lt;%= render \"components/header\" do %&gt;\n  &lt;%= render \"components/sidebar/trigger\" %&gt;\n  &lt;%= render \"components/separator\", orientation: :vertical %&gt;\n  \n  &lt;nav class=\"flex items-center gap-1\"&gt;\n    &lt;%= link_to \"Overview\", project_path(@project), \n      class: \"px-3 py-1.5 text-sm rounded-md #{'bg-accent text-accent-foreground' if current_page?(project_path(@project))}\" %&gt;\n    &lt;%= link_to \"Tasks\", project_tasks_path(@project),\n      class: \"px-3 py-1.5 text-sm rounded-md #{'bg-accent text-accent-foreground' if current_page?(project_tasks_path(@project))}\" %&gt;\n    &lt;%= link_to \"Settings\", edit_project_path(@project),\n      class: \"px-3 py-1.5 text-sm rounded-md #{'bg-accent text-accent-foreground' if current_page?(edit_project_path(@project))}\" %&gt;\n  &lt;/nav&gt;\n&lt;% end %&gt;\n\n\n\n\nTheme Variables\n\nvar(--background)\nvar(--border)\n\n\n\n\nCustomization\n\nFixed Height\n\nThe header has a fixed height for consistency with sidebar layouts:\n\n[data-component=\"header\"] {\n  @apply h-14;\n}\n\n\nSticky Header\n\n&lt;%= render \"components/header\", css_classes: \"sticky top-0 z-50\" do %&gt;\n&lt;% end %&gt;\n\n\n\n\nAccessibility\n\n\n  Uses semantic &lt;header&gt; element\n  Works with skip links for keyboard navigation\n  Provides consistent landmark for screen readers\n\n\n\n\nFile Structure\n\napp/views/components/\n└── _header.html.erb\n\napp/assets/stylesheets/header.css\ndocs/header.md"
        },
        {
          "id": "documentation-components",
          "title": "Components — Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/",
          "content": "Production-ready UI components for Rails applications. Copy-paste ERB partials styled with Tailwind CSS 4.0 and optional Stimulus controllers.\n\nWhat you get:\n\n  20+ components — From layouts to forms, navigation to feedback\n  Zero dependencies — Just Tailwind CSS and optionally Stimulus\n  shadcn/ui theming — Familiar CSS variable system for easy customization\n  Rails conventions — ERB partials, data attributes, form helpers\n\n\n\n  \n  \n\n\n\n\nDemo Application\n\nView Live Demo →\n\nExplore all components in action without installing anything. The demo showcases light/dark themes, color themes, and responsive layouts.\n\nFor local development, clone the components repository:\n\ngit clone https://github.com/maquina-app/maquina_components.git\ncd maquina_components/test/dummy\nbin/rails server\n\n\nVisit http://localhost:3000 to explore the components locally.\n\n\n\nQuick Start\n\n1. Add the Gem\n\n# Gemfile\ngem \"maquina-components\"\n\n\nbundle install\n\n\n2. Run the Install Generator\n\nbin/rails generate maquina_components:install\n\n\nThis adds the engine CSS import, theme variables (shadcn/ui convention), and a helper file for icon customization.\n\n3. Start Using Components\n\n&lt;%= render \"components/card\" do %&gt;\n  &lt;%= render \"components/card/header\" do %&gt;\n    &lt;%= render \"components/card/title\", text: \"Welcome\" %&gt;\n  &lt;% end %&gt;\n  &lt;%= render \"components/card/content\" do %&gt;\n    &lt;p&gt;Your content here&lt;/p&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\n\nFor form elements, use data attributes:\n\n&lt;%= form_with model: @user do |f| %&gt;\n  &lt;%= f.text_field :email, data: { component: \"input\" } %&gt;\n  &lt;%= f.submit \"Save\", data: { component: \"button\", variant: \"primary\" } %&gt;\n&lt;% end %&gt;\n\n\n\n\nAI-Assisted Development\n\nUse the Maquina UI Standards Claude Code plugin to generate views that follow component conventions automatically.\n\nInstead of correcting AI-generated code (“use the card partial, not a div”), the plugin teaches Claude your component patterns:\n\n&gt; Create the users index view with a table showing name, email, and status\n\n\nClaude generates code using your actual components — proper partials, correct data attributes, and consistent patterns.\n\n\n\nAvailable Components\n\nLayout\n\n\n  \n    \n      Component\n      Description\n    \n  \n  \n    \n      Sidebar\n      Collapsible navigation with mobile support and keyboard shortcuts\n    \n    \n      Header\n      Page header for sidebar layouts with breadcrumbs and actions\n    \n  \n\n\nContent\n\n\n  \n    \n      Component\n      Description\n    \n  \n  \n    \n      Card\n      Content containers with header, body, and footer sections\n    \n    \n      Alert\n      Callouts with 4 variants and icon support\n    \n    \n      Badge\n      Status indicators with 7 variants and 3 sizes\n    \n    \n      Table\n      Responsive data tables with sorting and sticky headers\n    \n    \n      Empty State\n      Placeholder for no-data scenarios with icons and actions\n    \n  \n\n\nNavigation\n\n\n  \n    \n      Component\n      Description\n    \n  \n  \n    \n      Breadcrumbs\n      Navigation with responsive collapsing support\n    \n    \n      Dropdown Menu\n      Actions menu triggered by a button with keyboard navigation\n    \n    \n      Pagination\n      Navigation for paginated content with Pagy integration\n    \n  \n\n\nInteractive\n\n\n  \n    \n      Component\n      Description\n    \n  \n  \n    \n      Calendar\n      Date selection with single and range modes\n    \n    \n      Combobox\n      Searchable dropdown with keyboard navigation and filtering\n    \n    \n      Date Picker\n      Popover calendar triggered by a button for date selection\n    \n    \n      Toggle Group\n      Single or multiple selection button groups\n    \n  \n\n\nFeedback\n\n\n  \n    \n      Component\n      Description\n    \n  \n  \n    \n      Toast\n      Non-intrusive notifications with auto-dismiss and variants\n    \n  \n\n\nForms\n\n\n  \n    \n      Component\n      Description\n    \n  \n  \n    \n      Form Components\n      Inputs, selects, checkboxes styled with data attributes\n    \n  \n\n\n\n\nPrerequisites\n\nThe generator requires tailwindcss-rails:\n\nbundle add tailwindcss-rails\nbin/rails tailwindcss:install\n\n\n\n\nStimulus Setup\n\nInteractive components (Sidebar, Dropdown Menu, Toggle Group, Breadcrumbs, Combobox, Toast) require Stimulus. With importmaps:\n\n# config/importmap.rb\npin \"@hotwired/turbo-rails\", to: \"turbo.min.js\"\npin \"@hotwired/stimulus\", to: \"stimulus.min.js\"\npin \"@hotwired/stimulus-loading\", to: \"stimulus-loading.js\"\npin_all_from \"app/javascript/controllers\", under: \"controllers\"\n\n\n// app/javascript/application.js\nimport \"@hotwired/turbo-rails\"\nimport { Application } from \"@hotwired/stimulus\"\nimport { eagerLoadControllersFrom } from \"@hotwired/stimulus-loading\"\n\nconst application = Application.start()\napplication.debug = false\nwindow.Stimulus = application\n\neagerLoadControllersFrom(\"controllers\", application)\n\n\nStatic components (Badge, Card, Alert, Button, form elements) work without JavaScript.\n\n\n\nTheme Variables\n\nComponents use CSS variables following the shadcn/ui theming convention.\n\nVariables must be defined twice for Tailwind CSS v4:\n\n:root {\n  --primary: oklch(0.205 0 0);           /* Actual value */\n}\n\n@theme {\n  --color-primary: var(--primary);        /* Enables: bg-primary, text-primary */\n}\n\n\nCustomizing Colors\n\nEdit the values in :root to match your brand:\n\n:root {\n  /* Blue primary */\n  --primary: oklch(0.488 0.243 264.376);\n  --primary-foreground: oklch(0.985 0 0);\n}\n\n\n\n\nIcon System\n\nComponents use icon_for(:name) to render icons. Override icon lookup in app/helpers/maquina_components_helper.rb:\n\nmodule MaquinaComponentsHelper\n  def main_icon_svg_for(name)\n    case name\n    when :home\n      &lt;&lt;~SVG\n        &lt;svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"&gt;\n          &lt;path d=\"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\"/&gt;\n          &lt;path d=\"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"/&gt;\n        &lt;/svg&gt;\n      SVG\n    end\n  end\nend\n\n\nIcons are sourced from Lucide. Copy SVG code directly from their website.\n\n\n\nGenerator Options\n\n# Skip theme variables (if you already have them)\nbin/rails generate maquina_components:install --skip-theme\n\n# Skip helper creation\nbin/rails generate maquina_components:install --skip-helper\n\n# Skip both\nbin/rails generate maquina_components:install --skip-theme --skip-helper\n\n\n\n\nFile Structure After Setup\n\napp/\n├── assets/tailwind/\n│   └── application.css               # Theme + engine import\n├── helpers/\n│   └── maquina_components_helper.rb  # Icon override\n├── javascript/\n│   └── application.js                # Stimulus init\n└── views/layouts/\n    └── application.html.erb          # Layout with components\n\n\n\n\nTroubleshooting\n\nGenerator Issues\n\n“tailwindcss-rails doesn’t appear to be installed”\n\nInstall it first:\n\nbundle add tailwindcss-rails\nbin/rails tailwindcss:install\n\n\nRuntime Issues\n\nSidebar trigger not working\n\n\n  Ensure Stimulus is initialized\n  Verify provider wraps both sidebar and content\n  Check browser console for errors\n\n\nStyles not applying\n\n\n  Verify engine CSS is imported after @import \"tailwindcss\";\n  Check that @theme block exists with color bindings\n  Restart dev server after CSS changes\n\n\nDark mode not working\n\n\n  Add .dark class to &lt;html&gt; element\n  Ensure .dark { } block has variable overrides\n\n\n\n\nNext Steps\n\n\n  \n    \n      Sidebar\n    \n    \n      Build your application layout with collapsible navigation.\n    \n  \n\n  \n    \n      Card\n    \n    \n      Display content in containers with header, body, and footer.\n    \n  \n\n  \n    \n      Form Components\n    \n    \n      Style inputs, selects, and buttons with data attributes.\n    \n  \n\n  \n    \n      AI-Assisted Development\n    \n    \n      Use Claude Code to generate views with component conventions."
        },
        {
          "id": "documentation-components-pagination",
          "title": "Pagination — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/pagination/",
          "content": "Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\nUsage\n\n&lt;%= render &quot;components/pagination&quot; do %&gt;\n  &lt;%= render &quot;components/pagination/content&quot; do %&gt;\n    &lt;%= render &quot;components/pagination/item&quot; do %&gt;\n      &lt;%= render &quot;components/pagination/previous&quot;, href: &quot;/page/1&quot; %&gt;\n    &lt;% end %&gt;\n    &lt;%= render &quot;components/pagination/item&quot; do %&gt;\n      &lt;%= render &quot;components/pagination/link&quot;, href: &quot;/page/1&quot; do %&gt;1&lt;% end %&gt;\n    &lt;% end %&gt;\n    &lt;%= render &quot;components/pagination/item&quot; do %&gt;\n      &lt;%= render &quot;components/pagination/link&quot;, href: &quot;/page/2&quot;, active: true do %&gt;2&lt;% end %&gt;\n    &lt;% end %&gt;\n    &lt;%= render &quot;components/pagination/item&quot; do %&gt;\n      &lt;%= render &quot;components/pagination/link&quot;, href: &quot;/page/3&quot; do %&gt;3&lt;% end %&gt;\n    &lt;% end %&gt;\n    &lt;%= render &quot;components/pagination/item&quot; do %&gt;\n      &lt;%= render &quot;components/pagination/ellipsis&quot; %&gt;\n    &lt;% end %&gt;\n    &lt;%= render &quot;components/pagination/item&quot; do %&gt;\n      &lt;%= render &quot;components/pagination/next&quot;, href: &quot;/page/3&quot; %&gt;\n    &lt;% end %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nAPI Reference\n\nPagination\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nPagination Content\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nPagination Item\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nPagination Link\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      href\n      String\n      required\n      URL for the page\n    \n    \n      active\n      Boolean\n      false\n      Whether current page\n    \n    \n      disabled\n      Boolean\n      false\n      Whether disabled\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nPagination Previous\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      href\n      String\n      nil\n      URL for previous page\n    \n    \n      label\n      String\n      \"Previous\"\n      Button label\n    \n    \n      disabled\n      Boolean\n      false\n      Whether disabled\n    \n    \n      show_label\n      Boolean\n      true\n      Show text label\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nPagination Next\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      href\n      String\n      nil\n      URL for next page\n    \n    \n      label\n      String\n      \"Next\"\n      Button label\n    \n    \n      disabled\n      Boolean\n      false\n      Whether disabled\n    \n    \n      show_label\n      Boolean\n      true\n      Show text label\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nPagination Ellipsis\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes"
        },
        {
          "id": "documentation-components-sidebar",
          "title": "Sidebar — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/sidebar/",
          "content": "Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\nUsage\n\n&lt;%= render &quot;components/sidebar/provider&quot;, default_open: sidebar_open? do %&gt;\n  &lt;%= render &quot;components/sidebar&quot;, state: sidebar_state do %&gt;\n    &lt;%= render &quot;components/sidebar/header&quot; do %&gt;\n      &lt;%# Logo/branding %&gt;\n    &lt;% end %&gt;\n\n    &lt;%= render &quot;components/sidebar/content&quot; do %&gt;\n      &lt;%= render &quot;components/sidebar/group&quot;, title: &quot;Navigation&quot; do %&gt;\n        &lt;%= render &quot;components/sidebar/menu&quot; do %&gt;\n          &lt;%= render &quot;components/sidebar/menu_item&quot; do %&gt;\n            &lt;%= render &quot;components/sidebar/menu_button&quot;,\n              title: &quot;Dashboard&quot;,\n              icon_name: :home,\n              url: root_path,\n              active: current_page?(root_path) %&gt;\n          &lt;% end %&gt;\n        &lt;% end %&gt;\n      &lt;% end %&gt;\n    &lt;% end %&gt;\n\n    &lt;%= render &quot;components/sidebar/footer&quot; do %&gt;\n      &lt;%# User menu %&gt;\n    &lt;% end %&gt;\n  &lt;% end %&gt;\n\n  &lt;%= render &quot;components/sidebar/inset&quot; do %&gt;\n    &lt;%= render &quot;components/header&quot; do %&gt;\n      &lt;%= render &quot;components/sidebar/trigger&quot; %&gt;\n    &lt;% end %&gt;\n    &lt;%= yield %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nExamples\n\nMenu Button\n\n&lt;%= render &quot;components/sidebar/menu_button&quot;,\n  title: &quot;Dashboard&quot;,\n  icon_name: :home,\n  url: root_path,\n  active: true %&gt;\n\nMenu Link (Avatar Style)\n\n&lt;%= render &quot;components/sidebar/menu_link&quot;,\n  url: profile_path,\n  text_icon: &quot;A&quot;,\n  title: &quot;ACME Corp&quot;,\n  subtitle: &quot;Workspace&quot; %&gt;\n\nAPI Reference\n\nProvider\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      id\n      String\n      \"sidebar-provider\"\n      Element ID for stable morph matching\n    \n    \n      default_open\n      Boolean\n      true\n      Initial open state\n    \n    \n      variant\n      Symbol\n      :inset\n      Visual variant\n    \n    \n      cookie_name\n      String\n      \"sidebar_state\"\n      Cookie for persistence\n    \n    \n      keyboard_shortcut\n      String\n      \"b\"\n      Toggle shortcut (Cmd/Ctrl+key)\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nSidebar\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      id\n      String\n      auto\n      Element ID\n    \n    \n      state\n      Symbol\n      :collapsed\n      :expanded or :collapsed\n    \n    \n      collapsible\n      Symbol\n      :offcanvas\n      :offcanvas, :icon, or :none\n    \n    \n      variant\n      Symbol\n      :inset\n      :sidebar, :floating, or :inset\n    \n    \n      side\n      Symbol\n      :left\n      :left or :right\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nMenu Button\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      title\n      String\n      required\n      Button text\n    \n    \n      url\n      String\n      required\n      Link URL\n    \n    \n      icon_name\n      Symbol\n      nil\n      Icon name\n    \n    \n      size\n      Symbol\n      :default\n      :default, :sm, or :lg\n    \n    \n      active\n      Boolean\n      false\n      Whether active\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nMenu Link\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      url\n      String\n      required\n      Link URL\n    \n    \n      title\n      String\n      required\n      Primary text\n    \n    \n      subtitle\n      String\n      nil\n      Secondary text\n    \n    \n      text_icon\n      String\n      nil\n      Text for avatar\n    \n    \n      icon\n      String\n      nil\n      Image URL for avatar\n    \n    \n      active\n      Boolean\n      false\n      Whether active\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nTrigger\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      icon_name\n      Symbol\n      :left_panel\n      Icon name for toggle button\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nOther Parts\n\n\n  \n    \n      Partial\n      Description\n    \n  \n  \n    \n      sidebar/header\n      Top section for logo/branding\n    \n    \n      sidebar/content\n      Scrollable middle section\n    \n    \n      sidebar/footer\n      Bottom section for user menu\n    \n    \n      sidebar/group\n      Groups menu items with optional title\n    \n    \n      sidebar/menu\n      List container for menu items\n    \n    \n      sidebar/menu_item\n      Individual menu item wrapper\n    \n    \n      sidebar/trigger\n      Toggle button for sidebar\n    \n    \n      sidebar/inset\n      Main content area wrapper\n    \n  \n\n\n\nHelper Methods\n\n\n  \n    \n      Method\n      Description\n    \n  \n  \n    \n      sidebar_state(cookie_name)\n      Returns :expanded or :collapsed\n    \n    \n      sidebar_open?(cookie_name)\n      Returns true if expanded\n    \n    \n      sidebar_closed?(cookie_name)\n      Returns true if collapsed\n    \n  \n\n\n\nTurbo Drive\n\nThe sidebar controller integrates with Turbo Drive to maintain correct state across navigations:\n\n\n  Cache teardown: On mobile, the sidebar closes and the backdrop is hidden before Turbo caches the page. Pressing back never shows a stale open sidebar or scroll-locked body.\n  Morph awareness: When using turbo_refresh_method_tag :morph, the sidebar re-reads its cookie to preserve the desktop toggle state and forces closed on mobile after a morph refresh.\n  Desktop persistence: The sidebar state is stored in a cookie, so it survives full page loads and Turbo navigations without extra configuration.\n\n\nStable IDs\n\nThe sidebar generates deterministic IDs based on its side: parameter (sidebar-left, sidebar-right) instead of random IDs. This allows idiomorph to match old and new elements across morph renders, preventing the sidebar from being destroyed and recreated.\n\nThe provider div also receives a stable ID (sidebar-provider) for the same reason.\n\nIf you render multiple sidebars on the same side, pass explicit id: parameters to avoid collisions:\n\n&lt;%= render &quot;components/sidebar/provider&quot;, id: &quot;sidebar-main&quot; do %&gt;\n  &lt;%= render &quot;components/sidebar&quot;, id: &quot;sidebar-nav&quot;, side: :left do %&gt;\n    ...\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nMorph Compatibility\n\nDuring a Turbo morph, the server-rendered data-sidebar-open-value may carry a stale value (e.g., from a broadcast where the server has no access to the browser cookie). The controller treats the browser cookie as the source of truth:\n\n\n  Before morph updates attributes, the controller sets an internal guard flag.\n  When idiomorph overwrites data-sidebar-open-value, the Stimulus value callback is skipped — preventing the stale server value from overwriting the cookie.\n  After morph completes, the controller reads the cookie, reasserts the correct state, and removes the sidebar-loading class that morph re-adds from server HTML.\n\n\nTurbo Frames\n\nThe sidebar works inside Turbo Frames because stable IDs enable clean Stimulus disconnect/reconnect cycles. On reconnection, initialize() re-reads the cookie, so the sidebar always reflects the latest client-side state."
        },
        {
          "id": "documentation-components-table",
          "title": "Table — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/table/",
          "content": "Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\nUsage\n\n&lt;%= render &quot;components/table&quot; do %&gt;\n  &lt;%= render &quot;components/table/header&quot; do %&gt;\n    &lt;%= render &quot;components/table/row&quot; do %&gt;\n      &lt;%= render &quot;components/table/head&quot; do %&gt;Name&lt;% end %&gt;\n      &lt;%= render &quot;components/table/head&quot; do %&gt;Email&lt;% end %&gt;\n      &lt;%= render &quot;components/table/head&quot;, css_classes: &quot;text-right&quot; do %&gt;Amount&lt;% end %&gt;\n    &lt;% end %&gt;\n  &lt;% end %&gt;\n\n  &lt;%= render &quot;components/table/body&quot; do %&gt;\n    &lt;% @users.each do |user| %&gt;\n      &lt;%= render &quot;components/table/row&quot; do %&gt;\n        &lt;%= render &quot;components/table/cell&quot; do %&gt;&lt;%= user.name %&gt;&lt;% end %&gt;\n        &lt;%= render &quot;components/table/cell&quot; do %&gt;&lt;%= user.email %&gt;&lt;% end %&gt;\n        &lt;%= render &quot;components/table/cell&quot;, css_classes: &quot;text-right&quot; do %&gt;&lt;%= user.amount %&gt;&lt;% end %&gt;\n      &lt;% end %&gt;\n    &lt;% end %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nExamples\n\nWith Footer\n\n&lt;%= render &quot;components/table&quot; do %&gt;\n  &lt;%= render &quot;components/table/header&quot; do %&gt;\n    &lt;%# ... %&gt;\n  &lt;% end %&gt;\n  &lt;%= render &quot;components/table/body&quot; do %&gt;\n    &lt;%# ... %&gt;\n  &lt;% end %&gt;\n  &lt;%= render &quot;components/table/footer&quot; do %&gt;\n    &lt;%= render &quot;components/table/row&quot; do %&gt;\n      &lt;%= render &quot;components/table/cell&quot;, colspan: 2 do %&gt;Total&lt;% end %&gt;\n      &lt;%= render &quot;components/table/cell&quot;, css_classes: &quot;text-right&quot; do %&gt;$750.00&lt;% end %&gt;\n    &lt;% end %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nSelected Row\n\n&lt;%= render &quot;components/table/row&quot;, selected: true do %&gt;\n  &lt;%= render &quot;components/table/cell&quot; do %&gt;Selected item&lt;% end %&gt;\n&lt;% end %&gt;\n\nBordered Variant\n\n&lt;%= render &quot;components/table&quot;, variant: :bordered do %&gt;\n  &lt;%# ... %&gt;\n&lt;% end %&gt;\n\nStriped Variant\n\n&lt;%= render &quot;components/table&quot;, table_variant: :striped do %&gt;\n  &lt;%# ... %&gt;\n&lt;% end %&gt;\n\nAPI Reference\n\nTable\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      container\n      Boolean\n      true\n      Wrap in scrollable container\n    \n    \n      variant\n      Symbol\n      nil\n      Container variant (:bordered)\n    \n    \n      table_variant\n      Symbol\n      nil\n      Table variant (:striped)\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nTable Header\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      sticky\n      Boolean\n      false\n      Sticky header on scroll\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nTable Row\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      selected\n      Boolean\n      false\n      Highlight as selected\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nTable Head\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      scope\n      String\n      \"col\"\n      Scope attribute for accessibility\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nTable Cell\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nTable Body / Footer / Caption\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes"
        },
        {
          "id": "documentation-components-toast",
          "title": "Toast — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/toast/",
          "content": "Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\nUsage\n\n&lt;%= render &quot;components/toast&quot;,\n  title: &quot;Scheduled: Catch up&quot;,\n  description: &quot;Friday, February 10, 2025 at 5:57 PM&quot; %&gt;\n\nExamples\n\nSuccess\n\n&lt;%= render &quot;components/toast&quot;,\n  variant: :success,\n  title: &quot;Success!&quot;,\n  description: &quot;Your changes have been saved.&quot; %&gt;\n\nError\n\n&lt;%= render &quot;components/toast&quot;,\n  variant: :error,\n  title: &quot;Error&quot;,\n  description: &quot;There was a problem with your request.&quot; %&gt;\n\nWarning\n\n&lt;%= render &quot;components/toast&quot;,\n  variant: :warning,\n  title: &quot;Warning&quot;,\n  description: &quot;Your session is about to expire.&quot; %&gt;\n\nWith Action\n\n&lt;%= render &quot;components/toast&quot;,\n  title: &quot;Event Created&quot;,\n  description: &quot;Your event has been scheduled.&quot;,\n  content: capture { %&gt;\n  &lt;%= render &quot;components/toast/action&quot;, label: &quot;Undo&quot;, href: &quot;#&quot; %&gt;\n&lt;% } %&gt;\n\nAPI Reference\n\nToast\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      variant\n      Symbol\n      :default\n      :default, :success, :info, :warning, :error\n    \n    \n      title\n      String\n      nil\n      Toast title text\n    \n    \n      description\n      String\n      nil\n      Toast description text\n    \n    \n      icon\n      Symbol\n      nil\n      Icon name (auto-selected by variant)\n    \n    \n      duration\n      Integer\n      5000\n      Auto-dismiss time in ms\n    \n    \n      dismissible\n      Boolean\n      true\n      Show close button\n    \n    \n      content\n      String\n      nil\n      HTML content via capture (e.g., action buttons)\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nToast Title\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      text\n      String\n      nil\n      Title text\n    \n    \n      content\n      String\n      nil\n      HTML content via capture\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nToast Description\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      text\n      String\n      nil\n      Description text\n    \n    \n      content\n      String\n      nil\n      HTML content via capture\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nToaster\n\nThe toaster is the container that holds and positions toast notifications. Place it once in your layout.\n\n&lt;%= render &quot;components/toaster&quot;, position: :bottom_right,\n      content: toast_flash_messages %&gt;\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      position\n      Symbol\n      :bottom_right\n      :top_left, :top_right, :bottom_left, :bottom_right\n    \n    \n      content\n      String\n      nil\n      Pre-rendered toasts (e.g., flash messages)\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nToast Action\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      label\n      String\n      required\n      Button/link text\n    \n    \n      href\n      String\n      nil\n      Link URL (renders button if nil)\n    \n    \n      method\n      Symbol\n      nil\n      HTTP method for Turbo\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nHelper Methods\n\n\n  \n    \n      Method\n      Description\n    \n  \n  \n    \n      toast_flash_messages(exclude: [])\n      Renders all flash messages as toasts\n    \n    \n      toast(variant, title, options)\n      Renders a single toast\n    \n    \n      toast_success(title, options)\n      Shorthand for success variant\n    \n    \n      toast_error(title, options)\n      Shorthand for error variant\n    \n    \n      toast_warning(title, options)\n      Shorthand for warning variant\n    \n    \n      toast_info(title, **options)\n      Shorthand for info variant"
        },
        {
          "id": "documentation-components-toggle-group",
          "title": "Toggle Group — Maquina Components",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/components/toggle-group/",
          "content": "Preview\n    \n\n    \n      \n        \n          \n          \n          \n          \n          \n          \n          \n          \n          \n        \n        \n          \n        \n      \n\n    \n  \n\n  \n    \n\n    \n      \n    \n  \n\n\n\n\nUsage\n\n&lt;%= render &quot;components/toggle_group&quot;, type: :single, value: &quot;center&quot; do %&gt;\n  &lt;%= render &quot;components/toggle_group/item&quot;, value: &quot;left&quot;, aria_label: &quot;Align left&quot; do %&gt;\n    &lt;%= icon_for :align_left, class: &quot;size-4&quot; %&gt;\n  &lt;% end %&gt;\n  &lt;%= render &quot;components/toggle_group/item&quot;, value: &quot;center&quot;, aria_label: &quot;Align center&quot;, pressed: true do %&gt;\n    &lt;%= icon_for :align_center, class: &quot;size-4&quot; %&gt;\n  &lt;% end %&gt;\n  &lt;%= render &quot;components/toggle_group/item&quot;, value: &quot;right&quot;, aria_label: &quot;Align right&quot; do %&gt;\n    &lt;%= icon_for :align_right, class: &quot;size-4&quot; %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nExamples\n\nMultiple Selection\n\n&lt;%= render &quot;components/toggle_group&quot;, type: :multiple, value: [&quot;bold&quot;, &quot;italic&quot;] do %&gt;\n  &lt;%= render &quot;components/toggle_group/item&quot;, value: &quot;bold&quot;, aria_label: &quot;Bold&quot;, pressed: true do %&gt;\n    &lt;%= icon_for :bold, class: &quot;size-4&quot; %&gt;\n  &lt;% end %&gt;\n  &lt;%= render &quot;components/toggle_group/item&quot;, value: &quot;italic&quot;, aria_label: &quot;Italic&quot;, pressed: true do %&gt;\n    &lt;%= icon_for :italic, class: &quot;size-4&quot; %&gt;\n  &lt;% end %&gt;\n  &lt;%= render &quot;components/toggle_group/item&quot;, value: &quot;underline&quot;, aria_label: &quot;Underline&quot; do %&gt;\n    &lt;%= icon_for :underline, class: &quot;size-4&quot; %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nOutline Variant\n\n&lt;%= render &quot;components/toggle_group&quot;, type: :single, variant: :outline do %&gt;\n  &lt;%= render &quot;components/toggle_group/item&quot;, value: &quot;list&quot;, aria_label: &quot;List view&quot; do %&gt;\n    &lt;%= icon_for :list, class: &quot;size-4&quot; %&gt;\n  &lt;% end %&gt;\n  &lt;%= render &quot;components/toggle_group/item&quot;, value: &quot;grid&quot;, aria_label: &quot;Grid view&quot; do %&gt;\n    &lt;%= icon_for :grid, class: &quot;size-4&quot; %&gt;\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nWith Text Labels\n\n&lt;%= render &quot;components/toggle_group&quot;, type: :single, size: :lg do %&gt;\n  &lt;%= render &quot;components/toggle_group/item&quot;, value: &quot;day&quot;, pressed: true do %&gt;\n    Day\n  &lt;% end %&gt;\n  &lt;%= render &quot;components/toggle_group/item&quot;, value: &quot;week&quot; do %&gt;\n    Week\n  &lt;% end %&gt;\n  &lt;%= render &quot;components/toggle_group/item&quot;, value: &quot;month&quot; do %&gt;\n    Month\n  &lt;% end %&gt;\n&lt;% end %&gt;\n\nAPI Reference\n\nToggle Group\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      type\n      Symbol\n      :single\n      :single or :multiple selection\n    \n    \n      variant\n      Symbol\n      :default\n      :default or :outline\n    \n    \n      size\n      Symbol\n      :default\n      :sm, :default, :lg\n    \n    \n      value\n      String/Array\n      nil\n      Initial selected value(s)\n    \n    \n      disabled\n      Boolean\n      false\n      Disable all items\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes\n    \n  \n\n\n\nToggle Group Item\n\n\n  \n    \n      Parameter\n      Type\n      Default\n      Description\n    \n  \n  \n    \n      value\n      String\n      required\n      Value when selected\n    \n    \n      pressed\n      Boolean\n      false\n      Initial pressed state\n    \n    \n      disabled\n      Boolean\n      false\n      Disable this item\n    \n    \n      aria_label\n      String\n      nil\n      Accessible label for icon-only items\n    \n    \n      css_classes\n      String\n      \"\"\n      Additional CSS classes\n    \n    \n      html_options\n      Hash\n      {}\n      Additional HTML attributes"
        },
        {
          "id": "documentation-generators",
          "title": "Maquina Generators — Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/generators/",
          "content": "Rails generators that produce standalone application code. No runtime dependency — generate once, own the code forever. Delete the gem when you’re done.\n\n\n\nWhat Is This?\n\nAfter rails new, every developer follows the same steps: configure authentication, set up request throttling, wire up a job queue, add error tracking. These steps aren’t gaps in the framework — they’re workflow choices that are repetitive and time-consuming.\n\nMaquina Generators make the post-rails new setup as deterministic as the framework itself. The gem is development-only. Everything it produces lives in your app and is yours to modify.\n\nrails new myapp --css tailwind\nbundle add maquina-generators --group development\nrails generate maquina:app --auth clave\nbin/rails db:migrate\nbin/dev\n\n\nFive commands. Auth, multi-tenancy, roles, job queue, error tracking, request protection — all generated, all yours.\n\n\n\n\n\nQuick Start\n\n1. Create a Rails App\n\nrails new myapp --css tailwind\ncd myapp\n\n\n2. Add the Gem\n\nbundle add maquina-generators --group development\n\n\n3. Run the App Generator\n\nrails generate maquina:app --auth registration\n\n\n4. Finish Setup\n\nbin/rails db:migrate\nbin/rails credentials:edit\n# Add: backstage: { username: admin, password: your_password }\nbin/dev\n\n\n\n\nAvailable Generators\n\n\n  \n    \n      Generator\n      Command\n      Purpose\n    \n  \n  \n    \n      App\n      rails g maquina:app\n      Full application setup (orchestrator)\n    \n    \n      Clave\n      rails g maquina:clave\n      Passwordless email-code authentication\n    \n    \n      Registration\n      rails g maquina:registration\n      Password-based auth with accounts and roles\n    \n    \n      Rack Attack\n      rails g maquina:rack_attack\n      Request protection and IP throttling\n    \n    \n      Solid Queue\n      rails g maquina:solid_queue\n      Background job processing\n    \n    \n      Solid Errors\n      rails g maquina:solid_errors\n      Error tracking dashboard\n    \n    \n      Mission Control\n      rails g maquina:mission_control_jobs\n      Job queue monitoring dashboard\n    \n  \n\n\n\n\nThe App Generator\n\nThe orchestrator. Runs after rails new and configures a complete, production-ready application in a single command.\n\nrails g maquina:app --auth clave --prefix /admin --port 3000\n\n\nWhat It Does\n\n\n  Adds gems — brakeman, standard, rails-i18n, maquina-components, aws-sdk-s3\n  Creates configs — Procfile.dev, .rubocop.yml, .standard.yml\n  Configures environments — letter_opener for dev, APPLICATION_HOST for production\n  Installs Rails features — Action Text, Active Storage, Turbo morphing\n  Runs auth generator — your choice of clave, registration, or none\n  Runs sub-generators — rack_attack, solid_queue, mission_control_jobs, solid_errors\n  Installs Solid adapters — Solid Queue, Solid Cache, Solid Cable, Solid Errors\n  Installs Maquina Components — UI library ready to use\n  Creates HomeController — with root route\n  Sets up multi-database — primary, queue, cache, cable, errors\n\n\nOptions\n\n\n  \n    \n      Option\n      Default\n      Description\n    \n  \n  \n    \n      --auth\n      none\n      Authentication: none, clave, or registration\n    \n    \n      --prefix\n      /admin\n      URL prefix for ops dashboards\n    \n    \n      --port\n      3000\n      Development server port\n    \n  \n\n\nGenerated Database Configuration\n\ndevelopment:\n  primary:\n    database: storage/development.sqlite3\n  queue:\n    database: storage/development_queue.sqlite3\n  cache:\n    database: storage/development_cache.sqlite3\n  cable:\n    database: storage/development_cable.sqlite3\n  errors:\n    database: storage/development_errors.sqlite3\n\n\n\n\nAuthentication: Clave (Passwordless)\n\nComplete passwordless authentication using email verification codes. Users receive a 6-digit code via email to sign in — no passwords to manage, no password resets to build.\n\nrails g maquina:clave\n\n\nWhat You Get\n\nModels:\n\n  Account — multi-tenant container (has_many :users)\n  User — with role enum (member/admin), account association, blocking support\n  Session — browser session tracking with IP and user agent\n  EmailVerification — verification codes with expiry and attempt tracking\n  Current — ActiveSupport::CurrentAttributes with session, user, and account\n\n\nControllers:\n\n  SessionsController — email entry for sign-in\n  Session::VerificationsController — code verification\n  Session::VerificationResendsController — resend with 15-minute cooldown\n  RegistrationsController — account creation (optional)\n  Registration verification controllers\n\n\nAdditional:\n\n  VerificationMailer — HTML + text email templates\n  AuthenticationCleanupJob — daily cleanup of expired sessions and codes\n  SessionTestHelper — sign_in_as(user) and sign_out for tests\n  Full i18n support (English and Spanish)\n\n\nHow It Works\n\nUser enters email → receives 6-digit code → enters code → signed in\n\n\n\n  Codes expire in 15 minutes\n  15-minute cooldown before resend\n  Rate limited: 10 attempts per 3 minutes\n  Sessions last 30 days (configurable)\n  + characters blocked in emails to prevent alias attacks\n\n\nMulti-Tenancy\n\nEvery user belongs to an Account. The first user who creates an account becomes its admin.\n\n# Access anywhere in your app\nCurrent.user          # The signed-in user\nCurrent.account       # The user's account\nCurrent.user.admin?   # Check role\n\n\nScoping Queries\n\nclass ProjectsController &lt; ApplicationController\n  def index\n    @projects = Current.account.projects\n  end\n\n  def create\n    @project = Current.account.projects.build(project_params)\n    # ...\n  end\n\n  private\n\n  def set_project\n    @project = Current.account.projects.find(params[:id])\n  end\nend\n\n\nOptions\n\n\n  \n    \n      Option\n      Default\n      Description\n    \n  \n  \n    \n      --skip-views\n      false\n      Skip view templates\n    \n    \n      --skip-registration\n      false\n      Skip sign-up flow (sign-in only)\n    \n  \n\n\n\n\nAuthentication: Registration (Password-Based)\n\nPassword-based authentication that builds on Rails 8’s built-in rails generate authentication. Adds multi-tenancy with an Account model, user roles, and a registration flow.\n\nrails g maquina:registration\n\n\nWhat It Adds to Rails Auth\n\nRails 8’s authentication generator gives you login but no signup. Registration adds:\n\n\n  Account model with has_many :users\n  User gains belongs_to :account and role enum (admin/member)\n  Current.account delegation\n  RegistrationsController — creates Account + User in a single transaction\n  Tailwind-styled views\n  English and Spanish translations\n\n\nGenerated Models\n\nclass Account &lt; ApplicationRecord\n  has_many :users, dependent: :destroy\n  validates :name, presence: true\nend\n\nclass User &lt; ApplicationRecord\n  has_secure_password\n  has_many :sessions, dependent: :destroy\n  belongs_to :account\n  validates :name, presence: true\n  enum :role, { member: \"member\", admin: \"admin\" }, default: \"member\"\nend\n\nclass Current &lt; ActiveSupport::CurrentAttributes\n  attribute :session\n  delegate :user, to: :session, allow_nil: true\n  delegate :account, to: :user, allow_nil: true\nend\n\n\nRegistration Flow\n\nclass RegistrationsController &lt; ApplicationController\n  allow_unauthenticated_access\n  rate_limit to: 10, within: 3.minutes, only: :create\n\n  def create\n    ActiveRecord::Base.transaction do\n      account = Account.create!(name: params[:account_name])\n      user = account.users.create!(\n        name: params[:name],\n        email_address: params[:email_address],\n        password: params[:password],\n        role: :admin\n      )\n    end\n    start_new_session_for user\n    redirect_to root_path\n  end\nend\n\n\nOptions\n\n\n  \n    \n      Option\n      Default\n      Description\n    \n  \n  \n    \n      --skip-views\n      false\n      Skip view templates\n    \n  \n\n\n\n\nRack Attack\n\nRequest protection with sensible defaults. Blocks common attack vectors and throttles abusive requests.\n\nrails g maquina:rack_attack\n\n\nDefault Protections\n\nBlocklists:\n\n  PHP files and WordPress paths\n  Sensitive files (.env, .git, .aws, .ssh)\n  Scanner targets (/cgi-bin, /phpmyadmin, /actuator, /debug)\n\n\nThrottles:\n\n  General: 300 requests per 5 minutes per IP (assets exempt)\n  Login: 5 attempts per 20 seconds per IP\n\n\nSafelists:\n\n  Localhost (127.0.0.1, ::1)\n\n\nAll rules live in config/initializers/rack_attack.rb. Edit directly.\n\n\n\nSolid Queue\n\nSets up Solid Queue as your Active Job backend with a separate database and Procfile integration.\n\nrails g maquina:solid_queue --database sqlite3\n\n\nConfiguration\n\n# config/solid_queue.yml\ndefault: &amp;default\n  dispatchers:\n    - polling_interval: 1\n      batch_size: 500\n  workers:\n    - queues: \"*\"\n      threads: 3\n      polling_interval: 0.1\n  recurring:\n    authentication_cleanup:\n      class: AuthenticationCleanupJob\n      schedule: every day at 3am\n\n\nOptions\n\n\n  \n    \n      Option\n      Default\n      Description\n    \n  \n  \n    \n      --database\n      sqlite3\n      Database adapter (sqlite3 or postgresql)\n    \n  \n\n\n\n\nSolid Errors\n\nError tracking dashboard with custom Tailwind views and HTTP basic auth.\n\nrails g maquina:solid_errors --prefix /admin\n\n\nWhat You Get\n\n\n  Custom Tailwind-styled error views\n  HTTP basic auth (credentials-first, ENV fallback)\n  Severity badge helpers\n  Clipboard and backtrace filter Stimulus controllers\n  Shared admin navigation bar\n\n\nAuthentication\n\n# Checks in order:\n# 1. Rails.application.credentials.backstage.username / .password\n# 2. ENV[\"SOLID_ERRORS_USER\"] / ENV[\"SOLID_ERRORS_PASSWORD\"]\n\n\nSet up credentials:\n\nbin/rails credentials:edit\n\n\nbackstage:\n  username: admin\n  password: your_secure_password\n\n\nOptions\n\n\n  \n    \n      Option\n      Default\n      Description\n    \n  \n  \n    \n      --prefix\n      required\n      URL prefix (e.g., /admin)\n    \n    \n      --user-env-var\n      SOLID_ERRORS_USER\n      Custom env var for username\n    \n    \n      --password-env-var\n      SOLID_ERRORS_PASSWORD\n      Custom env var for password\n    \n    \n      --copy-views\n      true\n      Include custom Tailwind views\n    \n  \n\n\n\n\nMission Control Jobs\n\nJob queue monitoring dashboard with custom Tailwind views. 41 view files styled to match your application.\n\nrails g maquina:mission_control_jobs --prefix /admin\n\n\nWhat You Get\n\n\n  Full Tailwind-styled dashboard for Solid Queue\n  Job status badges, queue views, worker monitoring\n  Recurring task management\n  Shared admin navigation (links to Solid Errors)\n  HTTP basic auth (same credentials as Solid Errors)\n\n\nOptions\n\n\n  \n    \n      Option\n      Default\n      Description\n    \n  \n  \n    \n      --prefix\n      required\n      URL prefix (e.g., /admin)\n    \n    \n      --user-env-var\n      MISSION_CONTROL_JOBS_USER\n      Custom env var for username\n    \n    \n      --password-env-var\n      MISSION_CONTROL_JOBS_PASSWORD\n      Custom env var for password\n    \n    \n      --copy-views\n      true\n      Include custom Tailwind views\n    \n  \n\n\n\n\nArchitecture Overview\n\nAfter running maquina:app --auth clave, your project structure looks like this:\n\napp/\n  controllers/\n    concerns/\n      authentication.rb          # Session management\n    sessions_controller.rb       # Sign-in\n    registrations_controller.rb  # Sign-up\n    home_controller.rb           # Root page\n  models/\n    account.rb                   # Multi-tenant container\n    user.rb                      # Roles + auth\n    current.rb                   # Request context\n    session.rb                   # Browser sessions\n    email_verification.rb        # Verification codes\n  mailers/\n    verification_mailer.rb       # Email codes\n  jobs/\n    authentication_cleanup_job.rb  # Daily cleanup\n\nconfig/\n  initializers/\n    rack_attack.rb               # Request protection\n    solid_errors.rb              # Error tracking auth\n    mission_control.rb           # Job dashboard auth\n  solid_queue.yml                # Queue configuration\n\n\nSecurity Defaults\n\n\n  Rate limiting on registration and login\n  Rack Attack blocks scanners and bots\n  All controllers require authentication by default\n  Account scoping prevents cross-tenant data access\n\n\nOps Dashboards\n\n\n  /admin/solid_errors — error tracking\n  /admin/mission_control_jobs — job queue monitoring\n\n\nBoth protected with HTTP basic auth using shared backstage credentials.\n\n\n\nRole-Based Authorization\n\nUse the role enum to restrict actions:\n\nclass ProjectsController &lt; ApplicationController\n  before_action :require_admin, only: [:destroy]\n\n  private\n\n  def require_admin\n    unless Current.user.admin?\n      redirect_to projects_path, alert: t(\"flash.general.forbidden\")\n    end\n  end\nend\n\n\nRoles:\n\n  admin — first user created with account, full access\n  member — default role, restricted from destructive actions\n\n\n\n\nCustomization\n\nAll generated code lives in your app. Common customization points:\n\n\n  \n    \n      What\n      Where\n    \n  \n  \n    \n      Redirect after login\n      app/controllers/concerns/authentication.rb → after_authentication_url\n    \n    \n      Session duration\n      Change 30.days.from_now in authentication.rb\n    \n    \n      Code expiration\n      Change 15.minutes.from_now in verification controllers\n    \n    \n      Resend cooldown\n      EmailVerification::COOLDOWN_MINUTES (default: 15)\n    \n    \n      View styling\n      Edit view templates directly\n    \n    \n      Email sender\n      app/mailers/verification_mailer.rb\n    \n    \n      Translations\n      config/locales/clave.*.yml or registration.*.yml\n    \n    \n      Rack Attack rules\n      config/initializers/rack_attack.rb\n    \n    \n      Dashboard credentials\n      bin/rails credentials:edit → backstage:\n    \n    \n      Queue config\n      config/solid_queue.yml\n    \n  \n\n\n\n\nRequirements\n\n\n  Ruby &gt;= 3.2.0\n  Rails &gt;= 7.2\n  Tailwind CSS (for generated views)\n\n\nThe gem has zero runtime dependencies. Add it to your development group, generate your code, and remove it.\n\n# Gemfile\ngroup :development do\n  gem \"maquina-generators\"\nend\n\n\n\n\nNext Steps\n\n\n  \n    \n      GitHub Repository\n    \n    \n      View source code and contribute.\n    \n  \n\n  \n    \n      Maquina Components\n    \n    \n      UI components installed by the app generator.\n    \n  \n\n  \n    \n      Rails Simplifier\n    \n    \n      Keep generated code idiomatic with 37signals patterns.\n    \n  \n\n  \n    \n      Rails MCP Server\n    \n    \n      Give AI visibility into your generated codebase."
        },
        {
          "id": "documentation",
          "title": "Documentation — Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/",
          "content": "Maquina is a growing collection of open-source tools extracted from production Rails applications. No complex build pipelines. No framework fatigue.\n\n\n\nWhy Maquina?\n\nRails developers who ship alone need tools that work together without adding complexity. Maquina provides:\n\n\n  Generators — Production-ready app scaffolding. Authentication, job queues, error tracking, and security in one command.\n  UI Components — ERB partials styled with Tailwind CSS 4.0. No React, no build step.\n  AI Tools — MCP servers and Claude Code plugins that understand your Rails codebase.\n  Developer Utilities — Menu bar apps and CLI tools for your local environment.\n\n\nAll projects are MIT licensed, extracted from production apps, and built for the Rails way.\n\n\n\nPhilosophy\n\nNoBuild\n\nNo complex JavaScript build pipelines. Ship CSS and JS directly with importmaps and Tailwind CSS. Every Maquina tool follows this principle.\n\nSingle Developer\n\nOne developer can build and maintain the entire application. Tools should reduce complexity, not add it.\n\nCRUD Excellence\n\nMost applications are CRUD at their core. Maquina tools make common patterns elegant and maintainable.\n\n\n\nProjects\n\nGenerators\n\nRails generators that produce standalone application code with no runtime dependency. Authentication (passwordless or password-based), multi-tenancy, Rack Attack, Solid Queue, error tracking, and job dashboards — all configured in a single command.\n\nbundle add maquina_generators --group development\nrails generate maquina:app --auth clave\n\n\nView Generators Documentation\n\nUI Components\n\nProduction-ready components for Rails applications. ERB partials with strict locals, Tailwind CSS 4.0 styling, and Stimulus controllers only where needed.\n\nbundle add maquina_components\nrails generate maquina_components:install\n\n\nBrowse Components\n\nAI Tools\n\nMCP servers and Claude Code plugins that let AI assistants understand your Rails projects. Analyze models, routes, schemas, simplify code, and coordinate changes across your editor.\n\n\n  \n    \n      Tool\n      Type\n      Purpose\n    \n  \n  \n    \n      Rails MCP Server\n      MCP Server\n      Let LLMs analyze your Rails codebase\n    \n    \n      Neovim MCP Server\n      MCP Server\n      Coordinate buffer changes with AI assistants\n    \n    \n      Rails Simplifier\n      Plugin\n      Code simplification with 37signals patterns\n    \n    \n      Rails Upgrade Assistant\n      Plugin\n      Generate upgrade guides for Rails 7.0 through 8.1\n    \n    \n      Maquina UI Standards\n      Plugin\n      Build consistent UIs with maquina_components\n    \n  \n\n\nDeveloper Tools\n\nMenu bar apps and CLI utilities for your local development environment.\n\n\n  \n    \n      Tool\n      Purpose\n    \n  \n  \n    \n      Redis Menu\n      Manage local Redis instances from your menu bar\n    \n    \n      Mongo Menu\n      Manage local MongoDB instances from your menu bar\n    \n    \n      Git Continuity\n      Transfer work-in-progress between machines\n    \n  \n\n\n\n\nGet Started\n\n\n  \n    \n      Generators\n    \n    \n      App scaffolding with auth, jobs, and error tracking.\n    \n  \n\n  \n    \n      Components\n    \n    \n      UI components for Rails. ERB partials with Tailwind CSS.\n    \n  \n\n  \n    \n      AI Tools\n    \n    \n      MCP servers and Claude Code plugins for Rails development.\n    \n  \n\n  \n    \n      Developer Tools\n    \n    \n      Menu bar apps and CLI utilities for your workflow.\n    \n  \n\n\n\n\nCommunity\n\nAll projects are on GitHub under the maquina-app organization. Issues, pull requests, and contributions welcome."
        },
        {
          "id": "documentation-tools",
          "title": "Tools — Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/tools/",
          "content": "Developer utilities for your local environment. Menu bar apps for managing databases, CLI tools for workflow automation, and helpers that make development easier.\n\n\n\nAvailable Tools\n\n\n  \n    \n      Redis Menu\n    \n    \n      macOS menu bar app for managing local Redis instances.\n    \n  \n\n  \n    \n      Mongo Menu\n    \n    \n      macOS menu bar app for managing local MongoDB instances.\n    \n  \n\n  \n    \n      Git Continuity\n    \n    \n      Transfer work-in-progress between machines without commits.\n    \n  \n\n\n\n\nMenu Bar Apps\n\nRedis Menu and Mongo Menu are native macOS applications that sit in your menu bar. They provide:\n\n\n  One-click start/stop controls\n  Visual status indicators\n  Custom configuration options\n  Auto-start and launch at login\n  Bundled database binaries (no separate installation needed)\n\n\nRequirements\n\nBoth menu bar apps require:\n\n  macOS 15.0 (Sequoia) or later\n  Xcode 16.0 or later (for building from source)\n\n\n\n\nCLI Tools\n\nGit Continuity\n\nTransfer work-in-progress between machines without committing to git history. Perfect for moving unfinished work between office and home.\n\n# On your work machine\ngit continuity push\n\n# On your home machine\ngit continuity pull\n\n\nYour uncommitted changes, staged files, and untracked files are transferred without polluting your git history."
        },
        {
          "id": "documentation-tools-mongo-menu",
          "title": "Mongo Menu — Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/tools/mongo-menu/",
          "content": "A macOS menu bar application that makes managing local MongoDB instances simple and convenient. Start, stop, and configure MongoDB with a single click.\n\n\n  \n  \n\n\n\n\nOverview\n\nMongo Menu sits in your macOS menu bar, providing easy access to start, stop, and configure MongoDB instances. Designed for developers who need to work with MongoDB locally and want a straightforward way to manage the database without terminal commands.\n\n\n\nFeatures\n\n\n  Menu Bar Controls: Start and stop MongoDB with a single click\n  Visual Status Indicator: Instantly see if MongoDB is running\n  Custom Configuration: Configure data directory, log path, and port\n  Auto-start Options: Start MongoDB automatically when the app launches\n  Launch at Login: Start Mongo Menu when your Mac boots\n  Lightweight Footprint: Minimal resource usage in the background\n\n\n\n\nRequirements\n\n\n  macOS 15.0 (Sequoia) or later\n  Admin privileges (for first-time setup)\n\n\n\n\nInstallation\n\nBuild from Source\n\n\n  Clone the repository:\n\n\ngit clone https://github.com/maquina-app/mongo-menu.git\ncd mongo-menu\n\n\n\n  Run the build script:\n\n\n./build.sh\n\n\nThe build script will:\n\n  Check if MongoDB binaries exist and download them if needed\n  Build the application\n  Place the built app in build/Release/MongoMenu.app\n\n\n\n  Move the built app to your Applications folder\n\n\nBuild Requirements\n\n\n  Xcode 16.0 or later\n  Command Line Tools for Xcode\n  macOS 15.0 (Sequoia) or later\n\n\n\n\nUsage\n\n\n  Click the MongoDB icon in the menu bar to see status and control options\n  Use “Start MongoDB” or “Stop MongoDB” to control the service\n  Click “Preferences” to configure settings:\n    \n      Data directory location\n      Log file path\n      MongoDB port (default: 27017)\n      Auto-start options\n      Launch at login option\n    \n  \n\n\n\n\nConfiguration\n\nDefault Locations\n\nMongo Menu stores data in these default locations:\n\n\n  \n    \n      Setting\n      Default Path\n    \n  \n  \n    \n      Data directory\n      ~/.local/share/mongodb/data\n    \n    \n      Log file\n      ~/.local/state/mongodb/logs/mongodb.log\n    \n    \n      Port\n      27017\n    \n  \n\n\nAll locations can be customized in the app preferences.\n\nBundled MongoDB\n\nMongo Menu bundles MongoDB binaries (version 8.0.6) specifically for Apple Silicon Macs. You don’t need to install MongoDB separately. The app handles downloading the appropriate MongoDB binaries for your Mac.\n\n\n\nTroubleshooting\n\nMongoDB Won’t Start\n\n\n  Check if the port is already in use by another application\n  Ensure you have write permissions to the data directory and log path\n  Check the log file for specific error messages\n\n\nApp Won’t Launch\n\n\n  Make sure you have macOS Sequoia (15.0) or later installed\n  Try rebuilding from source using the build script\n\n\n\n\nNext Steps\n\n\n  \n    \n      GitHub Repository\n    \n    \n      Source code, issues, and contribution guidelines.\n    \n  \n\n  \n    \n      Redis Menu\n    \n    \n      Similar menu bar app for managing Redis instances."
        },
        {
          "id": "documentation-tools-redis-menu",
          "title": "Redis Menu — Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/documentation/tools/redis-menu/",
          "content": "A macOS menu bar application that makes managing local Redis instances simple and convenient. Start, stop, and configure Redis with a single click.\n\n\n  \n  \n\n\n\n\nOverview\n\nRedis Menu sits in your macOS menu bar, providing easy access to start, stop, and configure Redis instances. Designed for developers who need to work with Redis locally and want a straightforward way to manage the database without terminal commands.\n\n\n\nFeatures\n\n\n  Menu Bar Controls: Start and stop Redis with a single click\n  Visual Status Indicator: Instantly see if Redis is running\n  Custom Configuration: Configure data directory, log path, and port\n  Auto-start Options: Start Redis automatically when the app launches\n  Launch at Login: Start Redis Menu when your Mac boots\n  Lightweight Footprint: Minimal resource usage in the background\n\n\n\n\nRequirements\n\n\n  macOS 15.0 (Sequoia) or later\n  Admin privileges (for first-time setup)\n\n\n\n\nInstallation\n\nBuild from Source\n\n\n  Clone the repository:\n\n\ngit clone https://github.com/maquina-app/redis-menu.git\ncd redis-menu\n\n\n\n  Run the build script:\n\n\n./build.sh\n\n\nThe build script will:\n\n  Download and compile Redis if needed\n  Build the application\n  Place the built app in build/Release/RedisMenu.app\n\n\n\n  Move the built app to your Applications folder\n\n\nBuild Requirements\n\n\n  Xcode 16.0 or later\n  Command Line Tools for Xcode\n  macOS 15.0 (Sequoia) or later\n\n\n\n\nUsage\n\n\n  Click the Redis icon in the menu bar to see status and control options\n  Use “Start Redis” or “Stop Redis” to control the service\n  Click “Preferences” to configure settings:\n    \n      Data directory location\n      Log file path\n      Redis port (default: 6379)\n      Auto-start options\n      Launch at login option\n    \n  \n\n\n\n\nConfiguration\n\nDefault Locations\n\nRedis Menu stores data in these default locations:\n\n\n  \n    \n      Setting\n      Default Path\n    \n  \n  \n    \n      Data directory\n      ~/.local/share/redis/data\n    \n    \n      Log file\n      ~/.local/state/redis/logs/redis.log\n    \n    \n      Port\n      6379\n    \n  \n\n\nAll locations can be customized in the app preferences.\n\nBundled Redis\n\nRedis Menu downloads, compiles, and bundles Redis binaries for your Mac. You don’t need to install Redis separately. The app handles downloading and compiling the appropriate Redis source code for your system.\n\n\n\nTroubleshooting\n\nRedis Won’t Start\n\n\n  Check if the port is already in use by another application\n  Ensure you have write permissions to the data directory and log path\n  Check the log file for specific error messages\n\n\nApp Won’t Launch\n\n\n  Make sure you have macOS Sequoia (15.0) or later installed\n  Try rebuilding from source using the build script\n\n\n\n\nNext Steps\n\n\n  \n    \n      GitHub Repository\n    \n    \n      Source code, issues, and contribution guidelines.\n    \n  \n\n  \n    \n      Mongo Menu\n    \n    \n      Similar menu bar app for managing MongoDB instances."
        },
        {
          "id": "",
          "title": "Maquina — Open Source Tools for Rails Developers",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/",
          "content": "Recuerd0\n              \n              \n                Documentation\n              \n              \n                Open Source\n              \n              \n                Blog\n              \n          \n\n          \n            mobile-nav#toggle\"\n            >\n              \n                \n              \n            \n          \n        \n      \n    \n  \n\n\n    \n  \n\n  \n    \n      \n      \n    \n\n    \n      \n        \n          \n            Open Source Rails Tools\n          \n\n          \n            Tools for developers\n            who ship alone\n          \n\n          \n            Generators, UI components, and AI tools extracted from production Rails\n            applications. No build pipelines. No framework fatigue. Built for the\n            one-person framework philosophy.\n          \n\n          \n            \n              Get Started\n            \n\n            \n              Get in Touch\n            \n          \n        \n      \n    \n  \n\n  \n    \n      \n        \n\n          \n            Featured Product\n\n            \n              \n            \n\n            \n              A dedicated knowledge base for managing the context your AI tools\n              consume. Curate project knowledge once, serve it to every tool via\n              REST API.\n            \n            \n              Works with Claude Code, Cursor, ChatGPT, and any tool that makes\n              HTTP requests.\n            \n\n            \n              \n                Explore Recuerd0\n                \n                  \n                \n              \n            \n          \n\n          \n            \n          \n\n        \n      \n    \n  \n\n  \n    \n      \n        \n\n          \n            \n          \n\n          \n            Featured Product\n\n            \n              \n            \n\n            \n              Know your daily vibe, spend without the spiral. Resto tells you\n              exactly what you can spend today — no more \"can I afford this?\"\n              anxiety. Kakeibo-inspired personal finance, simplified.\n            \n            \n              Track checking accounts, credit cards, and buffers. Reflect on\n              your spending. Plan ahead. All in one place.\n            \n\n            \n              \n                Explore Resto\n                \n                  \n                \n              \n            \n          \n\n        \n      \n    \n  \n\n  \n    \n      Open Source\n      \n        Production-tested tools\n      \n\n      \n\n        \n          \n            App Scaffolding\n            Maquina Generators\n            \n              Rails generators that produce standalone application code. Authentication, job queues, error tracking, and security — no runtime dependency. Generate once, own forever.\n            \n            \n              \n                Documentation\n              \n              \n                \n                  \n                \n                GitHub\n              \n            \n          \n        \n\n        \n          \n            UI Library\n            Maquina Components\n            \n              Modern UI components for Ruby on Rails. ERB partials styled with Tailwind CSS 4.0 and Stimulus controllers. Inspired by shadcn/ui, built for the Rails way.\n            \n            \n              \n                Documentation\n              \n              \n                \n                  \n                \n                GitHub\n              \n            \n          \n        \n\n        \n          \n            AI Integration\n            Rails MCP Server\n            \n              A Model Context Protocol server that lets LLMs interact with Rails projects. Analyze models, routes, schemas, and execute read-only Ruby code in your Rails context.\n            \n            \n              \n                Documentation\n              \n              \n                \n                  \n                \n                GitHub\n              \n            \n          \n        \n\n        \n          \n            Claude Skill\n            Rails Simplifier\n            \n              A Claude Code skill for simplifying and refining Ruby on Rails code. Follows 37signals patterns and One Person Framework philosophy.\n            \n            \n              \n                Documentation\n              \n              \n                \n                  \n                \n                GitHub\n              \n            \n          \n        \n      \n    \n  \n\n  \n    \n      \n        Philosophy\n        \n          Practical tools, not perfect abstractions\n        \n\n        \n          \n            \n              \n                \n              \n            \n            Production First\n            \n              Every tool starts in a real application. No theoretical exercises,\n              no \"what if\" features. If it's here, it's been shipped.\n            \n          \n\n          \n            \n              \n                \n              \n            \n            Standard Rails\n            \n              ERB partials, Tailwind CSS, Stimulus only where needed. No new\n              paradigms to learn. The Rails way, refined.\n            \n          \n\n          \n            \n              \n                \n              \n            \n            One Person Scale\n            \n              Built for developers who ship alone. Simple enough to understand,\n              powerful enough to build real applications.\n            \n          \n        \n      \n    \n  \n\n\n    \n      \n        \n          \n            \n              From the Blog\n              \n                What we're building\n              \n            \n            \n              View all posts\n              \n                \n              \n            \n          \n\n          \n              \n                  \n\n                \n                  \n                    April 7, 2026\n                  \n                  \n                    \n                      \n                      Recuerd0 Now Reads Like a Filesystem\n                    \n                  \n                  \n                    Recuerd0&#39;s API now lets AI agents grep, glob, and read memories in line ranges — the same primitives Claude Code already uses. Plus categories, links, and caching.\n                  \n                    \n                        \n                      Mario Alberto Chávez Cárdenas\n                    \n                \n              \n              \n                  \n\n                \n                  \n                    March 23, 2026\n                  \n                  \n                    \n                      \n                      MVP Creator: From Idea to Documents in Three Prompts\n                    \n                  \n                  \n                    Use MVP Creator, a Claude Code plugin, to generate research reports, business plans, brand guides, and technical specs for new Rails projects. Three prompts, six documents.\n                  \n                    \n                        \n                      Mario Alberto Chávez Cárdenas\n                    \n                \n              \n          \n\n          \n            View all posts\n          \n        \n      \n    \n\n  \n    \n      \n        Open Source\n        \n          All projects\n        \n\n        \n          \n            \n              \n                Project\n                Description\n                Links\n              \n            \n            \n                \n                  \n                    \n                      Maquina Generators\n                    \n                    Rails generators that produce standalone application code. Authentication, job queues, error tracking, and security — no runtime dependency. Generate once, own forever.\n                  \n                  \n                    Rails generators that produce standalone application code. Authentication, job queues, error tracking, and security — no runtime dependency. Generate once, own forever.\n                  \n                  \n                    \n                      \n                        Docs\n                      \n                      \n                        \n                          \n                        \n                      \n                    \n                  \n                \n                \n                  \n                    \n                      Maquina Components\n                    \n                    Modern UI components for Ruby on Rails. ERB partials styled with Tailwind CSS 4.0 and Stimulus controllers. Inspired by shadcn/ui, built for the Rails way.\n                  \n                  \n                    Modern UI components for Ruby on Rails. ERB partials styled with Tailwind CSS 4.0 and Stimulus controllers. Inspired by shadcn/ui, built for the Rails way.\n                  \n                  \n                    \n                      \n                        Docs\n                      \n                      \n                        \n                          \n                        \n                      \n                    \n                  \n                \n                \n                  \n                    \n                      Rails MCP Server\n                    \n                    A Model Context Protocol server that lets LLMs interact with Rails projects. Analyze models, routes, schemas, and execute read-only Ruby code in your Rails context.\n                  \n                  \n                    A Model Context Protocol server that lets LLMs interact with Rails projects. Analyze models, routes, schemas, and execute read-only Ruby code in your Rails context.\n                  \n                  \n                    \n                      \n                        Docs\n                      \n                      \n                        \n                          \n                        \n                      \n                    \n                  \n                \n                \n                  \n                    \n                      Neovim MCP Server\n                    \n                    MCP server for Neovim integration. Read and update buffers, coordinate file changes across your editor and AI assistants.\n                  \n                  \n                    MCP server for Neovim integration. Read and update buffers, coordinate file changes across your editor and AI assistants.\n                  \n                  \n                    \n                      \n                        Docs\n                      \n                      \n                        \n                          \n                        \n                      \n                    \n                  \n                \n                \n                  \n                    \n                      Rails Upgrade Skill\n                    \n                    A Claude Skill that helps upgrade Rails applications. Analyzes your codebase and generates migration guides for Rails 7.0 through 8.1.\n                  \n                  \n                    A Claude Skill that helps upgrade Rails applications. Analyzes your codebase and generates migration guides for Rails 7.0 through 8.1.\n                  \n                  \n                    \n                      \n                        Docs\n                      \n                      \n                        \n                          \n                        \n                      \n                    \n                  \n                \n                \n                  \n                    \n                      Rails Simplifier\n                    \n                    A Claude Code skill for simplifying and refining Ruby on Rails code. Follows 37signals patterns and One Person Framework philosophy.\n                  \n                  \n                    A Claude Code skill for simplifying and refining Ruby on Rails code. Follows 37signals patterns and One Person Framework philosophy.\n                  \n                  \n                    \n                      \n                        Docs\n                      \n                      \n                        \n                          \n                        \n                      \n                    \n                  \n                \n                \n                  \n                    \n                      Maquina UI Standards\n                    \n                    A Claude Code skill for building consistent, accessible UIs in Rails using maquina_components. Enforces design patterns and accessibility standards.\n                  \n                  \n                    A Claude Code skill for building consistent, accessible UIs in Rails using maquina_components. Enforces design patterns and accessibility standards.\n                  \n                  \n                    \n                      \n                        Docs\n                      \n                      \n                        \n                          \n                        \n                      \n                    \n                  \n                \n                \n                  \n                    \n                      Git Continuity\n                    \n                    Seamlessly transfer work-in-progress between machines without committing to git history. Perfect for moving unfinished work between office and home.\n                  \n                  \n                    Seamlessly transfer work-in-progress between machines without committing to git history. Perfect for moving unfinished work between office and home.\n                  \n                  \n                    \n                      \n                        Docs\n                      \n                      \n                        \n                          \n                        \n                      \n                    \n                  \n                \n                \n                  \n                    \n                      Redis Menu\n                    \n                    A macOS menu bar application for managing local Redis instances. Start, stop, and monitor Redis without touching the terminal.\n                  \n                  \n                    A macOS menu bar application for managing local Redis instances. Start, stop, and monitor Redis without touching the terminal.\n                  \n                  \n                    \n                      \n                        Docs\n                      \n                      \n                        \n                          \n                        \n                      \n                    \n                  \n                \n                \n                  \n                    \n                      Mongo Menu\n                    \n                    A macOS menu bar application for managing local MongoDB instances. Simple controls for your development database.\n                  \n                  \n                    A macOS menu bar application for managing local MongoDB instances. Simple controls for your development database.\n                  \n                  \n                    \n                      \n                        Docs\n                      \n                      \n                        \n                          \n                        \n                      \n                    \n                  \n                \n            \n          \n        \n      \n    \n  \n\n  \n    \n      \n        Work Together\n        \n          Need help with your Rails project?\n        \n        \n          I'm Mario Alberto Ch&aacute;vez&mdash;Rails architect available for consulting,\n          architecture review, AI integration, and code review.\n        \n        \n          \n            Get in Touch\n          \n          \n            \n              \n            \n            Visit My Blog\n          \n        \n      \n    \n  \n\n  \n  \n    \n\n    \n      \n        \n          \n            Get started\n          \n          \n            Ready to build faster?\n            Start using Maquina today.\n          \n          \n            Build robust multi-tenant Rails applications with a solid foundation and best practices built-in.\n          \n          \n            \n              Get started\n            \n          \n        \n\n        \n          \n            \n              \n              \n            \n\n            \n              \n                \n                  \n                    \n  \n\n                  \n                \n              \n\n              \n                  \n                    Products\n                    \n                        \n                          \n                            Recuerd0\n                          \n                        \n                    \n                  \n                  \n                    Open Source\n                    \n                        \n                          \n                            Documentation\n                          \n                        \n                        \n                          \n                            Generators\n                          \n                        \n                        \n                          \n                            Components\n                          \n                        \n                        \n                          \n                            All Projects\n                          \n                        \n                    \n                  \n                  \n                    Company\n                    \n                        \n                          \n                            Blog\n                          \n                        \n                    \n                  \n                  \n                    Resources\n                    \n                        \n                          \n                            GitHub\n                          \n                        \n                        \n                          \n                            RubyGems\n                          \n                        \n                    \n                  \n              \n            \n          \n\n          \n            \n              \n              \n              \n              \n            \n\n            \n              \n                \n                  &copy; 2026 Maquina.\n                  Mario Alberto Chávez Cárdenas"
        },
        {
          "id": "open-source",
          "title": "Open Source Projects — Maquina",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/open-source/",
          "content": "Recuerd0\n              \n              \n                Documentation\n              \n              \n                Open Source\n              \n              \n                Blog\n              \n          \n\n          \n            mobile-nav#toggle\"\n            >\n              \n                \n              \n            \n          \n        \n      \n    \n  \n\n\n\n      \n        Open Source\n      \n\n      \n        Open Source Projects\n      \n\n      \n        All our projects are MIT licensed and built in the open. Explore,\n        contribute, and make them your own.\n      \n    \n  \n\n  \n    \n      \n        Featured\n      \n\n      \n        Core Projects\n      \n\n      \n          \n            \n              \n                \n                  Maquina Generators\n                \n\n                \n                  Rails generators that produce standalone application code. Authentication, job queues, error tracking, and security — no runtime dependency. Generate once, own forever.\n                \n              \n\n              \n                \n                  \n                \n              \n            \n\n\n            \n              \n                Documentation\n              \n\n              \n                \n                  \n                \n                Repository\n              \n            \n          \n          \n            \n              \n                \n                  Maquina Components\n                \n\n                \n                  Modern UI components for Ruby on Rails. ERB partials styled with Tailwind CSS 4.0 and Stimulus controllers. Inspired by shadcn/ui, built for the Rails way.\n                \n              \n\n              \n                \n                  \n                \n              \n            \n\n\n            \n              \n                Documentation\n              \n\n              \n                \n                  \n                \n                Repository\n              \n            \n          \n          \n            \n              \n                \n                  Rails MCP Server\n                \n\n                \n                  A Model Context Protocol server that lets LLMs interact with Rails projects. Analyze models, routes, schemas, and execute read-only Ruby code in your Rails context.\n                \n              \n\n              \n                \n                  \n                \n              \n            \n\n\n            \n              \n                Documentation\n              \n\n              \n                \n                  \n                \n                Repository\n              \n            \n          \n          \n            \n              \n                \n                  Rails Upgrade Skill\n                \n\n                \n                  A Claude Skill that helps upgrade Rails applications. Analyzes your codebase and generates migration guides for Rails 7.0 through 8.1.\n                \n              \n\n              \n                \n                  \n                \n              \n            \n\n\n            \n              \n                Documentation\n              \n\n              \n                \n                  \n                \n                Repository\n              \n            \n          \n          \n            \n              \n                \n                  Rails Simplifier\n                \n\n                \n                  A Claude Code skill for simplifying and refining Ruby on Rails code. Follows 37signals patterns and One Person Framework philosophy.\n                \n              \n\n              \n                \n                  \n                \n              \n            \n\n\n            \n              \n                Documentation\n              \n\n              \n                \n                  \n                \n                Repository\n              \n            \n          \n      \n    \n  \n\n  \n    \n      \n        \n          All Projects\n        \n\n        \n          Complete Toolkit\n        \n\n        \n          \n            \n              \n                \n                  Project\n                \n\n                \n                  Description\n                \n\n                \n                  Links\n                \n              \n            \n\n            \n                \n                  \n                    \n                      \n                        \n                          \n                        \n                      \n\n                      \n                        \n                          Maquina Generators\n                        \n\n                        \n                          Rails generators that produce standalone application code. Authentication, job queues, error tracking, and security — no runtime dependency. Generate once, own forever.\n                        \n                      \n                    \n                  \n\n                  \n                    Rails generators that produce standalone application code. Authentication, job queues, error tracking, and security — no runtime dependency. Generate once, own forever.\n                  \n\n                  \n                    \n                      \n                        Docs\n                      \n\n                      \n                        GitHub\n                      \n                    \n                  \n                \n                \n                  \n                    \n                      \n                        \n                          \n                        \n                      \n\n                      \n                        \n                          Maquina Components\n                        \n\n                        \n                          Modern UI components for Ruby on Rails. ERB partials styled with Tailwind CSS 4.0 and Stimulus controllers. Inspired by shadcn/ui, built for the Rails way.\n                        \n                      \n                    \n                  \n\n                  \n                    Modern UI components for Ruby on Rails. ERB partials styled with Tailwind CSS 4.0 and Stimulus controllers. Inspired by shadcn/ui, built for the Rails way.\n                  \n\n                  \n                    \n                      \n                        Docs\n                      \n\n                      \n                        GitHub\n                      \n                    \n                  \n                \n                \n                  \n                    \n                      \n                        \n                          \n                        \n                      \n\n                      \n                        \n                          Rails MCP Server\n                        \n\n                        \n                          A Model Context Protocol server that lets LLMs interact with Rails projects. Analyze models, routes, schemas, and execute read-only Ruby code in your Rails context.\n                        \n                      \n                    \n                  \n\n                  \n                    A Model Context Protocol server that lets LLMs interact with Rails projects. Analyze models, routes, schemas, and execute read-only Ruby code in your Rails context.\n                  \n\n                  \n                    \n                      \n                        Docs\n                      \n\n                      \n                        GitHub\n                      \n                    \n                  \n                \n                \n                  \n                    \n                      \n                        \n                          \n                        \n                      \n\n                      \n                        \n                          Neovim MCP Server\n                        \n\n                        \n                          MCP server for Neovim integration. Read and update buffers, coordinate file changes across your editor and AI assistants.\n                        \n                      \n                    \n                  \n\n                  \n                    MCP server for Neovim integration. Read and update buffers, coordinate file changes across your editor and AI assistants.\n                  \n\n                  \n                    \n                      \n                        Docs\n                      \n\n                      \n                        GitHub\n                      \n                    \n                  \n                \n                \n                  \n                    \n                      \n                        \n                          \n                        \n                      \n\n                      \n                        \n                          Rails Upgrade Skill\n                        \n\n                        \n                          A Claude Skill that helps upgrade Rails applications. Analyzes your codebase and generates migration guides for Rails 7.0 through 8.1.\n                        \n                      \n                    \n                  \n\n                  \n                    A Claude Skill that helps upgrade Rails applications. Analyzes your codebase and generates migration guides for Rails 7.0 through 8.1.\n                  \n\n                  \n                    \n                      \n                        Docs\n                      \n\n                      \n                        GitHub\n                      \n                    \n                  \n                \n                \n                  \n                    \n                      \n                        \n                          \n                        \n                      \n\n                      \n                        \n                          Rails Simplifier\n                        \n\n                        \n                          A Claude Code skill for simplifying and refining Ruby on Rails code. Follows 37signals patterns and One Person Framework philosophy.\n                        \n                      \n                    \n                  \n\n                  \n                    A Claude Code skill for simplifying and refining Ruby on Rails code. Follows 37signals patterns and One Person Framework philosophy.\n                  \n\n                  \n                    \n                      \n                        Docs\n                      \n\n                      \n                        GitHub\n                      \n                    \n                  \n                \n                \n                  \n                    \n                      \n                        \n                          \n                        \n                      \n\n                      \n                        \n                          Maquina UI Standards\n                        \n\n                        \n                          A Claude Code skill for building consistent, accessible UIs in Rails using maquina_components. Enforces design patterns and accessibility standards.\n                        \n                      \n                    \n                  \n\n                  \n                    A Claude Code skill for building consistent, accessible UIs in Rails using maquina_components. Enforces design patterns and accessibility standards.\n                  \n\n                  \n                    \n                      \n                        Docs\n                      \n\n                      \n                        GitHub\n                      \n                    \n                  \n                \n                \n                  \n                    \n                      \n                        \n                          \n                        \n                      \n\n                      \n                        \n                          Git Continuity\n                        \n\n                        \n                          Seamlessly transfer work-in-progress between machines without committing to git history. Perfect for moving unfinished work between office and home.\n                        \n                      \n                    \n                  \n\n                  \n                    Seamlessly transfer work-in-progress between machines without committing to git history. Perfect for moving unfinished work between office and home.\n                  \n\n                  \n                    \n                      \n                        Docs\n                      \n\n                      \n                        GitHub\n                      \n                    \n                  \n                \n                \n                  \n                    \n                      \n                        \n                          \n                        \n                      \n\n                      \n                        \n                          Redis Menu\n                        \n\n                        \n                          A macOS menu bar application for managing local Redis instances. Start, stop, and monitor Redis without touching the terminal.\n                        \n                      \n                    \n                  \n\n                  \n                    A macOS menu bar application for managing local Redis instances. Start, stop, and monitor Redis without touching the terminal.\n                  \n\n                  \n                    \n                      \n                        Docs\n                      \n\n                      \n                        GitHub\n                      \n                    \n                  \n                \n                \n                  \n                    \n                      \n                        \n                          \n                        \n                      \n\n                      \n                        \n                          Mongo Menu\n                        \n\n                        \n                          A macOS menu bar application for managing local MongoDB instances. Simple controls for your development database.\n                        \n                      \n                    \n                  \n\n                  \n                    A macOS menu bar application for managing local MongoDB instances. Simple controls for your development database.\n                  \n\n                  \n                    \n                      \n                        Docs\n                      \n\n                      \n                        GitHub\n                      \n                    \n                  \n                \n            \n          \n        \n      \n    \n  \n\n  \n    \n      \n        \n          \n            Get Involved\n          \n\n          \n            Contribute\n          \n\n          \n            We welcome contributions of all kinds: code, documentation, bug\n            reports, feature requests, and more. Every contribution helps make\n            Maquina better for everyone.\n          \n\n          \n            \n              View on GitHub\n            \n          \n        \n\n        \n          \n            Philosophy\n          \n\n          \n            Built for simplicity\n          \n\n          \n            Every tool starts in a real production application. No build\n            pipelines, no framework fatigue. Just Rails the way it was meant to\n            be.\n          \n\n          \n            \n              Read Documentation\n            \n          \n        \n      \n    \n  \n\n  \n    \n      \n\n  \n    \n      Work Together\n    \n    \n        Need help with your Rails project?\n    \n    \n        I'm Mario Alberto Ch&aacute;vez&mdash;Rails architect available for consulting, AI integration, and code review.\n    \n    \n      \n        Get in Touch\n      \n      \n        \n          \n        \n        My Personal Website\n      \n    \n  \n\n\n    \n  \n\n  \n  \n    \n\n    \n      \n        \n          \n              \n                \n                  \n                    \n  \n\n                  \n                \n              \n\n              \n                  \n                    Products\n                    \n                        \n                          \n                            Recuerd0 \n                          \n                        \n                    \n                  \n                  \n                    Open Source\n                    \n                        \n                          \n                            Documentation \n                          \n                        \n                        \n                          \n                            Generators \n                          \n                        \n                        \n                          \n                            Components \n                          \n                        \n                        \n                          \n                            All Projects \n                          \n                        \n                    \n                  \n                  \n                    Company\n                    \n                        \n                          \n                            Blog \n                          \n                        \n                    \n                  \n                  \n                    Resources\n                    \n                        \n                          \n                            GitHub \n                          \n                        \n                        \n                          \n                            RubyGems \n                          \n                        \n                    \n                  \n              \n            \n          \n\n          \n            \n              \n              \n              \n              \n            \n\n            \n              \n                \n                  &copy; 2026 Maquina. Mario Alberto Chávez Cárdenas"
        },
        {
          "id": "",
          "title": "Maquina",
          "collection": {
            "label": "data",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "",
          "content": ""
        }
]
