Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .bazelignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ submodules/
node_modules/
rbt/v1alpha1/node_modules/
rbt/std/node_modules/
reboot/create-ui/node_modules/
reboot/inspect/node_modules/
reboot/nodejs/node_modules/
reboot/react/node_modules/
reboot/rootpage/node_modules/
reboot/std/node_modules/
reboot/std/react/node_modules/
reboot/web/node_modules/
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ dist/**/*.tar
dist/build_info/source_info.txt

# Generated binaries.
bin/
# TODO: bin/ somehow?
/reboot/*.whl

# Files inside submodules. This is moot for git itself, since it knows that
Expand Down
4 changes: 3 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,9 @@ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install bash-comple
# code. Keep the version of `mypy` in sync with `mypy-requirements.in`.
# * `build`, Python's package-builder-frontend.
# * `uv`, a fast Python package installer and resolver.
RUN pip install yapf==0.40.2 mypy==1.18.1 isort==5.12.0 ruff==0.1.14 build==1.0.3 uv==0.9.18
# * `py-spy`, the sampling profiler invoked by `_maybe_run_py_spy()`
# in `reboot/aio/monitoring.py`.
RUN pip install yapf==0.40.2 mypy==1.18.1 isort==5.12.0 ruff==0.1.14 build==1.0.3 uv==0.9.18 py-spy==0.4.2

# Install and setup fish (shell used on codespaces).
# NOTE: We do this as it is done here:
Expand Down
4 changes: 2 additions & 2 deletions charts/reboot/Chart.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
apiVersion: 3.3.2
name: reboot
version: "1.0.4"
version: "1.1.0"
description: Reboot is a programming framework that enables transactional microservices built with the developer in mind.
type: application
keywords:
Expand All @@ -10,4 +10,4 @@ keywords:
- scalable
- reactive
home: https://docs.reboot.dev/
appVersion: "1.0.4"
appVersion: "1.1.0"
62 changes: 56 additions & 6 deletions documentation/docs/ai_chat_apps/get_started.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,9 @@ Naming a type \`User\` in your \`API(...)\` is special:

- A \`User\` instance is automatically created for each authenticated
user that connects to your app.
- During development all users of your app are automatically
"authenticated" with the built-in \`Anonymous\` OAuth provider, so every
user of your app gets a \`User\` instance.
- During development you "sign in" by picking one of the built-in
\`Development\` OAuth provider's fake identities, so every user of
your app gets a \`User\` instance.
- \`User\` acts as an entry point: its methods create other state
types (like \`Counter\`) whose IDs the AI tracks in its context
window.
Expand Down Expand Up @@ -355,15 +355,31 @@ touch backend/src/main.py
```python
# backend/src/main.py
import asyncio
from example_prompts import example_prompts
from reboot.aio.applications import Application
from reboot.aio.auth.oauth_providers import Anonymous
from reboot.aio.auth.oauth_providers import (
Development,
OAuthProviderByEnvironment,
)
from servicers.counter import CounterServicer, UserServicer


async def main() -> None:
application = Application(
title="Chat Counter",
description=(
"Lets a chat client create, list, increment, and "
"show counters on your behalf."
),
servicers=[UserServicer, CounterServicer],
oauth=Anonymous(),
oauth=OAuthProviderByEnvironment(
dev=Development(),
# TODO: set a real provider (e.g. `Google(...)`) before
# production; `prod=None` makes a production deployment fail
# to start until one is chosen.
prod=None,
),
example_prompts=example_prompts,
)
await application.run()

Expand Down Expand Up @@ -412,6 +428,14 @@ touch web/ui/clicker/App.module.css

```css
/* web/ui/clicker/App.module.css */

/*
* The clicker renders inline inside the MCP host (e.g. Claude.ai),
* so it inherits the host's color scheme. We set every color
* explicitly — never relying on inherited text color — and provide
* a dark variant via `prefers-color-scheme` so the widget stays
* legible in both Claude.ai's light and dark modes.
*/
.container {
display: flex;
align-items: center;
Expand All @@ -423,13 +447,15 @@ touch web/ui/clicker/App.module.css
border: 1px solid #e0e0e0;
border-radius: 12px;
background: #fafafa;
color: #1a1a1a;
}

.value {
font-size: 32px;
font-weight: 600;
min-width: 48px;
text-align: center;
color: inherit;
}

.button {
Expand All @@ -440,11 +466,35 @@ touch web/ui/clicker/App.module.css
border-radius: 8px;
border: 1px solid #ccc;
background: #f5f5f5;
color: #1a1a1a;
cursor: pointer;
}

.button:hover:not(:disabled) {
background: #ebebeb;
}

.button:disabled {
cursor: default;
opacity: 0.5;
}

@media (prefers-color-scheme: dark) {
.container {
border-color: #3a3a3a;
background: #1e1e1e;
color: #f0f0f0;
}

.button {
border-color: #4a4a4a;
background: #2d2d2d;
color: #f0f0f0;
}

.button:hover:not(:disabled) {
background: #3a3a3a;
}
}
```

Expand Down Expand Up @@ -774,7 +824,7 @@ touch mcp_servers.json
<!-- MARKDOWN-AUTO-DOCS:END -->

```sh
npx @mcpjam/inspector@2.4.0 --config mcp_servers.json --server counter-server
npx @mcpjam/inspector@2.9.3 --config mcp_servers.json --server counter-server
```

</Step>
Expand Down
85 changes: 51 additions & 34 deletions documentation/docs/ai_chat_apps/get_started_claude_code.mdx
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";

# Get Started (with Claude Code)

Build an AI Chat App using
Expand All @@ -15,15 +18,32 @@ installed.

## Install the Reboot skill

Add the Reboot skills marketplace and install the
`reboot-chat-app` skill using Claude Code:
<Tabs groupId="install-method">
<TabItem value="quick" label="Quick install">

Install the Reboot plugin for Claude Code with a single
command:

```sh
curl -fsSL https://reboot.dev/install.sh | bash
```

This registers the Reboot marketplace, installs the plugin,
and pre-installs its pinned dependencies so your first build
runs without waiting on downloads.

</TabItem>
<TabItem value="manual" label="Manual install">

Add the marketplace and install the plugin yourself with
Claude Code:

```
claude plugin marketplace add reboot-dev/reboot-skills
claude plugin marketplace add reboot-dev/reboot-plugin
```

```
claude plugin install reboot-chat-app@reboot-skills
claude plugin install reboot@reboot-plugin
```

:::note
Expand All @@ -37,25 +57,28 @@ project's `.claude/settings.json`:
```json
{
"extraKnownMarketplaces": {
"reboot-skills": {
"reboot-plugin": {
"source": {
"source": "github",
"repo": "reboot-dev/reboot-skills"
"repo": "reboot-dev/reboot-plugin"
}
}
},
"enabledPlugins": {
"reboot-chat-app@reboot-skills": true
"reboot@reboot-plugin": true
}
}
```

</TabItem>
</Tabs>

## Use the skill

Once installed, invoke the skill with a description of your app:

```
/reboot-chat-app Build a counter app with an interactive clicker UI
/chat-app Build a counter app with an interactive clicker UI
```

The skill enters **plan mode** first. It will:
Expand All @@ -70,27 +93,30 @@ then builds and runs it.

## What gets created

The skill generates a complete Reboot AI Chat App:
The skill generates a complete Reboot AI Chat App. The most relevant
files are:

```
my-app/
├── .rbtrc # Reboot CLI config
├── pyproject.toml # Python deps (uv)
├── api/
│ └── my_app/v1/
│ └── app.py # API definition (Pydantic)
│ └── my_app.py # API definition (Pydantic)
├── backend/
│ └── src/
│ ├── main.py # Application entrypoint
│ └── servicers/
│ └── app.py # Servicer implementation
── web/
── ui/
└── my-ui/
── index.html
── main.tsx # RebootClientProvider entry
├── App.tsx # React component
── App.module.css
├── .rbtrc # Reboot CLI config
└── pyproject.toml
│ └── my_app.py # Servicer implementation
── web/
── package.json
├── index.css # Styling
── ui/
── my-ui/
├── index.html
── main.tsx # RebootClientProvider entry
├── App.tsx # React component
└── App.module.css
```

The API definition uses the same `User` + application type
Expand All @@ -102,27 +128,18 @@ by the AI.

## Test your app

After the skill finishes building, it starts the app with
`uv run rbt dev run`. You can test it with
[MCPJam Inspector](https://mcpjam.com):

```sh
npx @mcpjam/inspector@2.4.0 \
--config mcp_servers.json --server my-app
```

See the [hand-written guide](/ai_chat_apps/get_started) for details
on what to try in the inspector.
Once the build succeeds, Claude will run the program for you. You'll see
a link, click it to try your app out!

To connect from other AI clients (VS Code, ChatGPT, Claude,
Goose), see [From an MCP client](/learn_more/call/from_mcp_client).
Claude will also write unit tests for your app, which help to make sure
that your app works - and keeps working.

## Iterate on your app

You can also use the skill to modify an existing app:

```
/reboot-chat-app Add a reset button that sets the counter back to zero
/app Add a reset button that sets the counter back to zero
```

The skill reads your current code, plans the changes, and waits
Expand Down
Loading
Loading