<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Mira (useMira)]]></title><description><![CDATA[Mira (useMira)]]></description><link>https://usemira.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Wed, 04 Nov 2026 19:08:52 GMT</lastBuildDate><atom:link href="https://usemira.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Why we gave our Telegram content bot a "nothing twice" rule]]></title><description><![CDATA[We build Mira (useMira), a Telegram bot with a Mini App that pulls content from sources, scores it, and drafts channel posts. One rule shaped our worker…]]></description><link>https://usemira.hashnode.dev/why-we-gave-our-telegram-content-bot-a-nothing-twice-rule</link><guid isPermaLink="true">https://usemira.hashnode.dev/why-we-gave-our-telegram-content-bot-a-nothing-twice-rule</guid><category><![CDATA[telegram]]></category><category><![CDATA[PostgreSQL]]></category><category><![CDATA[backend]]></category><dc:creator><![CDATA[Mira]]></dc:creator><pubDate>Fri, 23 Oct 2026 19:33:08 GMT</pubDate><content:encoded><![CDATA[<p>We build Mira (useMira), a Telegram bot with a Mini App that pulls content from sources, scores it, and drafts channel posts. One rule shaped our worker more than anything else: if an outcome is unknown after a crash, skip it — never retry blindly.</p>
<p>For most backends, a duplicated job is a wasted API call — annoying, cheap to absorb. For a content pipeline it's different: a duplicated job means a post appears twice in someone's channel, or two near-identical drafts fight for the same slot in their schedule. The failure is visible to a real person, immediately.</p>
<p>So the asymmetry we optimize for is deliberately lopsided: under-processing is cheap (a source gets checked a minute later), over-processing is expensive (trust with someone's channel). Three places that shows up:</p>
<ol>
<li>Queue is Postgres, <code>FOR UPDATE SKIP LOCKED</code> for claiming — two workers physically can't grab the same job.</li>
<li>A dead worker means an expired lease, not a retry loop — the job returns to the queue exactly once.</li>
<li>Payment webhooks are idempotent by a unique constraint, not a pre-check — the check-then-act gap is exactly where duplicates sneak in.</li>
</ol>
<p>None of this is novel on its own. What changed our architecture was applying it past the payments layer, where everyone already expects idempotency, into the content layer, where it's easy to assume "it's just a draft, who cares if it runs twice" — until it's a real person's channel.</p>
<p>More on Mira: <a href="https://usemira.pro">https://usemira.pro</a> Bot: <a href="https://t.me/usemirabot">https://t.me/usemirabot</a></p>
]]></content:encoded></item><item><title><![CDATA[Mira: a Telegram bot and Mini App that turns your sources into channel post drafts]]></title><description><![CDATA[Keeping a Telegram channel alive takes the same loop every day: look for material, decide whether it fits your audience, write it up, schedule it. Mira…]]></description><link>https://usemira.hashnode.dev/mira-a-telegram-bot-and-mini-app-that-turns-your-sources-into-channel-post-drafts</link><guid isPermaLink="true">https://usemira.hashnode.dev/mira-a-telegram-bot-and-mini-app-that-turns-your-sources-into-channel-post-drafts</guid><category><![CDATA[telegram]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[chatbot]]></category><dc:creator><![CDATA[Mira]]></dc:creator><pubDate>Fri, 23 Oct 2026 17:02:03 GMT</pubDate><content:encoded><![CDATA[<p>Keeping a Telegram channel alive takes the same loop every day: look for material, decide whether it fits your audience, write it up, schedule it. Mira (useMira) is a Telegram bot with a Mini App that automates the first half of that loop and helps with the second.</p>
<p>How it works: you list your sources (websites, RSS feeds, YouTube, Reddit, Google News, Telegram channels, Bluesky) and describe your channel's topic, audience and tone, plus what to avoid. Mira searches your sources on its own, scores each item against that profile, and shows in the Inbox why it picked it. From the items you keep, it prepares drafts in your channel's voice.</p>
<p>You stay in control: drafts open in an editor with a preview, the Plan screen shows what is scheduled for each day, and nothing is published without your approval unless you switch on auto-publish. If you have no source at all, you can start a post from a bare topic. The Today screen always shows the next step, so setup takes minutes.</p>
<p>Mira is built and run by one independent developer and launched in April 2026. There is a free tier to start with. Website: <a href="https://usemira.pro/about">https://usemira.pro/about</a> Bot: <a href="https://t.me/usemirabot">https://t.me/usemirabot</a></p>
]]></content:encoded></item></channel></rss>