<?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: Tony Hui</title>
    <description>The latest articles on DEV Community by Tony Hui (@tony_hui_c4e5c0665a0d5b74).</description>
    <link>https://dev.to/tony_hui_c4e5c0665a0d5b74</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%2F3706379%2Fb2ead400-7546-4da4-b722-15ab9d413012.png</url>
      <title>DEV Community: Tony Hui</title>
      <link>https://dev.to/tony_hui_c4e5c0665a0d5b74</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tony_hui_c4e5c0665a0d5b74"/>
    <language>en</language>
    <item>
      <title>A follow-up tracker with four fields and no server</title>
      <dc:creator>Tony Hui</dc:creator>
      <pubDate>Thu, 05 Nov 2026 10:24:47 +0000</pubDate>
      <link>https://dev.to/tony_hui_c4e5c0665a0d5b74/a-follow-up-tracker-with-four-fields-and-no-server-1hdb</link>
      <guid>https://dev.to/tony_hui_c4e5c0665a0d5b74/a-follow-up-tracker-with-four-fields-and-no-server-1hdb</guid>
      <description>&lt;p&gt;There is a failure mode that hits almost everyone who does work for other people, and it is not a technical one.&lt;/p&gt;

&lt;p&gt;You finish the job, you send the invoice, and then the invoice disappears into a mental list you never wrote down. Three weeks later you remember it, and by then you are the one apologising for asking.&lt;/p&gt;

&lt;p&gt;The usual fixes all fail for the same reason. A spreadsheet is never opened. A reminder app fires while you are in a meeting and gets dismissed. A Notion database is beautiful and costs three minutes of maintenance per item, so it is abandoned within a week. None of them are built around the actual object, which is not "a task" but "something another person owes you."&lt;/p&gt;

&lt;p&gt;OweTrace is a small iOS app built on that premise. This post is about the design decisions, not the marketing, because the interesting part is what is deliberately absent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data model is intentionally boring
&lt;/h2&gt;

&lt;p&gt;The core object is an &lt;code&gt;Obligation&lt;/code&gt;. Four fields matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;what&lt;/code&gt; - a short label, free text&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kind&lt;/code&gt; - money, reply, document, or refund&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dueAt&lt;/code&gt; - the date the other person said they would act by&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nextNudgeAt&lt;/code&gt; - computed, never user-set&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last one is the only interesting decision. Users do not pick follow-up dates. The app derives them from a three-touch cadence: first nudge at two to four business days, second one a week later, third one a week after that, then a close-out.&lt;/p&gt;

&lt;p&gt;Why compute rather than ask: any interface that makes a user pick a date produces one of two bad outcomes. Either the user picks "tomorrow" for everything, or the user picks nothing because the decision is a nuisance. Deriving it means the default is correct and the user only intervenes when a case is genuinely unusual.&lt;/p&gt;

&lt;h2&gt;
  
  
  No account, no sync, no server
&lt;/h2&gt;

&lt;p&gt;This is the decision that looks wrong until you look at what is actually stored.&lt;/p&gt;

&lt;p&gt;A follow-up tracker is exactly the kind of thing people want on both a phone and a laptop. But every sync story needs an account, and every account is a thing that can be breached, a password someone forgets, and a server somebody has to keep running and paying for.&lt;/p&gt;

&lt;p&gt;The stored data is a list of what other people owe you. It is personal, it is not high-value, and it changes rarely. Local-only storage with a JSON export covers the real use case and removes an entire class of failure.&lt;/p&gt;

&lt;p&gt;The tradeoff is real and worth stating plainly: no sync means losing the phone means losing the list, unless you exported. There is an export. Most people will not use it. For a first version that is still the right call, because the alternative cost is having no users at all while waiting for a backend to justify itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reminder problem is a scheduling problem
&lt;/h2&gt;

&lt;p&gt;iOS notifications look simple and are not.&lt;/p&gt;

&lt;p&gt;A follow-up tracker has a specific shape: few items, each with few future trigger dates, all fully known at creation time. That maps cleanly onto &lt;code&gt;UNCalendarNotificationTrigger&lt;/code&gt;, which the system schedules ahead of time. No push notifications, no background refresh budget, no server deciding when to wake the app.&lt;/p&gt;

&lt;p&gt;What is needed instead is correct rescheduling when an item changes. If a nudge is marked sent, the next two triggers have to move forward by exactly one step of the cadence, not by a fixed interval from today. Getting this wrong produces a tracker that nags twice in one day and then goes silent for a month, which is worse than having no tracker at all.&lt;/p&gt;

&lt;p&gt;The whole scheduling module is a pure function from &lt;code&gt;[Obligation]&lt;/code&gt; to &lt;code&gt;[NotificationRequest]&lt;/code&gt;. It is about a hundred lines, it has no side effects, and it is the part worth writing tests for first. Everything else in the app is presentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this shape of problem teaches
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Derive schedules, do not ask for them.&lt;/strong&gt; A default that is right 80% of the time beats a picker that is right 100% of the time and used 20% of the time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make state exportable before making it syncable.&lt;/strong&gt; Export is a day of work. Sync is a quarter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model the cadence, not the reminder.&lt;/strong&gt; "Three touches then close out" survives a change in notification API; "schedule a notification for day 3" does not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do not build a social feature.&lt;/strong&gt; A list of what people owe you is embarrassing information. Nobody wants to share it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The app is free to start, with a Pro tier that unlocks unlimited active items. The longer write-up on follow-up timing, including the message templates, lives here:&lt;br&gt;
&lt;a href="https://taoapex.com/en/guides/general/how-long-to-wait-before-following-up/?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=owetrace-followup-cadence&amp;amp;utm_content=article-01" rel="noopener noreferrer"&gt;https://taoapex.com/en/guides/general/how-long-to-wait-before-following-up/?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=owetrace-followup-cadence&amp;amp;utm_content=article-01&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Disclosure: OweTrace is built by TAOAPEX LTD, which also publishes that guide.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>mobile</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Stop Prompt Chaos: Build a Professional Prompt Workflow</title>
      <dc:creator>Tony Hui</dc:creator>
      <pubDate>Mon, 12 Jan 2026 07:30:28 +0000</pubDate>
      <link>https://dev.to/tony_hui_c4e5c0665a0d5b74/stop-prompt-chaos-build-a-professional-prompt-workflow-59kb</link>
      <guid>https://dev.to/tony_hui_c4e5c0665a0d5b74/stop-prompt-chaos-build-a-professional-prompt-workflow-59kb</guid>
      <description>&lt;p&gt;Most people don’t have a “prompt quality” problem. They have a prompt lifecycle problem: a great prompt gets created once, then lost, duplicated, and rewritten forever.&lt;/p&gt;

&lt;p&gt;Here’s a lightweight system you can reuse across projects, teams, and models.&lt;/p&gt;

&lt;p&gt;1) The Prompt Lifecycle (Draft → Enhance → Improve → Save → Reuse)&lt;/p&gt;

&lt;p&gt;Treat prompts like assets (like code snippets or legal templates), not one-off messages.&lt;/p&gt;

&lt;p&gt;Draft: Write the simplest version that expresses intent.&lt;/p&gt;

&lt;p&gt;Enhance: Add clarity, constraints, and a fixed output structure.&lt;/p&gt;

&lt;p&gt;Run: Test on real inputs (not toy examples).&lt;/p&gt;

&lt;p&gt;Improve: Iterate with small, measurable changes.&lt;/p&gt;

&lt;p&gt;Save: Store with metadata + sample input/output.&lt;/p&gt;

&lt;p&gt;Reuse: Copy into the next task without starting over.&lt;/p&gt;

&lt;p&gt;2) What a Prompt Enhancer Actually Does&lt;/p&gt;

&lt;p&gt;A good prompt enhancer does three things:&lt;/p&gt;

&lt;p&gt;Makes the goal explicit (what “good” looks like)&lt;/p&gt;

&lt;p&gt;Adds constraints (what to avoid / what not to assume)&lt;/p&gt;

&lt;p&gt;Locks output format (so results are usable downstream)&lt;/p&gt;

&lt;p&gt;Before (vague): “Improve this onboarding email.”&lt;br&gt;
After (structured): “Rewrite for first-time users; &amp;lt;170 words; calm tone; include value promise + 3-step list + privacy reassurance + single CTA label; avoid hype; mention ‘AI’ at most once.”&lt;/p&gt;

&lt;p&gt;That’s the difference between lucky output and repeatable output.&lt;/p&gt;

&lt;p&gt;3) Prompt Improver = Versioning Mindset (Like Pros)&lt;/p&gt;

&lt;p&gt;Once a prompt is decent, stop rewriting from scratch. Improve like you’d optimize a landing page:&lt;/p&gt;

&lt;p&gt;Change one thing at a time (tone OR structure OR constraints — not all)&lt;/p&gt;

&lt;p&gt;Score with a simple rubric (Accuracy, Completeness, Usefulness, Style fit, Risk)&lt;/p&gt;

&lt;p&gt;Keep version history (so you can compare and roll back)&lt;/p&gt;

&lt;p&gt;This is how you build a dependable prompt library.&lt;/p&gt;

&lt;p&gt;4) Model-Specific Variants (Claude vs GPT)&lt;/p&gt;

&lt;p&gt;“One perfect prompt” is a myth. Different models respond differently, so create variants.&lt;/p&gt;

&lt;p&gt;A practical Claude-friendly pattern:&lt;/p&gt;

&lt;p&gt;Start with the job: “You are doing X.”&lt;/p&gt;

&lt;p&gt;Add motivation: “This matters because Y.”&lt;/p&gt;

&lt;p&gt;Provide one good example (avoid bad examples).&lt;/p&gt;

&lt;p&gt;Specify output format + stop conditions.&lt;/p&gt;

&lt;p&gt;5) Prompt Manager: Why Saving Prompts Isn’t Note-Taking&lt;/p&gt;

&lt;p&gt;If you only save raw prompt text, you won’t trust it later because you’ll forget:&lt;/p&gt;

&lt;p&gt;what it was for&lt;/p&gt;

&lt;p&gt;what input it expects&lt;/p&gt;

&lt;p&gt;which model it worked best on&lt;/p&gt;

&lt;p&gt;what “good output” looks like&lt;/p&gt;

&lt;p&gt;A real prompt manager helps with retrieval + reuse: tags/folders, full-text search, one-click copy, and version history.&lt;/p&gt;

&lt;p&gt;6) Save Prompts as “Prompt Cards” (Template)&lt;/p&gt;

&lt;p&gt;Use this compact format:&lt;/p&gt;

&lt;p&gt;Prompt Card&lt;/p&gt;

&lt;p&gt;Title:&lt;/p&gt;

&lt;p&gt;Goal:&lt;/p&gt;

&lt;p&gt;Audience:&lt;/p&gt;

&lt;p&gt;Model: (GPT / Claude / other)&lt;/p&gt;

&lt;p&gt;Inputs:&lt;/p&gt;

&lt;p&gt;Constraints: (no invented facts/citations; ask questions if info missing)&lt;/p&gt;

&lt;p&gt;Output format:&lt;/p&gt;

&lt;p&gt;Example input:&lt;/p&gt;

&lt;p&gt;Example output:&lt;/p&gt;

&lt;p&gt;Version notes: (what changed + why)&lt;/p&gt;

&lt;p&gt;7) Practical Prompt Packs (Copy/Paste)&lt;br&gt;
A) ChatGPT prompts for self-improvement (5)&lt;/p&gt;

&lt;p&gt;Weekly review&lt;br&gt;
“Ask me 10 questions to surface what worked, what didn’t, and what I avoided. After I answer, summarize patterns and propose 3 changes for next week. Keep it direct.”&lt;/p&gt;

&lt;p&gt;Habit design&lt;br&gt;
“Help me build a habit for: [goal]. Give 3 options (easy/medium/hard). For each: trigger, action, reward, and recovery after a missed day.”&lt;/p&gt;

&lt;p&gt;Decision clarity&lt;br&gt;
“I’m choosing between [A] and [B]. Ask only the questions needed to clarify constraints (time, money, risk). Then recommend with reasoning + a ‘first 30 minutes’ action plan.”&lt;/p&gt;

&lt;p&gt;30-day skill plan&lt;br&gt;
“Create a 30-day plan to improve [skill], 30 minutes/day. Give daily tasks, weekly checkpoints, and one measurable outcome per week.”&lt;/p&gt;

&lt;p&gt;Difficult conversation rehearsal&lt;br&gt;
“Roleplay a conversation with [person] about [topic]. First ask for context. Then simulate their likely pushback. Help me respond calmly. End with a short script I can actually say.”&lt;/p&gt;

&lt;p&gt;B) ChatGPT prompts for lawyer (5) + safety header&lt;/p&gt;

&lt;p&gt;Safety header (paste above every legal prompt):&lt;br&gt;
“Do not paste confidential client information. Use placeholders. Do not invent laws/cases/citations. If jurisdiction matters, ask first. Verify everything independently.”&lt;/p&gt;

&lt;p&gt;Contract risk scan (structured)&lt;br&gt;
“Review the clause below. Output: risk level; what it does; what could go wrong; suggested revision text; questions for the client.”&lt;/p&gt;

&lt;p&gt;Clause rewrite (stance)&lt;br&gt;
“Rewrite this clause to favor [buyer/seller/vendor/customer]. Provide two versions: ‘reasonable’ and ‘aggressive’. Explain tradeoffs in 5 bullets.”&lt;/p&gt;

&lt;p&gt;Client email (plain English)&lt;br&gt;
“Draft a client email explaining the issue in plain English (&amp;lt;180 words). Include: what it means, why it matters, recommendation.”&lt;/p&gt;

&lt;p&gt;Interview/deposition outline&lt;br&gt;
“Create an outline of questions to clarify facts for [issue]. Organize by topic and include follow-ups for evasive answers.”&lt;/p&gt;

&lt;p&gt;Hallucination-resistant research helper&lt;br&gt;
“State what you can conclude from the facts provided. Then list what you cannot conclude without external sources. If authorities are needed, provide a research checklist (not citations).”&lt;/p&gt;

&lt;p&gt;8) Prompt Debugging Checklist&lt;/p&gt;

&lt;p&gt;If outputs keep missing the mark, usually it’s because:&lt;/p&gt;

&lt;p&gt;you didn’t define success (add acceptance criteria: include X, exclude Y)&lt;/p&gt;

&lt;p&gt;the model is guessing missing context (force questions first)&lt;/p&gt;

&lt;p&gt;your example teaches the wrong behavior&lt;/p&gt;

&lt;p&gt;you needed a format, not “analysis” (lock structure)&lt;/p&gt;

&lt;p&gt;you mixed tasks (split: generate → critique)&lt;/p&gt;

&lt;p&gt;9) Where a Prompt Manager Pays Off Immediately&lt;/p&gt;

&lt;p&gt;You’ll feel ROI fastest when you have:&lt;/p&gt;

&lt;p&gt;Recurring work (emails, briefs, content frameworks, code reviews)&lt;/p&gt;

&lt;p&gt;Multi-model workflows (GPT + Claude + image tools)&lt;/p&gt;

&lt;p&gt;High-stakes domains (legal/finance/security) where versioning + guardrails matter&lt;/p&gt;

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