<?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: qingwancong</title>
    <description>The latest articles on DEV Community by qingwancong (@congcong).</description>
    <link>https://dev.to/congcong</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%2F4023087%2Ff00d80b4-f79b-4e77-a3cd-e1979ea635a2.png</url>
      <title>DEV Community: qingwancong</title>
      <link>https://dev.to/congcong</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/congcong"/>
    <language>en</language>
    <item>
      <title>A board-by-board method for building an 87 87 white cat bead pattern</title>
      <dc:creator>qingwancong</dc:creator>
      <pubDate>Tue, 28 Jul 2026 15:56:33 +0000</pubDate>
      <link>https://dev.to/congcong/a-board-by-board-method-for-building-an-87x87-white-cat-bead-pattern-1fo3</link>
      <guid>https://dev.to/congcong/a-board-by-board-method-for-building-an-87x87-white-cat-bead-pattern-1fo3</guid>
      <description>&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%2Fuhrltwmq369xoeoacpvw.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuhrltwmq369xoeoacpvw.png" alt="White cat and red camellia - PDF page 2 artwork reference, not a finished bead piece" width="800" height="1131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PDF page 2: the artwork reference for the subject and color balance. It is not a photograph of a finished fuse bead piece.&lt;/em&gt;&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%2Fsp1hvpmlmk6w2twdjfcw.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsp1hvpmlmk6w2twdjfcw.png" alt="Complete numbered 87 by 87 white cat and camellia bead map from PDF page 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PDF page 1: the complete numbered placement map. Use this page for exact bead positions and 29 × 29 board boundaries.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A mostly white bead pattern looks forgiving until you start placing it. The silhouette is easy to recognize, but three pale colors can collapse into one under warm room light. The mistakes are rarely dramatic; they are usually a row of White placed where Toasted Marshmallow should have carried the shadow.&lt;/p&gt;

&lt;p&gt;This white cat and camellia pattern is 87×87 cells. It spans nine 29×29 square boards, uses 16 colors, and contains 3,155 beads. The printable pack is three pages: a full view, a numbered placement map, and a material key. Here is the workflow I would use before touching the first peg.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sort by code, not by color name
&lt;/h2&gt;

&lt;p&gt;The four largest groups are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;White: 1,782 beads&lt;/li&gt;
&lt;li&gt;Toasted Marshmallow: 735&lt;/li&gt;
&lt;li&gt;Tomato: 152&lt;/li&gt;
&lt;li&gt;Tan: 115&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;White and Toasted Marshmallow account for almost four fifths of the project. Put them in separate opaque trays and label each tray with both the symbol from the PDF and the color code. Do not rely on visual memory after sunset; pale beads change surprisingly much under yellow light.&lt;/p&gt;

&lt;p&gt;The material list includes an 8% allowance. White needs two bags at that margin, while each of the other major colors fits into one. I still keep a small “unknown” cup beside the board. If a bead rolls away and I cannot identify it immediately, it goes there instead of being guessed back into the pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Place the anchors before the white field
&lt;/h2&gt;

&lt;p&gt;Do not begin by filling the largest empty-looking area. Start with the eyes, nose, ear edges, the red camellia, and the dark outline around the flower. These high-contrast landmarks make it obvious if the design has shifted by one column.&lt;/p&gt;

&lt;p&gt;Once the anchors line up with the numbered map, fill the pale regions outward from them. A wrong white bead inside a large white area is hard to notice. A wrong bead beside a black eye or red petal is obvious immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the nine boards names
&lt;/h2&gt;

&lt;p&gt;Label the 3×3 board layout A1–A3, B1–B3, and C1–C3. Add the same labels to a printed copy of the map. When one board is finished, check only two things before moving on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compare the final two rows on every shared edge.&lt;/li&gt;
&lt;li&gt;Take one overhead photo in the same orientation as the PDF.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That photo is not for social media. It is a cheap checkpoint. If the next session begins two days later, it tells you which board was finished and whether it was accidentally rotated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat the PDF pages as different tools
&lt;/h2&gt;

&lt;p&gt;The full image is for checking the cat’s pose and balance. The numbered map is for placement. The material table is for shopping and refilling trays. Trying to use the attractive preview as the placement guide is what makes a large project feel harder than it is.&lt;/p&gt;

&lt;p&gt;Small isolated cells deserve a manual check, especially around eyes, whisker roots, and flower edges. In a face, a cluster of three dark beads may carry more identity than a patch of fifty white beads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the iron before the cat
&lt;/h2&gt;

&lt;p&gt;Make a tiny test patch from spare beads. Start with a dry iron at medium heat, always use ironing paper, and move the heat evenly without pressing hard. If the center holes close immediately, reduce the temperature. For a nine-board piece, uneven heat at the outer edges is more dangerous than taking an extra minute.&lt;/p&gt;

&lt;p&gt;Let the piece cool before lifting the paper slowly. If children are involved, the ironing step belongs to an adult.&lt;/p&gt;

&lt;p&gt;The useful part of a large pattern is not the thumbnail. It is the combination of a readable map, board boundaries, exact counts, and a material key. The cat pattern library and its printable workflow are available in the &lt;a href="https://toonbead.com/patterns" rel="noopener noreferrer"&gt;Toonbead printable pattern library&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>diy</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Designing a Roblox Player Companion Around Verifiable Information</title>
      <dc:creator>qingwancong</dc:creator>
      <pubDate>Fri, 24 Jul 2026 16:12:59 +0000</pubDate>
      <link>https://dev.to/congcong/designing-a-roblox-player-companion-around-verifiable-information-46il</link>
      <guid>https://dev.to/congcong/designing-a-roblox-player-companion-around-verifiable-information-46il</guid>
      <description>&lt;p&gt;Player guides for a fast-moving Roblox game have a reliability problem: a useful page can become wrong as soon as an update lands.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Merge a Black Hole Companion&lt;/strong&gt;, an independent, unofficial resource for players of XAF Games’ Merge a Black Hole. The project is deliberately scoped around information a guide can stand behind: current game status, codes with a source/verification label, beginner and raid routes, update notes, and small planning tools.&lt;/p&gt;

&lt;p&gt;The central product decision was to separate &lt;em&gt;facts&lt;/em&gt; from &lt;em&gt;assumptions&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A live status surface uses the Roblox Games and Votes APIs rather than copying a number into a page.&lt;/li&gt;
&lt;li&gt;Codes and update notes are labelled by source and verification state instead of being presented as permanent truth.&lt;/li&gt;
&lt;li&gt;The upgrade tools run privately in the browser. They help a player reason about ROI or compare two upgrade paths without requiring an account.&lt;/li&gt;
&lt;li&gt;Pages avoid publishing unverified progression tables, exploits, or fake “community” activity.&lt;/li&gt;
&lt;li&gt;Every important route keeps the unofficial fan-site disclaimer close to the relevant player action and points people back to official links.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sounds conservative, but it is a better fit for a game whose meta changes often. A companion does not need to pretend it knows every number; it needs to make its evidence clear and help players make a decision with the information currently available.&lt;/p&gt;

&lt;p&gt;The implementation is a small Cloudflare Worker app with server-rendered, indexable guides, JSON-LD, a sitemap, and an Open Graph asset. The hard part is not the framework. It is maintaining the boundary between a useful player tool and an authoritative-looking page with no evidence behind it.&lt;/p&gt;

&lt;p&gt;The project is available at &lt;a href="https://mergeablackhole.net/" rel="noopener noreferrer"&gt;https://mergeablackhole.net/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>Why I Built a Free Printable Bead Pattern Library Instead of a Gallery</title>
      <dc:creator>qingwancong</dc:creator>
      <pubDate>Tue, 21 Jul 2026 16:58:23 +0000</pubDate>
      <link>https://dev.to/congcong/why-i-built-a-free-printable-bead-pattern-library-instead-of-a-gallery-4pe8</link>
      <guid>https://dev.to/congcong/why-i-built-a-free-printable-bead-pattern-library-instead-of-a-gallery-4pe8</guid>
      <description>&lt;h2&gt;
  
  
  A usable craft template needs more than a pretty preview
&lt;/h2&gt;

&lt;p&gt;A lot of digital craft resources stop at the image. They give you a small preview, perhaps a color approximation, and then leave the difficult translation to the person at the pegboard.&lt;/p&gt;

&lt;p&gt;That is fine for inspiration. It is not enough for a pattern someone can actually start, pause, and finish.&lt;/p&gt;

&lt;p&gt;The update I have been working on is a free printable pattern library for Toonbead. Each entry begins as original Toonbead Studio artwork and becomes a deliberately constrained 29 × 29 fuse-bead project. The point is not to generate a large collection of decorative thumbnails. The point is to publish templates with the missing handoff details included.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat the placement map as the source of truth
&lt;/h2&gt;

&lt;p&gt;A finished-looking pattern image is helpful for seeing the result, but it is a weak build instruction. Small colors merge, visual counting is error-prone, and two similar shades can become indistinguishable once the image is printed.&lt;/p&gt;

&lt;p&gt;Each library pattern therefore has a complete numbered placement map. Every colored cell uses the same symbol that appears in the printable PDF and in the material key. That lets the builder work from an unambiguous grid rather than trying to reverse-engineer a scaled-down preview.&lt;/p&gt;

&lt;p&gt;The initial collection deliberately stays at one 29 × 29 board. That constraint is part of the product design: it keeps the project approachable, makes the page honest about the required footprint, and avoids presenting a multi-board undertaking as a quick afternoon craft.&lt;/p&gt;

&lt;h2&gt;
  
  
  Material counts should be measured, not guessed
&lt;/h2&gt;

&lt;p&gt;The next gap in many free patterns is materials. “Use some blue and brown beads” is enough for an illustration, but not enough for someone preparing a project.&lt;/p&gt;

&lt;p&gt;A pattern page should tell the person how many beads it contains, which real palette it maps to, and how to retrieve an exact color-by-color list. In the library, each template includes counted materials and a downloadable CSV with a small spare-bead allowance. The printable PDF is a four-page build document rather than a single poster: overview, board map, symbol key, and material information have different jobs.&lt;/p&gt;

&lt;p&gt;This also creates a useful standard for future templates. A visual has not earned the label “free pattern” merely because it exists as a picture. It should be possible to check the grid, gather materials, and begin without inventing missing instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the origin of the artwork clear
&lt;/h2&gt;

&lt;p&gt;The library templates are original Toonbead Studio digital artwork. They are not user submissions, and they are not photographs of completed physical pieces. That disclosure matters because a source artwork and a real-world build are different kinds of evidence.&lt;/p&gt;

&lt;p&gt;Showing the source alongside the bead pattern makes the transformation understandable without pretending that the physical craft has already been completed. It also protects the library from drifting into an opaque feed of generated images with no clue how they became buildable.&lt;/p&gt;

&lt;h2&gt;
  
  
  A template should be a starting point, not a dead end
&lt;/h2&gt;

&lt;p&gt;A useful free template does not need an account, an AI generation, or a credit balance to load. But a builder may still want to change the colors, alter the size, inspect another bead brand, or export the result again.&lt;/p&gt;

&lt;p&gt;That is why the final link in the workflow matters: opening a library template in the Maker transfers a real pattern into a local editing context. Loading, recoloring, resizing, and exporting the public template remain local operations. Optional AI remains separate and requires an explicit choice later; it is not silently attached to a free pattern.&lt;/p&gt;

&lt;p&gt;The result is a smaller promise than “unlimited AI art,” but it is more useful to a maker. A person can select a recognisable project, see the exact work involved, print it, and still adapt it for their own materials.&lt;/p&gt;

&lt;p&gt;The first free library templates, including owl, butterfly, dinosaur, hedgehog, watermelon, cupcake, ghost, flower, star, heart, crown, and alphabet patterns, are available in Toonbead’s Pattern Library: &lt;a href="https://toonbead.com/patterns" rel="noopener noreferrer"&gt;https://toonbead.com/patterns&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>Designing an Own-Voice Consent Flow for an API-First TTS Product</title>
      <dc:creator>qingwancong</dc:creator>
      <pubDate>Sat, 18 Jul 2026 16:03:26 +0000</pubDate>
      <link>https://dev.to/congcong/designing-an-own-voice-consent-flow-for-an-api-first-tts-product-207c</link>
      <guid>https://dev.to/congcong/designing-an-own-voice-consent-flow-for-an-api-first-tts-product-207c</guid>
      <description>&lt;h2&gt;
  
  
  Voice cloning is a product-design problem before it is a model problem
&lt;/h2&gt;

&lt;p&gt;It is tempting to describe voice cloning as a simple pipeline: collect a sample, create a voice, synthesize some text. That description is technically tidy, but it skips the part that determines whether the workflow deserves trust.&lt;/p&gt;

&lt;p&gt;A voice is not merely another media asset. It is recognisable, personal, and easy to mistake for identity. So the interface has to make the boundaries of the system legible before anyone reaches the satisfying moment of pressing “generate.”&lt;/p&gt;

&lt;p&gt;This is the set of constraints I use when designing an own-voice text-to-speech workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put consent inside the action, not after it
&lt;/h2&gt;

&lt;p&gt;A generic terms checkbox at account creation is weak context. The meaningful decision happens when a person uploads or records the sample that will become a reusable voice.&lt;/p&gt;

&lt;p&gt;The flow should therefore make three things concrete at that point:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user is supplying their own voice, or has the authority to use it.&lt;/li&gt;
&lt;li&gt;The sample is being used to create a synthetic voice for the requested purpose.&lt;/li&gt;
&lt;li&gt;The user understands that generated speech is a new output, not a recording of something they said.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A short spoken verification phrase is useful here. It makes the experience more intentional than a silent upload, and it gives the product a natural place to explain the boundary. The goal is not to pretend that one phrase solves every identity question. It is to avoid an interface that treats the source voice as an anonymous file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate the clone from the script
&lt;/h2&gt;

&lt;p&gt;There are two different decisions in this category of tool. The first is whether a voice should be created. The second is what text that voice should say.&lt;/p&gt;

&lt;p&gt;Keeping those stages separate improves both the user experience and the auditability of the product. A creation step can focus on sample quality, consent, and what is retained. A synthesis step can focus on pronunciation, pacing, language, and the actual script. Combining them in one opaque button makes it harder for a user to understand what happened and harder for the product team to set responsible defaults.&lt;/p&gt;

&lt;p&gt;This distinction also makes errors easier to communicate. “We could not create the voice from this sample” and “we could not synthesize this script” are different failures. They should not collapse into a vague loading state or, worse, a plausible-looking fake result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make failure honest
&lt;/h2&gt;

&lt;p&gt;Generative products are often judged by their happy path, but trust is built in the unhappy path. If the voice provider is unavailable, the product should return a clear temporary error. If a sample is too short or unusable, explain the next useful action. If the request cannot meet the product's consent rules, stop before generation.&lt;/p&gt;

&lt;p&gt;That may feel less magical than silently substituting a generic voice, but it respects the user. A workflow that creates media should always make the origin of its output clear.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy is part of the interface
&lt;/h2&gt;

&lt;p&gt;People reasonably want to know what happens to a sample after upload. The answer cannot live only in a policy page. The UI should say, in plain language, what the current action sends, what is processed remotely, and what the user can expect to keep locally.&lt;/p&gt;

&lt;p&gt;For small creator tools, clarity has another benefit: it prevents product scope from drifting toward “clone any voice” as a growth shortcut. A focused own-voice workflow is not just a safer message; it gives the interface a coherent job to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The best use case is often continuity
&lt;/h2&gt;

&lt;p&gt;The most grounded use cases are practical: recording accessible narration in a familiar voice, drafting a corrected pickup after a recording session, or turning a prepared script into an audio version without losing the creator's identity.&lt;/p&gt;

&lt;p&gt;Those are not reasons to remove safeguards. They are reasons to build safeguards into the workflow people actually use. When a tool asks for explicit intent, separates creation from synthesis, and reports failure honestly, it feels less like a trick and more like a piece of creator infrastructure.&lt;/p&gt;

&lt;p&gt;I am applying these constraints in ClonaTuVoz, a Spanish-first own-voice cloning workspace: &lt;a href="https://clonatuvoz.com/" rel="noopener noreferrer"&gt;https://clonatuvoz.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>ChatWorkSkin: a free Codex skin builder with automatic macOS and Windows installers</title>
      <dc:creator>qingwancong</dc:creator>
      <pubDate>Fri, 17 Jul 2026 18:29:34 +0000</pubDate>
      <link>https://dev.to/congcong/chatworkskin-a-free-codex-skin-builder-with-automatic-macos-and-windows-installers-47dn</link>
      <guid>https://dev.to/congcong/chatworkskin-a-free-codex-skin-builder-with-automatic-macos-and-windows-installers-47dn</guid>
      <description>&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%2Fhcjyjed46lc4ehcay55m.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhcjyjed46lc4ehcay55m.png" alt="ChatWorkSkin current homepage" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ChatWorkSkin is now focused on one simple workflow: build a free Codex skin in the browser, download a layered .dreamskin package, and install it with a guided macOS or Windows path.&lt;/p&gt;

&lt;p&gt;The current homepage positions it around these keywords: free Codex skin, ChatGPT skin for coding, Codex desktop theme, AI coding workspace theme, and automatic Codex skin installer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the page offers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A local visual builder for layered .dreamskin themes&lt;/li&gt;
&lt;li&gt;Built-in original artwork presets for Codex desktop customization&lt;/li&gt;
&lt;li&gt;A live Codex-style preview before installing&lt;/li&gt;
&lt;li&gt;Automatic installer guidance for macOS and Windows&lt;/li&gt;
&lt;li&gt;A restore path that keeps native Codex controls and app files intact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key point is that the skin is not a fake screenshot overlay. It is built for a coding workspace where the sidebar, project picker, tasks, menus, and composer still need to work normally.&lt;/p&gt;

&lt;p&gt;Try it here: &lt;a href="https://chatworkskin.com/" rel="noopener noreferrer"&gt;https://chatworkskin.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>Correction: ChatWorkSkin 1.2.2 latest UI uses the new fine-tune panel</title>
      <dc:creator>qingwancong</dc:creator>
      <pubDate>Fri, 17 Jul 2026 07:23:07 +0000</pubDate>
      <link>https://dev.to/congcong/correction-chatworkskin-122-latest-ui-uses-the-new-fine-tune-panel-2ba2</link>
      <guid>https://dev.to/congcong/correction-chatworkskin-122-latest-ui-uses-the-new-fine-tune-panel-2ba2</guid>
      <description>&lt;p&gt;I reposted ChatWorkSkin with the correct latest UI screenshot.&lt;/p&gt;

&lt;p&gt;The current 1.2.2 build is about layered .dreamskin themes and native Codex controls, but the visual detail that matters is the new fine-tune panel. It shows optional foreground layers, theme name, theme copy, colors, and focal point controls in the current studio UI.&lt;/p&gt;

&lt;p&gt;This replaces the older workbench screenshot I shared earlier.&lt;/p&gt;

&lt;p&gt;Current product page: &lt;a href="https://chatworkskin.com/" rel="noopener noreferrer"&gt;https://chatworkskin.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Search-intent mirror: &lt;a href="https://chatgptskin.org/" rel="noopener noreferrer"&gt;https://chatgptskin.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keywords: Codex skin, Codex theme, Codex desktop customization, AI coding workspace theme, dreamskin theme package.&lt;/p&gt;

</description>
      <category>showdev</category>
    </item>
    <item>
      <title>ChatWorkSkin update: a visual Codex skin studio with layered .dreamskin packages</title>
      <dc:creator>qingwancong</dc:creator>
      <pubDate>Fri, 17 Jul 2026 06:45:38 +0000</pubDate>
      <link>https://dev.to/congcong/chatworkskin-update-a-visual-codex-skin-studio-with-layered-dreamskin-packages-2b80</link>
      <guid>https://dev.to/congcong/chatworkskin-update-a-visual-codex-skin-studio-with-layered-dreamskin-packages-2b80</guid>
      <description>&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%2Fxngxtidcfhjk3pc10qcv.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%2Fxngxtidcfhjk3pc10qcv.jpg" alt="ChatWorkSkin Codex theme preview" width="799" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I pushed a new visual update for ChatWorkSkin / Codex Dream Skin. The project is still focused on one narrow job: make a Codex desktop workspace feel personal without breaking native controls.&lt;/p&gt;

&lt;p&gt;The latest version is no longer just a background swap. It is a small local studio for Codex skins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;choose original artwork&lt;/li&gt;
&lt;li&gt;preview the Codex desktop theme before installing&lt;/li&gt;
&lt;li&gt;export a verifiable layered .dreamskin package&lt;/li&gt;
&lt;li&gt;install on macOS or Windows with a prefilled Codex task&lt;/li&gt;
&lt;li&gt;keep the native sidebar, task list, input box, and restore path intact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The product angle is for people searching for a Codex skin, Codex theme, Codex desktop customization, or an AI coding workspace theme.&lt;/p&gt;

&lt;p&gt;Try it here: &lt;a href="https://chatworkskin.com/" rel="noopener noreferrer"&gt;https://chatworkskin.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Search-intent mirror: &lt;a href="https://chatgptskin.org/" rel="noopener noreferrer"&gt;https://chatgptskin.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The implementation deliberately avoids modifying the official app package. The skin package and install flow stay reversible so the desktop workspace can be customized without turning the app into a fragile fork.&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Building a free Codex skin installer without touching the official app package</title>
      <dc:creator>qingwancong</dc:creator>
      <pubDate>Thu, 16 Jul 2026 16:12:58 +0000</pubDate>
      <link>https://dev.to/congcong/building-a-free-codex-skin-installer-without-touching-the-official-app-package-49lm</link>
      <guid>https://dev.to/congcong/building-a-free-codex-skin-installer-without-touching-the-official-app-package-49lm</guid>
      <description>&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%2F72v74vtn2pfoygc3edui.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F72v74vtn2pfoygc3edui.png" alt="Codex Dream Skin preview" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I shipped a small tool for a very specific search intent: people looking for a &lt;strong&gt;ChatGPT skin&lt;/strong&gt; or a &lt;strong&gt;free Codex skin&lt;/strong&gt; for their coding workspace.&lt;/p&gt;

&lt;p&gt;The result is &lt;a href="https://chatgptskin.org/" rel="noopener noreferrer"&gt;Codex Dream Skin&lt;/a&gt;: a free Codex desktop theme with original artwork, a local preview, and an automatic installer for macOS and Windows.&lt;/p&gt;

&lt;p&gt;The important constraint was not visual. It was safety.&lt;/p&gt;

&lt;p&gt;A theme tool for a coding assistant should not ask users to replace the official app, patch an app bundle, edit &lt;code&gt;app.asar&lt;/code&gt;, or take ownership of protected Windows app files. That kind of shortcut may work once, but it is brittle across updates and hard to restore.&lt;/p&gt;

&lt;p&gt;So I built the workflow around a different rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Change the mood around Codex, but keep Codex itself intact.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What the site does
&lt;/h2&gt;

&lt;p&gt;The public page is built around the keywords already used on the website: &lt;strong&gt;Codex skin&lt;/strong&gt;, &lt;strong&gt;Codex theme&lt;/strong&gt;, &lt;strong&gt;free Codex skin&lt;/strong&gt;, &lt;strong&gt;automatic Codex skin installer&lt;/strong&gt;, &lt;strong&gt;Codex desktop customization&lt;/strong&gt;, &lt;strong&gt;ChatGPT coding theme&lt;/strong&gt;, &lt;strong&gt;Codex macOS&lt;/strong&gt;, and &lt;strong&gt;Codex Windows&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The flow is deliberately simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose one of the bundled original themes.&lt;/li&gt;
&lt;li&gt;Preview the Codex skin in the browser.&lt;/li&gt;
&lt;li&gt;Prepare the one-command installer.&lt;/li&gt;
&lt;li&gt;Paste it into Terminal or PowerShell.&lt;/li&gt;
&lt;li&gt;Restore the original Codex appearance whenever needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The tool also supports a custom-image path on macOS, so users can turn their own artwork into a Codex desktop theme.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why native controls matter
&lt;/h2&gt;

&lt;p&gt;A lot of visual demos can fake a full app with a screenshot. That is not useful for daily work.&lt;/p&gt;

&lt;p&gt;Codex Dream Skin keeps the real Codex controls in place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sidebar&lt;/li&gt;
&lt;li&gt;task list&lt;/li&gt;
&lt;li&gt;project picker&lt;/li&gt;
&lt;li&gt;menus&lt;/li&gt;
&lt;li&gt;composer&lt;/li&gt;
&lt;li&gt;restore path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The theme changes the surrounding visual layer and background treatment. It does not replace the workflow with a static mockup.&lt;/p&gt;

&lt;h2&gt;
  
  
  The safety boundary
&lt;/h2&gt;

&lt;p&gt;The installer is designed around a local loopback session and a reversible restore step.&lt;/p&gt;

&lt;p&gt;It does not modify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the official Codex app package&lt;/li&gt;
&lt;li&gt;&lt;code&gt;app.asar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;WindowsApps files&lt;/li&gt;
&lt;li&gt;code signatures&lt;/li&gt;
&lt;li&gt;conversation data&lt;/li&gt;
&lt;li&gt;login state&lt;/li&gt;
&lt;li&gt;API keys or model-provider configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point matters. A skin should stay separate from credentials and model routing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I also use ChatWorkSkin
&lt;/h2&gt;

&lt;p&gt;The search-domain angle is &lt;a href="https://chatgptskin.org/" rel="noopener noreferrer"&gt;chatgptskin.org&lt;/a&gt;: it is for people typing things like “ChatGPT skin”, “free ChatGPT skin”, or “free Codex skin”.&lt;/p&gt;

&lt;p&gt;The brand/workspace angle is &lt;a href="https://chatworkskin.com/" rel="noopener noreferrer"&gt;chatworkskin.com&lt;/a&gt;: it frames the same project as &lt;strong&gt;AI coding workspace theme&lt;/strong&gt; and &lt;strong&gt;Codex desktop customization&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Same product, two discovery angles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current state
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Free to use&lt;/li&gt;
&lt;li&gt;No account required&lt;/li&gt;
&lt;li&gt;macOS and Windows installers&lt;/li&gt;
&lt;li&gt;Built-in original themes&lt;/li&gt;
&lt;li&gt;Custom image workflow on macOS&lt;/li&gt;
&lt;li&gt;One-command install&lt;/li&gt;
&lt;li&gt;One-click restore&lt;/li&gt;
&lt;li&gt;Unofficial, not affiliated with OpenAI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you use Codex Desktop and want the workspace to feel less default, the early version is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chatgptskin.org/" rel="noopener noreferrer"&gt;https://chatgptskin.org/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Why Automatic Cleanup Made This Cat Bead Pattern Worse</title>
      <dc:creator>qingwancong</dc:creator>
      <pubDate>Wed, 15 Jul 2026 18:12:42 +0000</pubDate>
      <link>https://dev.to/congcong/why-automatic-cleanup-made-this-cat-bead-pattern-worse-3bjd</link>
      <guid>https://dev.to/congcong/why-automatic-cleanup-made-this-cat-bead-pattern-worse-3bjd</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; This is a digital prototype. The physical bead piece has not been built yet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’m building &lt;a href="https://toonbead.com" rel="noopener noreferrer"&gt;Toonbead&lt;/a&gt;, a browser-based tool that turns photos into fuse-bead patterns. I wanted the first documented pet case to show the whole pipeline—including the part that failed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test setup
&lt;/h2&gt;

&lt;p&gt;The source was a real gray-and-white cat photo. The workflow was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;One protected &lt;strong&gt;Pet Icon&lt;/strong&gt; AI restyle to simplify the fur and isolate the subject.&lt;/li&gt;
&lt;li&gt;Browser-local mapping to a &lt;strong&gt;58 × 58&lt;/strong&gt; grid with up to &lt;strong&gt;16 Perler Standard colors&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Local counting and export: &lt;strong&gt;803 beads&lt;/strong&gt;, four 29 × 29 boards, a six-page PDF, PNG, and materials CSV.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The AI step prepared the image. Grid size, palette matching, cleanup, counts, and exports stayed local and did not use another generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The useful failure
&lt;/h2&gt;

&lt;p&gt;I tested the one-click stray-bead cleanup. It removed several small white regions around the face. To the algorithm they looked isolated; to a human they were part of the cat’s muzzle and identity.&lt;/p&gt;

&lt;p&gt;So I reverted the cleanup and kept the pre-cleanup mapping as the downloadable result.&lt;/p&gt;

&lt;p&gt;That changed the product rule: cleanup should be reversible and visually reviewed, especially around eyes, muzzle, and markings. A lower bead count is not automatically a better pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the case includes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;original cat photo&lt;/li&gt;
&lt;li&gt;AI-assisted Pet Icon artwork&lt;/li&gt;
&lt;li&gt;transparent 58 × 58 bead-pattern PNG&lt;/li&gt;
&lt;li&gt;counted materials CSV&lt;/li&gt;
&lt;li&gt;six-page printable PDF with four board maps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every asset is labeled as a &lt;strong&gt;digital prototype&lt;/strong&gt;. There is no claim that a finished physical craft exists yet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://toonbead.com/cases/gray-white-cat" rel="noopener noreferrer"&gt;Inspect the full case and download the exact assets →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you build creative tools, how would you handle this: keep cleanup off by default, or protect likely face regions before simplifying?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>productivity</category>
      <category>product</category>
    </item>
    <item>
      <title>Today I added five AI styles and a printable PDF to Toonbead</title>
      <dc:creator>qingwancong</dc:creator>
      <pubDate>Wed, 15 Jul 2026 12:27:33 +0000</pubDate>
      <link>https://dev.to/congcong/today-i-added-five-ai-styles-and-a-printable-pdf-to-toonbead-jjc</link>
      <guid>https://dev.to/congcong/today-i-added-five-ai-styles-and-a-printable-pdf-to-toonbead-jjc</guid>
      <description>&lt;p&gt;Today I shipped a few updates to Toonbead, a small browser-based tool for turning photos into fuse bead patterns.&lt;/p&gt;

&lt;p&gt;The first update is a real style library instead of one generic AI look:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pet Icon for dogs and cats&lt;/li&gt;
&lt;li&gt;Cute Portrait for selfies and gifts&lt;/li&gt;
&lt;li&gt;Clean Cartoon for people and couples&lt;/li&gt;
&lt;li&gt;Retro Pixel for icons and simple objects&lt;/li&gt;
&lt;li&gt;Pop Poster for bold portraits&lt;/li&gt;
&lt;li&gt;Custom, where you can write your own visual direction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The style choice is explicit. It guides the optional AI restyle, but it does not try to draw the final bead grid. After the AI step, the browser still handles the craft-specific work: mapping to real bead colors, changing the grid and palette, cleaning up small regions, and showing board and bead counts.&lt;/p&gt;

&lt;p&gt;I also shipped a browser-local printable PDF export. It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a project overview&lt;/li&gt;
&lt;li&gt;numbered board-by-board pages&lt;/li&gt;
&lt;li&gt;a color key&lt;/li&gt;
&lt;li&gt;a counted materials list&lt;/li&gt;
&lt;li&gt;concise making notes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That distinction matters to me. A nice image is not automatically a useful craft pattern. The export needs to help someone move from a screen to a bead table.&lt;/p&gt;

&lt;p&gt;Uploading a photo still does not call the AI route. The user has to press Generate with AI. Verified accounts get three free AI generations, while local pattern edits and exports stay free and do not use credits. Toonbead does not persist the original or generated image.&lt;/p&gt;

&lt;p&gt;I am building this for pet portraits, personal gifts, and beginner-friendly weekend projects. I am still learning how many colors and boards feel manageable for a first-time maker.&lt;/p&gt;

&lt;p&gt;Try the updated Maker: &lt;a href="https://toonbead.com/maker" rel="noopener noreferrer"&gt;https://toonbead.com/maker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See the style library: &lt;a href="https://toonbead.com/styles" rel="noopener noreferrer"&gt;https://toonbead.com/styles&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you make fuse bead art or build creative tools, I would love to hear what makes a printable pattern genuinely useful.&lt;/p&gt;

</description>
      <category>showdev</category>
    </item>
    <item>
      <title>I added an AI restyle step to a practical fuse bead pattern maker</title>
      <dc:creator>qingwancong</dc:creator>
      <pubDate>Tue, 14 Jul 2026 07:09:58 +0000</pubDate>
      <link>https://dev.to/congcong/i-added-an-ai-restyle-step-to-a-practical-fuse-bead-pattern-maker-2aji</link>
      <guid>https://dev.to/congcong/i-added-an-ai-restyle-step-to-a-practical-fuse-bead-pattern-maker-2aji</guid>
      <description>&lt;p&gt;I’m building Toonbead, a photo-to-fuse-bead-pattern tool for makers who want results they can actually build.&lt;/p&gt;

&lt;p&gt;The new part is an AI restyle step between the uploaded photo and the bead grid.&lt;/p&gt;

&lt;p&gt;Most photo-to-pixel tools treat the image as the final result. That is not enough for fuse beads. A craft pattern needs a readable subject, broad color regions, a manageable palette, and enough structure to assemble on a pegboard.&lt;/p&gt;

&lt;p&gt;Toonbead now splits the workflow into two jobs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload a portrait, pet photo, or gift photo.&lt;/li&gt;
&lt;li&gt;Choose either a free browser-local Basic pattern or the recommended AI restyle.&lt;/li&gt;
&lt;li&gt;With one explicit AI generation, find and reframe the subject, simplify it into cleaner color regions, and remove the background.&lt;/li&gt;
&lt;li&gt;Map that AI mother image to real bead colors in the browser.&lt;/li&gt;
&lt;li&gt;Adjust grid size, color count, palette, cleanup, and crafting mode locally.&lt;/li&gt;
&lt;li&gt;Export a PNG pattern and materials CSV.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The API is deliberately narrow. Uploading a photo does not call the AI service. Changing the grid or colors does not call it again. One explicit Generate action makes one same-origin request, and the result is kept only in the active browser session so the local craft workflow can continue without another generation.&lt;/p&gt;

&lt;p&gt;The account flow is also simple: verify an email to receive three free AI generations. After that, one-time generation packs are available; there is no subscription. The browser-local Basic path stays free, including local adjustments and exports.&lt;/p&gt;

&lt;p&gt;The privacy boundary matters here. The uploaded photo is transiently proxied through the server to the image model during an explicit AI Generate, then the generated image is streamed back. Toonbead does not persist the original or generated image, image URLs, or prompts. That is different from claiming the photo never leaves the browser.&lt;/p&gt;

&lt;p&gt;I’m still treating the AI output as a starting mother image, not a final artwork or a guaranteed likeness. The craft-specific work remains visible and editable: real bead colors, board counts, bead counts, cleanup, and a pattern a person can follow.&lt;/p&gt;

&lt;p&gt;Try the current maker: &lt;a href="https://toonbead.com/maker" rel="noopener noreferrer"&gt;https://toonbead.com/maker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you build fuse bead art, pixel art, or photo-based craft projects, I’d love feedback on where this workflow can become more useful.&lt;/p&gt;

</description>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Building a Private AI Diary with On-Device Speech Transcription</title>
      <dc:creator>qingwancong</dc:creator>
      <pubDate>Sat, 11 Jul 2026 13:48:13 +0000</pubDate>
      <link>https://dev.to/congcong/building-a-private-ai-diary-with-on-device-speech-transcription-5bim</link>
      <guid>https://dev.to/congcong/building-a-private-ai-diary-with-on-device-speech-transcription-5bim</guid>
      <description>&lt;p&gt;Writing a diary sounds simple until the blank page appears at the end of a long day. The friction is usually not a lack of things to say. It is the work of opening a keyboard, choosing a structure, and turning a messy thought into a sentence before the thought disappears.&lt;/p&gt;

&lt;p&gt;That is the problem behind &lt;a href="https://nishuowoji.top" rel="noopener noreferrer"&gt;You Speak, I Journal&lt;/a&gt;, a voice journal app for iPhone. The product starts with speech instead of a blank text field: speak naturally, let the phone transcribe the recording, and then ask AI to organize the transcript into a journal entry, todos, reminders, and moments worth remembering.&lt;/p&gt;

&lt;p&gt;This article explains the design choices behind that workflow, especially the boundary between on-device speech transcription and server-side AI organization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two different jobs: transcription and organization
&lt;/h2&gt;

&lt;p&gt;Speech recognition and journal organization are related, but they do not need to happen in the same place.&lt;/p&gt;

&lt;p&gt;The first job is transcription. The app needs to turn a person's voice into text while they are recording. Keeping this step on the device has practical benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the app can provide immediate feedback while recording;&lt;/li&gt;
&lt;li&gt;the raw audio does not need to become a long-lived server object;&lt;/li&gt;
&lt;li&gt;the product can explain its privacy model more clearly;&lt;/li&gt;
&lt;li&gt;a local transcript can remain available if the network is unavailable later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The second job is organization. A transcript may contain several topics at once: a meeting decision, a grocery item, a worry about tomorrow, and a small moment from the day. A language model is useful for separating those threads into a readable entry and a short list of concrete actions.&lt;/p&gt;

&lt;p&gt;The important design decision is to send only the current transcript needed for that organization step. The app does not need to upload a complete diary archive every time a new note is processed.&lt;/p&gt;

&lt;h2&gt;
  
  
  A local-first data boundary
&lt;/h2&gt;

&lt;p&gt;"Private" is too vague to be a useful technical claim unless the boundary is specific. For this app, the boundary is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The original recording is used for the current transcription session and is not saved by default.&lt;/li&gt;
&lt;li&gt;The current transcript can be sent to the backend when the user asks for AI organization.&lt;/li&gt;
&lt;li&gt;The backend performs authentication, AI processing, subscription checks, and necessary usage accounting.&lt;/li&gt;
&lt;li&gt;The confirmed journal entry is stored on the iPhone by default.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is not the same as claiming that no text ever leaves the device. The AI organization step needs the current transcript, so the product should say that plainly. Precise privacy language is less exciting than a sweeping promise, but it is much easier for users to understand and verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the output should not become a chatbot
&lt;/h2&gt;

&lt;p&gt;It is tempting to make an AI diary sound expressive by adding a strong assistant personality. In practice, that can make a personal record feel artificial. A diary transformation should stay close to what the person actually said.&lt;/p&gt;

&lt;p&gt;The organization step therefore has a narrow job:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;correct obvious transcription errors;&lt;/li&gt;
&lt;li&gt;remove repetition and filler;&lt;/li&gt;
&lt;li&gt;preserve the writer's meaning and tone;&lt;/li&gt;
&lt;li&gt;separate reflection from concrete actions;&lt;/li&gt;
&lt;li&gt;generate a short title and summary;&lt;/li&gt;
&lt;li&gt;avoid inventing facts, diagnoses, or emotional conclusions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a spoken note such as "I need to send the revised screenshots to Sam before Friday, and I was relieved that the review finally moved forward" contains two different kinds of information. The first is an actionable todo. The second belongs in the journal body. Keeping those outputs separate makes the result useful without turning the app into a full task manager.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structured output matters more than a longer paragraph
&lt;/h2&gt;

&lt;p&gt;A useful AI diary response is not just a polished block of prose. The app needs predictable fields so that each part can be shown in the right place:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"diary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The review finally moved forward"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A short reflection on today's progress"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"daily"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What happened"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The review moved forward, and I felt relieved after the delay."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"todos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Send the revised screenshots to Sam"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"today"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reminders"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact schema can evolve, but the principle is stable: the model produces structured data, while the app owns presentation, local persistence, editing, and deletion. This separation also makes it easier to test whether a revision changed the user's meaning or accidentally created duplicate todos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing for failure
&lt;/h2&gt;

&lt;p&gt;Voice capture happens in real life, not in a clean demo. A user may lose connectivity, stop speaking halfway through a thought, or receive an imperfect transcription. The safe fallback is to keep the transcript or a local draft whenever possible instead of replacing it with an error screen.&lt;/p&gt;

&lt;p&gt;The same principle applies to AI output. If organization fails, the original text should remain available. The user should be able to retry, edit the draft manually, or save the note without AI. An AI diary should make the model optional at the point of failure, not make the user's memory depend on a successful API call.&lt;/p&gt;

&lt;h2&gt;
  
  
  The product lesson
&lt;/h2&gt;

&lt;p&gt;The most important part of a voice journal is not the model's writing style. It is the reduction of friction between an experience and a saved memory.&lt;/p&gt;

&lt;p&gt;On-device speech transcription helps someone start talking. A narrowly scoped AI organization step helps turn that talk into something readable and actionable. Local-first storage gives the finished entry a clear home. Together, those choices create a calmer workflow than asking the user to write, organize, and categorize everything at once.&lt;/p&gt;

&lt;p&gt;That is the direction we are taking with &lt;a href="https://nishuowoji.top" rel="noopener noreferrer"&gt;You Speak, I Journal&lt;/a&gt;: speak first, organize second, and keep the finished journal close to the person who wrote it.&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>ai</category>
      <category>ios</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
