One Shot runs on a fresh clone with zero external accounts. There is no Postgres to install, no
Redis to run, and no API key to request before you see the app working. The database is SQLite,
and every third-party integration (billing, email, bot checking) ships with a Local fake that runs
the whole flow in-process. You add real keys later, only for the integrations you actually want
live. See [Bring Your Own Keys](/docs/bring-your-own-keys/optional-integrations) for that step.

## What you need before you start

Two things, and only one of them is required:

- **Ruby**, at the version pinned in `.ruby-version`, plus Bundler. This is required: the app is a
  Rails 8 application and won't boot without it.
- **Node**, only if you plan to use the optional Stripe MCP server via `npx`. The app itself needs
  no Node build step, no `npm install`, and no JavaScript bundler. Importmap serves JavaScript
  straight from `app/javascript/` with no compile step.

You do not need Docker, Postgres, Redis, or a cloud account of any kind to run the app locally.

## Installing and booting the app

From the root of the repository:

```bash
bin/setup
```

This installs gems, prepares the SQLite database, and seeds a demo workspace. It is safe to run
more than once.

Then start the app:

```bash
bin/dev
```

`bin/dev` runs the Rails server (and any watch processes the app needs) in one command. You can
also run `bin/rails server` directly if you don't need the extra watchers. Either way, the app is
now running at `http://localhost:3000`.

## What "zero external accounts" actually means

Every integration in One Shot follows the same shape: a real client when you've configured
credentials, and a deterministic fake otherwise. Billing without a Stripe key runs entirely through
a Local billing fake that behaves like Stripe well enough to develop and test against. Email
without a Resend key opens in your browser via `letter_opener` instead of sending anywhere. This is
why installation has no credential step: the app works fully, end to end, before you decide which
integrations to turn on. Read [The Adapter+Fake Pattern](/docs/building-features/the-adapter-fake-pattern)
for how this is implemented, in case you want to add your own integration the same way.

## Next

Once the server is running, head to [First Run](/docs/getting-started/first-run) to sign in and see
what's there.
