<?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: Dongsheng</title>
    <description>The latest articles on DEV Community by Dongsheng (@blackman99).</description>
    <link>https://dev.to/blackman99</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4118978%2Fe84dadce-5b5c-49ea-9e29-c145a3d2e052.jpg</url>
      <title>DEV Community: Dongsheng</title>
      <link>https://dev.to/blackman99</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/blackman99"/>
    <language>en</language>
    <item>
      <title>svelte5plus-calendar: Zero-dependency full calendar for Svelte 5</title>
      <dc:creator>Dongsheng</dc:creator>
      <pubDate>Thu, 10 Sep 2026 12:03:39 +0000</pubDate>
      <link>https://dev.to/blackman99/svelte5plus-calendar-zero-dependency-full-calendar-for-svelte-5-4maf</link>
      <guid>https://dev.to/blackman99/svelte5plus-calendar-zero-dependency-full-calendar-for-svelte-5-4maf</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;If you’re on &lt;strong&gt;Svelte 5&lt;/strong&gt;, calendar UIs often mean wrapping a React-era library, accepting a heavy dependency tree, or rolling month grids yourself and stopping short of week time-grids, recurrence, and drag-resize. You want one component that feels like Google / Apple / Outlook — without dragging half of npm into the client.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;svelte5plus-calendar&lt;/strong&gt; is a full-featured, &lt;strong&gt;zero-runtime-dependency&lt;/strong&gt; calendar component for Svelte 5: month, week, day, year, and agenda views, drag &amp;amp; drop editing, recurring events, multiple calendars, i18n, and dark mode. TypeScript-first; styles import automatically.&lt;/p&gt;

&lt;p&gt;Docs with live examples: &lt;a href="https://blackman99.github.io/svelte5plus-calendar/" rel="noopener noreferrer"&gt;blackman99.github.io/svelte5plus-calendar&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/Blackman99/svelte5plus-calendar" rel="noopener noreferrer"&gt;github.com/Blackman99/svelte5plus-calendar&lt;/a&gt; (MIT)&lt;/p&gt;

&lt;p&gt;npm: &lt;a href="https://www.npmjs.com/package/svelte5plus-calendar" rel="noopener noreferrer"&gt;svelte5plus-calendar&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Six views&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Month (spanning multi-day bars, +N more popovers), week &amp;amp; day time grids, year overview, agenda list, and a &lt;strong&gt;resources&lt;/strong&gt; view (rooms/people columns) for booking-style UIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drag &amp;amp; drop&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Move events across days/slots, drag all-day bars, resize from the bottom edge, drag empty space to select/create. Touch: long-press to drag, swipe to scroll.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built-in popovers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click an event for details (with delete); click/drag empty space for quick-create — zero config. Your callbacks replace them when provided.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recurring events&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Practical RRULE subset (FREQ, INTERVAL, COUNT, UNTIL, BYDAY incl. 2TU/-1FR, BYMONTHDAY) as strings or typed objects, plus exdates. This event and this and following edits; occurrence/series deletion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Theming &amp;amp; i18n&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Light / dark / auto; every color, radius, and font is a CSS custom property; 10-color event palette that adapts to dark mode. Any BCP-47 locale via Intl (no bundles); UI strings for 10 languages; locale-aware week start and clock; timeZone prop with edits converted back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;More&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Multiple calendar sources with visibility and edit permissions; current-time indicator and business hours; validRange + eventOverlap={false}; ICS parseICS / toICS; custom eventContent snippets; headless exports (layoutDay, expandRecurrence, …); keyboard navigation and aria-live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;svelte5plus-calendar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Requires Svelte 5. Styles are imported automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CalendarEvent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svelte5plus-calendar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Calendar&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svelte5plus-calendar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;events&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$state&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CalendarEvent&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Kickoff meeting&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;teal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Standup&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="na"&gt;recurrence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"height: 640px"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Calendar&lt;/span&gt; &lt;span class="na"&gt;bind:events&lt;/span&gt; &lt;span class="na"&gt;view=&lt;/span&gt;&lt;span class="s"&gt;"week"&lt;/span&gt; &lt;span class="na"&gt;locale=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt; &lt;span class="na"&gt;editable&lt;/span&gt; &lt;span class="na"&gt;selectable&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Handle edits with rollback:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;Calendar&lt;/span&gt;
    &lt;span class="na"&gt;bind:events&lt;/span&gt;
    &lt;span class="na"&gt;editable&lt;/span&gt;
    &lt;span class="na"&gt;onEventChange=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;revert&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;catch&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;revert&lt;/span&gt;&lt;span class="err"&gt;();&lt;/span&gt;
        &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;}}&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Who it’s for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Svelte 5 apps that need a real calendar, not only a date picker&lt;/li&gt;
&lt;li&gt;Teams that want DnD + recurrence + i18n without a React interop layer&lt;/li&gt;
&lt;li&gt;Authors who prefer CSS-variable theming and headless layout utils&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who it’s not (yet) for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Projects stuck on Svelte 4 (this package requires Svelte 5)&lt;/li&gt;
&lt;li&gt;Apps that need a full RFC5545 / CalDAV server stack (client component + practical RRULE subset)&lt;/li&gt;
&lt;li&gt;Teams standardized on FullCalendar’s plugin ecosystem with sunk cost already paid&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Light comparison (not a roast)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Typical pick&lt;/th&gt;
&lt;th&gt;svelte5plus-calendar angle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Battle-tested React calendar&lt;/td&gt;
&lt;td&gt;FullCalendar&lt;/td&gt;
&lt;td&gt;Svelte 5-native, zero runtime deps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Month-only picker&lt;/td&gt;
&lt;td&gt;Lightweight date libs&lt;/td&gt;
&lt;td&gt;Full views + DnD + RRULE + resources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stay in Svelte&lt;/td&gt;
&lt;td&gt;DIY grids&lt;/td&gt;
&lt;td&gt;One component + docs site examples&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Try it / tell us what’s wrong
&lt;/h2&gt;

&lt;p&gt;We’re especially hungry for feedback on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First-hour DX (npm install → editable week view)&lt;/li&gt;
&lt;li&gt;RRULE edit/split edges in real product data&lt;/li&gt;
&lt;li&gt;Gaps vs FullCalendar for your booking / scheduling use case&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 &lt;a href="https://blackman99.github.io/svelte5plus-calendar/" rel="noopener noreferrer"&gt;Live docs&lt;/a&gt; · &lt;a href="https://github.com/Blackman99/svelte5plus-calendar" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://www.npmjs.com/package/svelte5plus-calendar" rel="noopener noreferrer"&gt;npm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comment with your current Svelte calendar approach and the one feature that would make you switch — we’ll prioritize from real replies.&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>OpenBot: Self-hosted multi-bot collaboration with workspace credential isolation</title>
      <dc:creator>Dongsheng</dc:creator>
      <pubDate>Thu, 10 Sep 2026 11:58:03 +0000</pubDate>
      <link>https://dev.to/blackman99/openbot-self-hosted-multi-bot-collaboration-with-workspace-credential-isolation-30cg</link>
      <guid>https://dev.to/blackman99/openbot-self-hosted-multi-bot-collaboration-with-workspace-credential-isolation-30cg</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Engineering teams want several specialized assistants - not one chat box with everyone's API keys in a shared settings page. SaaS multi-agent products often mean someone else's trust boundary. Homegrown wrappers usually skip workspace membership, audit trails, and Bot versioning.&lt;/p&gt;

&lt;h2&gt;
  
  
  What OpenBot is
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;OpenBot&lt;/strong&gt; is an &lt;strong&gt;AGPL-3.0&lt;/strong&gt;, self-hosted multi-bot collaboration system. The current implementation includes local auth + optional OIDC, workspace membership and groups, scoped API tokens, and persistent Bot identities - shipped as a &lt;strong&gt;SvelteKit&lt;/strong&gt; web app, &lt;strong&gt;Fastify&lt;/strong&gt; API, &lt;strong&gt;PostgreSQL&lt;/strong&gt; migrations, and a &lt;strong&gt;Docker Compose&lt;/strong&gt; development stack.&lt;/p&gt;

&lt;p&gt;Personal connections support OpenAI Chat Completions, OpenAI Responses, and Anthropic Messages-compatible endpoints, with credential-safe settings and live text/action compatibility probes. Workspace model connections support shared use &lt;strong&gt;without sharing credentials&lt;/strong&gt;. Capability settings record verified evidence, explicit overrides, and compatible fallback chains.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/Blackman99/openbot" rel="noopener noreferrer"&gt;github.com/Blackman99/openbot&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Self-hosted, no phoning home&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
OpenBot sends no telemetry, analytics, or update checks. Idle instances make no outbound requests. Named volumes preserve users, workspaces, task state, and attachments across restarts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identity &amp;amp; access&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
First-owner setup with &lt;code&gt;OPENBOT_SETUP_TOKEN&lt;/code&gt;, local accounts, optional OIDC (Auth Code + PKCE). Workspace API tokens with fixed scopes (&lt;code&gt;me:read&lt;/code&gt;, &lt;code&gt;bots:*&lt;/code&gt;, &lt;code&gt;groups:*&lt;/code&gt;, &lt;code&gt;tasks:*&lt;/code&gt;, &lt;code&gt;events:read&lt;/code&gt;, ...); only SHA-256 digests persisted; audits without credential material.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bot identities&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Create Bots with purpose -&amp;gt; role description + system instructions, model binding, execution limits, immutable version history, permissions and discovery, archive / soft-delete with a 30-day recovery window, copy configuration, and template export.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conversations, tasks, routing&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Unified conversation list for groups and private Bot chats. In groups: &lt;code&gt;@Bot&lt;/code&gt; for an explicit task, or routing via a built-in workspace assistant (handoff), default lead, or local profile match. Task cards support approve, reject, answer, pause, cancel, and retry; plus streaming drafts, Markdown-safe answers, and optional SVG/HTML design artifacts in a sandboxed preview.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Personal &amp;amp; workspace models&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Protocol-explicit adapters; AES-256-GCM for keys and custom headers; provider host / scheme / private CIDR allowlists with DNS pinning; test-and-save probes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Routines&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
One-shot and repeating cron schedules in the routine's own IANA time zone; cost budgets; Bot collaboration tools limited to &lt;code&gt;request_input&lt;/code&gt;, &lt;code&gt;request_approval&lt;/code&gt;, &lt;code&gt;delegate&lt;/code&gt;, and &lt;code&gt;handoff&lt;/code&gt; (Bots cannot create or escalate routines).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ops hygiene&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Restricted &lt;code&gt;openbot_runtime&lt;/code&gt; DB role; backup/restore archives; explicit upgrades via migrate; workspace export (no secrets); soft-delete + planned purge; PWA install with network-first offline shell and nonce CSP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Docker + Compose plugin&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
docker compose up &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Web: &lt;code&gt;http://localhost:3000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;API status: &lt;code&gt;http://localhost:3001/api/v1/status&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before a non-local deploy: use unique Postgres passwords, a high-entropy setup token, &lt;code&gt;OPENBOT_ALLOW_INSECURE_LOCAL_PASSWORD=false&lt;/code&gt;, an exact HTTPS &lt;code&gt;WEB_ORIGIN&lt;/code&gt;, and TLS termination. Loopback bind is the default.&lt;/p&gt;

&lt;p&gt;The optional local Node path uses Node.js 24 + pnpm 11: &lt;code&gt;pnpm install&lt;/code&gt;, &lt;code&gt;pnpm db:migrate&lt;/code&gt;, then run the API and web dev servers. Verify with &lt;code&gt;pnpm verify&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who it's for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Teams that must keep model credentials and chat data on infrastructure they control&lt;/li&gt;
&lt;li&gt;Groups that want &lt;strong&gt;multiple&lt;/strong&gt; specialist Bots with real membership, permissions, and audit history&lt;/li&gt;
&lt;li&gt;Operators comfortable with Docker Compose and Postgres-backed services&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who it's not (yet) for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Anyone expecting a hosted SaaS or one-click "bring your ChatGPT team"&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Single-user laptop toys that don't need workspaces, OIDC, or API tokens&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shops that need a closed-source or permissive license for linking (this is &lt;strong&gt;AGPL-3.0 only&lt;/strong&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Light comparison (not a roast)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Typical pick&lt;/th&gt;
&lt;th&gt;OpenBot angle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hosted multi-agent chat&lt;/td&gt;
&lt;td&gt;SaaS copilots&lt;/td&gt;
&lt;td&gt;Self-hosted; your DB and encryption key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single-agent wrapper&lt;/td&gt;
&lt;td&gt;Custom Lang* scripts&lt;/td&gt;
&lt;td&gt;Persistent Bot identities, groups, tasks, routines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Share one API key" team setup&lt;/td&gt;
&lt;td&gt;Shared &lt;code&gt;.env&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Personal vs workspace connections; no shared secrets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Try it / tell us what's wrong
&lt;/h2&gt;

&lt;p&gt;Feedback is especially useful on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First Compose bring-up and setup-token flow&lt;/li&gt;
&lt;li&gt;Whether Bot permissions + discovery match how you'd grant access&lt;/li&gt;
&lt;li&gt;Provider allowlists and Anthropic + OpenAI protocol quirks in your environment&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://github.com/Blackman99/openbot" rel="noopener noreferrer"&gt;GitHub - Blackman99/openbot&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comment with your current self-hosted agent stack and the one missing piece - we'll prioritize from real replies.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>javascript</category>
    </item>
    <item>
      <title>svelte-json-discovery: the discovery.js JSON struct view, as a Svelte 5 component</title>
      <dc:creator>Dongsheng</dc:creator>
      <pubDate>Thu, 10 Sep 2026 11:48:33 +0000</pubDate>
      <link>https://dev.to/blackman99/svelte-json-discovery-the-discoveryjs-json-struct-view-as-a-svelte-5-component-5233</link>
      <guid>https://dev.to/blackman99/svelte-json-discovery-the-discoveryjs-json-struct-view-as-a-svelte-5-component-5233</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/discoveryjs/discovery" rel="noopener noreferrer"&gt;discovery.js&lt;/a&gt; ships one of the best interactive JSON &lt;strong&gt;struct&lt;/strong&gt; viewers in the wild. If you want that UX inside a &lt;strong&gt;Svelte 5&lt;/strong&gt; app — search, diff, validate, table, accessibility — without hosting the entire Discovery toolkit, &lt;strong&gt;svelte-json-discovery&lt;/strong&gt; is a standalone extraction/reimplementation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Blackman99/svelte-json-discovery" rel="noopener noreferrer"&gt;https://github.com/Blackman99/svelte-json-discovery&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs &amp;amp; examples:&lt;/strong&gt; &lt;a href="https://blackman99.github.io/svelte-json-discovery/" rel="noopener noreferrer"&gt;https://blackman99.github.io/svelte-json-discovery/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;code&gt;svelte-json-discovery&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add svelte-json-discovery
&lt;span class="c"&gt;# or npm / yarn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;JsonViewer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svelte-json-discovery&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ada&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;JsonViewer&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; expanded=&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Highlights
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;What you get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Previews&lt;/td&gt;
&lt;td&gt;Type-colored tokens; numbers with visual thousands separators; &lt;code&gt;Date&lt;/code&gt; / &lt;code&gt;RegExp&lt;/code&gt; / &lt;code&gt;Set&lt;/code&gt; / Error / bigint / typed arrays / functions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scale&lt;/td&gt;
&lt;td&gt;Windowed large array&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table&lt;/td&gt;
&lt;td&gt;Configurable object-array table with bounded “show more”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diff&lt;/td&gt;
&lt;td&gt;Bounded, entity-aware moves; cycle / hostile-value protection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validate&lt;/td&gt;
&lt;td&gt;Async/precomputed issues; optional &lt;strong&gt;Ajv / Zod / Valibot&lt;/strong&gt; adapters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A11y&lt;/td&gt;
&lt;td&gt;ARIA tree, roving tabindex, full keyboard navigation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema&lt;/td&gt;
&lt;td&gt;Hover field docs from JSON Schema (title, description, enum, deprecated, …)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Theme&lt;/td&gt;
&lt;td&gt;Light / dark / auto via &lt;code&gt;--discovery-fmt-*&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Full prop reference: docs &lt;code&gt;#api&lt;/code&gt; and the package README under &lt;code&gt;packages/svelte-json-discovery&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monorepo layout
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;packages/svelte-json-discovery&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Published library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Docs site consuming the workspace package (examples = shipping code)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Credits &amp;amp; license
&lt;/h2&gt;

&lt;p&gt;All rendering logic, styling, and UX derive from discovery.js &lt;code&gt;src/views/struct/&lt;/code&gt; by Roman Dvornov and contributors. This project re-implements that view as a Svelte 5 component. &lt;strong&gt;MIT.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Call for feedback
&lt;/h2&gt;

&lt;p&gt;Still early. If you build API explorers, admin consoles, or schema-driven UIs on Svelte 5, I’d love sharp edges filed as issues — especially large payloads, diff caps, and validator adapter ergonomics.s/objects; incremental &lt;code&gt;Set&lt;/code&gt;/&lt;code&gt;Map&lt;/code&gt; iterators |&lt;br&gt;
| Strings | Truncation, length badges, escaped vs “as text”, URL auto-link |&lt;br&gt;
| Search | Cancellable key/value walk, capped results, wraparound + reveal |&lt;br&gt;
| Control | Controlled paths + &lt;code&gt;bind:this&lt;/code&gt; controller methods (expand, focus, scroll, select) |&lt;br&gt;
| Inspector | Optional accessible toolbar from &lt;code&gt;svelte-json-discovery/inspector&lt;/code&gt; |&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Bring Claude Code and Codex into Feishu/Lark group chat — with permission cards</title>
      <dc:creator>Dongsheng</dc:creator>
      <pubDate>Thu, 10 Sep 2026 11:38:05 +0000</pubDate>
      <link>https://dev.to/blackman99/bring-claude-code-and-codex-into-feishulark-group-chat-with-permission-cards-2pb8</link>
      <guid>https://dev.to/blackman99/bring-claude-code-and-codex-into-feishulark-group-chat-with-permission-cards-2pb8</guid>
      <description>&lt;p&gt;If your team lives in &lt;strong&gt;Feishu / Lark&lt;/strong&gt;, but coding agents live in personal terminals, you get lost context, verbal “is it OK to run that?”, and no shared session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;agent-feishu-channel&lt;/strong&gt; bridges &lt;strong&gt;Claude Code&lt;/strong&gt; and &lt;strong&gt;Codex&lt;/strong&gt; sessions into a Feishu bot — a complete coding-agent workflow inside group chat.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;code&gt;agent-feishu-channel&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI:&lt;/strong&gt; &lt;code&gt;afc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/Blackman99/agent-feishu-channel" rel="noopener noreferrer"&gt;https://github.com/Blackman99/agent-feishu-channel&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://blackman99.github.io/agent-feishu-channel/" rel="noopener noreferrer"&gt;https://blackman99.github.io/agent-feishu-channel/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this exists
&lt;/h2&gt;

&lt;p&gt;Chat is where decisions happen. The agent should show up there with local-style controls: approve dangerous tools, keep sessions across restarts, and switch providers without rewiring the bot.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dual providers:&lt;/strong&gt; Claude or Codex; &lt;code&gt;/provider&lt;/code&gt; per session&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permission brokering:&lt;/strong&gt; sensitive calls become Feishu approval cards&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session persistence:&lt;/strong&gt; survives restarts; auto-resume; &lt;code&gt;/sessions&lt;/code&gt; and &lt;code&gt;/resume&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Queue &amp;amp; interrupt:&lt;/strong&gt; messages queue while generating; &lt;code&gt;!&lt;/code&gt; interrupts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive cards:&lt;/strong&gt; streaming status and tool activity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime config:&lt;/strong&gt; &lt;code&gt;/config set&lt;/code&gt; without restart&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context mitigation:&lt;/strong&gt; early warnings and a 50MB hard-reset fallback&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;

&lt;p&gt;Needs Node.js ≥ 20, a Feishu bot app at open.feishu.cn, and &lt;code&gt;claude&lt;/code&gt; and/or &lt;code&gt;codex&lt;/code&gt; on &lt;code&gt;$PATH&lt;/code&gt;. Install with &lt;code&gt;npm install -g agent-feishu-channel&lt;/code&gt;, then run &lt;code&gt;afc init&lt;/code&gt; and fill in &lt;code&gt;app_id&lt;/code&gt;, &lt;code&gt;app_secret&lt;/code&gt;, and the access allowlist before running &lt;code&gt;afc&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Migrating from &lt;code&gt;claude-feishu-channel&lt;/code&gt;? The command is now &lt;code&gt;afc&lt;/code&gt; (was &lt;code&gt;cfc&lt;/code&gt;); state auto-renames and history is kept.&lt;/p&gt;

&lt;h2&gt;
  
  
  Commands and caveats
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/new&lt;/code&gt; &lt;code&gt;/stop&lt;/code&gt; &lt;code&gt;/status&lt;/code&gt; &lt;code&gt;/cost&lt;/code&gt; &lt;code&gt;/context&lt;/code&gt; &lt;code&gt;/compact&lt;/code&gt; &lt;code&gt;/provider&lt;/code&gt; &lt;code&gt;/mode&lt;/code&gt; &lt;code&gt;/model&lt;/code&gt; &lt;code&gt;/config set&lt;/code&gt; &lt;code&gt;/project&lt;/code&gt; &lt;code&gt;/cd&lt;/code&gt; &lt;code&gt;/memory&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Permission modes: &lt;code&gt;default&lt;/code&gt;, &lt;code&gt;acceptEdits&lt;/code&gt;, &lt;code&gt;plan&lt;/code&gt;, &lt;code&gt;bypassPermissions&lt;/code&gt;. You own Feishu credentials and the &lt;code&gt;allowed_open_ids&lt;/code&gt; allowlist; don’t default to &lt;code&gt;bypassPermissions&lt;/code&gt; in shared groups.&lt;/p&gt;

&lt;p&gt;MIT. Issues: &lt;a href="https://github.com/Blackman99/agent-feishu-channel/issues" rel="noopener noreferrer"&gt;https://github.com/Blackman99/agent-feishu-channel/issues&lt;/a&gt;&lt;/p&gt;

</description>
      <category>feishu</category>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>SveltePress: Ship docs and blogs with SvelteKit — and Svelte 5 inside Markdown</title>
      <dc:creator>Dongsheng</dc:creator>
      <pubDate>Thu, 10 Sep 2026 11:13:59 +0000</pubDate>
      <link>https://dev.to/blackman99/sveltepress-ship-docs-and-blogs-with-sveltekit-and-svelte-5-inside-markdown-4o0i</link>
      <guid>https://dev.to/blackman99/sveltepress-ship-docs-and-blogs-with-sveltekit-and-svelte-5-inside-markdown-4o0i</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;If your product is SvelteKit, your docs often… aren’t. You jump to VitePress (Vue) or Docusaurus (React), then maintain a second mental model for layouts, components, and deploy adapters. That’s fine for many teams — until you want interactive examples that are &lt;em&gt;the same&lt;/em&gt; components your app uses.&lt;/p&gt;

&lt;h2&gt;
  
  
  What SveltePress is
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SveltePress&lt;/strong&gt; is a content-centered site builder for &lt;strong&gt;docs and blogs&lt;/strong&gt;, inspired by VitePress and built on &lt;strong&gt;SvelteKit&lt;/strong&gt;. You write Markdown (and Svelte), keep Kit’s full surface area (SSR, SSG, adapters, &lt;code&gt;+page.server.js&lt;/code&gt;, hooks), and get documentation-native features on top.&lt;/p&gt;

&lt;p&gt;Live docs &amp;amp; demos: &lt;a href="https://sveltepress.site" rel="noopener noreferrer"&gt;sveltepress.site&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Source: &lt;a href="https://github.com/SveltePress/sveltepress" rel="noopener noreferrer"&gt;github.com/SveltePress/sveltepress&lt;/a&gt; (~532 stars, MIT)&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Svelte 5 Runes in Markdown&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Embed reactive components and &lt;code&gt;$state&lt;/code&gt; islands directly in &lt;code&gt;.md&lt;/code&gt; — tips/callouts, Twoslash hover types, no separate playground toolchain required for simple demos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Immutable document versioning&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Keep current docs at clean URLs while publishing frozen historical snapshots, with built-in version navigation and release change catalogs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built-in i18n&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Serve multiple locales from one site: automatic prefixing, language switcher, navigation that preserves the selected version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search that stays out of your way&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Zero-config &lt;strong&gt;Pagefind&lt;/strong&gt; (client-side, multi-locale filtering, historical index freezing). Algolia DocSearch is also supported if you already live there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Themes you can own&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Default documentation theme, blog theme, or a custom theme — configuration and theme APIs are typed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Still SvelteKit&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Same routing mental model (&lt;code&gt;src/routes/+page.md&lt;/code&gt;, layouts, etc.). Scaffold defaults to &lt;code&gt;adapter-static&lt;/code&gt;; swap adapters when you need SSR or platform-specific deploys.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quickstart
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Node.js ^20.19.0 or &amp;gt;=22.12.0; pnpm 10 recommended&lt;/span&gt;
npm create @sveltepress@latest
&lt;span class="c"&gt;# or: pnpm create @sveltepress&lt;/span&gt;

&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
pnpm &lt;span class="nb"&gt;install
&lt;/span&gt;pnpm dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docs walk through adding &lt;code&gt;@sveltepress/vite&lt;/code&gt; to an existing SvelteKit app if you’re not starting from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who it’s for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Svelte / SvelteKit teams who want docs or a content site without leaving the ecosystem&lt;/li&gt;
&lt;li&gt;Projects that need &lt;strong&gt;versioned&lt;/strong&gt; docs and/or &lt;strong&gt;multi-locale&lt;/strong&gt; sites&lt;/li&gt;
&lt;li&gt;Authors who want interactive Svelte examples next to prose&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who it’s not (yet) for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Teams standardized on Vue/React doc stacks with deep plugin ecosystems already paid for&lt;/li&gt;
&lt;li&gt;Pure “Markdown → HTML with zero JS runtime” pipelines that don’t want a Kit project at all&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Light comparison (not a roast)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Typical pick&lt;/th&gt;
&lt;th&gt;SveltePress angle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vue-native docs SSG&lt;/td&gt;
&lt;td&gt;VitePress&lt;/td&gt;
&lt;td&gt;Same content-first feel, SvelteKit underneath&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Big React docs platform&lt;/td&gt;
&lt;td&gt;Docusaurus&lt;/td&gt;
&lt;td&gt;Lighter Kit-native path; versioning + i18n included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stay in Svelte&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;First-class: Runes in MD, Kit adapters, typed themes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Try it / tell us what’s wrong
&lt;/h2&gt;

&lt;p&gt;We’re especially hungry for feedback on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First-hour DX (create → first deploy)&lt;/li&gt;
&lt;li&gt;Versioning + i18n edge cases in real multi-product docs&lt;/li&gt;
&lt;li&gt;Gaps vs your current VitePress/Docusaurus setup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 &lt;a href="https://sveltepress.site" rel="noopener noreferrer"&gt;sveltepress.site&lt;/a&gt; · ⭐ &lt;a href="https://github.com/SveltePress/sveltepress" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you ship with it, a short “who’s using” note or issue is hugely helpful. Thanks for reading.&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>sveltekit</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>codsh 0.22.1 — /ship grill cards wrap long questions (DeepSeek terminal agent)</title>
      <dc:creator>Dongsheng</dc:creator>
      <pubDate>Thu, 10 Sep 2026 09:40:33 +0000</pubDate>
      <link>https://dev.to/blackman99/codsh-0221-ship-grill-cards-wrap-long-questions-deepseek-terminal-agent-3bp9</link>
      <guid>https://dev.to/blackman99/codsh-0221-ship-grill-cards-wrap-long-questions-deepseek-terminal-agent-3bp9</guid>
      <description>&lt;p&gt;DeepSeek-native terminal coding agent; &lt;code&gt;/ship&lt;/code&gt; one sentence → verified code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;0.22.1:&lt;/strong&gt; grill card wraps long questions fully (no 2-line ellipsis clip); sync dsh packages to &lt;code&gt;0.1.5-rc.1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install:&lt;/strong&gt; &lt;code&gt;npm i -g @deepseek-ai/dsh codsh-cli &amp;amp;&amp;amp; codsh&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/Blackman99/codsh" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://blackman99.github.io/codsh/" rel="noopener noreferrer"&gt;Docs&lt;/a&gt; · &lt;a href="https://www.npmjs.com/package/codsh-cli" rel="noopener noreferrer"&gt;npm codsh-cli&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Not a Claude Code env wrapper.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feedback and a star are always appreciated.&lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>cli</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
