restaurant-booking
Book restaurant reservations via browser automation. Use when asked to make dinner reservations, book a table, or find availability at restaurants. Supports OpenTable, Resy, and direct restaurant booking sites.
Best use case
restaurant-booking is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Book restaurant reservations via browser automation. Use when asked to make dinner reservations, book a table, or find availability at restaurants. Supports OpenTable, Resy, and direct restaurant booking sites.
Teams using restaurant-booking should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/orthogonal-restaurant-booking/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How restaurant-booking Compares
| Feature / Agent | restaurant-booking | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Book restaurant reservations via browser automation. Use when asked to make dinner reservations, book a table, or find availability at restaurants. Supports OpenTable, Resy, and direct restaurant booking sites.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# Restaurant Booking
Book reservations using Notte browser automation via Orthogonal.
## Requirements
- Orthogonal CLI (`npm install -g @orth/cli`) or API key
- Guest info: name, email, phone
## Quick Flow
1. Start Notte session
2. Navigate to booking site (OpenTable preferred)
3. Select date/time/party size
4. Fill contact form
5. Submit and confirm
## CLI Method (Recommended)
### 1. Start a Notte Session
```bash
orth run notte /sessions/start \
--body '{"browser_type":"chromium","headless":true,"solve_captchas":true,"idle_timeout_minutes":10}'
```
Save the `session_id` from the response.
### 2. Navigate to OpenTable
```bash
orth run notte /sessions/{session_id}/page/execute \
--body '{"type":"goto","url":"https://www.opentable.com/r/{restaurant}?datetime=2026-02-17T19:00&covers=2"}'
```
### 3. Click Time Slot
```bash
orth run notte /sessions/{session_id}/page/execute \
--body '{"type":"click","selector":"button:has-text(\"7:00 PM\")"}'
```
### 4. Select Seating (if prompted)
```bash
orth run notte /sessions/{session_id}/page/execute \
--body '{"type":"click","selector":"button:has-text(\"Select\")"}'
```
### 5. Fill the Form
```bash
# First name
orth run notte /sessions/{session_id}/page/execute \
--body '{"type":"fill","selector":"input#firstName","value":"John"}'
# Last name
orth run notte /sessions/{session_id}/page/execute \
--body '{"type":"fill","selector":"input#lastName","value":"Doe"}'
# Email
orth run notte /sessions/{session_id}/page/execute \
--body '{"type":"fill","selector":"input#email","value":"john@example.com"}'
# Phone
orth run notte /sessions/{session_id}/page/execute \
--body '{"type":"fill","selector":"input#phoneNumber","value":"4155551234"}'
```
### 6. Accept Terms
```bash
orth run notte /sessions/{session_id}/page/execute \
--body '{"type":"click","selector":"text=I agree to the restaurant"}'
```
### 7. Submit Reservation
```bash
orth run notte /sessions/{session_id}/page/execute \
--body '{"type":"click","selector":"button:has-text(\"Complete reservation\")"}'
```
### 8. Verify Confirmation
```bash
orth run notte /sessions/{session_id}/page/scrape \
--body '{"only_main_content":true}'
```
Look for "confirmed" in the response.
## API Method (curl)
```bash
# Start session
curl -X POST "https://api.orth.sh/v1/run" \
-H "Authorization: Bearer $ORTHOGONAL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"api": "notte",
"path": "/sessions/start",
"body": {
"browser_type": "chromium",
"headless": true,
"solve_captchas": true,
"idle_timeout_minutes": 10
}
}'
# Execute actions (same pattern)
curl -X POST "https://api.orth.sh/v1/run" \
-H "Authorization: Bearer $ORTHOGONAL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"api": "notte",
"path": "/sessions/{session_id}/page/execute",
"body": {"type":"goto","url":"https://www.opentable.com/..."}
}'
```
## Key Selectors (OpenTable)
| Field | Selector |
|-------|----------|
| First name | `input#firstName` |
| Last name | `input#lastName` |
| Email | `input#email` |
| Phone | `input#phoneNumber` |
| Terms checkbox | `text=I agree to the restaurant` |
| Submit | `button:has-text('Complete reservation')` |
| Time slots | `button:has-text('7:00 PM')` |
| Seating select | `button:has-text('Select')` |
## Finding Restaurant IDs
Search OpenTable and extract from URL:
- `restref=1906` → Foreign Cinema
- Restaurant slug in URL path
Example URL format:
```
https://www.opentable.com/r/{restaurant-slug}?restref={id}&datetime={YYYY-MM-DDTHH:MM}&covers={n}
```
## Tips
- OpenTable holds table for 5 minutes - move fast
- Use `fill` action with `value` param (not `type` with `text`)
- Click terms via label text, not checkbox directly
- No credit card needed - reservations are free
- Confirmation email sent automatically
## Resy Alternative
If restaurant uses Resy:
```
https://resy.com/cities/{city}/venues/{restaurant}?date={YYYY-MM-DD}&seats={n}
```
Similar flow but different selectors. Scrape page first to identify form fields.
## After Booking
1. Create calendar event with `gog calendar create`
2. Add attendees and location
3. Include confirmation number in descriptionRelated Skills
yt-dlp-downloader
Download videos from YouTube, Bilibili, Twitter, and thousands of other sites using yt-dlp. Use when the user provides a video URL and wants to download it, extract audio (MP3), download subtitles, or select video quality. Triggers on phrases like "下载视频", "download video", "yt-dlp", "YouTube", "B站", "抖音", "提取音频", "extract audio".
slack
Send messages and manage Slack channels. Use when asked to send Slack messages, post to channels, list channels, or fetch message history.
yc-batch-evaluator
Evaluate YC batch companies for investment — scrapes the YC directory, researches each company and its founders (work history, LinkedIn, website), assesses founder-company fit, and exports to Google Sheets with priority rankings. Use when asked to evaluate YC companies, research a YC batch, screen startups, or do due diligence on YC companies.
website-screenshot
Take screenshots of websites and web pages
weather
Get current weather and forecasts using free APIs (no API key required). Use when asked about weather, temperature, forecasts, or climate conditions for any location.
weather-forecast
Get weather forecasts - temperature, precipitation, wind, and conditions
vhs-terminal-recordings
Create polished terminal GIF recordings using VHS (Video Hardware Software) by Charmbracelet. Use when asked to create terminal demos, CLI gifs, command-line recordings, or animated terminal screenshots for documentation, READMEs, or marketing.
verify-email
Verify if an email address is valid and deliverable
valyu
Web search, AI answers, content extraction, and async deep research
uptime-monitor
Monitor website uptime - check availability, response times, and status
twitter-profile-lookup
Look up Twitter/X profiles - get bio, followers, tweets, and engagement
tomba
Email finder and verifier - find emails from domains, LinkedIn, or company search