<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Arnav Chatty</title>
    <description>The latest articles on DEV Community by Arnav Chatty (@arrrnav).</description>
    <link>https://dev.to/arrrnav</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3847374%2Fa6b10fff-c52a-44da-8b8e-82ab9bb36e00.png</url>
      <title>DEV Community: Arnav Chatty</title>
      <link>https://dev.to/arrrnav</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arrrnav"/>
    <language>en</language>
    <item>
      <title>Rosetta Automates Onboarding with Notion so New Hires Don’t Drown in Docs</title>
      <dc:creator>Arnav Chatty</dc:creator>
      <pubDate>Mon, 30 Mar 2026 02:51:29 +0000</pubDate>
      <link>https://dev.to/arrrnav/i-built-rosetta-an-ai-agent-that-turns-a-notion-row-into-a-personalized-onboarding-experience-21m</link>
      <guid>https://dev.to/arrrnav/i-built-rosetta-an-ai-agent-that-turns-a-notion-row-into-a-personalized-onboarding-experience-21m</guid>
      <description>&lt;blockquote&gt;
&lt;h2&gt;
  
  
  New hires don't fail because they're unqualified. They fail because the context is scattered, the answers are buried, and the first week is chaos.
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've seen it happen. Someone joins a team, gets handed a GitHub org invite and a Confluence link from 2021, and is expected to be productive in two weeks. The knowledge exists — it's just locked inside senior engineers' heads, old PRs, and READMEs nobody's updated since the rewrite.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Rosetta&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 What It Does
&lt;/h2&gt;

&lt;p&gt;Rosetta is a CLI-driven onboarding agent. A team lead fills in a row in Notion — name, role, GitHub repos, a few notes — marks it &lt;strong&gt;Ready&lt;/strong&gt;, and walks away. Within minutes, Rosetta has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔍 Researched every assigned repository using Claude as the orchestrating agent&lt;/li&gt;
&lt;li&gt;📋 Enriched its context with internal team docs — runbooks, ADRs, team norms — from Notion pages linked by the team lead&lt;/li&gt;
&lt;li&gt;📖 Generated a personalized, eight-section onboarding wiki in Notion&lt;/li&gt;
&lt;li&gt;🧠 Embedded the wiki (including images from READMEs) using Gemini multimodal embeddings&lt;/li&gt;
&lt;li&gt;💬 DMed the new hire in Slack with a link&lt;/li&gt;
&lt;li&gt;🔔 DMed the supervisor with a provisioning checklist inferred from the repos&lt;/li&gt;
&lt;li&gt;🤖 Spun up a Slack bot the new hire can chat with immediately&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No templates. No copy-paste. A wiki that's actually about &lt;em&gt;their&lt;/em&gt; repos and &lt;em&gt;their&lt;/em&gt; role.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tljn3gl6u8z0yr00qjs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tljn3gl6u8z0yr00qjs.png" alt="Newly Generated Notion Wiki" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Code!
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/arrrnav" rel="noopener noreferrer"&gt;
        arrrnav
      &lt;/a&gt; / &lt;a href="https://github.com/arrrnav/rosetta-onboarder" rel="noopener noreferrer"&gt;
        rosetta-onboarder
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Engineering onboarding agent using Notion MCP, GitHub API, and Claude API
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Rosetta Onboarder&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/arrrnav/rosetta-onboarder/main/docs/img/rosetta-ai-logo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Farrrnav%2Frosetta-onboarder%2Fmain%2Fdocs%2Fimg%2Frosetta-ai-logo.png" alt="Rosetta Logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Built for the MLH Notion AI Challenge.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Onboarding new engineers is repetitive work. A team lead writes the same wiki every time: here are the repos, here is how to run them, here are the open issues to start with, here is how we review code. The content is different per hire but the structure is always the same — and every piece of it already exists somewhere: in the GitHub README, in the issue tracker, in the PR history.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rosetta automates this.&lt;/strong&gt; A team lead fills in a Notion database row, marks it Ready, and walks away. Within minutes a personalized onboarding wiki is live in Notion, embeddings are indexed for RAG, the new hire has a Slack DM with their link, and the supervisor has a provisioning checklist.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agentic wiki generation&lt;/strong&gt; — Claude researches every assigned GitHub repo on demand (README, structure, issues, PRs, CONTRIBUTING)…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/arrrnav/rosetta-onboarder" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  🛠️ The Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Orchestration&lt;/td&gt;
&lt;td&gt;Anthropic SDK — Claude &lt;code&gt;claude-sonnet-4-6&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notion I/O&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@notionhq/notion-mcp-server&lt;/code&gt; over stdio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;PyGithub — README, structure, issues, PRs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embeddings&lt;/td&gt;
&lt;td&gt;Gemini &lt;code&gt;gemini-embedding-2-preview&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vector store&lt;/td&gt;
&lt;td&gt;numpy cosine similarity (no external DB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;FastAPI + Uvicorn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slack&lt;/td&gt;
&lt;td&gt;slack-sdk Socket Mode + DM notifications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;Typer + Questionary&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🏗️ Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;New Hire Requests DB (Notion)
        │
        ▼  Status = Ready
   Poller / Webhook
        │
        ├── fetch_context_pages  ◄── Notion REST API, injected into user message
        ▼
   Claude Agent Loop
   ├── fetch_github_metadata
   ├── fetch_github_readme
   ├── fetch_github_structure
   ├── fetch_github_issues
   ├── fetch_github_prs
   ├── fetch_github_contributing
   └── create_notion_wiki  ◄── terminates the loop
        │
        ├── Gemini embeddings (text + images)
        ├── Slack DM → new hire
        └── Slack DM → supervisor (provisioning checklist)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent loop is the core of the system. Claude is given seven tools and runs until it calls &lt;code&gt;create_notion_wiki&lt;/code&gt; exactly once. It decides what to fetch and in what order — which means it handles repos of wildly different sizes without wasting tokens on the ones that are straightforward. Context pages are fetched before the loop starts and injected directly into Claude's user message — so the wiki reflects your team's actual internal documentation, not just public GitHub data.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 The Agent Prompt Strategy
&lt;/h2&gt;

&lt;p&gt;The interesting prompt engineering isn't making the wiki specific — any LLM will do that with basic instructions. The interesting part is &lt;strong&gt;provisioning detection&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When a new hire joins, someone needs to figure out what they need access to: which cloud accounts, which databases, which internal tools, which CI/CD secrets. This normally falls on the team lead or engineering manager to mentally reconstruct from memory. Rosetta does it automatically.&lt;/p&gt;

&lt;p&gt;The system prompt instructs Claude to scan the repos for signals even when nothing is explicitly documented:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Infer from: cloud provider configs or deploy scripts (AWS, GCP, Azure),
keys in .env.example or README, Docker/container registry references,
database connection strings or migration files, third-party service
integrations (Stripe, Twilio, SendGrid, etc.), internal tooling references
(Datadog, PagerDuty, Sentry, Vault, Jira, LaunchDarkly, etc.),
VPN or SSH requirements, CI/CD secrets (GitHub Actions, CircleCI, etc.),
GitHub org-level permissions, and any access requirements explicitly
listed in the team documentation context.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output goes into an &lt;code&gt;access_requirements&lt;/code&gt; field on the wiki and gets forwarded to the supervisor as a Slack DM checklist — without anyone having to think about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  📄 Context Pages
&lt;/h2&gt;

&lt;p&gt;One feature I'm particularly happy with: &lt;strong&gt;Context Pages&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The team lead can paste Notion page URLs into the hire's database row. Before the agent runs, Rosetta fetches those pages' block content via the REST API and injects it into Claude's user message. Internal runbooks, ADRs, team norms — all of it becomes part of the wiki without Claude needing any special tools to access it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# pipeline.py
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ctx_page_id&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;hire&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;context_page_ids&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch_notion_page_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx_page_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;context_pages_text&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# injected into the agent's user message:
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Additional context from team documentation:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;{context_pages_text}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means the wiki isn't just built from public GitHub data — it's built from &lt;em&gt;your team's actual knowledge base&lt;/em&gt;. &lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 Freshness: Light and Full Refreshes
&lt;/h2&gt;

&lt;p&gt;A wiki is only useful if it's current. Rosetta runs a background scheduler that wakes every Friday at 17:00:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Week&lt;/th&gt;
&lt;th&gt;Refresh Type&lt;/th&gt;
&lt;th&gt;What Happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Odd ISO weeks&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Light&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;New issues and recent PRs appended&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Even ISO weeks&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Full&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Entire wiki regenerated, old page archived&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;State is persisted to &lt;code&gt;data/scheduler_state.json&lt;/code&gt; so restarts don't double-fire. New hire gets a Slack DM either way.&lt;/p&gt;




&lt;h2&gt;
  
  
  🖼️ Multimodal RAG
&lt;/h2&gt;

&lt;p&gt;After wiki generation, Rosetta embeds the content using Gemini's new multimodal &lt;code&gt;gemini-embedding-2-preview&lt;/code&gt; model. Architecture diagrams, screenshots, and other images in READMEs are embedded alongside text into the &lt;em&gt;same&lt;/em&gt; vector space — so the Slack bot can answer "what does the auth flow look like?" with context that includes visual material.&lt;/p&gt;

&lt;p&gt;The vector store is a simple numpy cosine similarity implementation for the demo. For a large-wiki scope, p.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;q_vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_embed_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_vectors&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;q_vec&lt;/span&gt;
    &lt;span class="n"&gt;top_indices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;argsort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;)[::&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][:&lt;/span&gt;&lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_chunks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;top_indices&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💬 The Slack Bot
&lt;/h2&gt;

&lt;p&gt;The moment the wiki is written, the new hire gets a DM with their wiki link. No email chain, no "check your onboarding doc in Drive" — it lands in Slack where they're already working.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3zrcrbew4cpysttcbubs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3zrcrbew4cpysttcbubs.png" alt="New Hire Rosetta Slack Bot Interaction" width="800" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From that point on, they can ask the bot anything directly in the DM. It resolves their Slack user ID to their wiki's vector store, retrieves the top-3 relevant chunks by cosine similarity, and generates an answer with Claude — all running inside the same Socket Mode connection as the FastAPI server. No separate process, no public URL required.&lt;/p&gt;

&lt;p&gt;The RAG context includes not just the wiki text but also any images embedded from READMEs — so questions like "how does the auth flow work?" can pull from an architecture diagram the same way they'd pull from a paragraph of prose.&lt;/p&gt;

&lt;p&gt;Meanwhile, the supervisor gets their own DM — a provisioning checklist inferred by Claude from the repos, sent automatically so nothing slips through the cracks before the hire's first day.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqkii6cvx7drd2hpvmvy3.png" alt="Manager's Rosetta Slack Bot Interaction" width="800" height="462"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  ⚙️ Setup Experience
&lt;/h2&gt;

&lt;p&gt;One thing I wanted to get right: the &lt;strong&gt;operator experience&lt;/strong&gt;. &lt;code&gt;rosetta setup&lt;/code&gt; runs an interactive wizard that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompts for every required env var with masked previews of existing values&lt;/li&gt;
&lt;li&gt;Provisions the Notion workspace (top-level page, database, all columns) in one shot&lt;/li&gt;
&lt;li&gt;Validates the configuration with a doctor check before exiting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fykms01g179a8czkrl7hs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fykms01g179a8czkrl7hs.png" alt="Interactive Rosetta CLI Experience" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then &lt;code&gt;rosetta serve&lt;/code&gt; starts the FastAPI server, the Slack bot, the poller, and the scheduler as co-located asyncio tasks. One command, everything running.&lt;/p&gt;




&lt;h2&gt;
  
  
  🪨 What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MCP over stdio is finicky.&lt;/strong&gt;&lt;br&gt;
The &lt;code&gt;@notionhq/notion-mcp-server&lt;/code&gt; uses stdio transport, which means a subprocess per session and careful teardown to avoid anyio cancel-scope errors on shutdown. A stable HTTP MCP server would be cleaner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I wanted to embed the repos themselves.&lt;/strong&gt;&lt;br&gt;
Right now, RAG is built from the generated wiki content. The richer version would embed the actual repository files and Notion pages directly — giving the Slack bot true codebase-level context rather than a summary of it. The architecture supports it, but the Gemini embedding API costs add up fast during development, and testing a full repo ingestion pipeline as a solo developer isn't cheap. This is the obvious next step for a production deployment where the cost is justified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context pages only go one level deep.&lt;/strong&gt;&lt;br&gt;
When a team lead attaches a Notion context page, Rosetta fetches its blocks but doesn't recurse into child pages. A runbook that links to five sub-pages of setup instructions is only partially ingested. Full recursive traversal with depth limits is the right solution — just didn't make the cut before the demo.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Try It
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;rosetta setup&lt;/code&gt; gets you from zero to a running onboarding system in about five minutes if you have Notion, GitHub, and Slack tokens ready.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Rosetta removes the biggest barrier to professional growth: getting started.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Faster ramp-up. Less friction. Smarter onboarding.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>notionchallenge</category>
      <category>devchallenge</category>
      <category>mcp</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
