<?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: gordey_pro</title>
    <description>The latest articles on DEV Community by gordey_pro (@gordey_pro).</description>
    <link>https://dev.to/gordey_pro</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%2F4171567%2F4e98352c-ae93-4679-984b-d9c0787bd5c7.png</url>
      <title>DEV Community: gordey_pro</title>
      <link>https://dev.to/gordey_pro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gordey_pro"/>
    <language>en</language>
    <item>
      <title>A Telegram Mini App in plain JavaScript — no build step, no dependencies, no guilt</title>
      <dc:creator>gordey_pro</dc:creator>
      <pubDate>Thu, 08 Oct 2026 14:47:14 +0000</pubDate>
      <link>https://dev.to/gordey_pro/a-telegram-mini-app-in-plain-javascript-no-build-step-no-dependencies-no-guilt-50a0</link>
      <guid>https://dev.to/gordey_pro/a-telegram-mini-app-in-plain-javascript-no-build-step-no-dependencies-no-guilt-50a0</guid>
      <description>&lt;p&gt;&lt;a href="https://t.me/hellatrener_bot" rel="noopener noreferrer"&gt;PULSAR&lt;/a&gt; is a Telegram Mini App for gentle self-tracking: mood, sleep, food, workouts,&lt;br&gt;
tasks, finances, a diary, skills and breathing — and a statistics screen that ties it together. Two decisions shaped it&lt;br&gt;
more than any framework would have.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decision 1: no build step at all
&lt;/h3&gt;

&lt;p&gt;PULSAR is vanilla JavaScript, HTML and CSS. No bundler, no npm dependencies, no transpiling. Cloudflare Pages deploys&lt;br&gt;
the repository as static files on every push.&lt;/p&gt;

&lt;p&gt;What that buys:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deploys are just files.&lt;/strong&gt; If something is wrong in production, the file in the repo is exactly what users run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nothing to rot.&lt;/strong&gt; No dependency updates breaking the build a year later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast inside Telegram.&lt;/strong&gt; A Mini App opens inside a chat; every kilobyte and every request is felt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it costs: discipline. Cache-busting is manual — a release bumps every &lt;code&gt;?v=&lt;/code&gt; query in &lt;code&gt;index.html&lt;/code&gt; and the version&lt;br&gt;
constant in the app &lt;em&gt;by the same number&lt;/em&gt;, or users get a mix of old CSS and new JS. And all storage goes through two&lt;br&gt;
small helpers (one for &lt;code&gt;localStorage&lt;/code&gt;, one for Telegram CloudStorage) so data stays isolated per account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decision 2: anti-shame as code
&lt;/h3&gt;

&lt;p&gt;Most trackers motivate with guilt: red streaks, "you missed a day", leaderboards. PULSAR does the opposite, and it's&lt;br&gt;
enforced in the code, not just in the copy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No "you failed" language anywhere.&lt;/strong&gt; No "you won't make it", no "missed".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Downward changes are muted&lt;/strong&gt;, not highlighted in red.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaks forgive gaps&lt;/strong&gt; — there's a grace period, so one bad day doesn't erase a month.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Basic tracking is never paywalled.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Statistics compare you only with yourself&lt;/strong&gt;, and the correlations are deterministic — "based on your data", not a
model's guess.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqok61fpesfvm9s626imo.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqok61fpesfvm9s626imo.jpg" alt="You vs. you: PULSAR compares you only with yourself" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Where AI is allowed
&lt;/h3&gt;

&lt;p&gt;AI is a side dish. A language model may &lt;em&gt;suggest&lt;/em&gt; what to log, but it never writes data itself: suggestions appear in a&lt;br&gt;
confirmation sheet, and only the user's tap saves anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design in one theme
&lt;/h3&gt;

&lt;p&gt;One dark "liquid glass" theme over a quiet starry sky, one cherry accent color, large bold type — and no theme picker.&lt;br&gt;
Fewer options meant every screen could be polished instead of every combination being "okay".&lt;/p&gt;

&lt;h3&gt;
  
  
  Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;For a small Mini App, "no build" is a feature, not a limitation — if you're strict about cache-busting.&lt;/li&gt;
&lt;li&gt;If your product is about wellbeing, put the tone rules in code, where they can't drift.&lt;/li&gt;
&lt;li&gt;Let AI propose; let the user decide.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm Gordey Fisun, I build websites, online stores, Telegram bots and Mini Apps for businesses —&lt;br&gt;
&lt;a href="https://gordey.pro" rel="noopener noreferrer"&gt;gordey.pro&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>telegram</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>ux</category>
    </item>
    <item>
      <title>Building a notes + whiteboard + graph app where losing data is not an option</title>
      <dc:creator>gordey_pro</dc:creator>
      <pubDate>Thu, 08 Oct 2026 14:46:33 +0000</pubDate>
      <link>https://dev.to/gordey_pro/building-a-notes-whiteboard-graph-app-where-losing-data-is-not-an-option-4nc4</link>
      <guid>https://dev.to/gordey_pro/building-a-notes-whiteboard-graph-app-where-losing-data-is-not-an-option-4nc4</guid>
      <description>&lt;p&gt;I built &lt;a href="https://omni.pp.ua" rel="noopener noreferrer"&gt;OMNI&lt;/a&gt; — one web app for documents, whiteboards, databases and a link graph. The editors&lt;br&gt;
were the easy part: I used ready-made ones, BlockNote for documents and tldraw for boards. The hard part was a promise&lt;br&gt;
I made to myself: &lt;strong&gt;a user must never lose a note&lt;/strong&gt;. Not after a crash, not after two open tabs, not after a bad sync.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqcii0ijc4b0cxwzfo6lw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqcii0ijc4b0cxwzfo6lw.gif" alt="OMNI: a board, a table, a kanban and the knowledge graph in one app" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is what that promise turned into in code.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. One door for every write
&lt;/h3&gt;

&lt;p&gt;All user data lives in IndexedDB (via Dexie), and there is exactly one place that writes it: a &lt;code&gt;VaultRepo&lt;/code&gt; module.&lt;br&gt;
Features never touch the database directly. That sounds bureaucratic, but it means every guarantee below is&lt;br&gt;
implemented once, not once per feature.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;localStorage&lt;/code&gt; is used for one thing only — the UI theme.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Every save is atomic and versioned
&lt;/h3&gt;

&lt;p&gt;Each write is a single transaction. Before an entity is overwritten, the previous version goes to its revision list —&lt;br&gt;
up to 30 revisions per entity. Restoring is just another write through the same door.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Delete means "move to trash"
&lt;/h3&gt;

&lt;p&gt;There is no hard delete in normal use. Deleted items go to a trash and can be restored; emptying the trash is a&lt;br&gt;
separate, explicit action. Old work that's still useful goes to an &lt;em&gt;archive&lt;/em&gt; instead — out of sight, still searchable.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Two tabs, no lost edits
&lt;/h3&gt;

&lt;p&gt;Two open tabs editing the same note is the classic way to lose data in a local-first app. OMNI detects the conflict and&lt;br&gt;
keeps both versions instead of letting the last writer win silently.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Backup is one JSON file
&lt;/h3&gt;

&lt;p&gt;The whole vault exports to one JSON file and imports back. Boring, and exactly what you want on a bad day.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Schema changes only through migrations
&lt;/h3&gt;

&lt;p&gt;The database schema changes only by a new Dexie version with a migration. No "just add a field" — that is how old&lt;br&gt;
data quietly breaks.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Tests guard the promise
&lt;/h3&gt;

&lt;p&gt;All of the above is covered by the test suite, and the rule is simple: if a change breaks a data-safety test, the&lt;br&gt;
change is wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keeping it fast
&lt;/h3&gt;

&lt;p&gt;Boards, documents and the graph are heavy, so each one is a lazy chunk: you only download tldraw when you open a board.&lt;br&gt;
The core (&lt;code&gt;src/core/&lt;/code&gt;) has no React and no editor code, and features don't import each other — which keeps the startup&lt;br&gt;
bundle small and the architecture honest.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr5q2unvfgqswoladow2h.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr5q2unvfgqswoladow2h.jpg" alt="The OMNI knowledge graph: every note and its links" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  AI without giving it the keys
&lt;/h3&gt;

&lt;p&gt;OMNI also exposes an MCP server, so an AI assistant can search the vault, read notes and propose changes. Changes the&lt;br&gt;
owner didn't ask for come in as drafts that wait for approval, and every edit still goes through the same door — soft&lt;br&gt;
delete and revision history included — so even an over-eager AI can't destroy anything for good.&lt;/p&gt;

&lt;h3&gt;
  
  
  Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pick one write path and make it the only one.&lt;/li&gt;
&lt;li&gt;Make deletion reversible by default.&lt;/li&gt;
&lt;li&gt;Treat "two tabs" as a real user, not an edge case.&lt;/li&gt;
&lt;li&gt;Use battle-tested editors; spend your effort on the data layer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm Gordey Fisun, I build websites, online stores, Telegram bots and AI assistants for businesses —&lt;br&gt;
&lt;a href="https://gordey.pro" rel="noopener noreferrer"&gt;gordey.pro&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>react</category>
      <category>indexeddb</category>
      <category>localfirst</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
