<?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: Apoorv Darshan</title>
    <description>The latest articles on DEV Community by Apoorv Darshan (@apoorvdarshan).</description>
    <link>https://dev.to/apoorvdarshan</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%2F3803883%2F9b7a7479-6c77-4e92-a6b7-98c03078f916.JPG</url>
      <title>DEV Community: Apoorv Darshan</title>
      <link>https://dev.to/apoorvdarshan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/apoorvdarshan"/>
    <language>en</language>
    <item>
      <title>A scheduler calendar that's just a view over a JSON file</title>
      <dc:creator>Apoorv Darshan</dc:creator>
      <pubDate>Sat, 04 Jul 2026 15:15:05 +0000</pubDate>
      <link>https://dev.to/apoorvdarshan/a-scheduler-calendar-thats-just-a-view-over-a-json-file-38hl</link>
      <guid>https://dev.to/apoorvdarshan/a-scheduler-calendar-thats-just-a-view-over-a-json-file-38hl</guid>
      <description>&lt;p&gt;Crossposter has a scheduling calendar at &lt;code&gt;/scheduled&lt;/code&gt;, and I want to show how little machinery sits behind it.&lt;/p&gt;

&lt;p&gt;What you get in the UI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A month calendar view by default.&lt;/li&gt;
&lt;li&gt;Click a date to review every post scheduled for that day.&lt;/li&gt;
&lt;li&gt;Edit a queued post's timing.&lt;/li&gt;
&lt;li&gt;Discard queued or failed posts.&lt;/li&gt;
&lt;li&gt;Review each post's target channels, media, and last publish error.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What's behind it: that calendar is a rendering of scheduled entries stored in &lt;code&gt;poster.config.local.json&lt;/code&gt;. There's no jobs table, no scheduler service, no cron daemon. Editing a time rewrites the entry. Discarding deletes it. The runtime side is the ~30-second tick that checks for due posts while the server runs.&lt;/p&gt;

&lt;p&gt;Failed posts are first-class, which I added deliberately: if a publish errors (a platform challenge, a rate limit, a broken unofficial integration), the post doesn't vanish. It stays visible with its last error so you can fix and retry, rather than wondering whether it ever went out. When a scheduled post does publish, it moves to local publish history and leaves the queue.&lt;/p&gt;

&lt;p&gt;It's a good reminder that a useful scheduler UI doesn't require a heavyweight backend when the product is single-user and local.&lt;/p&gt;

&lt;p&gt;Open source, MIT.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crossposter.apoorvdarshan.com/" rel="noopener noreferrer"&gt;https://crossposter.apoorvdarshan.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
    <item>
      <title>If you ship on Vercel, the code is yours to read</title>
      <dc:creator>Apoorv Darshan</dc:creator>
      <pubDate>Sat, 04 Jul 2026 13:37:34 +0000</pubDate>
      <link>https://dev.to/apoorvdarshan/if-you-ship-on-vercel-the-code-is-yours-to-read-3pm2</link>
      <guid>https://dev.to/apoorvdarshan/if-you-ship-on-vercel-the-code-is-yours-to-read-3pm2</guid>
      <description>&lt;p&gt;Saturday plug for the open-source side. Verceltics is a real, universal SwiftUI app, not a demo, and it's MIT-licensed on GitHub. Clone it, see how the charts and the API layer fit together, open a PR if you spot something to fix.&lt;/p&gt;

&lt;p&gt;Stars and feedback genuinely keep an indie project moving.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/apoorvdarshan/verceltics" rel="noopener noreferrer"&gt;https://github.com/apoorvdarshan/verceltics&lt;/a&gt;&lt;/p&gt;

</description>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Multilingual by default: companion speech that follows your iPhone</title>
      <dc:creator>Apoorv Darshan</dc:creator>
      <pubDate>Sat, 04 Jul 2026 10:45:04 +0000</pubDate>
      <link>https://dev.to/apoorvdarshan/multilingual-by-default-companion-speech-that-follows-your-iphone-5h7o</link>
      <guid>https://dev.to/apoorvdarshan/multilingual-by-default-companion-speech-that-follows-your-iphone-5h7o</guid>
      <description>&lt;p&gt;If you don't live in English all day, your AI companion shouldn't assume you do.&lt;/p&gt;

&lt;p&gt;Scowld has multilingual speech settings. By default it follows your iPhone's language, and you can set overrides when you want something different. So the companion can speak and understand in the language you actually use, without you hunting through a config the first time you open it.&lt;/p&gt;

&lt;p&gt;Where this fits in the voice loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It defaults to your iPhone language out of the box.&lt;/li&gt;
&lt;li&gt;You can override it in settings when you want a specific language.&lt;/li&gt;
&lt;li&gt;It works alongside your chosen speech-to-text and text-to-speech providers, so transcription and the spoken reply line up with your language settings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Combined with the rest of Scowld, a VRM character with lip sync and expressions, bring-your-own-key providers, and hands-free wake mode, you get a companion that meets you where you are linguistically.&lt;/p&gt;

&lt;p&gt;It's iOS only, MIT licensed, and built solo. Sensible defaults, with the knobs there when you want them.&lt;/p&gt;

&lt;p&gt;Set your language and start talking from the site.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.scowld.xyz/" rel="noopener noreferrer"&gt;https://www.scowld.xyz/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Two weeks of using my own calorie tracker: what stuck</title>
      <dc:creator>Apoorv Darshan</dc:creator>
      <pubDate>Sat, 04 Jul 2026 08:00:04 +0000</pubDate>
      <link>https://dev.to/apoorvdarshan/two-weeks-of-using-my-own-calorie-tracker-what-stuck-2idl</link>
      <guid>https://dev.to/apoorvdarshan/two-weeks-of-using-my-own-calorie-tracker-what-stuck-2idl</guid>
      <description>&lt;p&gt;Almost two weeks into shipping &lt;strong&gt;Fud AI&lt;/strong&gt; in public, here's what I personally use most:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Photo logging for real meals (fast, edit the estimate, done)&lt;/li&gt;
&lt;li&gt;Copy-from-another-day for repeat breakfasts&lt;/li&gt;
&lt;li&gt;The AI Coach when a day feels off and I want a straight answer&lt;/li&gt;
&lt;li&gt;The all-time calorie chart, because the trend is the only honest signal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rest of the logging methods are there for the moments they fit. Nice to build the tool you actually wanted.&lt;/p&gt;

&lt;p&gt;App: &lt;a href="https://www.fud-ai.app/" rel="noopener noreferrer"&gt;https://www.fud-ai.app/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Free to download, and why the core stays that way</title>
      <dc:creator>Apoorv Darshan</dc:creator>
      <pubDate>Sat, 04 Jul 2026 04:30:03 +0000</pubDate>
      <link>https://dev.to/apoorvdarshan/free-to-download-and-why-the-core-stays-that-way-2f90</link>
      <guid>https://dev.to/apoorvdarshan/free-to-download-and-why-the-core-stays-that-way-2f90</guid>
      <description>&lt;p&gt;Quick note on the model, since people ask. Quit All is free to download with an optional paid tier.&lt;/p&gt;

&lt;p&gt;The part I cared about: the things that actually help in a hard moment shouldn't sit behind a wall. The I'm Craving button, the clean timers, the per-habit tracking, the stats, all there from install. If the app earns a paid upgrade later, great, but the moment you need it most can't be a paywall.&lt;/p&gt;

&lt;p&gt;Building in public means saying this stuff out loud and meaning it.&lt;/p&gt;

&lt;p&gt;Get it: &lt;a href="https://apps.apple.com/us/app/quit-all-break-every-habit/id6760978934" rel="noopener noreferrer"&gt;https://apps.apple.com/us/app/quit-all-break-every-habit/id6760978934&lt;/a&gt;&lt;/p&gt;

</description>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why Wi-Fi capture still works when the iPhone is locked</title>
      <dc:creator>Apoorv Darshan</dc:creator>
      <pubDate>Fri, 03 Jul 2026 15:15:01 +0000</pubDate>
      <link>https://dev.to/apoorvdarshan/why-wi-fi-capture-still-works-when-the-iphone-is-locked-5emj</link>
      <guid>https://dev.to/apoorvdarshan/why-wi-fi-capture-still-works-when-the-iphone-is-locked-5emj</guid>
      <description>&lt;p&gt;A detail worth its own post: TetherShot's Wi-Fi capture works even when the phone is locked.&lt;/p&gt;

&lt;p&gt;That's because the cable-free path isn't screen mirroring. It opens a RemoteXPC tunnel to the device over your local network (using pymobiledevice3) and talks to the device service layer, so it doesn't depend on an unlocked, foregrounded screen the way a mirroring approach would. The capture comes back pixel-perfect.&lt;/p&gt;

&lt;p&gt;Practically: you can leave a test iPhone on a shelf, locked, and still pull clean full-resolution screenshots of it from your Mac over Wi-Fi. No reaching for it, no waking it, no cable.&lt;/p&gt;

&lt;p&gt;It's all local, device to Mac over your own network, with no servers in between. A native Swift 6 / SwiftUI menu-bar app for macOS 14+, open source under MIT.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/apoorvdarshan/TetherShot" rel="noopener noreferrer"&gt;https://github.com/apoorvdarshan/TetherShot&lt;/a&gt;&lt;/p&gt;

</description>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Comparing this week to last week, on iOS</title>
      <dc:creator>Apoorv Darshan</dc:creator>
      <pubDate>Fri, 03 Jul 2026 13:30:00 +0000</pubDate>
      <link>https://dev.to/apoorvdarshan/comparing-this-week-to-last-week-on-ios-4djb</link>
      <guid>https://dev.to/apoorvdarshan/comparing-this-week-to-last-week-on-ios-4djb</guid>
      <description>&lt;p&gt;Verceltics lets you flip between 24h, 7d, 30d, 3 months, and 12 months, so you can actually tell whether a post landed or a deploy changed anything.&lt;/p&gt;

&lt;p&gt;The same breakdowns follow you across every range: countries, devices, referrers, UTMs. Juggling more than one project? It does multi-account switching too.&lt;/p&gt;

&lt;p&gt;Details: &lt;a href="https://www.verceltics.com/" rel="noopener noreferrer"&gt;https://www.verceltics.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Lean on your own machine: Ollama + native iOS STT</title>
      <dc:creator>Apoorv Darshan</dc:creator>
      <pubDate>Fri, 03 Jul 2026 10:45:08 +0000</pubDate>
      <link>https://dev.to/apoorvdarshan/lean-on-your-own-machine-ollama-native-ios-stt-2loc</link>
      <guid>https://dev.to/apoorvdarshan/lean-on-your-own-machine-ollama-native-ios-stt-2loc</guid>
      <description>&lt;p&gt;Here's a fun configuration for the self-hosting crowd: a companion that leans on your own machine.&lt;/p&gt;

&lt;p&gt;Scowld is bring-your-own-key, and one of the supported LLM providers is Ollama. Point the app at your Ollama setup and your chats run against the model you're hosting yourself. Pair that with native iOS speech recognition for transcription and the core of your voice loop leans on a model you control.&lt;/p&gt;

&lt;p&gt;The pieces you'd wire together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LLM: Ollama (your own host)&lt;/li&gt;
&lt;li&gt;STT: native iOS speech recognition, no extra key needed&lt;/li&gt;
&lt;li&gt;TTS: optional, via ElevenLabs or OpenAI if you want spoken replies&lt;/li&gt;
&lt;li&gt;Avatar: a VRM character (Aria, Bella, Ciel, or custom) rendered with three-vrm&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For anyone who likes keeping their stack close, this is a great starting point. The app provides the companion shell, the VRM rendering, and the voice loop; you provide the brain.&lt;/p&gt;

&lt;p&gt;And since Scowld is open source under MIT, you can read exactly how the Ollama provider path is implemented before you trust it with anything.&lt;/p&gt;

&lt;p&gt;The code is all there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/apoorvdarshan/scowld" rel="noopener noreferrer"&gt;https://github.com/apoorvdarshan/scowld&lt;/a&gt;&lt;/p&gt;

</description>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What I'd want before I install another tracker (and how to check)</title>
      <dc:creator>Apoorv Darshan</dc:creator>
      <pubDate>Fri, 03 Jul 2026 08:00:07 +0000</pubDate>
      <link>https://dev.to/apoorvdarshan/what-id-want-before-i-install-another-tracker-and-how-to-check-1dkb</link>
      <guid>https://dev.to/apoorvdarshan/what-id-want-before-i-install-another-tracker-and-how-to-check-1dkb</guid>
      <description>&lt;p&gt;Things I'd vet before trusting a calorie app with my food data, and where to verify each in &lt;strong&gt;Fud AI&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What gets sent to the AI? -&amp;gt; read the request code&lt;/li&gt;
&lt;li&gt;Where's my data? -&amp;gt; read the storage code&lt;/li&gt;
&lt;li&gt;Can I leave? -&amp;gt; it's your own API key, no lock-in&lt;/li&gt;
&lt;li&gt;Is the math sound? -&amp;gt; the BMR formulas are right there&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The answer to all of those is "open the repo and look." That's the point of shipping it MIT.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/apoorvdarshan/fud-ai" rel="noopener noreferrer"&gt;https://github.com/apoorvdarshan/fud-ai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The 30-day calendar that doesn't keep score against you</title>
      <dc:creator>Apoorv Darshan</dc:creator>
      <pubDate>Fri, 03 Jul 2026 04:30:07 +0000</pubDate>
      <link>https://dev.to/apoorvdarshan/the-30-day-calendar-that-doesnt-keep-score-against-you-416g</link>
      <guid>https://dev.to/apoorvdarshan/the-30-day-calendar-that-doesnt-keep-score-against-you-416g</guid>
      <description>&lt;p&gt;Added a 30-day calendar to Quit All's stats and thought hard about what it should feel like.&lt;/p&gt;

&lt;p&gt;It's a month at a glance, your streaks and clean days laid out. The temptation in this kind of view is to turn every gap into a mark of failure. I wanted the opposite: a record you can look back on and see progress in, not a report card.&lt;/p&gt;

&lt;p&gt;Alongside it: total money saved, average streak, craving count, and survival rate. Numbers that are yours, for you, not a leaderboard.&lt;/p&gt;

&lt;p&gt;The rest: &lt;a href="https://www.quit-all.com/" rel="noopener noreferrer"&gt;https://www.quit-all.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Deploy your own crossposter to a VPS or Render and keep the scheduler alive</title>
      <dc:creator>Apoorv Darshan</dc:creator>
      <pubDate>Thu, 02 Jul 2026 15:15:04 +0000</pubDate>
      <link>https://dev.to/apoorvdarshan/deploy-your-own-crossposter-to-a-vps-or-render-and-keep-the-scheduler-alive-4dk1</link>
      <guid>https://dev.to/apoorvdarshan/deploy-your-own-crossposter-to-a-vps-or-render-and-keep-the-scheduler-alive-4dk1</guid>
      <description>&lt;p&gt;Local-first doesn't mean stuck on your laptop. Because Crossposter is just a Node/Next.js process with file-based state, you can self-host it anywhere and reach it from a browser.&lt;/p&gt;

&lt;p&gt;The one thing that actually matters for scheduling: the scheduler only fires while the server process is running. So the deployment question is really "how do I keep the process up?"&lt;/p&gt;

&lt;p&gt;Three paths I use and document:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local Mac: a macOS auto-start service keeps &lt;code&gt;http://localhost:2004&lt;/code&gt; alive after login.&lt;/li&gt;
&lt;li&gt;Small VPS: run the Node service under your usual process manager, with a persistent disk so &lt;code&gt;poster.config.local.json&lt;/code&gt;, uploads, and sessions survive restarts.&lt;/li&gt;
&lt;li&gt;Render: same idea, a long-running Node service with persistent disk.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The persistent-disk point is the gotcha. Since there's no database, your config, scheduled queue, media, and login sessions all live on disk. Ephemeral filesystems will wipe your sessions and you'll be re-logging into X/Instagram. Mount a disk and you're fine.&lt;/p&gt;

&lt;p&gt;If the server is offline when a scheduled post is due, it publishes the next time the process starts and the tick runs. No cloud worker compensates for downtime, by design.&lt;/p&gt;

&lt;p&gt;It's the self-hosted alternative to a Buffer/Hootsuite-style stack, minus the stack.&lt;/p&gt;

&lt;p&gt;This post published through Crossposter.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crossposter.apoorvdarshan.com/" rel="noopener noreferrer"&gt;https://crossposter.apoorvdarshan.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Where your Vercel API token lives in Verceltics</title>
      <dc:creator>Apoorv Darshan</dc:creator>
      <pubDate>Thu, 02 Jul 2026 13:30:04 +0000</pubDate>
      <link>https://dev.to/apoorvdarshan/where-your-vercel-api-token-lives-in-verceltics-5g7j</link>
      <guid>https://dev.to/apoorvdarshan/where-your-vercel-api-token-lives-in-verceltics-5g7j</guid>
      <description>&lt;p&gt;Worth being specific about this one. You bring your own Vercel API token, and it's stored only in the iOS Keychain. There's no server of mine sitting in between. The app talks straight to Vercel to fetch your analytics.&lt;/p&gt;

&lt;p&gt;Nothing about your traffic passes through me. That was non-negotiable when I built it.&lt;/p&gt;

&lt;p&gt;App Store: &lt;a href="https://apps.apple.com/us/app/vercel-analytics-verceltics/id6761645656" rel="noopener noreferrer"&gt;https://apps.apple.com/us/app/vercel-analytics-verceltics/id6761645656&lt;/a&gt;&lt;/p&gt;

</description>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
