# Friday — Full Documentation > Friday runs on schedule, across your tools, with and without you. Every workflow is transparent config you can read, version, and share. This file aggregates workspace examples, communicator guides, and product comparison content as a single document for ingestion by AI agents. Per-page markdown is also available at /space/.md, /communicator/.md, /compare/.md, and /m/.md. Browse what we've built, import any space, and have it running today. Trigger and manage workflows from Slack, Discord, Telegram, WhatsApp, or Teams. Friday fits into the surfaces you already use. ## Frequently Asked Questions ### What is Friday? Friday runs on schedule, across your tools, with and without you. Every workflow is transparent config you can read, version, and share. ### How do I get started? Download Friday Studio for macOS, import a workspace, and connect your tools. See the Quick Start guide at https://docs.hellofriday.ai/getting-started/quickstart.md. ### Is Friday open source? Friday is source-available under BSL 1.1. Each release converts to Apache 2.0 one year after publication. The repository is at https://github.com/friday-platform/friday-studio. Source: https://hellofriday.ai Index: https://hellofriday.ai/llms.txt Docs: https://docs.hellofriday.ai/llms.txt --- # Workspaces --- URL: https://hellofriday.ai/space/2d-asset-pipeline Source: https://github.com/friday-platform/friday-studio-examples/tree/main/2d-asset-pipeline # 2D Asset Pipeline A pixel art asset creation pipeline. Trigger it with a text description to generate game-ready sprites and animated GIFs — fully transparent background, exact pixel dimensions, and no manual cleanup. Two workflows: - **Single asset** — describe a sprite and get a sized, transparent PNG ready to drop into a game project - **Animation frames** — describe a sprite and an animation, get a looping GIF with frame-accurate timing Both workflows save directly to `~/game_assets` by default. --- ![2d-asset-pipeline output](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/2d-asset-pipeline/output.png) --- ## Setup ### 1. Download Friday 1. Go to [hellofriday.ai](https://hellofriday.ai) and download the macOS installer 2. Open the DMG and drag Friday to your Applications folder 3. Launch Friday and complete the initial setup ### 2. Import the workspace 1. Open Friday and go to **Discover Spaces** 2. Find this workspace and click it 3. Click **Add Space** ### 3. Install dependencies The pipeline uses ImageMagick to convert and resize images and Pillow for spritesheet processing. Both must be available in your `PATH`. **ImageMagick** ```bash brew install imagemagick ``` **Pillow** (installed automatically by the Friday SDK Python environment — no manual action needed) ### 4. That's it No API keys, no external services, no email address to configure. The workspace runs entirely locally. --- ## How to use it Both workflows are triggered on-demand via HTTP signal. ### Generate a single asset Trigger the `/create-pixel-asset` endpoint with a description, and optionally a size and style: | Parameter | Required | Description | Example | |---|---|---|---| | `description` | Yes | What to generate | `"a medieval sword"` | | `size` | No | Canvas size in pixels (default: `64x64`) | `"32x32"` | | `style` | No | Art style notes | `"dark fantasy"`, `"cute chibi"` | **Example — in the Friday chat:** > Trigger create-pixel-asset: description "a wooden shield", size "64x64", style "SNES palette" The pipeline generates the PNG, saves it to `~/game_assets/asset_.png`, removes the green-screen background, and resizes to the exact requested dimensions. ### Generate animation frames Trigger the `/create-animation-frames` endpoint with a description and animation type: | Parameter | Required | Description | Example | |---|---|---|---| | `description` | Yes | The sprite to animate | `"a walking knight"` | | `animation` | Yes | What motion to create | `"walk cycle"`, `"idle breathing"` | | `frame_count` | No | Number of frames (default: `4`) | `"8"` | | `size` | No | Dimensions per frame (default: `64x64`) | `"32x32"` | | `frame_delay_ms` | No | Milliseconds per frame (default: `150`) | `"100"` | **Example — in the Friday chat:** > Trigger create-animation-frames: description "a flickering torch", animation "flame flicker", frame_count "6", size "32x32" The pipeline generates a raw spritesheet, normalizes it to exact frame dimensions, assembles it into a looping GIF, and saves to `~/game_assets/`. --- ## How it works ### Single asset pipeline ![single asset pipeline](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/2d-asset-pipeline/single-asset.png) | Component | Role | |---|---| | `create-pixel-asset` signal | HTTP trigger at `/create-pixel-asset` accepting description, size, style | | `create-pixel-asset-job` | Five-state FSM: idle → generate → save → remove background → resize → done | | `pixel-asset-generator` | Atlas image-generation agent; produces a neon-green-background PNG at requested canvas size | | `file-saver` | Python user agent; fetches the artifact from the Friday API and writes it to disk | | `background-remover` | LLM agent (Claude Haiku); runs two-pass ImageMagick chroma key to remove neon green and make the sprite transparent | | `image-resizer` | LLM agent (Claude Haiku); runs ImageMagick nearest-neighbour resize to exact target dimensions | ### Animation pipeline ![animation pipeline](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/2d-asset-pipeline/animation.png) | Component | Role | |---|---| | `create-animation-frames` signal | HTTP trigger at `/create-animation-frames` | | `create-animation-frames-job` | Eight-state FSM with a retry loop: idle → generate spritesheet → save → normalize → check → route → assemble GIF → resize → done | | `animation-frame-generator` | Atlas image-generation agent; produces a horizontal spritesheet with all frames side by side | | `file-saver` | Python user agent; saves the raw spritesheet PNG to disk | | `spritesheet-normalizer` | Python user agent; detects background color from corners, slices frames to exact dimensions using NEAREST resampling, and returns `regenerate: true` if the canvas is malformed | | `check-normalize-result` | Inline LLM step (Claude Haiku); reads normalizer output and emits `REGENERATE` or `OK` | | `route-after-normalize` | Inline LLM step (Claude Haiku); routes the FSM to retry generation or proceed to assembly | | `gif-assembler` | LLM agent (Claude Opus); runs a Python/Pillow script to slice frames and produce the final looping GIF | | `image-resizer` | LLM agent (Claude Haiku); final nearest-neighbour resize | | `filesystem` MCP server | Provides the `bash` tool used by gif-assembler, image-resizer, and background-remover | The animation job includes a regeneration loop: if the spritesheet normalizer cannot parse frame boundaries (canvas dimensions wrong and no clean column separators detected), it sets `regenerate: true` and the FSM routes back to `generate-frames` to try again. --- ## Notes - Output files land in `~/game_assets/` by default. To change this, pass `output_dir` in the signal payload, or edit the default in the job prompts. - The background-removal pipeline uses neon green (`#00FF00`) as a chroma key color. The image generation agents are instructed never to use neon green on the sprite itself — if you see transparency artifacts on legitimate sprite pixels, the generation step picked a palette that overlaps with the key color. Re-trigger to regenerate. - The spritesheet normalizer runs in the Friday SDK Python environment and does not require any extra installation — Pillow is available there. - ImageMagick must be installed system-wide (`brew install imagemagick`). The pipeline does not install it automatically. - The `filesystem` MCP server is granted access to `${HOME}` — this is the broadest safe scope needed for writing to `~/game_assets`. You can tighten it to a specific directory by editing the `args` in `workspace.yml` under `tools.mcp.servers.filesystem`. - All generation happens locally — no image data is sent to external services beyond the Anthropic API call that drives the image-generation agents. --- URL: https://hellofriday.ai/space/competitive-monitor Source: https://github.com/friday-platform/friday-studio-examples/tree/main/competitive-monitor # Competitive Monitor A weekly competitor intelligence workspace. Every Monday at 8:00am Pacific, it searches the web for recent product moves, pricing changes, and GTM signals from your tracked competitors, clusters findings by theme, and delivers a sourced brief with verified dates. It covers five categories across the prior 7 days: - **Product** — new features, launches, deprecations - **Pricing** — plan changes, discounts, packaging shifts - **GTM** — campaigns, positioning changes, new messaging - **Partnerships** — integrations, co-marketing, ecosystem moves - **Leadership** — executive hires, departures, org changes Every finding includes what happened, an exact confirmed date, and a direct link to the source article. Findings without a verified date and article URL are dropped — no fabricated dates, no homepage links. --- ![competitive-monitor output](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/competitive-monitor/output.png) --- ## Setup ### 1. Download Friday 1. Go to [hellofriday.ai](https://hellofriday.ai) and download the macOS installer 2. Open the DMG and drag Friday to your Applications folder 3. Launch Friday and complete the initial setup ### 2. Import the workspace 1. Open Friday and go to **Discover Spaces** 2. Find this workspace and click it 3. Click **Add Space** ### 3. Update your competitor list The default scan targets **Google** and **Facebook**. To change this: 1. Go to **Jobs → Competitive Monitor Weekly Scan** 2. In the `research` state agent prompt, update the competitors line: `Run a competitive intelligence scan ... on these competitors: Google, Facebook.` 3. Replace with your actual competitors You can also override competitors on a per-run basis using the `run-now` signal's `competitors` input field without changing the job config. --- ## What the brief looks like Findings are clustered by theme and delivered as a structured report artifact in the workspace. Each entry follows this format: > **What happened** > Announced: April 21, 2025 > Source: [Publication Name](https://specific-article-url) --- ## How to use it It runs automatically. Nothing to trigger, nothing to open. If you want to fire it outside the Monday schedule — say, mid-week after a competitor announcement — trigger the `run-now` signal from the workspace. You can optionally pass: - `competitors` — override the default list (Google, Facebook) with specific names - `focus_areas` — limit the scan to specific themes: `pricing`, `product`, `packaging`, `gtm`, `partnerships`, `leadership` - `lookback_days` — how many days back to search (default: 7, max: 90) --- ## How it works ![competitive-monitor workspace overview in Friday](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/competitive-monitor/how-it-works.png) | Component | Role | |---|---| | `competitive-analyst` agent | Atlas web agent that searches the web, visits source pages to verify dates and URLs, and produces a clustered intelligence brief | | `competitive-scan` job | Three-state FSM: idle → research → done | | `run-now` signal | HTTP signal — trigger on demand with optional `competitors`, `focus_areas`, and `lookback_days` inputs | | `weekly-scan` signal | Schedule signal firing at `0 8 * * 1` (8:00am Pacific, Mondays only) | Either signal starts the `competitive-scan` FSM. The FSM transitions from `idle` to `research`, runs the `competitive-analyst` agent, emits an `ADVANCE` event, and moves to `done`. The output is stored as a `scan-report` artifact in the session. --- ## Notes - The scan defaults to a 7-day lookback window. Pass `lookback_days` via `run-now` to go further back (up to 90 days). - The analyst is instructed to drop any finding it cannot confirm with a real article URL and verified publication date — you will not see fabricated or undated entries. - Competitors are currently hardcoded in the job prompt as **Google** and **Facebook**. Update the job config or use the `run-now` signal's `competitors` field to scan others. - The scan runs for up to 15 minutes. Large competitor lists or long lookback windows may approach this limit. - All data stays within your Friday workspace and the public web. No external services beyond the LLM call and web search. --- URL: https://hellofriday.ai/space/daily-operating-memo Source: https://github.com/friday-platform/friday-studio-examples/tree/main/daily-operating-memo # Daily Operating Memo A morning briefing workspace. Every weekday at 7:30am Pacific, it pulls your Google Calendar and Gmail, synthesizes what actually needs your attention, and sends a prioritized memo to your inbox. It checks two sources every morning: - **Google Calendar** — all events for the full day, sorted chronologically, with ⚡ flags on anything starting within the next 2 hours - **Gmail** — recent unread and important emails, triaged into what needs a reply today (🔴), what's worth knowing (🟡), and any deadlines or time-sensitive threads (⏰) The memo-composer synthesizes those two blocks into a single email with a **Top Priorities** section at the top — specific actions, not vague reminders — and sends it to your inbox. --- ![daily-operating-memo output](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/daily-operating-memo/output.png) --- ## Setup ### 1. Download Friday 1. Go to [hellofriday.ai](https://hellofriday.ai) and download the macOS installer 2. Open the DMG and drag Friday to your Applications folder 3. Launch Friday and complete the initial setup ### 2. Import the workspace 1. Open Friday and go to **Discover Spaces** 2. Find this workspace and click it 3. Click **Add Space** ### 3. Connect Google Calendar and Gmail 1. Go to **MCP Catalog** 2. Go to **Gmail** 3. Under **Credentials**, click **Add one** 4. Connect your account (the memo is sent from and to this account) 5. Repeat this for **Google Calendar** ### 4. Set your recipient email 1. Go to **Agents > memo-composer** 2. In the agent prompt, find: `[ADD EMAIL RECIPIENT HERE]` (appears twice) 3. Replace both instances with your email address Once both steps are done, the schedule will fire automatically on the next weekday at 7:30am Pacific. --- ## What the memo looks like > **Subject: Your Daily Operating Memo — Monday, April 28** > > Good morning. > > Here's what needs your attention today. > > **TOP PRIORITIES** > — Reply to Alex re: Q3 budget (🔴 email, flagged important) > — Prep for 10am product sync (⚡ in 45 min) > > **📅 TODAY'S CALENDAR** > ... > > **📬 EMAIL PRIORITIES** > ... --- ## How to use it It runs automatically. Nothing to trigger, nothing to open. If you want to fire it outside the schedule — say, mid-afternoon for a second look — trigger the `run-daily-memo` signal from the workspace. --- ## How it works ![daily-operating-memo workspace overview in Friday](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/daily-operating-memo/how-it-works.png) | Component | Role | |---|---| | `calendar-fetcher` agent | LLM agent (Claude Haiku) that fetches today's full calendar window in local timezone | | `gmail-fetcher` agent | LLM agent (Claude Haiku) that scans for unread and important emails from the last 1–2 days | | `memo-composer` agent | LLM agent (Claude Sonnet) that synthesizes both blocks and sends the final email | | `daily-memo` job | Three-state FSM: fetch calendar → fetch email → compose and send | | `run-daily-memo` signal | Schedule signal firing at `30 7 * * 1-5` (7:30am Pacific, weekdays only) | | `google-calendar` MCP server | Provides `list_calendars` and `get_events` tools | | `google-gmail` MCP server | Provides `search_gmail_messages`, `get_gmail_messages_content_batch`, and `send_gmail_message` tools | The schedule fires the `run-daily-memo` signal, which starts the `daily-memo` FSM. The FSM runs the three agents in sequence: calendar first, then email, then the composer which sends the final memo and returns a one-line confirmation. --- ## Notes - The calendar fetch uses your local timezone (America/Los_Angeles) for the full-day window — not UTC, so early-morning events aren't missed. - To change the recipient, update the `memo-composer` agent prompt (find and replace both instances of your email address). - All data stays within your Friday workspace and Google OAuth session. Nothing is routed through external services beyond the LLM call and Google's own APIs. - The composer will not fabricate priorities. If your calendar is empty and inbox is clear, it says so. --- URL: https://hellofriday.ai/space/dnd-campaign-manager Source: https://github.com/friday-platform/friday-studio-examples/tree/main/dnd-campaign-manager # DnD Campaign Manager An AI-assisted D&D campaign world manager. Generate context-aware NPCs, spin up side quests, and log session notes — everything builds on what came before, so your world compounds over time. There's no spreadsheet to maintain, no wiki to update after every session. Just describe what you need: - **Generate an NPC** — "I need a corrupt harbormaster who's been quietly skimming from Ledger shipments" — and get a full 5e stat block with cross-references to existing characters - **Generate a side quest** — "Something that draws the party toward the south quarter warehouse" — woven from NPCs already in the roster - **Log a session** — Dump raw notes after the game, and the system updates NPC records, tracks continuity, and saves a clean summary - **View the roster** — Get a world state snapshot: who's alive, who's in custody, what threads are open Every generation reads the current campaign state first. NPCs know about each other. Quests use characters who already exist. The world stays consistent. --- ![dnd-campaign-manager output](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/dnd-campaign-manager/output.png) --- ## Setup ### 1. Download Friday 1. Go to [hellofriday.ai](https://hellofriday.ai) and download the macOS installer 2. Open the DMG and drag Friday to your Applications folder 3. Launch Friday and complete the initial setup ### 2. Import the workspace 1. Open Friday and go to **Discover Spaces** 2. Find this workspace and click it 3. Click **Add Space** Start a chat and share your session notes to seed your campaign history, or jump straight to **Generate NPC** and **Generate Quest** to start populating the world. --- ## How to use it Use the jobs directly from the Friday UI, or trigger them via their HTTP signals. **Generate an NPC:** > "A mid-level Crimson Ledger enforcer who suspects Sable is about to cut him loose" **Generate a quest:** > "Something that finally pays off the south quarter warehouse thread — morally uncomfortable, no clean resolution" **Log a session:** > Paste your raw notes — who showed up, what was invented on the fly, what the party did — and the system handles the rest **View the roster:** > Run it with no prompt for a full world state summary, or ask about a specific character or thread --- ## How it works ![dnd-campaign-manager workspace overview in Friday](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/dnd-campaign-manager/how-it-works.png) | Component | Role | |---|---| | `npc-generator` agent | Reads roster memory, generates a new NPC with full 5e stat block and campaign cross-references | | `quest-generator` agent | Reads NPC roster, generates a side quest using real campaign characters | | `roster-viewer` agent | Produces a world state summary — NPCs, quests, open threads | | `session-logger` agent | Processes freeform session notes, updates NPC records, saves a structured summary | | `notes` memory | Short-term narrative memory — session logs, NPC updates, continuity flags | | `memory` memory | Long-term memory distilled by the system workspace over time | Each job reads the current memory state before generating anything. The roster viewer aggregates everything into a single snapshot. Session logs write back to memory so the next generation is always working from the latest world state. --- ## Current campaign: The Ashford Campaign A city-corruption arc set in Ashford, a port city where real power flows through the docks. Eight sessions in. The Crimson Ledger crime organization has been partially dismantled — one sergeant in custody, one dockmaster at large, one Merchant's Council patron identified but untouchable. Something older called the Pale Compact may be pulling strings above all of them. **Active NPCs include:** Varek Dunnmore, Sera Voss, Harlen Croft, Orvyn Sable, Mira Ashvane, Tommy Ashcart, Renn, Brix, Councillor Aldren Voss, and one horse named Biscuit who is technically evidence. --- ## Notes - All campaign data stays in your Friday workspace memory — nothing is stored externally beyond the LLM call. - The generators will not invent contradictions. If a character is in custody, they're in custody. If a thread is unresolved, it stays unresolved until you log otherwise. - Long-term memory is distilled automatically over time by the system workspace — you don't need to manage continuity manually. - Continuity flags (like NPC name conflicts) are surfaced in session logs rather than silently resolved. The DM decides. --- URL: https://hellofriday.ai/space/fitness-tracker Source: https://github.com/friday-platform/friday-studio-examples/tree/main/fitness-tracker # Fitness Tracker A lifting and nutrition tracking workspace. Log workouts and meals through chat, track daily protein against a 150g goal, and get personalized workout plans that build on your recent session history. No app to open, no form to fill. Just tell it what you did: - "Just did upper body — bench 3x8 185, OHP 3x10 115" - "Had chicken and rice, about 500 cal, 45g protein" - "What's my summary for today?" - "Give me a workout plan for tomorrow" --- ![fitness-tracker output](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/fitness-tracker/output.png) --- ## Setup ### 1. Download Friday 1. Go to [hellofriday.ai](https://hellofriday.ai) and download the macOS installer 2. Open the DMG and drag Friday to your Applications folder 3. Launch Friday and complete the initial setup ### 2. Import the workspace 1. Open Friday and go to **Discover Spaces** 2. Find this workspace and click it 3. Click **Add Space** ### 3. Connect the Telegram communicator 1. Go to your space > **Overview > Info > Communicators** 2. Find the Telegram communicator and connect it Once connected, messages sent to the linked Telegram bot will trigger the workspace automatically. --- ## How to use it Talk to the workspace in chat. Four things you can do: **Log a workout** — describe your session and it's saved to memory: > "Upper body today — bench 3x8 185lb, OHP 3x10 115lb, cable rows 3x12 120lb" **Log a meal** — name the meal and rough macros: > "Lunch was a chicken burrito bowl, ~750 cal, 52g protein, 80g carbs, 8g fiber" **Daily summary** — get a snapshot of today's nutrition and workouts vs your 150g protein goal: > "What's today's summary?" **Workout plan** — get a personalized plan based on your recent session history: > "Plan my next workout — no barbell today" --- ## How it works ![fitness-tracker workspace overview in Friday](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/fitness-tracker/how-it-works.png) | Component | Role | |---|---| | `log-workout-agent` | Parses workout descriptions and writes session records to memory | | `log-meal-agent` | Parses meal descriptions with calories, protein, carbs, and fiber, then writes to memory | | `daily-summary-agent` | Reads today's logs and generates a nutrition and workout summary vs the 150g protein goal | | `workout-planner-agent` | Reads recent session history and generates a personalized next-session plan | ### Signals | Signal | Trigger | |---|---| | `log-workout` | Manual — describe a lifting session | | `log-meal` | Manual — describe a meal with macros | | `daily-summary` | Manual — request today's summary | | `generate-workout-plan` | Manual — request a new workout plan | ### Memory stores | Store | Purpose | |---|---| | `notes` (short-term, narrative) | Rolling log of workouts and meals within the current period | | `memory` (long-term, narrative) | Longer-term history distilled over time | --- ## Notes - Protein goal is 150g/day — hardcoded in the `daily-summary-agent` prompt. Change it there to adjust. - Workout history is read by the planner to alternate upper/lower days and avoid repeating the same movements back-to-back. - The planner respects preferences passed at run time: "short session," "focus on hypertrophy," "no barbell." - All data stays in your Friday workspace memory — nothing is sent externally beyond the LLM call. - Long-term memory is distilled automatically over time — no manual continuity management needed. --- URL: https://hellofriday.ai/space/github-digest Source: https://github.com/friday-platform/friday-studio-examples/tree/main/github-digest # GitHub Digest A scheduled pull request briefing workspace. Every Monday and Thursday at 8:30am Pacific, it scans GitHub for your open PRs and pending review requests, and surfaces a clean digest — no dashboard to open, no GitHub inbox to scan. The digest is organized into three sections: - **Your Open PRs** — title, repo, URL, age, and current review status (approved / changes requested / awaiting) - **Review Requested** — PRs where you're asked to review, with title, repo, URL, and author - **Summary** — one sentence on total counts and any urgent items --- ![github-digest output](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/github-digest/output.png) --- ## Setup ### 1. Download Friday 1. Go to [hellofriday.ai](https://hellofriday.ai) and download the macOS installer 2. Open the DMG and drag Friday to your Applications folder 3. Launch Friday and complete the initial setup ### 2. Import the workspace 1. Open Friday and go to **Discover Spaces** 2. Find this workspace and click it 3. Click **Add Space** ### 3. Connect GitHub GitHub Digest uses the GitHub MCP server, which needs a personal access token to query your PRs and review requests. **Generate a token** 1. Go to [github.com/settings/tokens](https://github.com/settings/tokens) 2. Click **Generate new token (classic)** 3. Give it a name (e.g. `friday-digest`) 4. Select the following scopes: - `repo` — to read pull requests across your repos - `read:user` — to resolve your GitHub username automatically 5. Click **Generate token** and copy it — you won't see it again **Connect it in Friday** 1. Open the imported workspace and start a chat 2. Friday will detect that GitHub needs credentials and surface a **Connect GitHub** prompt 3. Paste your token when asked 4. You're connected — no further setup needed ### 4. That's it No email recipient to configure, no additional MCP servers to enable. The digest runs against your authenticated GitHub account and outputs directly to the workspace session. --- ## What the digest looks like > **Your Open PRs** > > - [Fix auth token refresh](https://github.com/...) — `my-org/api` — 3 days old — awaiting review > > **Review Requested** > > - [Add rate limiting middleware](https://github.com/...) — `my-org/api` — by @colleague > > **Summary** > 1 open PR, 1 review pending. No urgent items. --- ## How to use it It runs automatically. Nothing to trigger, nothing to open. The digest fires every **Monday and Thursday at 8:30am Pacific** (cron: `30 8 * * 1,4` in `America/Los_Angeles`). --- ## How it works ![github-digest workspace overview in Friday](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/github-digest/how-it-works.png) | Component | Role | |---|---| | `github-digest-agent` | LLM agent (Claude Opus) that queries GitHub for your open PRs and review requests, then formats a Markdown digest | | `github-digest-job` | Three-state FSM: idle → run agent → done | | `github-digest-schedule` | Schedule signal firing at `30 8 * * 1,4` in `America/Los_Angeles` (8:30am Pacific, Monday and Thursday) | | `github` MCP server | Provides `get_me`, `search_pull_requests`, and `pull_request_read` tools | The schedule fires the `github-digest-schedule` signal, which starts the `github-digest-job` FSM. The FSM runs `github-digest-agent` in a single step, which calls GitHub MCP tools in sequence — get the authenticated user, search authored PRs, search review-requested PRs — then renders the digest and stores it in `digest-result`. --- ## Notes - The agent calls `get_me` first to resolve your GitHub login dynamically — no hardcoded username required. - If a section is empty (no open PRs, no review requests), the agent says so explicitly rather than omitting it. - The schedule is configured in `America/Los_Angeles` so it fires at 8:30am Pacific year-round, automatically adjusting for daylight saving time. To change it, edit the `timezone` and `schedule` fields under `signals.github-digest-schedule.config` in `workspace.yml`. - All data stays within your Friday workspace and GitHub OAuth session. --- URL: https://hellofriday.ai/space/github-pr-reviewer Source: https://github.com/friday-platform/friday-studio-examples/tree/main/github-pr-reviewer # PR Reviewer An on-demand pull request review workspace. Paste a GitHub PR URL in chat, and the reviewer fetches the code, analyzes it for bugs, security issues, and style problems, then posts an inline review directly on the PR. When triggered, it: - **Reads the PR** — fetches metadata: title, body, author, base/head branches, and changed files - **Reads each changed file** — pulls the current file contents to understand full context, not just the diff - **Analyzes the changes** for: - Correctness and logic bugs - Security issues (injection, auth, secret exposure) - Performance concerns - Code style and maintainability - Missing tests or edge cases - **Posts an inline GitHub review** — specific comments at the relevant file and line, plus a summary verdict (APPROVE / REQUEST_CHANGES / COMMENT) --- ![github-pr-reviewer output](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/github-pr-reviewer/output.png) --- ## Setup ### 1. Download Friday 1. Go to [hellofriday.ai](https://hellofriday.ai) and download the macOS installer 2. Open the DMG and drag Friday to your Applications folder 3. Launch Friday and complete the initial setup ### 2. Import the workspace 1. Open Friday and go to **Discover Spaces** 2. Find this workspace and click it 3. Click **Add Space** ### 3. Connect GitHub GitHub PR Reviewer uses the GitHub MCP server, which needs a personal access token to query your PRs and review requests. **Generate a token** 1. Go to [github.com/settings/tokens](https://github.com/settings/tokens) 2. Click **Generate new token (classic)** 3. Give it a name (e.g. `friday-digest`) 4. Select the following scopes: - `repo` — to read pull requests across your repos - `read:user` — to resolve your GitHub username automatically 5. Click **Generate token** and copy it — you won't see it again **Connect it in Friday** 1. Open the imported workspace and start a chat 2. Friday will detect that GitHub needs credentials and surface a **Connect GitHub** prompt 3. Paste your token when asked 4. You're connected — no further setup needed ### 4. Run your first review Once GitHub is connected, open the workspace, start a chat, and paste in any PR URL. The reviewer will fetch the code, analyze it, and post the review directly to the PR. --- ## What the review looks like The reviewer posts directly to the GitHub PR as a formal review, with: - Inline comments on specific lines with explanations and suggestions - A summary comment with an overall verdict and key findings grouped by severity - A clear APPROVE, REQUEST_CHANGES, or COMMENT review state --- ## How to use it Trigger the `review-pr` signal from the Friday UI and paste in the PR URL when prompted. --- ## How it works ![github-pr-reviewer workspace overview in Friday](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/github-pr-reviewer/how-it-works.png) | Component | Role | |---|---| | `pr-reviewer` agent | LLM agent (Claude Opus 4.6) that reads the PR, analyzes changes, and posts the inline review | | `review-pr-job` job | Single-state FSM that runs the `pr-reviewer` agent with the provided PR URL | | `review-pr` signal | HTTP signal that accepts a `pr_url` and starts the review job | | `github` MCP server | Provides PR read, file contents, review write, and comment tools | The `review-pr` HTTP signal fires the `review-pr-job` FSM, which immediately runs the `pr-reviewer` agent. The agent calls the GitHub MCP tools in sequence: read PR → read files → create pending review → add inline comments → submit. ### GitHub tools used - `github/pull_request_read` — fetches PR metadata - `github/list_commits` — lists commits in the PR - `github/get_file_contents` — reads current file contents - `github/pull_request_review_write` — creates and submits the review - `github/add_comment_to_pending_review` — adds inline comments to the pending review - `github/add_issue_comment` — posts general comments if needed - `github/search_code` — searches the codebase for context when needed --- ## Notes - The reviewer uses **Claude Opus 4.6** at temperature 0.3 — thorough and consistent, not creative. - It reads full file contents, not just the diff, so it can spot issues that only make sense in context. - Reviews are posted under the GitHub account you connected — make sure that account has write access to the repo. - The reviewer will not invent findings. If the code looks clean, it says so and approves. - There is no schedule — every review is triggered manually via the signal or HTTP endpoint. --- URL: https://hellofriday.ai/space/google-sheets-query Source: https://github.com/friday-platform/friday-studio-examples/tree/main/google-sheets-query # Google Sheets Query A natural language interface for your Google Sheets data. Ask questions in plain English and get direct answers — no formula bar to navigate, no pivot tables to build. Point it at a sheet and ask anything: - **List spreadsheets** — if you don't specify one, the agent surfaces what's available - **Explore structure** — reads sheet names, ranges, and layout before answering so it understands what it's working with - **Read and answer** — pulls the relevant data and responds directly, citing the spreadsheet name, sheet name, and range it used - **Remember context** — saves key findings to memory so follow-up questions can reference what was already found --- ![google-sheets-query output](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/google-sheets-query/output.png) --- ## Setup ### 1. Download Friday 1. Go to [hellofriday.ai](https://hellofriday.ai) and download the macOS installer 2. Open the DMG and drag Friday to your Applications folder 3. Launch Friday and complete the initial setup ### 2. Import the workspace 1. Open Friday and go to **Discover Spaces** 2. Find this workspace and click it 3. Click **Add Space** ### 3. Connect Google Sheets 1. Go to **MCP Catalog → Google Sheets** 2. Under **Credentials**, click **Add one** 3. Follow the OAuth flow to grant access to your Google account Once connected, the agent can immediately list and read any spreadsheet your Google account has access to. --- ## What a query looks like > **You:** What were total sales by region last quarter? > > **Agent:** Based on the "Q3 Sales" sheet in your "2024 Revenue" spreadsheet (rows 2–847), here's the breakdown by region... --- ## How to use it Ask questions directly in chat — the `Query sheet job` tool is available in every conversation in this workspace. If you don't specify a spreadsheet, the agent lists what it has access to first. To trigger it programmatically or from an external system, POST to the `query-sheet` HTTP signal at `/query-sheet` with a JSON body: ```json { "question": "What are the top 5 rows by revenue?", "spreadsheet": "My Sales Data" } ``` `spreadsheet` is optional. If omitted, the agent will list available sheets and pick the most relevant one. --- ## How it works ![google-sheets-query workspace overview in Friday](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/google-sheets-query/how-it-works.png) | Component | Role | |---|---| | `sheets-query-agent` | LLM agent (Claude Sonnet) that lists, explores, and reads spreadsheets, then answers the question | | `query-sheet-job` | Two-state FSM: receive question → run agent → return answer | | `query-sheet` signal | HTTP signal accepting `question` (required) and `spreadsheet` (optional) at `/query-sheet` | | `google-sheets` MCP server | Provides `list_spreadsheets`, `get_spreadsheet_info`, `read_sheet_values`, and `list_sheet_tables` tools | The `query-sheet` signal triggers `query-sheet-job`, which runs `sheets-query-agent`. The agent calls the Google Sheets MCP tools in sequence — list if needed, inspect structure, read data — then returns a direct answer with source attribution. --- ## Notes - The agent always cites which spreadsheet, sheet, and range it read from so you can verify. - Key findings are saved to the workspace's `notes` memory, so follow-up questions in the same session can reference earlier results without re-reading the sheet. - If you ask about a spreadsheet that isn't connected to your Google account, the agent will say so plainly rather than guessing. - All data stays within your Friday workspace and Google OAuth session. Sheet contents are read only during the agent's turn and are not stored beyond memory notes you explicitly ask it to save. --- URL: https://hellofriday.ai/space/inbox-zero Source: https://github.com/friday-platform/friday-studio-examples/tree/main/inbox-zero # Inbox Zero An interactive inbox triage and autopilot workspace. Manually review emails one-by-one with letter-key actions, or let the autopilot run every morning at 8am Pacific — classifying up to 25 unread emails, auto-acting on high-confidence ones, and writing a markdown report so you stay in the loop. Two modes: **Interactive Triage** — pull the 10 most recent unread emails and walk through them one at a time. For each email you get a summary card and five actions: - **(A) Archive** — removes the email from your inbox - **(K) Keep** — leaves it untouched, moves to the next - **(U) Mark Unread** — re-marks as unread, moves on - **(D) Delete** — sends it to trash - **(S) Unsubscribe** — surfaces the unsubscribe link and archives the email After all 10, the workspace saves your triage patterns to the `preferences` memory store. The next time you triage, it reads those preferences back and suggests the likely action next to each email `[suggested]`. **Autopilot** — runs automatically every day at 8am Pacific. Fetches up to 25 unread emails, classifies each with a confidence score (0.0–1.0), and auto-acts on anything at **0.85 or above**. Emails below that threshold are left untouched and flagged in the report under "Needs Review." After processing, it writes a markdown report to `~/inbox-zero-reports/report-{YYYY-MM-DD-HH-MM}.md` covering every action taken, skipped emails, and any unsubscribe links found. --- ![inbox-zero output](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/inbox-zero/output.png) --- ## Setup ### 1. Download Friday 1. Go to [hellofriday.ai](https://hellofriday.ai) and download the macOS installer 2. Open the DMG and drag Friday to your Applications folder 3. Launch Friday and complete the initial setup ### 2. Import the workspace 1. Open Friday and go to **Discover Spaces** 2. Find this workspace and click it 3. Click **Add Space** ### 3. Connect Gmail The workspace uses your Gmail account both to read emails and to apply label changes (archive, delete, etc.). 1. Go to **Integrations** in the workspace sidebar 2. Find **Gmail** and click **Connect** 3. Authenticate with the Google account you want to manage ### 4. Set your email address Both agents have a placeholder `[INSERT EMAIL RECIPIENT HERE]` in their prompts that tells them which inbox to operate on. 1. Go to **Agents > inbox-reviewer**, find and replace `[INSERT EMAIL RECIPIENT HERE]` with your email address 2. Go to **Agents > inbox-autopilot**, do the same Once those two steps are done, both modes are ready. --- ## What the triage looks like > ───────────────────────────────────────── > [#1 of 10] Subject: Your weekly newsletter > From: hello@example.com > Date: Tue, Apr 29 > Preview: This week in the world of... > ───────────────────────────────────────── > (A) Archive [suggested] (K) Keep (U) Mark Unread (D) Delete (S) Unsubscribe Type a letter and hit enter. The action fires, the next email loads. --- ## How to use it **Interactive triage** — trigger the `triage-inbox` signal from the workspace, or just ask in chat to start going through your unreads. Either way, you'll be walked through your 10 most recent unread emails one by one. **Autopilot** — runs automatically every day at 8am Pacific. Nothing to trigger. After each run, a markdown report lands in `~/inbox-zero-reports/`. If you want to fire the autopilot outside the schedule, trigger the `autopilot-inbox` signal manually from the workspace. --- ## How it works ![inbox-zero workspace overview in Friday](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/inbox-zero/how-it-works.png) | Component | Role | |---|---| | `inbox-reviewer` agent | LLM agent (Claude Sonnet) that fetches your 10 most recent unreads, presents each with a summary card, applies your chosen action, and saves preference patterns to memory | | `inbox-autopilot` agent | LLM agent (Claude Sonnet) that fetches up to 25 unreads, scores each with a confidence level, auto-acts on anything ≥ 0.85, and writes a markdown report | | `triage-inbox-job` | Single-state FSM that triggers `inbox-reviewer` on the `triage-inbox` signal | | `autopilot-inbox-job` | Single-state FSM that triggers `inbox-autopilot` on the `autopilot-inbox` signal | | `triage-inbox` signal | HTTP signal — trigger manually from the workspace to start a triage session | | `autopilot-inbox` signal | Schedule signal firing at `0 8 * * *` (8am Pacific, every day) | | `google-gmail` MCP server | Provides `search_gmail_messages`, `get_gmail_messages_content_batch`, `get_gmail_message_content`, and `modify_gmail_message_labels` tools | The `autopilot-inbox` schedule fires daily at 8am, starting the `autopilot-inbox-job` FSM. That invokes the `inbox-autopilot` agent, which classifies your inbox, acts, and writes the report. Interactive triage works the same way but triggered manually — you fire `triage-inbox`, which starts `triage-inbox-job` and invokes `inbox-reviewer` for a live back-and-forth in this chat. --- ## Memory stores | Store | Purpose | |---|---| | `preferences` (long-term, narrative) | Accumulates triage patterns — senders you always archive, domains you delete, people you always keep. Both agents read this at the start of every run to inform suggestions and confidence scoring. | | `notes` (short-term, narrative) | General workspace scratch memory | | `memory` (long-term, narrative) | General long-term workspace memory | The preference store is what makes the autopilot smarter over time. The more triage sessions you run, the more patterns it accumulates, and the higher confidence scores it assigns to familiar senders. --- ## Notes - The autopilot does **not** auto-act below 0.85 confidence. Anything ambiguous is left untouched and listed in the report's "Needs Review" section. - To change the auto-act threshold, update the `inbox-autopilot` agent prompt. - Unsubscribe actions in triage surface the link to you rather than clicking it automatically. In autopilot mode, they archive the email and note the URL in the report. - The autopilot runs at 8am Pacific every day — including weekends. If you want weekdays only, change the schedule on the `autopilot-inbox` signal to `0 8 * * 1-5`. - All data stays within your Friday workspace and Google OAuth session. Gmail actions are applied through your own authenticated account via the Google Gmail API. - Reports accumulate in `~/inbox-zero-reports/` with timestamped filenames — they are not automatically cleaned up. --- URL: https://hellofriday.ai/space/networking-crm Source: https://github.com/friday-platform/friday-studio-examples/tree/main/networking-crm # Networking CRM A relationship tracking workspace. Send it a message via Telegram to log an interaction, add context about a contact, ask what you know about someone, or find out who you should be following up with — and it keeps your network warm over time. There's no form to fill in, no spreadsheet to maintain. Just message it the way you'd message a colleague: - **Log an interaction** — "Had coffee with James today, he's exploring a new role, follow up in two weeks" - **Add context about a contact** — "Sarah just moved to Head of Product at Stripe" - **Ask about a contact** — "What do I know about Marcus?" or "When did I last talk to the Acme team?" - **Surface follow-ups** — "Who should I be following up with this week?" or "Who have I been neglecting?" The assistant stores everything in a narrative memory — contact name, company/role, date, what happened, commitments made, and next follow-up action. It reads that memory to answer questions and proactively suggests who's due for a touchpoint based on relationship context. --- ![networking-crm output](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/networking-crm/output.png) --- ## Setup ### 1. Download Friday 1. Go to [hellofriday.ai](https://hellofriday.ai) and download the macOS installer 2. Open the DMG and drag Friday to your Applications folder 3. Launch Friday and complete the initial setup ### 2. Import the workspace 1. Open Friday and go to **Discover Spaces** 2. Find this workspace and click it 3. Click **Add Space** ### 3. Connect the Telegram communicator 1. Go to **Overview > Info > Communicators** 2. Find the Telegram communicator and connect it Once connected, messages sent to the linked Telegram bot will trigger the CRM assistant automatically. --- ## How to use it Once set up, message the workspace's Telegram bot. No commands, no syntax — plain English works. **Examples:** > "Caught up with Nina yesterday — she's leaving her current role and exploring something new. I said I'd make an intro to the Horizon team." > "What's the latest with Ben?" > "Who have I not talked to in a while?" > "Remind me what I need to follow up on." The assistant will confirm every save, answer questions directly from what's been logged, and flag contacts that need a nudge. It'll also factor in relationship strength when suggesting timing — a warm lead gets a tighter cycle than a casual connection. --- ## How it works ![networking-crm workspace overview in Friday](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/networking-crm/how-it-works.png) | Component | Role | |---|---| | `crm-assistant` agent | LLM agent (Claude Sonnet) that reads and writes relationship memory | | `crm-interact` job | FSM job triggered by incoming Telegram messages | | `notes` memory | Short-term narrative memory where interaction logs are stored | | `memory` memory | Long-term memory distilled by the system workspace over time | The Telegram communicator routes incoming messages into the `crm-interact` job. The job invokes the `crm-assistant`, which decides whether to save a new entry, answer a question, or surface follow-ups — then responds back to you in Telegram. --- ## Notes - All contact data stays in your Friday workspace memory — nothing is sent to external services beyond the LLM call. - The assistant will not fabricate relationship details. If it doesn't know something, it says so. - Long-term memory is distilled automatically over time by the system workspace — you don't need to manage it. --- URL: https://hellofriday.ai/space/personal-knowledge-base Source: https://github.com/friday-platform/friday-studio-examples/tree/main/personal-knowledge-base # Personal Knowledge Base Feed it URLs and PDFs and it indexes them locally with vector embeddings; ask questions and it answers from the indexed material with cited sources. Everything runs on your machine — embeddings, vector search, the database itself — only the answer synthesis call goes to Anthropic. --- ![how it works](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/personal-knowledge-base/how-it-works.png) --- ## Setup ### 1. Download Friday 1. Go to [hellofriday.ai](https://hellofriday.ai) and download the macOS installer 2. Open the DMG and drag Friday to your Applications folder 3. Launch Friday and complete the initial setup ### 2. Import the workspace 1. Open Friday and go to **Discover Spaces** 2. Find **Personal Knowledge Base** and click it 3. Click **Add Space** ### 3. First-run dependencies The two Python agents bring their own dependencies via `pyproject.toml`. The first time you trigger ingestion or a query, Friday runs `uv` to: - Provision a Python 3.12 interpreter under `~/.friday/local/uv/python/` - Install `sentence-transformers`, `sqlite-vec`, and `pymupdf` into a cached environment - Download the `BAAI/bge-large-en-v1.5` embedding model (~1.3 GB) from HuggingFace into `~/.cache/huggingface/` This is one-time per host and takes a couple of minutes. Subsequent runs are fast. No manual `pip` or `venv` step. > **The model download is ~1.3 GB.** On a slow or flaky connection it can stall. If it does, set `HF_HUB_DISABLE_XET=1` in Friday's environment and retrigger — it switches HuggingFace to the plain HTTP downloader, which is more resilient to interrupted transfers. ### 4. Make sure Python can load SQLite extensions `sqlite-vec` is a **loadable SQLite extension**, so the agents need a Python whose `sqlite3` module was compiled with extension support. The default macOS system Python and the python.org 3.12 build ship **without** it, and `uv run --python 3.12` may select one of those. When that happens, the agents fail immediately with a clear error: > This Python lacks SQLite loadable-extension support, which sqlite-vec requires… The fix is one command — install a uv-managed CPython, which has extension support enabled: ```bash uv python install 3.12 ``` Then retrigger the workspace. `requires-python = ">=3.12"` in each agent's `pyproject.toml` only gates the version, not the build flag, so this can't be caught at install time — the preflight guard catches it at runtime instead. ### 5. That's it No API keys to configure beyond Anthropic (already set during Friday setup). No external services. The vector DB lives at `~/.friday/local/workspaces/personal-knowledge-base/kb.db`. --- ## How to use it All three workflows are on-demand HTTP signals. Trigger them from the Friday chat, the Run-now button on the space dashboard, or any external HTTP client. ### Ingest a URL Hit `/ingest-url` with a single `url` parameter: | Parameter | Required | Description | Example | |---|---|---|---| | `url` | Yes | Page to fetch and index | `"https://example.com/article"` | The agent fetches the page, strips HTML, chunks the text (~500 chars with 50-char overlap), embeds each chunk, and writes both chunks and vectors to SQLite. Duplicate URLs are skipped. **Example — in the Friday chat:** > Trigger ingest-url: url "https://en.wikipedia.org/wiki/Vector_database" ### Ingest a PDF Drop a PDF into a chat (this uploads it as an artifact), then trigger `/ingest-pdf`: | Parameter | Required | Description | Example | |---|---|---|---| | `artifact_id` | Yes | UUID of the uploaded PDF artifact | `"a1b2c3d4-..."` | | `source_label` | No | Human-readable name shown in citations | `"Q3 board deck"` | The agent locates the upload by content hash, extracts text with `pymupdf`, then chunks + embeds + stores like the URL flow. ### Query Hit `/query-kb` with a question: | Parameter | Required | Description | Example | |---|---|---|---| | `question` | Yes | Natural-language question to answer from the corpus | `"what does the Q3 deck say about churn?"` | The agent embeds the question with the BGE retrieval prefix, runs an ANN search in `sqlite-vec` for the top 10 chunks, and asks Claude Sonnet to synthesize a grounded answer with `[1]`-style citations and a `sources_consulted` list. --- ## How it works | Component | Role | |---|---| | `ingest-url` / `ingest-pdf` / `query-kb` signals | HTTP triggers at the matching paths | | `ingest-url` job | Two-state FSM: `idle` → `ingest` | | `ingest-pdf` job | Two-state FSM: `idle` → `ingest` | | `query-kb` job | Two-state FSM: `idle` → `answer` | | `url-ingester`, `pdf-ingester` | Both point at the `kb-ingest-agent` Python agent — same code, different signal payloads | | `kb-query` | Points at the `kb-query-agent` Python agent | | `kb-ingest-agent` | Python user agent: chunks content, embeds with BGE, writes to SQLite + `sqlite-vec`. Uses `pymupdf` for PDF text extraction. | | `kb-query-agent` | Python user agent: embeds the question, runs ANN search via `sqlite-vec` `MATCH` query, hands the top 10 chunks to Claude Sonnet for synthesis. | | `knowledge-base` long-term memory | Narrative log of every successful ingestion (source, title, doc_id, chunk count) — useful for "what have I ingested?" queries via chat. | The DB schema is three tables: `documents` (one row per ingested source), `chunk_metadata` (chunk text + foreign key), and `chunk_embeddings` (a `vec0` virtual table holding 1024-dim float vectors). The `kb-query-agent` joins the vector match against `chunk_metadata` and `documents` to surface source titles in the synthesized answer. --- ## Notes - **Storage paths are configurable.** Set `KB_DB_PATH` in Friday's environment to move the SQLite DB; set `FRIDAY_UPLOADS_ROOT` to point the PDF locator at a non-default `$FRIDAY_HOME/scratch/uploads`. - **PDF locator strategy.** The ingest agent tries four strategies to read a PDF artifact: contentRef SHA-256 lookup in the uploads tree, generic scan of recent uploads, `parse_artifact` via the SDK, then inline artifact contents. The cascade exists because the Friday daemon's artifact API has historically returned content in several shapes — the agent handles all of them. - **Embedding model.** `BAAI/bge-large-en-v1.5` produces 1024-dim normalized vectors. The query agent prepends BGE's recommended `"Represent this sentence for searching relevant passages: "` instruction to questions but not to passages — matching the model card. - **All embedding and search happens locally.** The only external call is Anthropic's API for answer synthesis, and only the top-10 retrieved chunks are sent (no full-document upload). - **Memory mounts** include read-only access to `user/narrative/notes` and `user/narrative/memory` — your global notes and long-term memory across all workspaces. The agents don't currently use them, but they're available if you extend the prompts to cross-reference your own notes with the knowledge base. --- URL: https://hellofriday.ai/space/rtx-price-monitor Source: https://github.com/friday-platform/friday-studio-examples/tree/main/rtx-price-monitor # RTX Price Monitor A GPU price alert workspace. Every hour, it scrapes RTX 5080 listings from major retailers, checks for prices under $1,400, and sends you a Gmail alert if any qualifying listings are found. > This workspace is set up for RTX 5080s, but it's not hard-coded to them. If you want to track something else — a different GPU, a piece of furniture, concert tickets, whatever — just ask Friday in chat and it will reconfigure the workspace for you. It checks four retailers on the hour: - **Best Buy, Newegg, Amazon, B&H Photo** — scraped for current price, availability status, and direct purchase URL, focused specifically on the RTX 5080 (not 5080 Super, not 5090) If any listing comes back in-stock and under $1,400, you get an email with the retailer, product name, price, availability, and a direct link to buy. If nothing qualifies, nothing is sent. --- ![rtx-price-monitor output](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/rtx-price-monitor/output.png) --- ## Setup ### 1. Download Friday 1. Go to [hellofriday.ai](https://hellofriday.ai) and download the macOS installer 2. Open the DMG and drag Friday to your Applications folder 3. Launch Friday and complete the initial setup ### 2. Import the workspace 1. Open Friday and go to **Discover Spaces** 2. Find this workspace and click it 3. Click **Add Space** ### 3. Connect Gmail 1. Go to **MCP Catalog → Gmail** 2. Under **Credentials**, click **Add one** 3. Follow the OAuth flow to grant access to your Google account (alerts are sent from and to this account) ### 4. Set your recipient email 1. Go to **Agents > rtx-alert-emailer** 2. In the agent prompt, find: `[ADD EMAIL RECIPIENT HERE]` 3. Replace it with your email address Once both steps are done, the schedule fires automatically at the top of every hour. --- ## What the alert looks like > **Subject: RTX 5080 Alert: Sub-$1400 listing found!** > > An automated price monitor found the following RTX 5080 listings under $1,400: > > **Newegg** — ASUS TUF Gaming GeForce RTX 5080 > Price: $1,349 | In Stock > Link: https://www.newegg.com/... > > *(Found by your Friday RTX Price Monitor — running hourly)* If no listings qualify, no email is sent. --- ## How to use it It runs automatically. Nothing to trigger, nothing to open. If you want to run a check immediately outside the hourly schedule, trigger the `rtx-price-check-cron` signal from the workspace. --- ## How it works ![rtx-price-monitor workspace overview in Friday](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/rtx-price-monitor/how-it-works.png) | Component | Role | |---|---| | `rtx-price-scraper` agent | Bundled web agent that searches Best Buy, Newegg, Amazon, and B&H for current RTX 5080 listings and returns structured price data | | `rtx-alert-emailer` agent | LLM agent (Claude Sonnet) that reviews the scraped data and sends a Gmail alert if any listing is under $1,400 and in stock | | `rtx-price-monitor` job | Two-state FSM: scrape prices → evaluate and alert | | `rtx-price-check-cron` signal | Schedule signal firing at `0 * * * *` in `America/Los_Angeles` (top of every hour, Pacific) | | `google-gmail` MCP server | Provides `send_gmail_message` for outbound alerts | The cron signal fires the `rtx-price-monitor` FSM. The FSM runs the scraper first, passes its output to the emailer, and the emailer decides whether to send — or stays silent if nothing qualifies. --- ## Notes - The price threshold is $1,400. To change it, update the `rtx-alert-emailer` prompt with your preferred ceiling. - The scraper targets the RTX 5080 specifically — not the 5080 Super or 5090. If you want to track a different model, update the `rtx-price-scraper` prompt. - No email is sent on clean runs. You'll only hear from this workspace when something actionable turns up. - To change the recipient, update the `rtx-alert-emailer` agent prompt and replace the email address. - All data stays within your Friday workspace and Google OAuth session. Nothing is routed through external services beyond the LLM call, Google's own APIs, and the public retailer pages being scraped. --- URL: https://hellofriday.ai/space/san-diego-surf-watch Source: https://github.com/friday-platform/friday-studio-examples/tree/main/san-diego-surf-watch # San Diego Surf Watch A surf conditions monitor for San Diego area beaches. Every 30 minutes, it checks wave height, period, wind, and swell direction across 9 beaches from Ocean Beach to Oceanside, evaluates whether conditions are worth paddling out, and saves an alert to memory when they are. It covers: - **Wave height** — filtered to 3 feet or larger - **Wave period** — 8 seconds or longer for clean, organized swell - **Wind** — offshore or light (under 10 mph); flags choppy onshore wind above 15 mph as poor - **Swell direction** — NW, W, or SW (optimal for San Diego's south-facing beaches) Good conditions trigger a `SURF ALERT` entry in long-term memory. Poor conditions log a one-liner to notes and move on. --- ![screenshot](https://raw.githubusercontent.com/friday-platform/friday-studio-examples/main/assets/san-diego-surf-watch/output.png) --- ## Setup ### 1. Download Friday 1. Go to [hellofriday.ai](https://hellofriday.ai) and download the macOS installer 2. Open the DMG and drag Friday to your Applications folder 3. Launch Friday and complete the initial setup ### 2. Import the workspace 1. Open Friday and go to **Discover Spaces** 2. Find this workspace and click it 3. Click **Add Space** ### 3. That's it No credentials required. The workspace uses a web agent to check public surf forecast sites (Surfline, Magic Seaweed, and similar). No API key, no OAuth flow. --- ## What a surf alert looks like When conditions meet the threshold, the evaluator writes to memory: > **SURF ALERT:** Swamis (Encinitas) — 4–5 ft, 12 sec period, light NW wind, W swell. Clean lines, waist-to-head high. Worth paddling out before 10am. Poor conditions log a note instead: > Surf check 07:30: conditions poor — 1–2 ft wind swell, 13 mph onshore SW wind. --- ## How to use it It runs automatically every 30 minutes. Nothing to trigger, nothing to open. To check conditions on demand, open the workspace chat and ask Friday what the surf looks like. The evaluator has all prior check results in memory and can answer without running a new web search. --- ## How it works | Component | Role | |---|---| | `surf-checker` | Atlas web agent — searches Surfline, Magic Seaweed, and similar sites for current conditions at 9 San Diego area beaches | | `surf-evaluator` | LLM agent (Claude Sonnet) — applies good/poor criteria, decides whether to alert, writes one memory entry | | `surf-watch` job | Sequential two-agent execution: checker runs first, evaluator runs on its output | | `surf-check-cron` signal | Schedule signal firing every 30 minutes (`*/30 * * * *`) | The cron fires `surf-watch`, which runs `surf-checker` then `surf-evaluator` in sequence. The checker returns structured conditions for all beaches. The evaluator applies the criteria, picks the best beach if conditions qualify, and writes exactly one memory entry — a `SURF ALERT` to `memory` (long-term) if good, or a brief note to `notes` (short-term) if not. --- ## Notes - Beaches covered: Ocean Beach, Mission Beach, Pacific Beach, La Jolla Shores, Del Mar, Solana Beach, Swamis (Encinitas), Carlsbad, Oceanside. - The evaluator is instructed to write exactly one memory entry per run — no flooding your memory store with 48 identical poor-condition entries per day. - The workspace is configured for David Woolf in San Diego. To change the persona or the good-surf thresholds, edit the `surf-evaluator` prompt in `workspace.yml`. - The cron runs on UTC. Adjust the `timezone` field in `workspace.yml` under `signals.surf-check-cron.config` if you want the schedule expressed in local time. - All data stays within your Friday workspace and public surf forecast sites. No external services beyond the LLM call and web search. --- # Communicators --- URL: https://hellofriday.ai/communicator/discord Docs: https://docs.hellofriday.ai/guides/communicators/discord # Discord - DMs and channel `@mentions` create chats in Studio with a Discord badge, and replies route back automatically. - Friday opens an outbound gateway connection to Discord, so no public webhook or tunnel is required — the bot works from a laptop. - Setup: register a Discord application, generate a bot token alongside the application ID and public key, then enable the **Message Content Intent** so the bot can read what users send. - Paste credentials into Studio's Communicators card and use the OAuth2 invite URL to drop the bot into any server you administer. - Messaging only — slash commands and button handlers aren't supported. Replies to channel mentions land in a thread to keep timelines tidy. --- URL: https://hellofriday.ai/communicator/slack Docs: https://docs.hellofriday.ai/guides/communicators/slack # Slack - DMs and `@mentions` flow into the same conversation pipeline as web chat — each thread appears in Studio with a blue **SLACK** badge. - Channel posts only trigger the bot when it's explicitly tagged, so it never butts in on unrelated discussions. - Setup: create an OAuth app from a manifest at `api.slack.com`, install it to a workspace, then paste the App ID, Signing Secret, and Bot Token into Studio. - Friday's bundled tunnel provides the public HTTPS URL Slack uses for event verification and delivery. - For headless deployments, credentials can also be set via `workspace.yml` or environment variables. --- URL: https://hellofriday.ai/communicator/teams Docs: https://docs.hellofriday.ai/guides/communicators/teams # Microsoft Teams - DMs and channel `@mentions` create chats in Studio with a **TEAMS** badge, and replies route back to Teams without extra wiring. - Setup: provision an Azure Bot resource (the F0 tier is free), capture the Microsoft App ID, client secret, and tenant ID. - Assemble a Teams app package with a manifest and icons; Friday's tunnel supplies the messaging endpoint Azure points at (`/platform/teams`). - Studio's Communicators card stores credentials securely. - Watch out: the `SingleTenant` vs `MultiTenant` setting must match between Azure and Studio, or outbound replies will fail to authorize. --- URL: https://hellofriday.ai/communicator/telegram Docs: https://docs.hellofriday.ai/guides/communicators/telegram # Telegram - DM the bot from your phone and the message lands in Studio with a green **TELEGRAM** badge — replies route back to Telegram instantly. - The lightest-weight communicator: no app manifest, no OAuth flow, no scopes to manage. - Setup: talk to BotFather to create a bot, copy the resulting token, and paste it into Studio's Communicators card. - Studio stores the token securely and registers the webhook with Telegram automatically; the bundled tunnel provides the public HTTPS endpoint Telegram needs. - For scripted setups, the token can live in `workspace.yml` or an environment variable, with the webhook registered manually via curl. --- URL: https://hellofriday.ai/communicator/whatsapp Docs: https://docs.hellofriday.ai/guides/communicators/whatsapp # WhatsApp - Bridges a Friday space to a WhatsApp Business number via Meta's Cloud API (not WhatsApp Web). - Customer messages land in Studio with a green **WHATSAPP** badge, and replies travel back over the same channel. - Only sees messages received while Friday is running — Meta does not expose archived history. - Setup: create a Meta developer app, generate a permanent system user access token, configure webhook subscriptions, then enter the access token, app secret, and phone number ID into Studio. - Meta's free test number works for development with up to five pre-verified recipients; production requires registering a real business number and clearing OTP verification. - Constraints: messages cannot be edited after sending, and streaming replies are buffered into a single payload before delivery. --- # Compare --- # Friday Studio vs OpenClaw > Both tools let you build AI agents through conversation. Friday turns that conversation into a versioned workflow that runs on schedule. URL: https://hellofriday.ai/compare/openclaw ## How they compare ### Workflow reliability **How you build** - Friday Studio: Describe it in chat. Friday writes the agents and config. You can edit, version, and share the result. - OpenClaw: Describe it in chat. The behavior lives in that conversation context going forward. **Spinning up agents** - Friday Studio: Describe a new capability in chat. Friday configures the agent, assigns its tools, and wires it into the job. The agent is explicit in your config and guaranteed to run. - OpenClaw: Drop a SKILL.md file. The LLM decides whether to route to it based on intent matching. At scale, roughly 1 in 7 skills become unreachable with no warning. **Workflow format** - Friday Studio: Single `workspace.yml` — agents, triggers, and steps in one version-controlled file. - OpenClaw: Spread across SOUL.md, MEMORY.md, HEARTBEAT.md, and installed skills. **Prompt decay** - Friday Studio: Versioned config pins behavior. Model updates do not silently shift outputs. - OpenClaw: Conversation-based. The same prompt can produce different results after a model update. **Sharing with a teammate** - Friday Studio: Share a file. They import it and it runs identically. - OpenClaw: Rebuild config per machine. Setup is not portable. **Multi-step pipelines** - Friday Studio: FSM job engine. Each step passes typed data to the next. Branches and retries are explicit. - OpenClaw: Chat-first. The LLM decides tool order and execution flow each time. ### MCP tools **Adding a server** - Friday Studio: Install from the built-in MCP catalog or define your own in `workspace.yml`. Scope per-workspace or globally across all workspaces. - OpenClaw: `openclaw mcp set` from the CLI. Stored in central user config. **Authentication** - Friday Studio: Tokens and API keys passed in as env variables. - OpenClaw: Env variables, or HTTP headers for remote transports. **Transports** - Friday Studio: stdio, streamable HTTP. - OpenClaw: stdio, HTTP/SSE, streamable HTTP. **Tool exposure** - Friday Studio: Each agent's `tools:` array lists `serverId/toolName` explicitly. An agent only sees the tools you wired to it. - OpenClaw: Configured MCP tools are available globally to whichever agent the router picks. ### Skills **Adding a skill** - Friday Studio: Install from the built-in skills catalog or define your own. Scope per-workspace or globally across all workspaces. - OpenClaw: Drop a `SKILL.md` into one of six locations (workspace, project, personal, managed, bundled, extra). A precedence hierarchy resolves conflicts. **Format** - Friday Studio: `SKILL.md` — Markdown with YAML frontmatter. Pure instruction text. Can also be inlined in `workspace.yml`. - OpenClaw: `SKILL.md` — Markdown with YAML frontmatter. Can also bundle inside plugins with executable code (shell, JS, Python). ### Memory and context **How memory works** - Friday Studio: Narrative memory stores attached to each workspace. Auto-injected into agent context at each run. Readable, editable, version-controlled alongside your config. - OpenClaw: MEMORY.md and DREAMS.md files updated by a background "dreaming" process. No UI to browse or prune. Silent circuit breaker degrades recall when the index is slow. **Memory visibility** - Friday Studio: Every memory entry is a plain-text record in your workspace. You can read, edit, and delete entries directly. - OpenClaw: Managed by background processes. No way to see what was or was not promoted, or why the agent "forgot" something. **Memory across teammates** - Friday Studio: Memory stores can be mounted read-only or read-write across workspaces. Shared context is explicit and auditable. - OpenClaw: Memory is local to one machine and one agent. Sharing requires manual file copying. ### Observability **Run inspector** - Friday Studio: Step-by-step UI showing every tool call, input, output, and timing. - OpenClaw: Terminal logs and chat notifications. **Logs** - Friday Studio: Everything is logged per-workspace and broken down by chat vs session. Browse from Studio. - OpenClaw: Terminal logs. One stream per process. **Failure diagnosis** - Friday Studio: Failed step surfaces which state broke and why. Job stops there. - OpenClaw: Reconstruct failures from logs. **Token usage** - Friday Studio: Per-session breakdown in the UI. - OpenClaw: Requires log inspection. ### Security **Agent permissions** - Friday Studio: Each agent declares which tools it can call. Enforced by the config, not a prompt. - OpenClaw: Full system access. The LLM decides which tools to use. **Compliance** - Friday Studio: SOC 2 Type II. - OpenClaw: No formal certification. 1,300+ security advisories since launch; CVE-2026-33579 disclosed Apr 2026. ## Examples ### 1. Weekly competitive intelligence brief **OpenClaw:** You write a SOUL.md, add a HEARTBEAT.md cron entry, and tune a memory prompt so it remembers last week. Three config files now have to agree. When it runs, you get a message. Whether it checked the right sources or hallucinated a summary, you cannot tell. When a model update ships and the heartbeat stops firing, you find out Tuesday when the brief does not arrive. **Friday Studio:** Tell Friday in chat: "Every Monday, research these five competitors and email me a summary." Friday writes the agents, sets the schedule, and wires the delivery into one `workspace.yml`. ### 2. A workflow breaks and you need to know why **OpenClaw:** Your nightly job did not send the report. You check WhatsApp — no message. You open a terminal, dig through logs, and try to piece together which part failed. Did the fetch fail? Did the summary agent time out? Did the message send but go somewhere unexpected? You spend 40 minutes reconstructing a run that took 3 minutes to execute. **Friday Studio:** Open Studio, find the session, and look at the job inspector. The failed step and its error are right there. ### 3. A new teammate needs to run your automations **OpenClaw:** Your setup lives across SOUL.md, MEMORY.md, BOOT.md, installed skills, and weeks of accumulated memory context. You write a handover doc. They install the tool, hit a version mismatch, and spend two days getting to where you were. (BOOT.md does not auto-load — a documented gotcha that catches most users.) **Friday Studio:** Share the `workspace.yml`. They import it. It runs. ## FAQ **Do I have to write YAML to use Friday Studio?** No. You describe what you want in chat and Friday builds the workflow. The YAML is the output, not the input. You can read and edit it, but you never have to start from scratch. **Is Friday Studio open source?** Friday is source-available under BSL 1.1, with automatic conversion to Apache 2.0 one year after each release. Source is at [github.com/friday-platform/friday-studio](https://github.com/friday-platform/friday-studio). **Does Friday Studio work with the same LLMs as OpenClaw?** Yes. Anthropic Claude (recommended), OpenAI, Google Gemini, and Groq. You bring your own API keys with no intermediary. **Does Friday Studio run locally?** Yes. The daemon, Studio, and all services run on your machine. Nothing is sent to Friday's servers. **Can I share workflows with teammates?** Yes. Every workspace is a `workspace.yml` you can commit to a repo, share, and import on any machine. Nothing is locked in the tool. **What if I am already using OpenClaw?** Both tools use your own API keys, so there is no migration overhead. You can run them in parallel and compare on the same tasks. **Is Friday Studio free?** Yes, for personal use, teams under 5 people, and businesses under $1M ARR. Commercial licensing is available beyond that. **Can I migrate my OpenClaw setup to Friday Studio?** Yes — describe what your OpenClaw setup does in Friday's chat and it will rebuild it as a workspace.yml. Your API keys transfer directly since both tools use your own provider credentials. **What does Friday Studio run on?** Mac. Windows and Linux support is coming soon. --- # Personal, private, local AI > Friday runs on your Mac, talks to the LLMs you pick, and keeps everything private. Your data stays local. Your keys go direct to the provider. URL: https://hellofriday.ai/local-ai ## What makes Friday yours - Runs entirely on your Mac - Bring your own LLM keys - Your spaces and memory stay yours ### More than a local model A local LLM gives you a chat interface. Friday gives you a system that works without you in the loop. - Connects to your tools via MCP — GitHub, HubSpot, Slack, and more - Builds agents and sets schedules from plain English - LLM handles reasoning, Friday handles everything else --- ### Your data stays on your machine The daemon runs locally. Memory is plain text. Nothing phones home. - Bring your own keys — Anthropic, OpenAI, Google, Groq, or OpenRouter - Your key goes direct to the provider, no markup, no middleman - Spaces are config you can version, export, and share --- ### Set it up once, runs without you Most AI tools require you to be present. Friday runs on a schedule, no babysitting required — just leave your Mac on. - Competitive monitor fires at 8am, GitHub digest lands before standup - CRM audit runs every Sunday without you touching it - Friday surfaces what needs attention, the rest runs headlessly --- ### Works where your team works Once Friday is running on your Mac, you don't need to open the app. - Trigger workflows from Slack, Discord, Teams, Telegram, or WhatsApp - Ask questions and get results from whatever you're already in - No new app to open, no context switching --- # AI agent harness, generated from conversation > A decent model with a great harness beats a great model with a bad one. Friday is the harness. URL: https://hellofriday.ai/agent-harness ## Why a harness, not just a model - Complete runtime: memory, MCP tools, signals, scheduler, and FSM orchestration. - Generated from conversation: Friday writes the workspace.yml. One file you own. - Config you control: versioned, diffable, portable. No invisible runtime behavior. ## FAQ ### What is an AI agent harness? An agent harness is the runtime layer around your model — handling memory, tool access, scheduling, credentials, and orchestration so the model can focus on reasoning. Friday ships the harness pre-built. ### How is Friday different from OpenClaw? Friday is built for reliability from the start. Workflows run from a versioned workspace.yml — diffable, repeatable, importable, shareable. Every run is traceable to the config that produced it. No hidden state, no invisible behavior to debug around. ### What is workspace.yml? The single source of truth for a Friday workspace. It declares agents, tools, triggers, memory stores, and job steps in one file. Diffable, portable, and readable without a UI. Runs identically on any machine. ### How do jobs get triggered? Signals. A signal can be a cron schedule, an HTTP endpoint, a Slack message, or a webhook. You define the trigger in workspace.yml; Friday's signal gateway handles the rest. ### What happens when an agent fails? The FSM captures the failure state. You get the exact step, the error, and the config that produced it. Fix the workspace.yml, redeploy, and the job runs from a clean state — no hidden runtime behavior to debug around. --- # Automate dev workflows from plain English > Describe the workflow. Friday writes the config, wires the tools, and runs it on schedule. URL: https://hellofriday.ai/ai-augmented-engineer ## What you can automate - Bring your own API key: Anthropic, OpenAI, Gemini, Groq, or any OpenAI-compatible endpoint. - Full MCP support: GitHub, Slack, Jira, Linear, Snowflake, and any stdio or HTTP/SSE server. - Source-available · runs locally · no cloud required. ## FAQ ### Do I need to host anything? No. Friday runs locally on your Mac. The daemon, scheduler, memory, and all agents run on your machine. No cloud account, no server to maintain. ### What models does Friday support? Anthropic (Claude, default), OpenAI, Google Gemini, Groq, Fireworks, and any OpenAI-compatible endpoint via LiteLLM. You bring your own API key. ### How does MCP support work? Friday ships bundled MCP servers for GitHub, Slack, Jira, Linear, Gmail, Google Drive, Notion, Snowflake, Postgres, and SQLite. Any stdio or HTTP/SSE MCP server can be registered and wired into agents. ### Can I edit the generated config? Yes. Friday writes a workspace.yml from your description. Plain YAML — readable, diffable, versionable with Git. Edit it directly or share it with a teammate. ### Is Friday free to use? Friday is free for individuals and teams under $1M ARR. Source code is available on GitHub. Larger teams can reach out about commercial licensing. ### How do I get started? Download Friday for Mac, add your API key, then open chat and describe what you want to automate. Friday will ask a few questions and walk you through the setup. Most workflows are running in under 10 minutes. --- # Friday Studio vs OpenClaw > A better alternative to OpenClaw for teams who need agents that run reliably on a schedule. Friday builds the workflow from conversation and saves it as a versioned workspace.yml — one file, no sprawling config, runs the same way every time. URL: https://hellofriday.ai/m/openclaw ## What Friday does differently - Researches, writes, reasons, and acts across your connected tools from a single chat - One conversation becomes a versioned, scheduled workflow — no config forms - When something breaks, you see exactly which step and why. Nothing disappears