<?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: codexu</title>
    <description>The latest articles on DEV Community by codexu (@codexu).</description>
    <link>https://dev.to/codexu</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%2F1648242%2Fc9346b24-ccea-4d45-b81d-d079209cb310.jpeg</url>
      <title>DEV Community: codexu</title>
      <link>https://dev.to/codexu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codexu"/>
    <language>en</language>
    <item>
      <title>How NoteGen handles sync queues and conflicts in a local-first Markdown app</title>
      <dc:creator>codexu</dc:creator>
      <pubDate>Fri, 31 Jul 2026 13:21:41 +0000</pubDate>
      <link>https://dev.to/codexu/how-notegen-handles-sync-queues-and-conflicts-in-a-local-first-markdown-app-2mop</link>
      <guid>https://dev.to/codexu/how-notegen-handles-sync-queues-and-conflicts-in-a-local-first-markdown-app-2mop</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/codexu/note-gen" rel="noopener noreferrer"&gt;codexu/note-gen&lt;/a&gt; is an open-source, local-first Markdown note-taking app. Notes live as regular files in the user's workspace. GitHub, Gitee, GitLab, Gitea, S3, and WebDAV are optional sync targets rather than the primary store.&lt;/p&gt;

&lt;p&gt;That ownership model creates a less obvious engineering problem. An editor save, a filesystem write, and a remote upload do not happen at the same time. Save events may fire repeatedly while someone is typing, and another device may change the same file before the next upload starts.&lt;/p&gt;

&lt;p&gt;A direct &lt;code&gt;save -&amp;gt; upload&lt;/code&gt; path would be easy to build, but it would also generate noisy requests and make stale writes more likely. NoteGen splits the job into three parts: an in-memory push queue, remote-version checks, and explicit conflict handling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Save events enqueue paths, not content
&lt;/h2&gt;

&lt;p&gt;The main entry point is &lt;code&gt;src/lib/sync/sync-push-queue.ts&lt;/code&gt;. A singleton &lt;code&gt;SyncPushQueue&lt;/code&gt; is initialized from &lt;code&gt;src/app/layout.tsx&lt;/code&gt; and listens for four events:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;article-saved&lt;/code&gt; adds the file path to the queue;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;editor-input&lt;/code&gt; refreshes the last-input timestamp;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sync-pulled&lt;/code&gt; prevents a fresh pull from immediately bouncing back as a push;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;article-opened&lt;/code&gt; resets the idle calculation when the active file changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The queue reads the user's auto-sync interval and checks for idleness every 100 milliseconds. It only calls &lt;code&gt;flush()&lt;/code&gt; after the configured quiet period has passed.&lt;/p&gt;

&lt;p&gt;The delay is not only a request-saving debounce. Before each upload, the queue waits another 100 milliseconds for the filesystem write to settle and then reads the file from disk again. The event answers “which path changed?”; the workspace answers “what is the latest content?”&lt;/p&gt;

&lt;p&gt;That distinction matters in a local-first editor. React state and editor events are transient. The Markdown file on disk is the durable fact the user owns.&lt;/p&gt;

&lt;h2&gt;
  
  
  It deduplicates by path, but it is not a durable job queue
&lt;/h2&gt;

&lt;p&gt;During &lt;code&gt;flush()&lt;/code&gt;, pending tasks are grouped in a &lt;code&gt;Map&lt;/code&gt; keyed by path. Repeated saves for one file collapse into the newest task. Different paths are processed from newest to oldest. If another save happens while an upload is running, the new task is appended and scheduled after the current batch.&lt;/p&gt;

&lt;p&gt;This is intentionally smaller than a general-purpose message queue. It lives in memory and does not recover pending work after an application restart. Before processing begins, a new &lt;code&gt;addTask()&lt;/code&gt; call also replaces the current queue with the latest task. The design optimizes for the final state of an interactive editing session, not delivery of every intermediate snapshot.&lt;/p&gt;

&lt;p&gt;An application that must deliver every file mutation would need persisted jobs, task states, restart recovery, and probably idempotency keys. A notes editor usually cares more about the final file than the version produced after each keystroke, so NoteGen accepts the narrower guarantee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read remote content before writing it
&lt;/h2&gt;

&lt;p&gt;When a push begins, the queue first calls &lt;code&gt;pullRemoteFile()&lt;/code&gt;. If the remote content is byte-for-byte equal to the local file, it skips the upload and only refreshes the locally recorded remote SHA. This avoids creating another commit when a save event fires without a content change.&lt;/p&gt;

&lt;p&gt;For GitHub, Gitee, GitLab, and Gitea, the queue then fetches the current remote file metadata again and passes its SHA to the provider's upload function. That SHA acts as an optimistic concurrency token: update the file only if the remote version still matches the version we just observed.&lt;/p&gt;

&lt;p&gt;After a successful upload, the returned remote SHA is stored in Tauri Store under &lt;code&gt;syncedFileShas&lt;/code&gt;. On a later open or sync, &lt;code&gt;compareFileVersions()&lt;/code&gt; in &lt;code&gt;src/lib/sync/auto-sync.ts&lt;/code&gt; compares the recorded SHA with the current remote SHA. A mismatch means the remote file changed since this device last synchronized it.&lt;/p&gt;

&lt;p&gt;The local content hash and the remote identifier are not interchangeable. Local content uses SHA-256, while Git providers may expose blob or commit identifiers. NoteGen therefore treats the remote SHA as a remote-version cursor, then uses local modification time, remote commit time, and the last sync time for additional decisions.&lt;/p&gt;

&lt;p&gt;There is also a ten-second grace period after a pull or restore. If writing remote content makes the local file appear newer for a moment, the grace period stops that filesystem timestamp from triggering an immediate push back to the server.&lt;/p&gt;

&lt;h2&gt;
  
  
  A conflict is not a transient network error
&lt;/h2&gt;

&lt;p&gt;The push queue classifies HTTP 409 and 422 responses, along with messages containing terms such as &lt;code&gt;sha&lt;/code&gt;, &lt;code&gt;blob&lt;/code&gt;, &lt;code&gt;out of date&lt;/code&gt;, or &lt;code&gt;conflict&lt;/code&gt;, as version mismatches.&lt;/p&gt;

&lt;p&gt;On the first mismatch, it does not keep retrying the same stale write. It emits a &lt;code&gt;sync-sha-mismatch&lt;/code&gt; event containing the path and the known local and remote identifiers. &lt;code&gt;src/components/sync-confirm-dialog.tsx&lt;/code&gt; consumes that event and asks the user whether to keep the local version. Only an explicit confirmation enters the &lt;code&gt;forcePush()&lt;/code&gt; path; cancelling leaves the remote file unchanged.&lt;/p&gt;

&lt;p&gt;Pulls have a separate content-level conflict path in &lt;code&gt;src/lib/sync/conflict-resolution.ts&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;identical content needs no action;&lt;/li&gt;
&lt;li&gt;a pure tail addition can be merged;&lt;/li&gt;
&lt;li&gt;content that only differs in whitespace can be treated as a formatting change;&lt;/li&gt;
&lt;li&gt;larger differences require a local-or-remote decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The merge is deliberately conservative. It is not a Markdown AST merge or a three-way merge, and it cannot understand two edits to the same paragraph. Asking the user is safer than manufacturing a document that looks valid while silently dropping meaning.&lt;/p&gt;

&lt;h2&gt;
  
  
  One workflow does not mean one consistency model
&lt;/h2&gt;

&lt;p&gt;All six providers pass through the same queue, but they do not provide identical conflict guarantees.&lt;/p&gt;

&lt;p&gt;Git-based providers expose SHAs or commit identifiers that fit optimistic concurrency checks. S3 and WebDAV store ETags in local sync state, but their current upload paths are primarily direct writes; they are not yet normalized into conditional requests with the same semantics as a Git SHA update.&lt;/p&gt;

&lt;p&gt;Provider adapters also differ in how they return or throw errors. The queue can only recognize a structured 409 or 422 if the adapter preserves that information. A shared &lt;code&gt;upload()&lt;/code&gt; shape is the easy part of multi-provider sync. The hard parts are version tokens, conditional writes, error classification, and a recovery action the user can understand.&lt;/p&gt;

&lt;p&gt;NoteGen currently shares scheduling and confirmation flows across providers while keeping those backend differences visible in the implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four rules worth carrying into another local-first app
&lt;/h2&gt;

&lt;p&gt;The implementation suggests four practical rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enqueue a path, then read the latest file from disk immediately before upload.&lt;/li&gt;
&lt;li&gt;Combine idle detection with per-path deduplication for high-frequency editor saves.&lt;/li&gt;
&lt;li&gt;Persist the remote version identifier as the baseline for the next sync.&lt;/li&gt;
&lt;li&gt;Treat network failure and version conflict as different states; the latter may require a user decision.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The useful measure of a sync system is not whether every request succeeds. It is whether latency, multi-device edits, and different storage protocols can be handled without making an irreversible overwrite on the user's behalf.&lt;/p&gt;

&lt;p&gt;The original Chinese version is available on &lt;a href="https://juejin.cn/spost/7668571193188810792" rel="noopener noreferrer"&gt;Juejin&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>markdown</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>NoteGen is a cross-platform Markdown note-taking application</title>
      <dc:creator>codexu</dc:creator>
      <pubDate>Thu, 29 May 2025 06:33:12 +0000</pubDate>
      <link>https://dev.to/codexu/notegen-is-a-cross-platform-markdown-note-taking-application-hj1</link>
      <guid>https://dev.to/codexu/notegen-is-a-cross-platform-markdown-note-taking-application-hj1</guid>
      <description>&lt;p&gt;Why Choose NoteGen?&lt;br&gt;
Lightweight: Installation package is only 20MB, free with no ads or bundled software.&lt;br&gt;
Cross-platform: Supports Mac, Windows, Linux, and thanks to Tauri2's cross-platform capabilities, will support iOS and Android in the future.&lt;br&gt;
Supports multiple recording methods including screenshots, text, illustrations, files, links, etc., meeting fragmented recording needs across various scenarios.&lt;br&gt;
Native Markdown(.md) as storage format, no modifications, easy to migrate.&lt;br&gt;
Native offline usage, supporting real-time synchronization to GitHub, Gitee private repositories with history rollback, and WebDAV synchronization.&lt;br&gt;
AI-enhanced: Configurable with ChatGPT, Gemini, Ollama, LM Studio, Grok, and other models, with support for custom third-party model configuration.&lt;br&gt;
Github: &lt;a href="https://github.com/codexu/note-gen" rel="noopener noreferrer"&gt;https://github.com/codexu/note-gen&lt;/a&gt;&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>tauri</category>
      <category>github</category>
    </item>
    <item>
      <title>💻 AI-Powered NoteGen: Transform Your Fragments into Masterpieces!</title>
      <dc:creator>codexu</dc:creator>
      <pubDate>Wed, 30 Apr 2025 05:55:31 +0000</pubDate>
      <link>https://dev.to/codexu/ai-powered-notegen-transform-your-fragments-into-masterpieces-4jj0</link>
      <guid>https://dev.to/codexu/ai-powered-notegen-transform-your-fragments-into-masterpieces-4jj0</guid>
      <description>&lt;p&gt;💻 Hey everyone, if you're tired of messy notes and want a simple way to turn your ideas into polished pieces, let me introduce you to NoteGen! 😍 It's this amazing AI-driven app that bridges recording and writing effortlessly. 🚀 As a busy note-taker myself, I've found it super helpful for organizing thoughts without the hassle.&lt;br&gt;
📝 First off, why pick NoteGen over others? 🌟 It's lightweight at just a few megabytes, completely free, and ad-free – no sneaky bundles here! 😊 It works on Mac, Windows, Linux, and even plans for iOS and Android soon, thanks to its cross-platform tech. 💪 Plus, it handles all sorts of inputs like screenshots, text, images, files, and links, making every scenario a breeze.&lt;br&gt;
🚀 Diving deeper, NoteGen splits into two awesome parts: recording and writing. 😎 In recording mode, it's like chatting with an AI bot that ties in your existing notes, and you can switch to organize mode to tidy up fragments into readable docs. 🌈 Features like tags for sorting, custom prompts for your AI helper, and a clipboard assistant that auto-grabs text or pics make it a game-changer. 📌 Don't forget the writing side, with a file manager for easy Markdown handling and an editor that offers real-time previews, AI for polishing text, and even tools for charts or formulas.&lt;br&gt;
🔄 What I love most is how it supports offline use, syncs to GitHub, and has AI from models like ChatGPT or Gemini. 😊 It's perfect for deep writing sessions where you can insert records on the fly and roll back changes if needed. 🌟 If you're into customization, tweak themes, search globally, or manage your image uploads easily. Trust me, it's a total efficiency boost!&lt;br&gt;
💡 So, what's your go-to note app right now? 😏 Give NoteGen a try and share your thoughts in the comments – I'd love to hear how it works for you! Remember, it's in alpha but already packs a punch. Let's level up our note-taking game together! ✨&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/codexu/note-gen" rel="noopener noreferrer"&gt;https://github.com/codexu/note-gen&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>NoteGen Markdown Editor</title>
      <dc:creator>codexu</dc:creator>
      <pubDate>Thu, 17 Apr 2025 06:01:59 +0000</pubDate>
      <link>https://dev.to/codexu/notegen-markdown-editor-273f</link>
      <guid>https://dev.to/codexu/notegen-markdown-editor-273f</guid>
      <description>&lt;p&gt;Github: &lt;a href="https://github.com/codexu/note-gen" rel="noopener noreferrer"&gt;https://github.com/codexu/note-gen&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NoteGen is a cross-platform &lt;code&gt;Markdown&lt;/code&gt; note-taking application dedicated to using AI to bridge recording and writing, organizing fragmented knowledge into a readable note.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Choose NoteGen?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Lightweight: &lt;a href="https://github.com/codexu/note-gen/releases" rel="noopener noreferrer"&gt;Installation package&lt;/a&gt; is &lt;strong&gt;only about 10MB&lt;/strong&gt;, free with no ads or bundled software.&lt;/li&gt;
&lt;li&gt;Cross-platform: Supports Mac, Windows, Linux, and thanks to &lt;code&gt;Tauri2&lt;/code&gt;'s cross-platform capabilities, will support iOS and Android in the future.&lt;/li&gt;
&lt;li&gt;Supports multiple recording methods including &lt;code&gt;screenshots&lt;/code&gt;, &lt;code&gt;text&lt;/code&gt;, &lt;code&gt;illustrations&lt;/code&gt;, &lt;code&gt;files&lt;/code&gt;, &lt;code&gt;links&lt;/code&gt;, etc., meeting fragmented recording needs across various scenarios.&lt;/li&gt;
&lt;li&gt;Native offline usage with &lt;code&gt;Markdown(.md)&lt;/code&gt; as the storage format, while also supporting real-time synchronization to &lt;code&gt;private GitHub repositories&lt;/code&gt; with history rollback.&lt;/li&gt;
&lt;li&gt;AI-enhanced: Configurable with ChatGPT, Gemini, Ollama, LM Studio, DeepSeek, and other models, with support for custom third-party model configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Screenshots
&lt;/h2&gt;

&lt;p&gt;Recording:&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.amazonaws.com%2Fuploads%2Farticles%2F0dnaag6h603sard2dp6h.png" 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.amazonaws.com%2Fuploads%2Farticles%2F0dnaag6h603sard2dp6h.png" alt="record" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Writing:&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.amazonaws.com%2Fuploads%2Farticles%2Fbbrleaenwvevg4idw0rh.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fbbrleaenwvevg4idw0rh.png" alt="writing" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dark Mode:&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.amazonaws.com%2Fuploads%2Farticles%2Fakjjq2907njisv1yi5mt.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fakjjq2907njisv1yi5mt.png" alt="dark" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  From Recording to Writing
&lt;/h2&gt;

&lt;p&gt;Conventional note-taking applications typically don't provide recording functionality. Users need to manually copy and paste content for recording, which greatly reduces efficiency. When faced with scattered recorded content, it requires significant effort to organize.&lt;/p&gt;

&lt;p&gt;NoteGen is divided into &lt;code&gt;Recording&lt;/code&gt; and &lt;code&gt;Writing&lt;/code&gt; pages, with the following relationship:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recordings can be organized into notes and transferred to the writing page for in-depth composition.&lt;/li&gt;
&lt;li&gt;During writing, you can insert recordings at any time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Recording
&lt;/h3&gt;

&lt;p&gt;The recording function is similar to an &lt;strong&gt;AI chatbot&lt;/strong&gt;, but when conversing with it, you can associate it with previously recorded content, switching from conversation mode to organization mode to arrange recordings into a readable note.&lt;/p&gt;

&lt;p&gt;The following auxiliary features can help you record more effectively:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tags&lt;/strong&gt; to distinguish different recording scenarios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personas&lt;/strong&gt; with support for custom prompts to precisely control your AI assistant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clipboard Assistant&lt;/strong&gt; that automatically recognizes text or images in your clipboard and records them to your list.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Writing
&lt;/h3&gt;

&lt;p&gt;The writing section is divided into two parts: &lt;strong&gt;File Manager&lt;/strong&gt; and &lt;strong&gt;Markdown Editor&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File Manager&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports management of local Markdown files and GitHub synchronized files.&lt;/li&gt;
&lt;li&gt;Supports unlimited directory hierarchy.&lt;/li&gt;
&lt;li&gt;Supports multiple sorting methods.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Markdown Editor&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports WYSIWYG, instant rendering, and split-screen preview modes.&lt;/li&gt;
&lt;li&gt;Supports version control with history rollback.&lt;/li&gt;
&lt;li&gt;Supports AI assistance for conversation, continuation, polishing, and translation functions.&lt;/li&gt;
&lt;li&gt;Supports image hosting, uploading images and converting them to Markdown image links.&lt;/li&gt;
&lt;li&gt;Supports HTML to Markdown conversion, automatically converting copied browser content to Markdown format.&lt;/li&gt;
&lt;li&gt;Supports outlines, math formulas, mind maps, charts, flowcharts, Gantt charts, sequence diagrams, staves, multimedia, voice reading, title anchors, code highlighting and copying, graphviz rendering, and plantuml UML diagrams.&lt;/li&gt;
&lt;li&gt;Supports real-time local content saving, delayed (10s without editing) automatic synchronization, and history rollback.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Other Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Global search for quickly finding and jumping to specific content.&lt;/li&gt;
&lt;li&gt;Image hosting management for convenient management of image repository content.&lt;/li&gt;
&lt;li&gt;Themes and appearance with support for dark themes and appearance settings for Markdown, code, etc.&lt;/li&gt;
&lt;li&gt;Internationalization support, currently available in Chinese and English.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Use?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Download
&lt;/h3&gt;

&lt;p&gt;Currently supports Mac, Windows, and Linux. Thanks to Tauri2's cross-platform capabilities, it will support iOS and Android in the future.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/codexu/note-gen/releases" rel="noopener noreferrer"&gt;Download NoteGen (alpha)&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Enhancement
&lt;/h3&gt;

&lt;p&gt;The note-taking application can be used directly without configuration. If you want a better experience, please open the settings page to configure AI and synchronization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Community
&lt;/h2&gt;

&lt;p&gt;Welcome to join the NoteGen community group where you can ask questions, share usage experiences, or suggest improvements. You can also join to learn about Tauri and discuss it with me.&lt;/p&gt;

&lt;p&gt;Scan the QR code to join the &lt;a href="https://github.com/codexu/note-gen/discussions/110" rel="noopener noreferrer"&gt;discussion group&lt;/a&gt;. If the QR code expires, you can add WeChat xu461229187 to join the group.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contribute
&lt;/h2&gt;

&lt;p&gt;NoteGen is implemented using the following technology stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v2.tauri.app/" rel="noopener noreferrer"&gt;Tauri 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/" rel="noopener noreferrer"&gt;Next.js 15&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ui.shadcn.com/" rel="noopener noreferrer"&gt;shadcn-ui&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How to contribute:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/codexu/note-gen/issues/46" rel="noopener noreferrer"&gt;Update plans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/codexu/note-gen/issues" rel="noopener noreferrer"&gt;Submit bugs or improvement suggestions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/codexu/note-gen/discussions" rel="noopener noreferrer"&gt;Discussions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>NoteGen is a cross-platform AI note-taking application focused on recording and writing, developed based on Tauri.</title>
      <dc:creator>codexu</dc:creator>
      <pubDate>Mon, 03 Mar 2025 06:06:20 +0000</pubDate>
      <link>https://dev.to/codexu/notegen-is-a-cross-platform-ai-note-taking-application-focused-on-recording-and-writing-developed-11k9</link>
      <guid>https://dev.to/codexu/notegen-is-a-cross-platform-ai-note-taking-application-focused-on-recording-and-writing-developed-11k9</guid>
      <description>&lt;p&gt;The core philosophy of NoteGen is to combine recording, writing, and AI, with all three complementing each other. The recording function helps users quickly capture and organize fragmented knowledge. The organization function is the bridge connecting recording and writing, which can organize continuously recorded content into a readable note, assisting users in completing the creation process from scratch. If the AI-organized results cannot meet your requirements, you can use the writing function to refine it yourself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/codexu/note-gen" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recording&lt;br&gt;
Recording methods supported:&lt;/p&gt;

&lt;p&gt;🖥️ Screenshot recording, through which users can quickly capture and record fragmented knowledge, especially in situations where text copying is not possible.&lt;br&gt;
📄 Text recording, which allows copying text or manually inputting brief content as a record.&lt;br&gt;
🖼️ Illustration recording, which can be automatically inserted into appropriate positions when generating notes.&lt;br&gt;
📇 File recording, which recognizes content from PDF, md, html, txt, and other files for text recording.&lt;br&gt;
🔗 Link recording (to be implemented), using web crawlers for page content recognition and recording.&lt;br&gt;
📷 Photo recording (to be implemented), similar to illustration recording, calling the camera to record, suitable for future mobile use.&lt;br&gt;
Auxiliary recording:&lt;/p&gt;

&lt;p&gt;🏷️ Custom tags for better categorization and differentiation of different recording scenarios.&lt;br&gt;
🤖 AI conversation, by default associated with records under the current tag, and you can also manually associate it with any article in your writing.&lt;br&gt;
📋 Clipboard recognition, which automatically recognizes images or text in the clipboard after you copy them.&lt;br&gt;
💾 Organization, when you have completed a series of records, you can try to let AI help you organize them into an article.&lt;br&gt;
Writing&lt;br&gt;
🗂 File manager, supporting management of files and folders in local and Github repositories, with unlimited directory levels.&lt;br&gt;
📝 Support for WYSIWYG, instant rendering, and split-screen preview modes.&lt;br&gt;
📅 Version control, if you enable synchronization, you can trace back to historically uploaded records in the history.&lt;br&gt;
🤖 AI assistance, supporting Q&amp;amp;A, continuation, optimization, simplification, translation, and other functions, and you can insert records into any position of the article at any time.&lt;br&gt;
🏞️ Image hosting, directly copy and paste images into the Markdown editor, which will automatically upload the image to the image hosting service and convert it to a Markdown image link.&lt;br&gt;
🛠️ HTML and Markdown conversion, copying content from browsers will automatically convert it to Markdown format.&lt;br&gt;
Auxiliary&lt;br&gt;
📦 Large model support, with multiple built-in large model configurations, supporting customization and easy switching.&lt;br&gt;
👁️ OCR, which can assist in recognizing text in images.&lt;br&gt;
🏗️ Organization templates, which can be customized for AI to organize different types of content.&lt;br&gt;
🔎 Global search, for quickly searching and jumping to specified content.&lt;br&gt;
🌃 Image hosting management, for convenient management of image hosting repository content.&lt;br&gt;
💎 Themes and appearance, supporting dark theme, and appearance settings for Markdown, code, etc.&lt;br&gt;
How to Use?&lt;br&gt;
Download&lt;br&gt;
Currently supports Mac, Windows, Linux, and thanks to Tauri2's cross-platform capabilities, it will support iOS and Android in the future.&lt;/p&gt;

&lt;p&gt;Download NoteGen (alpha)&lt;/p&gt;

&lt;p&gt;Getting Started Guide&lt;br&gt;
If you are not familiar with NoteGen, you can read the user documentation, which includes a quick start guide:&lt;/p&gt;

&lt;p&gt;NoteGen User Documentation&lt;/p&gt;

&lt;p&gt;AI Model Integration&lt;br&gt;
Currently supports custom model configuration, with built-in support for ChatGPT, ChatAnyWhere, Ollama, LM Studio, Doubao, Tongyi Qianwen, Kimi, DeepSeek, and all models using the OpenAI protocol. Support for other protocols will be gradually added in the future.&lt;/p&gt;

&lt;p&gt;Local models may currently experience 403 errors, waiting for a solution from http-plugin. This issue does not occur in the development environment.&lt;/p&gt;

&lt;p&gt;Discussion Topic - About Model Integration&lt;/p&gt;

&lt;p&gt;Synchronization and Image Hosting&lt;br&gt;
NoteGen supports offline storage, with all notes stored in Markdown format. To ensure the security of your notes, you can choose to synchronize them to a private Github repository. After configuring synchronization, Github image hosting functionality is also supported. Independent configuration for other image hosting services will be supported in the future.&lt;/p&gt;

&lt;p&gt;Contribute&lt;br&gt;
NoteGen is implemented using the following technology stack:&lt;/p&gt;

&lt;p&gt;Tauri 2&lt;br&gt;
Next.js 15&lt;br&gt;
shadcn-ui&lt;br&gt;
Participate in contributions:&lt;/p&gt;

&lt;p&gt;Update Plan&lt;br&gt;
Submit Bug or Improvement Suggestions&lt;br&gt;
Discussions&lt;br&gt;
If you are learning Tauri, you can follow my series 《Tauri Open Source Diary》.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
