<?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: Miodrag Todorovic</title>
    <description>The latest articles on DEV Community by Miodrag Todorovic (@lotus015).</description>
    <link>https://dev.to/lotus015</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%2F3818300%2F87e73f06-f589-414d-abb8-57543676e9e8.jpeg</url>
      <title>DEV Community: Miodrag Todorovic</title>
      <link>https://dev.to/lotus015</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lotus015"/>
    <language>en</language>
    <item>
      <title>My entry for Notion MCP Hackathon.</title>
      <dc:creator>Miodrag Todorovic</dc:creator>
      <pubDate>Wed, 25 Mar 2026 16:01:03 +0000</pubDate>
      <link>https://dev.to/lotus015/my-entry-for-notion-mcp-hackathon-1pl5</link>
      <guid>https://dev.to/lotus015/my-entry-for-notion-mcp-hackathon-1pl5</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/lotus015/vizion-vibe-coding-without-leaving-notion-write-it-in-notion-click-a-button-get-a-live-react-1m58" class="crayons-story__hidden-navigation-link"&gt;Vizion: Vibe-coding without leaving Notion. Write it in Notion. Click a button. Get a live React app — with two-way sync.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/lotus015/vizion-vibe-coding-without-leaving-notion-write-it-in-notion-click-a-button-get-a-live-react-1m58" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Notion MCP Challenge Submission 🧠&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/lotus015" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F3818300%2F87e73f06-f589-414d-abb8-57543676e9e8.jpeg" alt="lotus015 profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/lotus015" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Miodrag Todorovic
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Miodrag Todorovic
                
              
              &lt;div id="story-author-preview-content-3403777" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/lotus015" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F3818300%2F87e73f06-f589-414d-abb8-57543676e9e8.jpeg" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Miodrag Todorovic&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/lotus015/vizion-vibe-coding-without-leaving-notion-write-it-in-notion-click-a-button-get-a-live-react-1m58" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/lotus015/vizion-vibe-coding-without-leaving-notion-write-it-in-notion-click-a-button-get-a-live-react-1m58" id="article-link-3403777"&gt;
          Vizion: Vibe-coding without leaving Notion. Write it in Notion. Click a button. Get a live React app — with two-way sync.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/notionchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;notionchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/mcp"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;mcp&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/lotus015/vizion-vibe-coding-without-leaving-notion-write-it-in-notion-click-a-button-get-a-live-react-1m58" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;5&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/lotus015/vizion-vibe-coding-without-leaving-notion-write-it-in-notion-click-a-button-get-a-live-react-1m58#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>devchallenge</category>
      <category>notionchallenge</category>
      <category>mcp</category>
      <category>ai</category>
    </item>
    <item>
      <title>Vizion: Vibe-coding without leaving Notion. Write it in Notion. Click a button. Get a live React app — with two-way sync.</title>
      <dc:creator>Miodrag Todorovic</dc:creator>
      <pubDate>Wed, 25 Mar 2026 15:43:41 +0000</pubDate>
      <link>https://dev.to/lotus015/vizion-vibe-coding-without-leaving-notion-write-it-in-notion-click-a-button-get-a-live-react-1m58</link>
      <guid>https://dev.to/lotus015/vizion-vibe-coding-without-leaving-notion-write-it-in-notion-click-a-button-get-a-live-react-1m58</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/notion-2026-03-04"&gt;Notion MCP Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Notion is where ideas live. But ideas don't stay ideas — they become products, tools, dashboards, forms. And the moment that happens, you leave Notion and open a code editor.&lt;/p&gt;

&lt;p&gt;I wanted to close that gap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vizion&lt;/strong&gt; turns a Notion page into a deployed, interactive React app — without leaving Notion. You write what you want (a landing page spec, a dashboard description, a form brief), click a button, and get a working app embedded right back into your page. No setup. No code. No context switching.&lt;/p&gt;

&lt;p&gt;It's a full loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vizion &lt;strong&gt;reads your page&lt;/strong&gt; via Notion MCP — databases, text, block structure, everything&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;creates the databases&lt;/strong&gt; you need (if they don't exist), wires them up, and generates the app&lt;/li&gt;
&lt;li&gt;The app &lt;strong&gt;writes data back&lt;/strong&gt; to Notion in real time — form submissions, signups, updates&lt;/li&gt;
&lt;li&gt;Change a row in Notion → the app &lt;strong&gt;updates within seconds&lt;/strong&gt; via SSE streaming&lt;/li&gt;
&lt;li&gt;Not happy with the result? &lt;strong&gt;Write a comment, click Refine&lt;/strong&gt; — vizion iterates on the existing app&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What you can build
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dashboard from databases&lt;/strong&gt; — point vizion at 1-3 Notion databases, get a live dashboard with KPI cards, charts, and tables. Data polls every 10 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Landing page with email capture&lt;/strong&gt; — write a spec like &lt;em&gt;"Hero section, 3 feature cards, pricing table, CTA captures email for waitlist"&lt;/em&gt; — vizion creates the Waitlist database on your page and generates a working signup form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lead capture form&lt;/strong&gt; — import a leads database, click Generate Form — get a Typeform-style multi-step form that writes directly to Notion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free-form apps&lt;/strong&gt; — write anything: a game spec, a calculator description, an internal tool brief. Click Build. Get a deployed React app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Video Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Tqa1DLqFyHY"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Show us 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/Lotus015" rel="noopener noreferrer"&gt;
        Lotus015
      &lt;/a&gt; / &lt;a href="https://github.com/Lotus015/vizion" rel="noopener noreferrer"&gt;
        vizion
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &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;vizion&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Turn Notion pages into live apps. No code, no setup, no leaving Notion.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Write what you want. Click a button. Get a working app.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vizion reads your Notion page — databases, text, whatever you wrote — and generates a fully interactive React app, embedded right back into your page. It creates the databases you need, connects them, and keeps everything in sync.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Capabilities&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Visualize your data&lt;/strong&gt;
→ Point vizion at your Notion databases and get a live dashboard with KPIs, charts, and tables — auto-generated from your data relationships&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Build anything from a description&lt;/strong&gt;
→ Write a product spec on a Notion page, click Build — get a deployed React app. Landing pages, forms, tools, games&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two-way data sync&lt;/strong&gt;
→ Collect data through your app's UI — signups, form submissions, feedback — automatically stored in a Notion database on the same page&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Auto-create databases&lt;/strong&gt;
→ Describe…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Lotus015/vizion" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Used Notion MCP
&lt;/h2&gt;

&lt;p&gt;Notion MCP is the foundation of the entire read layer. Every vizion workflow starts with a deep page read — and without MCP, that wouldn't be possible at the fidelity it needs.&lt;/p&gt;

&lt;p&gt;When a webhook fires (user clicks a button), vizion's agent pipeline kicks off with an MCP-powered page scan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Notion page
  ↓ webhook trigger
vizion (Express on Railway)
  ├── Notion MCP → reads full page: blocks, inline databases, text content, schema
  ├── Mozaik agents → analyze structure, plan databases, write app spec
  ├── Notion API → creates databases, writes rows, posts comments
  └── Spektrum SDK → generates &amp;amp; deploys React app to *.apps.jigjoy.ai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What MCP unlocks specifically:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The critical thing MCP gives you is &lt;em&gt;structured, traversable content&lt;/em&gt; — not just raw text. When an agent reads a Notion page through MCP, it gets the block tree: headings, paragraphs, inline databases, their schemas, their relationships. This means the agent can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discover what databases already exist on the page and what their columns are&lt;/li&gt;
&lt;li&gt;Understand the &lt;em&gt;intent&lt;/em&gt; from the surrounding text (the spec the user wrote)&lt;/li&gt;
&lt;li&gt;Figure out what databases need to be created vs. reused&lt;/li&gt;
&lt;li&gt;Reason about data relationships before writing a single line of app code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without MCP, you'd get a flat text dump. With MCP, the agent gets enough structure to make real architectural decisions — "this page has a Customers DB and a Revenue DB, they share a Company ID, build a dashboard that joins them."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Refine flow&lt;/strong&gt; also leans on MCP heavily. When a user writes feedback as a Notion comment and clicks Refine, the agent re-reads the page through MCP to get the current state of the embed, the original spec, and the new comment — and generates a targeted diff, not a full rebuild.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The agent stack&lt;/strong&gt; is built on &lt;a href="https://jigjoy.ai/mozaik" rel="noopener noreferrer"&gt;Mozaik&lt;/a&gt; — a TypeScript multi-agent orchestration framework I'm building. Each vizion workflow is a Mozaik pipeline: a coordinator agent breaks down the task, spawns specialized sub-agents (page reader, DB planner, spec writer), collects structured outputs, and passes them to &lt;a href="https://jigjoy.ai/spektrum" rel="noopener noreferrer"&gt;Spektrum&lt;/a&gt; for app generation and deployment.&lt;/p&gt;

&lt;p&gt;The result is an end-to-end loop that starts and ends in Notion — MCP on the read side, Notion API on the write side, and a live deployed app in the middle.&lt;/p&gt;

&lt;p&gt;Give &lt;a href="https://github.com/Lotus015/vizion" rel="noopener noreferrer"&gt;vizion&lt;/a&gt; and &lt;a href="https://github.com/jigjoy-ai/spektrum-sdk" rel="noopener noreferrer"&gt;Spektrum&lt;/a&gt; a star on GitHub if you enjoyed!&lt;/p&gt;

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