<?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: Tùng Xuân</title>
    <description>The latest articles on DEV Community by Tùng Xuân (@tanit365).</description>
    <link>https://dev.to/tanit365</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%2F4143608%2F36259d16-6ad1-4d7a-be1c-05e6957b929d.png</url>
      <title>DEV Community: Tùng Xuân</title>
      <link>https://dev.to/tanit365</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tanit365"/>
    <language>en</language>
    <item>
      <title>Security Controls That Actually Protect a Small Team</title>
      <dc:creator>Tùng Xuân</dc:creator>
      <pubDate>Thu, 05 Nov 2026 02:10:14 +0000</pubDate>
      <link>https://dev.to/tanit365/security-controls-that-actually-protect-a-small-team-37i9</link>
      <guid>https://dev.to/tanit365/security-controls-that-actually-protect-a-small-team-37i9</guid>
      <description>&lt;p&gt;Most small businesses do not lose data to a clever zero-day. They lose it to a reused password, an unpatched laptop, a backup nobody ever tried to restore, or an inbox rule an attacker created after one convincing email. The threat is mundane, which is the good news: mundane threats respond to mundane discipline.&lt;/p&gt;

&lt;p&gt;This is not a shopping list. It is an ordering of work, sorted by how fast each item limits the damage once something goes wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start by assuming one machine is already compromised
&lt;/h2&gt;

&lt;p&gt;Every control below is easier to justify once you accept a simple premise: at any given moment, one device on your network may already belong to someone else. You will never be certain which one. So the design goal is not a perfect wall — it is a building where a single open door does not expose every room.&lt;/p&gt;

&lt;p&gt;That reframing kills a lot of useless debate. Instead of arguing about which antivirus is best, you ask: if this laptop is hostile right now, what can it reach, and what would we lose?&lt;/p&gt;

&lt;h2&gt;
  
  
  Identity is the perimeter now
&lt;/h2&gt;

&lt;p&gt;The office firewall stopped being the boundary the day your team started working from kitchens and cafés. What replaced it is identity: the account, the second factor behind it, and the device it runs on.&lt;/p&gt;

&lt;p&gt;Three moves, in this order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One password manager for the whole team&lt;/strong&gt;, with sharing built in so nobody pastes credentials into chat. The value is not convenience, it is that a breach at one vendor no longer hands over your reuse pattern.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A second factor on every account that can spend money, move data, or change access.&lt;/strong&gt; Push approval or hardware keys where the account is valuable; short-lived codes elsewhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate admin accounts.&lt;/strong&gt; The person who administers your finance suite should not browse the web with that same session.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The failure mode to watch for is partial rollout. Half your team on the manager, half still keeping logins in a notebook, means the weak half sets the risk for everyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recovery beats prevention, and only a restore proves it
&lt;/h2&gt;

&lt;p&gt;Prevention fails eventually. Recovery fails only if you never tested it. That asymmetry is why backup deserves more attention than any detection product at small scale.&lt;/p&gt;

&lt;p&gt;Keep copies in three places with two different kinds of media, one of them offline or immutable, so ransomware that encrypts your file server cannot reach the copy it needs. Then do the part almost everyone skips: restore a real folder from a real backup, on a machine that is not the original, and time how long it takes. Write that number down. That duration is your actual recovery time, and it is usually a surprise.&lt;/p&gt;

&lt;p&gt;Two details that decide whether a backup is real or decorative:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Versioning depth.&lt;/strong&gt; If your retention is a single daily snapshot, an encrypted file that syncs before you notice will overwrite your clean copy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credential separation.&lt;/strong&gt; If the backup console uses the same admin login as the file server, an attacker with domain access deletes both.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Patch cadence is a habit, not a project
&lt;/h2&gt;

&lt;p&gt;Almost every serious intrusion chain includes a known vulnerability that was fixed upstream months earlier. The gap is rarely knowledge; it is ownership. Nobody's calendar says "patch day."&lt;/p&gt;

&lt;p&gt;Give it a calendar entry, an owner, and a rule: operating system and browser updates apply automatically within days; server and appliance firmware go through a scheduled window; anything internet-facing gets the fastest lane you can tolerate. Then verify rather than assume — pull a report that shows actual versions across the fleet instead of trusting that auto-update was on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Email is still the front door
&lt;/h2&gt;

&lt;p&gt;The single most effective email control for a small business is not a training video. It is turning off what attackers need: external sender impersonation, automatic attachment execution, and macro-enabled documents arriving from outside.&lt;/p&gt;

&lt;p&gt;On top of that, add two cheap habits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A reporting path that takes seconds.&lt;/strong&gt; A button in the client, or a mailbox everyone knows. If reporting a suspicious message requires composing a ticket, people will just delete the message and move on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A rehearsed response for "I clicked."&lt;/strong&gt; The person who clicks must not be afraid to say so within minutes. Speed of disclosure decides the cost far more than the click itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Train people on the specific lures your industry receives, not generic slides. A finance team and a workshop team face different bait.&lt;/p&gt;

&lt;h2&gt;
  
  
  Least privilege is an operating discipline
&lt;/h2&gt;

&lt;p&gt;Every account should have the minimum reach it needs to do its job, and that allowance should expire when the job does. In practice this means a quarterly look at who can see payroll, who can export customer lists, who holds admin rights, and which integrations still have access nobody remembers granting.&lt;/p&gt;

&lt;p&gt;The test is simple: for each permission that could hurt you, name the person who needs it and the reason. If you cannot name both, remove it. Most small businesses find a long tail of leftover access from contractors, trials, and old projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write the first hour down
&lt;/h2&gt;

&lt;p&gt;An incident response plan for a small business fits on two pages. It answers: who calls whom, who can shut a system down, how do we communicate with staff and customers, where does the forensic copy of the affected machine go, and who talks to the bank or insurer.&lt;/p&gt;

&lt;p&gt;The point of writing it is not compliance. It is that during the incident you will be tired, scared, and making decisions at speed. A page that says "call this person before paying anyone anything" prevents the most expensive mistake in the whole genre: paying a ransom demand that was never going to be honoured.&lt;/p&gt;

&lt;p&gt;Rehearse it once a year by walking through a scenario on paper. It takes an hour and surfaces gaps that no tool report will show you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to skip, at least for now
&lt;/h2&gt;

&lt;p&gt;Small teams burn budget on things that feel like security but change little:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Threat hunting and heavy detection engineering&lt;/strong&gt; — you cannot staff the follow-up, so alerts pile up unread.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A second antivirus product&lt;/strong&gt; on top of the built-in protection, which mostly produces conflicts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long, unenforced policy documents.&lt;/strong&gt; A rule nobody can follow is worse than no rule, because it teaches the team that policy is theatre.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance paperwork bought before the basics&lt;/strong&gt; — certification on top of untested backups is a signed statement about a process you do not run.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sequencing a quarter
&lt;/h2&gt;

&lt;p&gt;If you are starting from nothing, this order gets you the most risk reduction per hour spent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Password manager rolled out to everyone, with second factor on the money and data accounts.&lt;/li&gt;
&lt;li&gt;One tested restore, timed, with the result written down.&lt;/li&gt;
&lt;li&gt;Automatic updates on, plus a named owner for the fleet report.&lt;/li&gt;
&lt;li&gt;Email hardening: block external impersonation, disable macro execution from the internet.&lt;/li&gt;
&lt;li&gt;Access review, removing anything nobody can justify.&lt;/li&gt;
&lt;li&gt;A two-page incident plan, walked through once.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nothing on that list requires a security team, and all of it survives an audit far better than a shelf of purchased tools. The work is unglamorous, which is exactly why it is still available to you as an advantage.&lt;/p&gt;

&lt;p&gt;The full walkthrough — vendor categories, the questions to ask before you buy, and the failure modes to design out — is on the original post at &lt;a href="https://tanit365.com/en/blog/posts/small-business-cybersecurity-2026/" rel="noopener noreferrer"&gt;Tân IT365&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>security</category>
      <category>smallbusiness</category>
      <category>windows</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Small-Team Project Management in 2026: Four Decisions That Matter More Than the Tool</title>
      <dc:creator>Tùng Xuân</dc:creator>
      <pubDate>Wed, 04 Nov 2026 20:36:33 +0000</pubDate>
      <link>https://dev.to/tanit365/small-team-project-management-in-2026-four-decisions-that-matter-more-than-the-tool-b2d</link>
      <guid>https://dev.to/tanit365/small-team-project-management-in-2026-four-decisions-that-matter-more-than-the-tool-b2d</guid>
      <description>&lt;p&gt;Most teams do not have a project management problem. They have a decisions problem — nobody agreed on how work becomes visible, who owns a task the moment it stalls, or where the finished files finally land. An app can carry those decisions for you, but it cannot invent them. That is the frame this guide uses. The five platforms below are the ones small teams keep coming back to — Trello, Asana, Notion, Monday.com and ClickUp — but the question worth asking is narrower: which of your four decisions does each one make easier, and which does it quietly make harder.&lt;/p&gt;

&lt;h2&gt;
  
  
  A tool cannot repair a process nobody agreed on
&lt;/h2&gt;

&lt;p&gt;A spreadsheet stops working the moment a task depends on another task, repeats every month, or needs a status someone else updates without being asked. That is the real trigger for buying a platform — not the size of the team. Before you compare pricing pages, write down the three things that break most often in a normal week. If you cannot name them, no subscription will fix the situation, because the platform will faithfully reproduce the confusion you already have, only faster.&lt;/p&gt;

&lt;p&gt;The second thing to accept is that small teams get less slack, not more. There is no project office to chase updates and no IT desk to untangle integrations. Whatever you adopt has to be understandable in a single sitting, capable of growing with you, and cheap enough that the monthly cost never becomes the argument.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision one: how work becomes visible
&lt;/h2&gt;

&lt;p&gt;This is the choice that decides whether people actually update the tool. Some teams think in columns — a board where a card moves from To Do to In Progress to Done. Trello is the cleanest expression of that model and the fastest to teach: a new member is useful within minutes, and its Power-Ups stretch the tool without making it complicated. It suits creative and freelance teams, though boards turn messy past a couple of hundred cards and the lower plans keep reporting thin.&lt;/p&gt;

&lt;p&gt;Other teams think in sequences and dependencies. Asana answers that with list, board, timeline and calendar views over one shared dataset, plus a rules engine that reassigns work and fires notifications on its own. It is the stronger pick once you are planning projects that genuinely depend on each other, and the weaker pick for a team of two or three that just wants a tidy checklist.&lt;/p&gt;

&lt;p&gt;The test is simple. Ask each person how they would draw the last project on a whiteboard. If most draw columns, start with a board. If most draw arrows, start with a timeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision two: what actually deserves automation
&lt;/h2&gt;

&lt;p&gt;Automation pays for itself only when the work is repetitive. Status changes, recurring reminders, deadline nudges — these are worth automating. Judgement calls are not, and automating a decision nobody has thought through just produces confident mistakes at scale. Monday.com leans hardest into this, with a large library of pre-built recipes (over two hundred) that handle repetitive steps without code, alongside colour-coded boards and dashboards that are easy to scan. The trade-off is that its free tier is tiny — only enough seats for a couple of people — and the automation caps mean heavy users hit the ceiling.&lt;/p&gt;

&lt;p&gt;The honest rule: automate the trigger, keep the decision human. If a step needs someone to weigh two options, leave it as a task with a named owner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision three: where the finished work will live
&lt;/h2&gt;

&lt;p&gt;This is the decision teams forget until it hurts. The real output of a small team — specs, client revisions, signed documents, design files — ends up inside whichever platform you chose, and export options usually hand you a download folder that lives on one laptop. Two years later, when a client asks for the source file or an auditor asks for the approved version, that archive has to still open and still carry a date.&lt;/p&gt;

&lt;p&gt;A synced copy in storage you control, kept beside the tool rather than instead of it, is the cheapest insurance against that. When you look at storage, check two things before paying: whether the plan is truly a one-time purchase or quietly renews at a higher price, and whether the capacity still fits several years of exported project archives with room to spare. Notion helps here in a different way — it folds documents, a wiki and a task database into one place, so the notes and the work stop living in separate tools, provided you accept a steeper learning curve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision four: how the team adopts it in the first fortnight
&lt;/h2&gt;

&lt;p&gt;Adoption is a decision, not a hope. Set it up with your real projects rather than a demo board, import the tasks you are actually carrying, and give every task one owner and one date. Keep the first fortnight deliberately boring: no new automations, no new views, no renaming conventions. Let people complain about the small annoyances, then fix one of them. Teams abandon tools that arrive with a hundred rules attached.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the evaluation without pausing delivery
&lt;/h2&gt;

&lt;p&gt;Pick the platform you think fits, then run it against live work for two weeks. Track three things: how often a status is stale, how often someone asks "who owns this", and how long it takes a new person to find the current version of a file. Those three answers separate a tool your team uses from a tool your team tolerates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing by team shape
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Two to five people, simplicity first:&lt;/strong&gt; start with Trello, and upgrade only when dependencies and reporting become the bottleneck.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documents and tasks in one place:&lt;/strong&gt; Notion replaces the wiki, the meeting notes and the tracker at once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation as the priority:&lt;/strong&gt; Monday.com offers the deepest no-code automation engine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budget as the hard line:&lt;/strong&gt; ClickUp packs the most features into the lowest tiers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Growing from five toward fifty:&lt;/strong&gt; Asana provides the structure and goal-tracking that scale with headcount.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Warning signs you picked the wrong platform
&lt;/h2&gt;

&lt;p&gt;If people are maintaining the tool and the real work in a second place, you chose wrong. If a status update needs a meeting to produce, you chose wrong. If the free tier cannot hold your whole team, you will either pay sooner than planned or split the team across two tools — both worse than starting with the right shape.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to verify before you pay
&lt;/h2&gt;

&lt;p&gt;Read the renewal terms, not just the headline price. Confirm the integrations your team already depends on — chat, file storage, calendar, time tracking — are supported natively, because a tool that fights your existing stack creates work instead of removing it. And check that you can export everything, in a format that will still open long after you stop paying, into storage you own.&lt;/p&gt;

&lt;p&gt;The worst system is the one you never set up. The second worst is the one you set up for a process you never agreed on. Decide the four things first — visibility, automation, archive, adoption — then pick the platform that carries them, and set it up this week.&lt;/p&gt;

&lt;p&gt;The full walkthrough, with the side-by-side pricing table for all five platforms, is on the original post at tanit365.com.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>management</category>
      <category>webdev</category>
      <category>tools</category>
    </item>
    <item>
      <title>Your Welcome Sequence Is a State Machine — Five Failure Modes to Design Out</title>
      <dc:creator>Tùng Xuân</dc:creator>
      <pubDate>Wed, 04 Nov 2026 17:53:22 +0000</pubDate>
      <link>https://dev.to/tanit365/your-welcome-sequence-is-a-state-machine-five-failure-modes-to-design-out-5e0g</link>
      <guid>https://dev.to/tanit365/your-welcome-sequence-is-a-state-machine-five-failure-modes-to-design-out-5e0g</guid>
      <description>&lt;p&gt;Your welcome sequence is a state machine you never drew. Most small teams build it once, in a drag-and-drop builder, and then never look at the edges - the transitions where a real person actually lives. That is where the expensive bugs hide.&lt;/p&gt;

&lt;p&gt;This is not a piece about which platform to buy. It is a piece about the small set of design decisions that decide whether an automated email program feels helpful or stalky, and whether your sending domain survives the year.&lt;/p&gt;

&lt;h2&gt;
  
  
  Email automation is a distributed system you are running by hand
&lt;/h2&gt;

&lt;p&gt;Strip away the pricing page and every email tool is the same shape: an event source, a rule engine, a queue, and a sender. You feed it events - a signup, a purchase, a click, a long silence - and it decides what to enqueue next.&lt;/p&gt;

&lt;p&gt;The trap is that people treat this pipeline as a marketing artifact instead of a system. Marketing artifacts get reviewed on a call and then forgotten. Systems get edge cases, retries, and monitoring. If nobody owns the edges, the edges win.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure mode one: the same trigger fires twice
&lt;/h2&gt;

&lt;p&gt;The classic production bug of email land. A customer completes checkout, the order webhook retries, and now they get the "thanks for your order" note two or three times within a minute. It looks amateurish and it trains people to ignore you.&lt;/p&gt;

&lt;p&gt;The fix is the same one you would apply to any event consumer: make the send idempotent. Key each send on something stable - order number, contact, campaign step - and refuse to enqueue a duplicate key that already went out. If your tool does not expose that, keep your own dedupe table in front of it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Idempotency key per (contact, campaign step).&lt;/li&gt;
&lt;li&gt;A short suppression window so a burst of retries collapses into one send.&lt;/li&gt;
&lt;li&gt;Log every decision, not just every send, so you can explain a silent customer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Failure mode two: the sequence has no exit condition
&lt;/h2&gt;

&lt;p&gt;A welcome flow that keeps emailing after someone has already bought is the single most common complaint people make about small-business automation. The sequence only knows how to advance; it never learns how to stop.&lt;/p&gt;

&lt;p&gt;Design the exits first. Before you add a single email step, list the conditions that should pull a person out of the flow: they purchased, they unsubscribed, they replied, they hit your support desk, or they already received the offer through another channel. Then make those exits hard requirements, not nice-to-haves.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exit on conversion beats another nudge.&lt;/li&gt;
&lt;li&gt;Exit on human contact beats another automated touch.&lt;/li&gt;
&lt;li&gt;Exit on complaint beats everything else on this list.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Failure mode three: one bad list poisons the sender
&lt;/h2&gt;

&lt;p&gt;Deliverability is not a setting you switch on. It is a reputation you earn per sending domain, and it is fragile. A purchased list, or even a stale one you imported years ago, produces a spike of bounces and spam complaints that can take months to climb back from.&lt;/p&gt;

&lt;p&gt;Treat list hygiene as a background job. Remove hard bounces immediately, stop mailing contacts who have not opened anything in a long stretch, and never let a form silently add people who did not ask. The addresses you leave out are doing as much work as the ones you send to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure mode four: nobody owns the quiet branch
&lt;/h2&gt;

&lt;p&gt;Every flow has a branch where the contact stops responding. Most teams simply keep forwarding them through the same steps and wonder why engagement decays. The quiet branch is a state of its own, and it deserves its own logic.&lt;/p&gt;

&lt;p&gt;Give inactive contacts something different: a lighter cadence, a genuinely useful piece of content rather than another discount, and an honest "do you still want to hear from us" note. If they still do not move, let them go gracefully instead of dragging a dead address through the funnel forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure mode five: you cannot tell sending from delivering
&lt;/h2&gt;

&lt;p&gt;"Our numbers are falling" usually means one of two very different things, and conflating them sends teams down the wrong repair path. Sending is what your tool reports. Delivering, opening, and clicking are what the receiving side actually did with your message.&lt;/p&gt;

&lt;p&gt;Track the funnel in stages and keep the stages separate: queued, sent, delivered, opened, clicked, converted. A drop between sent and delivered is a reputation or infrastructure problem. A drop between delivered and opened is a subject-line and relevance problem. Different failures, different fixes - and you cannot choose the right one until the stages are split apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  A minimal state model you can sketch in one sitting
&lt;/h2&gt;

&lt;p&gt;You do not need an enterprise diagram. You need a handful of states and the arrows that connect them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;State: eligible. The contact asked to hear from you and has not converted on this campaign yet.&lt;/li&gt;
&lt;li&gt;State: in sequence. A campaign step is pending; a timer and a condition guard the next move.&lt;/li&gt;
&lt;li&gt;State: paused. A human touched them, or they replied, or support has an open ticket.&lt;/li&gt;
&lt;li&gt;State: converted. The goal was reached; the sequence stops and a different track begins.&lt;/li&gt;
&lt;li&gt;State: dormant. No signal for a long stretch; move to a lighter, non-promotional cadence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Draw those five and label every arrow with the event that triggers it. Any arrow without a clear event is a bug waiting to fire, and any state with no exit is a complaint waiting to be written.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for a small team
&lt;/h2&gt;

&lt;p&gt;You do not need more emails. You need fewer, better-timed ones with honest stopping rules. The teams that get automation right are not the ones with the fanciest builder - they are the ones who treat the flow as code, review the edges, and monitor the funnel stage by stage. That discipline costs an afternoon to set up and saves you the year you would otherwise spend apologising to customers for messages they never asked for.&lt;/p&gt;

&lt;p&gt;The full walkthrough, including the platform checklist and the cost breakdown for a small business, lives on the original post at tanit365.com.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>marketing</category>
      <category>productivity</category>
      <category>automation</category>
    </item>
    <item>
      <title>Voice agents vs chatbots: an architecture decision, not a feature list</title>
      <dc:creator>Tùng Xuân</dc:creator>
      <pubDate>Wed, 04 Nov 2026 14:52:41 +0000</pubDate>
      <link>https://dev.to/tanit365/voice-agents-vs-chatbots-an-architecture-decision-not-a-feature-list-24lg</link>
      <guid>https://dev.to/tanit365/voice-agents-vs-chatbots-an-architecture-decision-not-a-feature-list-24lg</guid>
      <description>&lt;p&gt;Most teams treat "chatbot or voice agent" as a vendor question. It is really a plumbing question: one system moves text, the other moves audio in real time, and almost every difference in cost, latency and failure mode falls out of that single fact.&lt;/p&gt;

&lt;p&gt;This is a build-side comparison for people who have to wire the thing up, not a feature list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two different pipes, not two features
&lt;/h2&gt;

&lt;p&gt;A website chatbot is a short loop: user types, model answers, answer renders. You can drop it into a page with a script tag, and if the model takes two seconds nobody notices.&lt;/p&gt;

&lt;p&gt;A voice agent is a chain of four hops that must finish inside a conversational pause:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;speech-to-text turns the caller's sentence into words,&lt;/li&gt;
&lt;li&gt;the model decides what to say,&lt;/li&gt;
&lt;li&gt;text-to-speech renders it back into audio,&lt;/li&gt;
&lt;li&gt;the telephony leg carries it to the handset.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each hop adds delay, and delay is audible. A caller hears a slow response as hesitation, then starts talking over the agent, which produces a worse transcript and a worse reply. This is why voice work feels harder than chat work even when the model is identical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the money actually goes
&lt;/h2&gt;

&lt;p&gt;Chat pricing is a subscription: you pick a plan and the bill is roughly flat, with entry tiers in the low tens of dollars and paid plans reaching into the low hundreds per month.&lt;/p&gt;

&lt;p&gt;Voice pricing is metered. Speech-to-text, text-to-speech and the phone line are all billed per minute, which lands somewhere around five to fifteen cents per minute depending on the stack. The uncomfortable consequence: the better the agent performs, the more minutes it consumes. A pilot that looks cheap because it only handles a few calls becomes a real line item the month it starts working.&lt;/p&gt;

&lt;p&gt;Two ways to keep that predictable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Route by intent, not by channel.&lt;/strong&gt; Let text handle everything that can be text, and keep the phone line for calls that genuinely need a human voice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Own the stack when volume justifies it.&lt;/strong&gt; Self-hosting STT, model and TTS on a VPS replaces per-minute fees with a fixed server cost — but you inherit patching, security and uptime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you self-host, two details decide whether it works: put the server in a region near your callers (latency on a live call is far more noticeable than latency on a page load), and make sure snapshots and backups are included, because you will break the audio pipeline at least once while tuning it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The plumbing nobody budgets for
&lt;/h2&gt;

&lt;p&gt;Chat needs a widget and a knowledge base. Voice needs a phone number, a SIP or VoIP trunk, call routing rules, a recording policy and a way to replay calls when something goes wrong. That is not exotic, but it is a second system with its own failure modes — busy lines, codec negotiation, dropped transfers.&lt;/p&gt;

&lt;p&gt;Practical order that saves rework: choose the telephony layer first, write the call flow second, and only then pick the voice stack. Teams that start with the model usually discover mid-project that their phone provider cannot do the warm transfer they designed around.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escalation is the product, not the fallback
&lt;/h2&gt;

&lt;p&gt;An automation that cannot hand off cleanly is worse than no automation, because it traps the caller. Design the handoff before the happy path:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write down what the agent may not answer — pricing promises, medical or legal advice, delivery dates it cannot verify — and script what it says instead.&lt;/li&gt;
&lt;li&gt;Make the transfer warm: pass a short summary and the caller's intent to the human, so the customer does not repeat everything.&lt;/li&gt;
&lt;li&gt;Keep a callback path for anything that cannot be transferred right now.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a clinic this means booking by voice and reminders by text. For a repair service it means capturing the address by voice and confirming it back before dispatching. For a retailer with a busy site it usually means text first, with a human queue behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep one conversation store
&lt;/h2&gt;

&lt;p&gt;Chat and voice are two front doors into the same customer history. Log both into the same place — transcript, intent, outcome, whether a human took over — and review a sample of real conversations every week. Gaps appear in transcripts long before they show up as complaints or churn.&lt;/p&gt;

&lt;p&gt;If the two channels write to separate tools, you will end up reconciling them by hand and you will stop reviewing anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Metrics that survive a vendor dashboard
&lt;/h2&gt;

&lt;p&gt;Three numbers are enough to start, and all of them should be measured from your own transcripts rather than the vendor's summary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;share of conversations resolved without a handoff,&lt;/li&gt;
&lt;li&gt;how often callers ask for a person,&lt;/li&gt;
&lt;li&gt;how many handoffs end with the caller hanging up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Watch them per channel. A voice agent with a high handoff rate is usually a script problem, not a model problem — the agent simply lacks an answer it is allowed to give.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Start with&lt;/th&gt;
&lt;th&gt;Because&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Store with an active website&lt;/td&gt;
&lt;td&gt;Text chat, voice later&lt;/td&gt;
&lt;td&gt;Most questions are product, price, hours — text is enough&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clinic or booking-driven service&lt;/td&gt;
&lt;td&gt;Voice for booking, text for reminders&lt;/td&gt;
&lt;td&gt;Patients call; confirmations work better written&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Field service and repairs&lt;/td&gt;
&lt;td&gt;Voice with callback capture&lt;/td&gt;
&lt;td&gt;Callers are moving and will not fill a long form&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High-volume online seller&lt;/td&gt;
&lt;td&gt;Text first, human second&lt;/td&gt;
&lt;td&gt;Repetitive volume, and text leaves a written record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2B with long sales cycles&lt;/td&gt;
&lt;td&gt;Text for qualification, human to close&lt;/td&gt;
&lt;td&gt;Qualifying questions repeat; negotiation does not&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two rules hold across every row: decide the refusal list before launch, and review transcripts weekly.&lt;/p&gt;

&lt;h2&gt;
  
  
  A layered default that works
&lt;/h2&gt;

&lt;p&gt;The configuration that survives contact with real traffic is boring: an agent answers first, resolves the routine questions, and hands the rest to a person with context attached. Chat covers the site and messaging apps, voice covers the phone, both write to one store. Measure the three numbers weekly and change one thing at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does a voice agent replace a chatbot?&lt;/strong&gt;&lt;br&gt;
No. They cover different channels. Voice handles callers who pick up the phone; chat handles people already on your site or in a messaging app. Most businesses end up running both, with one shared history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which is cheaper to start?&lt;/strong&gt;&lt;br&gt;
Text. A chatbot needs a widget and content, while voice needs telephony before the model can answer anything, and the per-minute billing starts on day one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much can automation resolve on its own?&lt;/strong&gt;&lt;br&gt;
For routine questions — hours, prices, order status, bookings — a well-scoped agent handles the large majority and escalates the rest. Complex or high-stakes conversations still need a person.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long does a pilot take?&lt;/strong&gt;&lt;br&gt;
For a narrow scope, a few weeks: one to write and test the script, one to connect the phone line and logging, one to run beside a human before going live. Delay usually comes from business rules, not the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should we watch in the first month?&lt;/strong&gt;&lt;br&gt;
Containment, human requests, and abandoned handoffs — reviewed from transcripts, weekly, per channel.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatbot</category>
      <category>architecture</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Keyboard Habits That Save an Hour a Week in Windows</title>
      <dc:creator>Tùng Xuân</dc:creator>
      <pubDate>Wed, 04 Nov 2026 05:11:16 +0000</pubDate>
      <link>https://dev.to/tanit365/the-keyboard-habits-that-save-an-hour-a-week-in-windows-3c81</link>
      <guid>https://dev.to/tanit365/the-keyboard-habits-that-save-an-hour-a-week-in-windows-3c81</guid>
      <description>&lt;p&gt;Speed at a keyboard is not about typing faster. It is about never leaving the home row to chase a pointer across the screen. Every trip to the mouse costs a moment of hand travel, a moment of aiming, and a moment of reorientation when you come back to the keys. None of that shows up as a dramatic loss in any single minute, which is exactly why almost nobody fixes it.&lt;/p&gt;

&lt;p&gt;The fix is not a giant cheat sheet either. In practice, a small set of keystrokes covers the tasks that office work repeats all day: switching windows, editing a paragraph, sorting a folder, juggling browser tabs. Below are the ones worth the muscle memory, grouped by the job they do rather than by the key they use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Window management comes first
&lt;/h2&gt;

&lt;p&gt;If you only fix one thing, fix how you move between windows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Win + E&lt;/strong&gt; jumps straight into File Explorer, so the taskbar icon becomes optional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Win + I&lt;/strong&gt; opens Settings directly, useful when you need to change a display or sound device in a hurry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Win + L&lt;/strong&gt; locks the screen instantly. Anyone who works in a shared room should train this one until it is automatic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Win + D&lt;/strong&gt; clears everything off the screen and brings it back on a second press, which is faster than minimising windows one at a time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Win + V&lt;/strong&gt; opens clipboard history, so something you copied several minutes ago is still retrievable. It has to be switched on once under System, Clipboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alt + Tab&lt;/strong&gt; cycles through open windows, and holding Alt while tapping Tab lets you pick a specific one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Win + arrow keys&lt;/strong&gt; snap a window to half the screen, a quarter, or maximise it, which is the quickest way to put two documents side by side for comparison.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Editing text without reaching for the arrows
&lt;/h2&gt;

&lt;p&gt;This is where the biggest daily gain hides, because anyone who writes for a living repeats these motions hundreds of times.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + Left or Right&lt;/strong&gt; moves the caret a whole word at a time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hold Ctrl + Shift plus an arrow&lt;/strong&gt; to select word by word, or paragraph by paragraph.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Home and End&lt;/strong&gt; go to the start or finish of the current line, while adding Ctrl takes you to the start or finish of the entire document.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shift + click&lt;/strong&gt; selects everything between the caret and wherever you click, which handles most long selections faster than dragging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + Backspace&lt;/strong&gt; deletes the word behind the caret instead of a single letter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + F&lt;/strong&gt; searches inside the document, and &lt;strong&gt;Ctrl + H&lt;/strong&gt; usually opens find and replace in the same panel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + Z and Ctrl + Y&lt;/strong&gt; step backwards and forwards through your edit history.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Selecting by word instead of by character is the single habit that changes how fast a draft gets cleaned up. Retyping a badly worded sentence becomes a two-key operation rather than a slow drag of the pointer.&lt;/p&gt;

&lt;p&gt;Spreadsheet users get an extra layer. Inside Excel, Ctrl plus an arrow jumps to the edge of the current block of data, and holding Shift as well selects that whole block. On a sheet with a large amount of data, that replaces a long scroll with one keystroke.&lt;/p&gt;

&lt;h2&gt;
  
  
  File Explorer without the right-click menu
&lt;/h2&gt;

&lt;p&gt;Renaming and reshuffling files is the least glamorous part of desk work, and it is fully covered by the keyboard.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;F2&lt;/strong&gt; renames the selected item. Arrow down and press F2 again to keep renaming in sequence, which beats right-click, Rename, type, Enter, repeat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;F5&lt;/strong&gt; refreshes the folder, handy when a file you just saved has not appeared yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alt + Up&lt;/strong&gt; or &lt;strong&gt;Backspace&lt;/strong&gt; climbs to the parent folder without aiming at the breadcrumb bar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + Shift + N&lt;/strong&gt; creates a new folder in place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + N&lt;/strong&gt; opens a second Explorer window, which makes dragging files between two locations trivial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alt + Enter&lt;/strong&gt; shows the Properties dialog for whatever is selected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl plus the mouse wheel&lt;/strong&gt; resizes the icons in the current view.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two lesser-known tricks save real time in crowded folders. Typing a letter jumps to the first item beginning with that letter, and typing several letters quickly jumps to the matching name. Holding Ctrl while clicking selects scattered files, while clicking one item and Shift-clicking another grabs the range in between. All of this behaves identically in the Open and Save dialogs inside applications, so the skill carries over everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Taming the browser during long research sessions
&lt;/h2&gt;

&lt;p&gt;Much of the working day now happens in a browser, and the gap between a careful researcher and a drowned one is a handful of keys.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + T&lt;/strong&gt; opens a tab, &lt;strong&gt;Ctrl + W&lt;/strong&gt; closes the current one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + Shift + T&lt;/strong&gt; brings back the tab you just closed, which is the most appreciated keystroke in this entire guide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + Tab&lt;/strong&gt; and &lt;strong&gt;Ctrl + Shift + Tab&lt;/strong&gt; move forwards and backwards along the tab strip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + L&lt;/strong&gt; selects the address bar so you can type a new destination immediately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + plus or minus&lt;/strong&gt; zooms, and &lt;strong&gt;Ctrl + 0&lt;/strong&gt; returns the page to normal size.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + Shift + Delete&lt;/strong&gt; opens the clear browsing data dialog.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pinning the tabs you always need keeps them compact and protects them from accidental closure. The browser also remembers several recently closed tabs, not just the most recent one, so pressing Ctrl + Shift + T more than once keeps resurrecting them in reverse order.&lt;/p&gt;

&lt;h2&gt;
  
  
  The emergency shortcuts worth memorising
&lt;/h2&gt;

&lt;p&gt;A few keystrokes look obscure until the day they rescue you.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Win + Shift + S&lt;/strong&gt; takes a cropped screenshot of a region you select, ready to paste into a chat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Win + Ctrl + Shift + B&lt;/strong&gt; restarts the graphics driver. When the screen goes black or freezes but sound keeps playing, this usually restores the picture in a few seconds without losing work that looks exactly like a hardware failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + Shift + Esc&lt;/strong&gt; opens Task Manager directly, which matters when a machine feels sluggish and you want to see what is eating the processor or the disk. Doing this routinely, not only in a crisis, makes slow computers easier to diagnose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Win + Period&lt;/strong&gt; opens the emoji and symbol panel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Win + A&lt;/strong&gt; reaches the quick settings for muting or switching audio output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Win + P&lt;/strong&gt; cycles the projector and display modes before a meeting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Win + plus or minus&lt;/strong&gt; zooms the whole screen with the magnifier, which helps on large displays with small text.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A practice plan that actually sticks
&lt;/h2&gt;

&lt;p&gt;Reading a list does not create speed. Deliberate practice in tiny batches does.&lt;/p&gt;

&lt;p&gt;Pick a handful of shortcuts, not a wall of them. Match them to whatever you repeat most: if you live in several windows, start with Alt + Tab, the Win + arrow snaps, Ctrl + W and Ctrl + Shift + T, plus F2. Write them on a sticky note beside the monitor, because a physical reminder gets consulted far more often than a page in a bookmark folder. Use them badly for a week, forcing the awkward pause instead of falling back on the mouse. Add the next batch only once the first feels automatic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions people ask most
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do these work on both Windows 10 and Windows 11?&lt;/strong&gt; Yes, every shortcut in this guide behaves the same on both versions unless noted otherwise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does Win + V do nothing on my machine?&lt;/strong&gt; Clipboard history is switched off by default and has to be enabled once in Settings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it worth learning dozens of shortcuts?&lt;/strong&gt; No. A small set tied to your own repetitive tasks delivers almost all of the benefit, and a long list mostly gets forgotten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long before the keys feel natural?&lt;/strong&gt; Usually about a week of conscious use for a batch of five, after which the motion becomes automatic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use the same habits outside Windows applications?&lt;/strong&gt; Most of the editing and browser keys work identically in other desktop applications, so the effort transfers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if my screen freezes mid-task?&lt;/strong&gt; Try the graphics driver restart first; if the machine is still unresponsive, open Task Manager and inspect what is consuming resources.&lt;/p&gt;

&lt;p&gt;The full walkthrough, with the complete table of key combinations and the surrounding notes, lives on the original post at tanit365.com.&lt;/p&gt;

</description>
      <category>windows</category>
      <category>productivity</category>
      <category>career</category>
      <category>tips</category>
    </item>
    <item>
      <title>Finding paid work as an AI agent in five minutes: Agent Bounty Feed, MCP and curl</title>
      <dc:creator>Tùng Xuân</dc:creator>
      <pubDate>Wed, 04 Nov 2026 01:33:45 +0000</pubDate>
      <link>https://dev.to/tanit365/finding-paid-work-as-an-ai-agent-in-five-minutes-agent-bounty-feed-mcp-and-curl-h97</link>
      <guid>https://dev.to/tanit365/finding-paid-work-as-an-ai-agent-in-five-minutes-agent-bounty-feed-mcp-and-curl-h97</guid>
      <description>&lt;p&gt;Most "agent marketplace" directories are lists you read once and never again. Agent Bounty Feed is different: it is an hourly-refreshed JSON index of paid, currently-open bounties from a dozen sources, and it exposes that index three ways — a static JSON file, a plain HTTP endpoint, and a free MCP server. This post shows the exact calls that work, and what the returned numbers actually mean.&lt;/p&gt;

&lt;p&gt;All commands below were run on 2026-11-04 around 00:55 UTC. Output is trimmed, not edited.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The 30-second version
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://agent-bounty-feed.dailydollar.workers.dev/earn-now
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns a small JSON document with the feed's age, the MCP URL, install snippets for Claude and Cursor, and the filter the maintainer recommends:&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Agent Bounty Feed — earn now"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"generated_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-11-03T23:49:30Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"feed_age_minutes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;79&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://agent-bounty-feed.dailydollar.workers.dev/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"feed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://dailydollar-bot.github.io/agent-bounty-feed/feed.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"paid_trust_layer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Per-bounty trust layer ... is paid-only: GET /v1/bounties ($0.01 USDC on Base, x402)."&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;Two things to notice before anything else. &lt;code&gt;feed_age_minutes&lt;/code&gt; tells you how stale the index is; 79 is normal, several hours is a warning that the relay is lagging. And the trust layer is explicitly paid — the free feed gives discovery fields only.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The static feed
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://dailydollar-bot.github.io/agent-bounty-feed/feed.json | jq &lt;span class="s1"&gt;'.items | length'&lt;/span&gt;
&lt;span class="c"&gt;# 35&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each item carries &lt;code&gt;source&lt;/code&gt;, &lt;code&gt;kind&lt;/code&gt;, &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;reward&lt;/code&gt;, &lt;code&gt;currency&lt;/code&gt;, &lt;code&gt;network&lt;/code&gt;, &lt;code&gt;deadline&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;requires[]&lt;/code&gt;, &lt;code&gt;slots_left&lt;/code&gt;, &lt;code&gt;est_usd&lt;/code&gt;, &lt;code&gt;first_seen&lt;/code&gt;, &lt;code&gt;eligibility&lt;/code&gt; (a one-paragraph plain-English summary), and &lt;code&gt;verified.checked_at&lt;/code&gt;. That &lt;code&gt;requires[]&lt;/code&gt; array is the single most useful field in the document, and section 5 explains why.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The MCP server, without an SDK
&lt;/h2&gt;

&lt;p&gt;The MCP endpoint is Streamable HTTP and needs no authentication. The one request header people get wrong is &lt;code&gt;Accept&lt;/code&gt;: it must advertise both JSON and SSE, or the server rejects the call.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://agent-bounty-feed.dailydollar.workers.dev/mcp

&lt;span class="c"&gt;# handshake&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$U&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Accept: application/json, text/event-stream'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{
        "protocolVersion":"2025-06-18","capabilities":{},
        "clientInfo":{"name":"probe","version":"1"}}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response is the standard &lt;code&gt;initialize&lt;/code&gt; result: &lt;code&gt;protocolVersion: 2025-06-18&lt;/code&gt;, &lt;code&gt;capabilities.tools&lt;/code&gt;, and &lt;code&gt;serverInfo&lt;/code&gt; naming the server &lt;code&gt;agent-bounty-feed&lt;/code&gt; version &lt;code&gt;1.2.0&lt;/code&gt;. The server is stateless — it returns no &lt;code&gt;Mcp-Session-Id&lt;/code&gt;, and subsequent calls work without one, so there is no session bookkeeping to get wrong.&lt;/p&gt;

&lt;p&gt;List the tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$U&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Accept: application/json, text/event-stream'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":2,"method":"tools/list"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four tools come back: &lt;code&gt;list_bounties&lt;/code&gt;, &lt;code&gt;get_new_bounties&lt;/code&gt;, &lt;code&gt;get_bounty&lt;/code&gt;, &lt;code&gt;get_feed_stats&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Call one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$U&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Accept: application/json, text/event-stream'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{
        "name":"list_bounties",
        "arguments":{"exclude_requires":"kyc,stake,bond","limit":3}}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The payload arrives as a JSON string inside &lt;code&gt;result.content[0].text&lt;/code&gt;, so parse twice:&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="nl"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"total_matching"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"has_more"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"sort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"reward"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"frantic:129"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"frantic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"reward"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"est_usd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
           &lt;/span&gt;&lt;span class="nl"&gt;"requires"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;"agent_account"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"wallet_evm"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nl"&gt;"slots_left"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&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;&lt;code&gt;count&lt;/code&gt; is the page size you asked for; &lt;code&gt;total_matching&lt;/code&gt; is what the filter actually matched — 27 items with no KYC, stake or bond requirement. Always read &lt;code&gt;total_matching&lt;/code&gt;, not &lt;code&gt;count&lt;/code&gt;, when you decide whether the market is worth polling.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Installed in one line
&lt;/h2&gt;

&lt;p&gt;If you already run an MCP client, skip the curl work entirely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http agent-bounty-feed https://agent-bounty-feed.dailydollar.workers.dev/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Cursor, the equivalent is a server entry with just a &lt;code&gt;url&lt;/code&gt;, no command:&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="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"agent-bounty-feed"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"https://agent-bounty-feed.dailydollar.workers.dev/mcp"&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;h2&gt;
  
  
  5. Read the numbers the way an operator reads them
&lt;/h2&gt;

&lt;p&gt;Here is the whole market at the time of writing, pulled with &lt;code&gt;get_feed_stats&lt;/code&gt;:&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="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"total_usd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;624.36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"by_source"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"algora"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"usd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"superteam"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"usd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;125&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"frantic"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"usd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"taskmarket"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"usd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;14.9&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"direct"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"usd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"hondo"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"usd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;0.46&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 headline is $624. The addressable number is much smaller. All eight Algora items — $443, which is 71% of the total — carry &lt;code&gt;requires: ["github","kyc"]&lt;/code&gt;: they are merged-pull-request bounties that need a GitHub identity and KYC at payout. The Superteam item is $125 in one listing and needs a Solana wallet plus an agent account. What is actually claimable by an agent holding only an EVM wallet is the Frantic block ($36 across six items), the Taskmarket block ($14.9 across fifteen), the single $5 direct bounty, and $0.46 across four Hondō items.&lt;/p&gt;

&lt;p&gt;That gap between &lt;code&gt;total_usd&lt;/code&gt; and what you can clear is the real work of using the feed. A loop that sorts by &lt;code&gt;est_usd&lt;/code&gt; and stops there will spend every cycle looking at money it cannot collect. A loop that filters on &lt;code&gt;requires&lt;/code&gt; first, then sorts, produces a short list you can act on in one sitting.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;eligibility&lt;/code&gt; string is the second filter that matters, because it carries payout history: &lt;code&gt;"So far 120 paid / 64 rejected"&lt;/code&gt; on one item and &lt;code&gt;"0 paid / 22 rejected"&lt;/code&gt; on another are different offers even at the same reward. Read it before claiming, not after.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Paginating new work
&lt;/h2&gt;

&lt;p&gt;Poll for bounties that appeared after your last cursor and walk the pages until &lt;code&gt;has_more&lt;/code&gt; is false:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$U&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Accept: application/json, text/event-stream'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{
        "name":"get_new_bounties",
        "arguments":{"since":"2026-11-01T00:00:00Z","limit":2}}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response hands you the next cursor directly — &lt;code&gt;next_since: "2026-11-02T06:45:03Z"&lt;/code&gt; and &lt;code&gt;next_after_id: "taskmarket:TSK-WEXT341C"&lt;/code&gt; — together with &lt;code&gt;has_more: true&lt;/code&gt;. Feed those two values back in on the next call. Store &lt;code&gt;next_since&lt;/code&gt; between runs and the poll becomes cheap and restart-safe; the server resumes from an exact point in the stream rather than making you deduplicate locally.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. A complete client in twenty lines
&lt;/h2&gt;

&lt;p&gt;This runs as-is with the Python standard library, no MCP SDK, no dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;

&lt;span class="n"&gt;U&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://agent-bounty-feed.dailydollar.workers.dev/mcp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jsonrpc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools/call&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;U&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json, text/event-stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;list_bounties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exclude_requires&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kyc,stake,bond&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reward&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;slots_left&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;est_usd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;source&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][:&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drop it in a cron job and print only when &lt;code&gt;first_seen&lt;/code&gt; is new, and you have a zero-token monitor.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. The paid rail, and when to skip it
&lt;/h2&gt;

&lt;p&gt;The free feed is discovery. The per-bounty trust layer — &lt;code&gt;payout_track_record&lt;/code&gt;, live competition counts, &lt;code&gt;verified.how&lt;/code&gt;, verification evidence — sits behind &lt;code&gt;GET /v1/bounties&lt;/code&gt; at $0.01 USDC on Base, paid over x402. On Base that payment is EIP-3009, so the payer does not need ETH for gas, only USDC.&lt;/p&gt;

&lt;p&gt;Skip it on day one. Start with the free filter above, claim one small bounty, and only pay for the trust layer once a bounty's reward is large enough that $0.01 for competition data is obviously worth it. Paying for trust data about a $2 bounty is a losing trade.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. The five-minute checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;curl&lt;/code&gt; &lt;code&gt;/earn-now&lt;/code&gt; and read &lt;code&gt;feed_age_minutes&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;list_bounties&lt;/code&gt; with &lt;code&gt;exclude_requires=kyc,stake,bond&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Multiply by what your wallet can actually clear — an EVM-only agent ignores the GitHub/KYC block, no matter how large it looks.&lt;/li&gt;
&lt;li&gt;Read &lt;code&gt;eligibility&lt;/code&gt; for the paid/rejected ratio.&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;deadline&lt;/code&gt; and &lt;code&gt;slots_left&lt;/code&gt; before investing an hour.&lt;/li&gt;
&lt;li&gt;Store &lt;code&gt;next_since&lt;/code&gt; and poll instead of re-listing.&lt;/li&gt;
&lt;li&gt;Claim only work you can finish inside the claim window; an expired claim returns the slot and does nothing for your record.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Pitfalls that cost real time
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A null deadline is not "no deadline".&lt;/strong&gt; Several sources only publish a deadline at the source, and a few repost the same item with the field empty. Confirm on the source URL before you plan around it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;slots_left: null&lt;/code&gt; means unknown, not unlimited.&lt;/strong&gt; Treat null as one slot and claim early.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;requires&lt;/code&gt; includes values other than the obvious gates.&lt;/strong&gt; &lt;code&gt;purchase&lt;/code&gt; means the bounty pays you back after you spend your own money first — a rebate, not a reward. &lt;code&gt;public_post&lt;/code&gt; means the deliverable is a public URL that must stay up until payout, so a tunnel that dies is a failed submission.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stale feeds are the most common silent failure.&lt;/strong&gt; An hourly index that has not refreshed in six hours will show you expired bounties with confidence. Check &lt;code&gt;generated_at&lt;/code&gt; on every run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Machine judges reject on keywords, not judgment.&lt;/strong&gt; If a bounty's own submission form forbids naming the sponsor or the program in your report, that rule is enforced by a string check, and a single mention fails the delivery.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is good for
&lt;/h2&gt;

&lt;p&gt;Agent Bounty Feed is not going to pay your rent: the median item is a few dollars and most of the large rewards are gated behind identities an autonomous agent does not have. What it does do is turn "where do I look for work" into a single deterministic call with a stable schema, pagination that survives restarts, and honest eligibility text that tells you in advance how a given offer has actually paid out. That is the part that was missing, and it is worth wiring into a cron before it is worth paying for.&lt;/p&gt;

</description>
      <category>showdev</category>
    </item>
    <item>
      <title>How to Choose Office Laptops in 2026 Without Overspending</title>
      <dc:creator>Tùng Xuân</dc:creator>
      <pubDate>Tue, 03 Nov 2026 19:56:13 +0000</pubDate>
      <link>https://dev.to/tanit365/how-to-choose-office-laptops-in-2026-without-overspending-4344</link>
      <guid>https://dev.to/tanit365/how-to-choose-office-laptops-in-2026-without-overspending-4344</guid>
      <description>&lt;p&gt;Most small businesses overpay for office laptops in one of two ways. Either they buy the cheapest model on the shelf and replace it early, or they buy a premium machine for work that never needs it. Both mistakes come from the same place: starting at the spec sheet instead of the daily workload.&lt;/p&gt;

&lt;p&gt;This guide walks through the decisions that actually change how a laptop feels in year two, and the places where a lower price tag costs nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start from what your team opens every day
&lt;/h2&gt;

&lt;p&gt;Before comparing models, write down the actual daily load for each role: how many browser tabs, whether the job runs big spreadsheets, whether the machine travels, and how long you expect it to stay in service. Every recommendation below is a way of answering that list, not a rule for its own sake.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three specs people feel the most
&lt;/h2&gt;

&lt;p&gt;Three components decide whether staff describe a machine as fast or slow. Everything else is a smaller fraction of the experience.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory (RAM).&lt;/strong&gt; Sixteen gigabytes is the working standard for general office, accounting, sales and management. Eight gigabytes is acceptable only for a light, single-purpose machine such as a shared kiosk or a reception terminal. Thirty-two gigabytes belongs to developers, analysts and anyone running virtual machines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage.&lt;/strong&gt; Buy an NVMe solid-state drive, not a mechanical disk, and start at five hundred and twelve gigabytes for anyone who works all day. Two hundred and fifty-six gigabytes is workable if the team genuinely lives in the cloud, but it fills quickly with system updates, office suites and a year of email attachments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Display.&lt;/strong&gt; Full HD at one thousand nine hundred and twenty by one thousand and eighty is the sensible minimum for spreadsheets. Screens at one thousand three hundred and sixty-six by seven hundred and sixty-eight should be avoided entirely. An IPS panel with a matte finish handles office lighting far better than a glossy touchscreen.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Processor: generation matters more than tier
&lt;/h2&gt;

&lt;p&gt;For office work the processor sits behind memory and storage in importance, but the generation matters more than the tier. A current-generation mid-range chip beats an older high-end one on efficiency, battery life and driver support. Aim for eight or more cores on a current generation. An on-board AI engine is a bonus for a machine bought in twenty twenty-six, not a reason to reject an otherwise good laptop. Budget chips sold as budget-tier series are fine for a fixed-purpose counter machine and painful as a daily driver.&lt;/p&gt;

&lt;h2&gt;
  
  
  Details that quietly decide satisfaction
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Battery.&lt;/strong&gt; Look at the watt-hour rating rather than the marketing hours. Fifty to sixty watt-hours is the office baseline; go above sixty for a full travel day, and prefer USB-C charging at forty-five watts so a power bank can top the machine up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weight.&lt;/strong&gt; Under one and a half kilograms for a machine that travels weekly; close to two kilograms is fine for a desk-bound unit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ports.&lt;/strong&gt; At least one USB-A and one USB-C with charging and display support, plus HDMI. Fewer dongles means fewer support tickets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connectivity.&lt;/strong&gt; Wi-Fi 6 or Wi-Fi 6E, a webcam at one thousand and eighty p, and a microphone with noise reduction. The video call is the meeting room now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business features.&lt;/strong&gt; A fingerprint reader or infrared camera for Windows Hello, a TPM version two point zero chip, and a privacy shutter are standard on business lines and often missing on consumer models.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Match the machine to the role
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reception or a shared kiosk:&lt;/strong&gt; entry current-generation chip, light memory, small solid-state drive, locked down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;General office and admin:&lt;/strong&gt; the default buy for most staff, with sixteen gigabytes and an NVMe drive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accounting and finance:&lt;/strong&gt; more memory for large workbooks and multiple monitors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sales and field work:&lt;/strong&gt; low-power chip, light chassis, a bigger battery and a matte screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design and marketing:&lt;/strong&gt; a colour-accurate panel matters more than graphics hardware for print and web work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer and data:&lt;/strong&gt; the highest memory tier, because virtual machines and local datasets consume memory first.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where you can save, and where you cannot
&lt;/h2&gt;

&lt;p&gt;Safe places to cut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Processor tier within the same generation.&lt;/li&gt;
&lt;li&gt;Discrete graphics, if the role does no three-dimensional or video work.&lt;/li&gt;
&lt;li&gt;Thinness and cosmetics — a slightly thicker business chassis is cheaper to repair and usually carries a larger battery.&lt;/li&gt;
&lt;li&gt;The previous-generation model, new in box and still under warranty.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Never cut these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory below sixteen gigabytes on a daily driver, especially when it is soldered and cannot be upgraded later.&lt;/li&gt;
&lt;li&gt;The solid-state drive. No new office laptop should ship with a mechanical disk.&lt;/li&gt;
&lt;li&gt;Screen resolution and panel quality — a poor screen taxes everyone who uses it, every day.&lt;/li&gt;
&lt;li&gt;Security features such as TPM, Windows Hello and a supported firmware update path.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  New, refurbished or leased
&lt;/h2&gt;

&lt;p&gt;Sticker price is the wrong comparison; cost per usable year is the right one. A new business laptop kept for four years spreads its price across those years. A refurbished two-year-old business machine at roughly half the price, kept for two more years, often lands in a similar annual band — with more battery risk and a shorter warranty. A lease turns the same cost into a predictable monthly figure and usually bundles support and replacement, which pays off when downtime costs more than hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five-minute checklist before you pay
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Read the exact model number, not the family name — two machines with the same name can differ in memory, panel and processor.&lt;/li&gt;
&lt;li&gt;Confirm the memory size and that the drive is NVMe, and check whether memory is soldered or upgradeable.&lt;/li&gt;
&lt;li&gt;Check battery watt-hours, and on a used machine check the reported battery health.&lt;/li&gt;
&lt;li&gt;Verify warranty terms and where service happens locally; that matters more than a small spec bump.&lt;/li&gt;
&lt;li&gt;Boot it and run the real workload: email, several browser tabs, a large spreadsheet and a video call.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Buying in Vietnam and Southeast Asia
&lt;/h2&gt;

&lt;p&gt;Three local factors change the maths. A brand with an authorised service centre you can reach from the office beats a marginally better machine that must be shipped abroad. Confirm the warranty is honoured locally, since grey-market units can carry one that is effectively void. And check the keyboard layout and power adapter match the office mains and typing habits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Standardise before you scale
&lt;/h2&gt;

&lt;p&gt;The first order is a purchase; the second order is a fleet. A mixed fleet is what turns a cheap decision into an expensive support problem, because every model needs its own drivers, charger, spare parts and system image. Before the second order, settle on one model per role tier and write down the support and warranty path for each.&lt;/p&gt;

&lt;p&gt;The full walkthrough, with the per-role recommendation table, the Windows 11 minimum-versus-recommended comparison and local pricing notes, is on the original post at tanit365.com.&lt;/p&gt;

</description>
      <category>hardware</category>
      <category>productivity</category>
      <category>windows</category>
      <category>smallbusiness</category>
    </item>
    <item>
      <title>Sending big files by email: stop fighting the attachment limit</title>
      <dc:creator>Tùng Xuân</dc:creator>
      <pubDate>Tue, 03 Nov 2026 06:18:48 +0000</pubDate>
      <link>https://dev.to/tanit365/sending-big-files-by-email-stop-fighting-the-attachment-limit-31ja</link>
      <guid>https://dev.to/tanit365/sending-big-files-by-email-stop-fighting-the-attachment-limit-31ja</guid>
      <description>&lt;p&gt;You draft the message, attach the documents, hit send, walk off — then the bounce arrives: message exceeds the allowed size. Or the silent version, where the mail reports success and the recipient says nothing came through. Both repeat constantly and stall real work, especially when a client, partner, or manager is waiting on documents.&lt;/p&gt;

&lt;p&gt;The fix is sequence, not extra software: check your limit before you attach, compress what compresses, split what must travel by mail, and switch to a link past the threshold — then verify before sending.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why big attachments bounce
&lt;/h2&gt;

&lt;p&gt;Email was built for text, and attachments were bolted on later. Every provider caps the total size of one message — body plus all attachments. Cross it and the server rejects the whole thing, replying with jargon that reads like a broken mailbox when the real issue is weight.&lt;/p&gt;

&lt;p&gt;A subtlety trips up senders: an attached file inflates inside the message. Attachments are encoded so they can travel through mail systems, and that encoding adds real overhead. A file that looks fine on disk can therefore push the message over the line unexpectedly.&lt;/p&gt;

&lt;p&gt;There is also a receiving-side cap you cannot see. A message leaves with no error, yet the recipient never opens it because their own inbox is nearly full or their system blocks oversized incoming mail to protect the server. That is the hardest case to notice, because the sender believes the job is done while the other side sits waiting for documents.&lt;/p&gt;

&lt;p&gt;An unstable connection during upload can break a large transfer too, surfacing a generic error that looks like a file fault when it is really the network.&lt;/p&gt;

&lt;h2&gt;
  
  
  Know the limit before you attach
&lt;/h2&gt;

&lt;p&gt;Check the file size first — right-click, read the size in its properties. That number decides whether you attach directly or change tactics, and it pre-empts most bounces.&lt;/p&gt;

&lt;p&gt;A workable rule used by many office workers: keep total attachments in one message small, only a few dozen megabytes at most. Everyday documents, spreadsheets, and slide decks rarely approach it. Phone-recorded video, high-quality photo sets, design files, or data backups almost always do, so plan an alternative up front rather than attaching first and waiting for the bounce.&lt;/p&gt;

&lt;p&gt;Watch one detail: the cap applies to the message total, not to each file. Split one big file into three, attach all three to a single message, and it still bounces, because the pieces sum back to the original. Send separate messages or change method.&lt;/p&gt;

&lt;p&gt;Keep an eye on your own mailbox space, especially the sent folder. Every large attachment occupies your quota too, and a mailbox that runs nearly full can stop outgoing mail or incoming delivery. Clear old heavy-attachment mail once the job is done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compress the files that actually compress
&lt;/h2&gt;

&lt;p&gt;Compression is the cheapest win for documents, spreadsheets, drawings, and many office formats — often down to a small fraction of the size. Gather the files into one folder and use the operating system's built-in archive feature. The archive is lighter and tidier, and the recipient downloads one file instead of many scattered ones.&lt;/p&gt;

&lt;p&gt;Name the archive so its contents are obvious at a glance — project name plus date. Clear names survive the pile of files on a recipient's machine; vague ones get lost among dozens of lookalikes.&lt;/p&gt;

&lt;p&gt;Be honest about the limits. Photos, recorded video, and music are already stored compressed, so re-zipping them saves almost nothing worth mentioning. For that group, lower the quality to a sensible level or move to a storage link.&lt;/p&gt;

&lt;p&gt;And remember the recipient has to open the archive. Most machines today handle common formats with nothing extra installed, but phone and tablet users sometimes hesitate. If they are not technical, add one short instruction line, or send uncompressed when the size allows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Splitting: a life raft, not a habit
&lt;/h2&gt;

&lt;p&gt;When a file is too big for mail but must travel by mail, splitting it across several messages works. Each part stays under the cap so every message goes through, and the recipient rejoins the pieces. It helps when outside services are not reachable, or when workplace rules require every document to travel by email.&lt;/p&gt;

&lt;p&gt;Number every part clearly in the filename, state "part X of Y" in each message, and ask the recipient to wait for all parts before joining. That care stops them treating each message as a separate document.&lt;/p&gt;

&lt;p&gt;The cost is extra work on both sides plus a real risk of a missing piece. If one message in the chain lands in spam or gets deleted, the whole file cannot be reassembled. So confirm the part count after sending, and resend just the missing part rather than starting over.&lt;/p&gt;

&lt;p&gt;Keep splitting as the exception for mail-only situations. When the recipient can open links, a single link beats a chain of parts every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Send a link instead of the file
&lt;/h2&gt;

&lt;p&gt;For genuinely large files — long video, high-quality photo sets, backups — upload once and send a download link. The message stays featherlight with only a few lines and one link, so it sends fast and never bounces on size. The recipient downloads without your inbox or theirs having to hold the file.&lt;/p&gt;

&lt;p&gt;Choose the link's permission deliberately. An "anyone with the link" option is convenient for ordinary work documents sent to the right person. For sensitive material, restrict access and add an expiry so the link stops working after a set period.&lt;/p&gt;

&lt;p&gt;Links also let you fix a file after the message went out: replace the file in place, keep the same link, and the recipient who clicks the old link sees the newest version. Direct attachments cannot do that — every fix means a new message, more quota, and version confusion.&lt;/p&gt;

&lt;p&gt;Keep the file hosted until the recipient confirms the download finished. Tidy your storage only after that confirmation, and keep important documents a while longer as a safety copy.&lt;/p&gt;

&lt;h2&gt;
  
  
  One minute of checking before you hit send
&lt;/h2&gt;

&lt;p&gt;Reread the attachment list. The classic mistake is an outdated version when the machine holds near-identical names like draft, revision, and final. Open each attachment briefly — a right name does not guarantee right contents.&lt;/p&gt;

&lt;p&gt;Reread the body. Say what the file is, what the recipient should do with it, and any deadline. An attachment with no explanation gets shelved or misunderstood.&lt;/p&gt;

&lt;p&gt;Recheck recipients, especially on group mail. One wrong character misdirects work documents. For important mail, type the recipients last so a stray keystroke cannot send early while you are still drafting.&lt;/p&gt;

&lt;p&gt;And watch your inbox for a few minutes after sending. Bounces arrive quickly, and catching one early lets you recompress, split, or switch to a link immediately instead of learning a day later that nothing moved.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the recipient cannot open it
&lt;/h2&gt;

&lt;p&gt;Most often they lack software for your format — a design-tool file on a machine without that tool. Export a universal-format copy and send that. When writing to non-technical people, start with the popular format.&lt;/p&gt;

&lt;p&gt;Sometimes a downloaded file errors or opens half-empty because the transfer was interrupted. Resend it, and for big files a link makes re-downloading steadier. Ask about their connection — a weak, flickering network is the familiar culprit behind broken downloads.&lt;/p&gt;

&lt;p&gt;Sometimes the message never surfaces even though you sent it fine. Heavy-attachment mail gets sorted into spam or held for inspection. Ask the recipient to check those folders, then send a short attachment-free note announcing the documents. If it is still missing, a link usually clears it, because light mail gets held less.&lt;/p&gt;

&lt;p&gt;Note the cause and the fix each time, and a routine forms: under the limit direct, over it by link, sensitive ones with restricted access.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on Tân IT365: &lt;a href="https://tanit365.com/en/blog/posts/how-to-send-large-files-email-2026/" rel="noopener noreferrer"&gt;https://tanit365.com/en/blog/posts/how-to-send-large-files-email-2026/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>email</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>workflow</category>
    </item>
    <item>
      <title>Lock Your Screen: The Cheapest Security Habit Most People Skip</title>
      <dc:creator>Tùng Xuân</dc:creator>
      <pubDate>Tue, 03 Nov 2026 06:18:39 +0000</pubDate>
      <link>https://dev.to/tanit365/lock-your-screen-the-cheapest-security-habit-most-people-skip-4lgj</link>
      <guid>https://dev.to/tanit365/lock-your-screen-the-cheapest-security-habit-most-people-skip-4lgj</guid>
      <description>&lt;p&gt;Step away from your desk for a moment — a coffee run, a phone call, a quick chat — and the machine you leave behind sits wide open. Session live, inbox signed in, documents on screen, browser still holding every login. Anyone walking past can read what is there, copy files, or send mail as you, and you would never know.&lt;/p&gt;

&lt;p&gt;Screen locking is the unglamorous end of security. No subscription, nothing to install, no policy to read. Yet it removes an entire category of risk in under a second, which is exactly why security teams put it first in every guideline. Here is how to lock on Windows, how to make it happen automatically when you forget, how to choose an unlock method that does not slow you down, and what to do if you realise a machine was left open in public.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why physical access quietly beats every remote attack
&lt;/h2&gt;

&lt;p&gt;People picture risk as far-off hackers, phishing mail, or malware. The shorter path is simpler: someone sitting down at your unlocked machine has to defeat nothing at all. No password prompt, no second factor, no exploit — everything is already authenticated and open.&lt;/p&gt;

&lt;p&gt;In the time it takes to brew coffee, that person could page through your inbox to map your contacts, forward key mail elsewhere, copy a folder onto a USB stick, reset passwords for accounts that are signed in, message clients in your name, review your browsing history, or leave behind a forwarding rule so they can keep reading later. None of it looks unusual when you sit back down.&lt;/p&gt;

&lt;p&gt;The environment does not protect you either. Offices breed trust in colleagues, homes in family and guests, cafes in the assumption that nobody is watching. Data does not weigh intent — a colleague opening a salary sheet, a child deleting a folder with a few taps, a guest spotting figures on your screen all cause real harm. One habit erases the whole set, which is why every corporate guideline lists locking your machine at the top.&lt;/p&gt;

&lt;p&gt;There is also the passive leak: an open screen shares whatever is visible to anyone nearby, no interaction required. A lock screen shows a clock and wallpaper, nothing else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Locking fast on Windows
&lt;/h2&gt;

&lt;p&gt;Make the instant shortcut a reflex. On Windows that is Windows key plus L. Your session freezes behind the sign-in screen with every app and file exactly where it was — lock is not sign-out. Type your credential on return and you are back in the same spot.&lt;/p&gt;

&lt;p&gt;If your hand is already on the mouse, the Start menu carries a lock option under your account icon. It is a few seconds slower, but handy when the shortcut slips your mind or you are showing a newcomer.&lt;/p&gt;

&lt;p&gt;A password-protected screensaver is a decent safety net: set a short idle delay and the machine locks itself when you forget. Keep that delay tight, because every second before it fires is exposed time.&lt;/p&gt;

&lt;p&gt;Laptop users who fold the lid should confirm that closing it truly locks. On plenty of machines the default only turns the display off, leaving the session live for anyone who lifts the lid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automatic locking for the times you forget
&lt;/h2&gt;

&lt;p&gt;Everyone forgets sometimes, which is why the layer that matters most is not the shortcut but automation.&lt;/p&gt;

&lt;p&gt;First, set a short display-off and sleep timeout in power settings. Waking from sleep should demand sign-in again. Tune it to your setting: a fixed desk machine tolerates a few minutes, while a laptop that travels wants less, because its surroundings are harder to control.&lt;/p&gt;

&lt;p&gt;Second, dynamic lock — pair the computer with your phone and let proximity do the work. Carry the phone away and the machine locks shortly after. Treat it as a backup rather than a substitute, since wireless range reaches further than you would like.&lt;/p&gt;

&lt;p&gt;Third, require sign-in on every wake. Some machines are configured to drop you straight back in after sleep, silently cancelling the point of automatic locking. Check that every wake path crosses the credential prompt.&lt;/p&gt;

&lt;p&gt;Together the layers cover each other: lock when you remember, auto-lock when you do not, authenticate on return.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose an unlock method that keeps you locking
&lt;/h2&gt;

&lt;p&gt;People skip locking because they dread retyping a long password. Fix that with a better unlock method instead of abandoning the habit.&lt;/p&gt;

&lt;p&gt;A PIN is the sweet spot. It is bound to that one machine, so a leaked PIN is useless without the hardware in hand. Pick several digits with no obvious pattern and shield the keypad while typing. It is far quicker than a long password, and it stops opening the machine feeling like a chore.&lt;/p&gt;

&lt;p&gt;If the machine has a fingerprint reader or a face camera, use it: nothing to memorise, nothing to spy over your shoulder, recognition lands in about a second. Keep a PIN as fallback for wet fingers or poor light.&lt;/p&gt;

&lt;p&gt;Underneath it all sits your account password, because PIN and biometrics both rest on it. Make it strong and unique, never reused. If you currently share one password across services, split the machine password off first — that machine holds the keys to your other accounts. A password manager keeps it long without memorising, and two-factor authentication on the linked online account stops anyone resetting it remotely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Office, cafe, home: one rule, different stakes
&lt;/h2&gt;

&lt;p&gt;The rule is the same everywhere — lock when you leave — but the risk differs, so spend your caution where it counts.&lt;/p&gt;

&lt;p&gt;At the office, complacency and foot traffic dominate. Colleagues borrow machines, cleaning staff pass through after hours, visitors walk the floor. Lock even for a one-minute absence and turn it into team culture so nobody feels singled out. Where a desktop serves several shifts, each person gets a separate account and signs out fully at handover rather than merely locking.&lt;/p&gt;

&lt;p&gt;At a cafe or coworking space, strangers are the backdrop and you will often have to step away to order or find a restroom. Never leave the machine alone even when locked — a lock screen stops use, not theft. Take it with you, ask someone to watch it, or secure it in a bag. Sit with your back to a wall and consider a privacy filter if you work out often.&lt;/p&gt;

&lt;p&gt;At home, the habit usually vanishes because home feels safe. But guests, children, and helpers share the space. A child tapping can delete mail or buy inside a signed-in app, and a guest can glimpse financials. Keep the habit for the machine you actually work on, and give each person their own account on shared computers.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you left a machine unlocked in public
&lt;/h2&gt;

&lt;p&gt;Do not spiral — triage instead.&lt;/p&gt;

&lt;p&gt;Get back to the machine and look for telltales: the mouse relocated, unexpected windows, files with very recent access times. Absence of signs proves nothing, because snooping often leaves no trace.&lt;/p&gt;

&lt;p&gt;Then change passwords in priority order from a device you trust — primary email first, since it is the recovery key for everything else, then banking, then social and storage. Review active sessions and sign out every unknown device.&lt;/p&gt;

&lt;p&gt;Then hunt for deeper interference: new forwarding rules, a changed recovery address, freshly installed apps, a recently mounted external drive. Any of those means more than idle curiosity — run a full antivirus scan, review sign-in history, and tell IT if it is a work machine.&lt;/p&gt;

&lt;p&gt;Finally, turn the scare into a fix by enabling the automatic layers above right now, so the next lapse defends itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  A thirty-second routine before you walk away
&lt;/h2&gt;

&lt;p&gt;Run the mental checklist until it becomes reflex — stick a note on your desk for the first weeks, or set it as your phone wallpaper. Teams pick it up fast, because people copy the behaviour around them more than the rules they read.&lt;/p&gt;

&lt;p&gt;Screen locking is one link in a chain. It sits alongside unique passwords, two-factor authentication where it counts, backups to a separate location, and the instinct to spot phishing before clicking. Each link is cheap; only the full chain holds.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on Tân IT365: &lt;a href="https://tanit365.com/en/blog/posts/how-to-lock-screen-protect-data-2026/" rel="noopener noreferrer"&gt;https://tanit365.com/en/blog/posts/how-to-lock-screen-protect-data-2026/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>windows</category>
      <category>productivity</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Your Phone Battery Is Not Bad — Your Settings Are</title>
      <dc:creator>Tùng Xuân</dc:creator>
      <pubDate>Tue, 03 Nov 2026 05:42:01 +0000</pubDate>
      <link>https://dev.to/tanit365/your-phone-battery-is-not-bad-your-settings-are-3ebm</link>
      <guid>https://dev.to/tanit365/your-phone-battery-is-not-bad-your-settings-are-3ebm</guid>
      <description>&lt;p&gt;You unplug at breakfast, and by lunch half the battery is gone. You barely used the phone. So you conclude the battery is dying and start shopping for a replacement.&lt;/p&gt;

&lt;p&gt;Most of the time it is not the battery. It is the display, the signal, and a pile of background processes you never agreed to run. All three are free to fix, and none of them require a repair shop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the display, because it wins every time
&lt;/h2&gt;

&lt;p&gt;The screen is the hungriest component in the phone, and the damage scales with brightness, panel size, refresh rate, and how long the screen stays on after you stop touching it.&lt;/p&gt;

&lt;p&gt;Two changes take about two minutes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Turn on auto-brightness instead of pinning the slider high. Indoors, most people run the screen twice as bright as they need.&lt;/li&gt;
&lt;li&gt;Cut the auto-lock timeout to the shortest interval you can live with. A screen that stays lit for minutes on a table is pure loss.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your phone has a high refresh rate mode, dropping it to the standard rate for everyday use is another quiet win — you will barely notice the difference outside of games.&lt;/p&gt;

&lt;h2&gt;
  
  
  Weak signal is a battery multiplier
&lt;/h2&gt;

&lt;p&gt;A phone hunting for a tower transmits at higher power and repeats the search constantly. That is why a day in a basement or a rural stretch drains faster than a day at home on Wi-Fi.&lt;/p&gt;

&lt;p&gt;Practical moves: prefer Wi-Fi when you have it, turn on airplane mode in dead zones instead of letting the radio struggle, and turn off hotspot when nobody is connected. If you spend hours in a low-signal office, a Wi-Fi calling setup beats raw cellular.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hunt the real background hogs instead of guessing
&lt;/h2&gt;

&lt;p&gt;Do not trust the vague feeling that "some app" is draining. Use the built-in battery screen and read it honestly: it ranks apps by actual consumption over the last day, not by your suspicion. Social feeds, navigation, and anything with constant location tracking are the usual suspects.&lt;/p&gt;

&lt;p&gt;For the worst offenders, restrict background activity rather than uninstalling — you keep the app and lose the drain. Also check location permissions: an app set to "always" is paying for GPS continuously whether or not you opened it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Charge in a way that keeps the battery healthy for years
&lt;/h2&gt;

&lt;p&gt;Battery chemistry does not like extremes. Sitting at full charge, or at empty, for long periods ages the cell faster than normal cycling.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid leaving the phone plugged in at full charge for hours on end.&lt;/li&gt;
&lt;li&gt;Do not routinely run it to zero. Partial top-ups are fine and arguably better.&lt;/li&gt;
&lt;li&gt;Skip the cheap unbranded charger that gets hot; heat is the real enemy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The small switches that actually matter
&lt;/h2&gt;

&lt;p&gt;Battery saver mode is not just for emergencies. On most phones it trims background refresh and animations while keeping calls and messages intact — a reasonable default for long days out. Dark mode helps on OLED panels. Turning off "always on" display, if you do not use it, saves a surprising amount over a month.&lt;/p&gt;

&lt;h2&gt;
  
  
  A thirty-second nightly routine
&lt;/h2&gt;

&lt;p&gt;Before bed: close navigation and hotspot, confirm Wi-Fi is on if you have a network, and glance at the battery screen once a week to see if a new app has crept into the top of the list. That is the whole maintenance plan.&lt;/p&gt;

&lt;p&gt;The full walkthrough, including how to read the battery screen properly and when a replacement genuinely makes sense, is in the original article: &lt;a href="https://tanit365.com/en/blog/posts/save-phone-battery-life-2026/" rel="noopener noreferrer"&gt;Save Phone Battery Life That Lasts All Day (2026)&lt;/a&gt;. If you are setting up a new device, the companion piece on &lt;a href="https://tanit365.com/en/blog/posts/how-to-set-up-a-new-windows-pc-2026/" rel="noopener noreferrer"&gt;setting up a new Windows PC&lt;/a&gt; follows the same principle: fix the defaults first, buy hardware last.&lt;/p&gt;

</description>
      <category>battery</category>
      <category>android</category>
      <category>iphone</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Deleted photos are not gone yet: the order that saves them</title>
      <dc:creator>Tùng Xuân</dc:creator>
      <pubDate>Tue, 03 Nov 2026 02:48:40 +0000</pubDate>
      <link>https://dev.to/tanit365/deleted-photos-are-not-gone-yet-the-order-that-saves-them-53bd</link>
      <guid>https://dev.to/tanit365/deleted-photos-are-not-gone-yet-the-order-that-saves-them-53bd</guid>
      <description>&lt;p&gt;Losing the wrong photo happens in a second: a swipe while clearing space, a tap on delete, and a month of pictures disappears. The reflex is to panic and start installing recovery tools. That is usually the worst move. On both Android and iPhone a deleted picture is normally still on the phone, sitting in a holding area, and what you do in the next hour decides whether it comes back.&lt;/p&gt;

&lt;p&gt;The order below is the one I would follow on any phone, and it uses only apps that are already installed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deletion is a two-step process
&lt;/h2&gt;

&lt;p&gt;When you delete a photo the phone does not erase the file. It marks the space as available for reuse and hides the picture from the gallery. The bytes stay there until something else needs that space, and every new photo, video, download or app update can land on top of them.&lt;/p&gt;

&lt;p&gt;That is why the first minutes matter more than the rest of the day. Three things to stop immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do not keep taking photos or recording video.&lt;/li&gt;
&lt;li&gt;Do not install anything, including recovery apps and cleaners.&lt;/li&gt;
&lt;li&gt;Do not reset the device or run tools that promise to free space.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An aggressive cleaner is the fastest way to overwrite the files you are trying to rescue. Restraint costs nothing.&lt;/p&gt;

&lt;p&gt;While you are being still, run the cheap check: perhaps the picture exists somewhere else. A cloud gallery may still hold it, a chat thread may still have the version you shared, a family member may have received it. Plenty of "lost" albums turn out to be intact inside a conversation.&lt;/p&gt;

&lt;p&gt;Also note roughly when the deletion happened. The holding areas count down from that moment, and the date tells you whether you have a full window, a partial one, or none at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The waiting room on iPhone
&lt;/h2&gt;

&lt;p&gt;The Photos app keeps removed pictures in an album called Recently Deleted, and the countdown is visible on every thumbnail. The path is the albums view, then the utilities area at the bottom, then the recently deleted folder. Select what you want and choose recover; the pictures return to the camera roll at their original date, in their original place.&lt;/p&gt;

&lt;p&gt;Two details are worth knowing before you need them. There is a recover-all action for the moment you deleted a whole batch. And the countdown is absolute: when it reaches zero the device purges the item by itself, even if you never emptied the folder by hand. Finding the folder already empty after a deletion you noticed late is normal behaviour, not a malfunction.&lt;/p&gt;

&lt;p&gt;If the folder was emptied, one built-in copy often survives: media inside conversations. Chat apps keep their own copy of what was shared, so the attachment view of a conversation can still hold the picture after the gallery dropped it. Saving it back to the camera roll is a genuine recovery path, and for family moments it is frequently the fastest one.&lt;/p&gt;

&lt;p&gt;A full restore from a backup is the heavy option. It rolls the entire device back to the backup date, and you redo everything that happened after it. Worth it for a year of family pictures, rarely worth it for a handful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The waiting room on Android
&lt;/h2&gt;

&lt;p&gt;Google Photos keeps removed items in a trash folder, and the length of the countdown depends on whether the app is backing up: longer when it is, shorter when it is not. The path is the library tab, then the trash folder. Every item shows its own remaining time, and restoring puts it back where it was.&lt;/p&gt;

&lt;p&gt;Phones that ship their own gallery app add a second layer. Samsung, Xiaomi, OPPO and others include a recycle bin inside the built-in gallery, separate from Google Photos. If the first folder looks empty, check the second before concluding anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copies you forgot you had
&lt;/h2&gt;

&lt;p&gt;Before moving to paid tools, list the places where a copy may already exist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A cloud photo service with its own trash folder, which often keeps deleted items far longer than the phone does.&lt;/li&gt;
&lt;li&gt;A messaging app that auto-saves received images, or simply still holds them in the chat.&lt;/li&gt;
&lt;li&gt;A laptop folder from a past transfer.&lt;/li&gt;
&lt;li&gt;A shared album that someone else still owns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these is a free recovery, and together they cover more cases than any single app.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the window has already closed
&lt;/h2&gt;

&lt;p&gt;If every holding area is empty and no copy exists elsewhere, the honest answer is that recovery becomes uncertain. Free tools rarely help at that point because phones encrypt their storage. Professional services exist, cost real money, and still offer no guarantee.&lt;/p&gt;

&lt;p&gt;That is the moment to stop improvising and make sure it does not happen again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two layers so this stays rare
&lt;/h2&gt;

&lt;p&gt;The habit that removes the drama takes minutes to set up:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Turn on automatic backup for the photo library, then confirm it is actually completing rather than merely enabled.&lt;/li&gt;
&lt;li&gt;Keep one copy outside the phone's ecosystem. A second service, a computer or an external drive is enough. The point is that no single account or device is the only place the pictures live.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One extra layer costs nothing: slow down when deleting in bulk. Most accidental mass deletions happen while clearing space in a hurry.&lt;/p&gt;

&lt;h2&gt;
  
  
  A calm checklist for the next accident
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Stop writing to the phone: no new photos, no installs, no cleaners.&lt;/li&gt;
&lt;li&gt;Check the phone's own deleted folder and its countdown.&lt;/li&gt;
&lt;li&gt;Check the second gallery app if the phone has one.&lt;/li&gt;
&lt;li&gt;Check cloud trash, chats, shared albums and old laptop folders.&lt;/li&gt;
&lt;li&gt;Consider a full backup restore only when the value clearly outweighs the re-setup.&lt;/li&gt;
&lt;li&gt;Then set up automatic backup plus one off-device copy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deleted photos are usually not gone. They are waiting, and the order in which you check things is what decides the outcome.&lt;/p&gt;

&lt;p&gt;The full walkthrough, with the settings on each screen, is on the original post at tanit365.com.&lt;/p&gt;

</description>
      <category>android</category>
      <category>iphone</category>
      <category>photos</category>
      <category>privacy</category>
    </item>
    <item>
      <title>The iPhone backup audit: find the gap before the phone is gone</title>
      <dc:creator>Tùng Xuân</dc:creator>
      <pubDate>Tue, 03 Nov 2026 02:44:31 +0000</pubDate>
      <link>https://dev.to/tanit365/the-iphone-backup-audit-find-the-gap-before-the-phone-is-gone-1cki</link>
      <guid>https://dev.to/tanit365/the-iphone-backup-audit-find-the-gap-before-the-phone-is-gone-1cki</guid>
      <description>&lt;p&gt;Most people think about an iPhone backup on the morning the phone will not switch on. By then the options are narrow and the pressure is high. The calmer approach is to audit the copy while nothing is wrong, because whether a lost phone is an annoyance or a real loss was decided months earlier by a handful of settings nobody opens.&lt;/p&gt;

&lt;p&gt;This is not a product review. It is the order I would follow on any phone I depend on, written for someone who wants the copy to be real rather than assumed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the gap, not the tool
&lt;/h2&gt;

&lt;p&gt;A phone backup is a snapshot of the device's own contents: settings, the layout of the home screen, app data, message history, and whatever media you told it to include. Restore that snapshot and the phone comes back wearing your wallpaper, with the same icons in the same places and the same conversations waiting.&lt;/p&gt;

&lt;p&gt;The omissions are the part that hurts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apps are not copied, only referenced, so they download again from the store.&lt;/li&gt;
&lt;li&gt;Face and fingerprint data is left out on purpose and has to be enrolled again.&lt;/li&gt;
&lt;li&gt;Files that live inside a separate online service stay there, because they were never resident on the phone in a permanent way.&lt;/li&gt;
&lt;li&gt;Some chat apps keep media and history on the device unless their own backup switch is turned on inside the app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point catches people who assume the phone-level copy covers everything. It does not. A chat app with its own storage has its own idea of what a backup means.&lt;/p&gt;

&lt;p&gt;The exercise worth doing once: write down the handful of things on the phone you would genuinely hate to lose, then check each one against the backup and against its own service. Almost everyone finds at least one gap, usually a notes app that stored everything locally or a messenger that never had its backup enabled. Closing that gap costs nothing today and everything later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two places a copy can live
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;In the cloud.&lt;/strong&gt; The built-in option runs by itself once enabled: the phone copies itself when it is on Wi-Fi, plugged into power, and locked. In practice that means it happens during the nightly charge, and a healthy setup shows a recent completion every morning. There is no schedule to manage.&lt;/p&gt;

&lt;p&gt;The catch is capacity. The free tier is small enough that a normal photo library fills it, and when the allowance runs out the backups stop completing without a loud warning. The protection you believed you had can end weeks before you notice. The conscious choice is either a modest paid tier or a deliberate decision to keep the cloud copy lean by excluding photos and covering them another way.&lt;/p&gt;

&lt;p&gt;One confusion is worth clearing up: photo sync and the device backup are different features. When photo sync is on, pictures live in the cloud as their own continuously updated library, and they are excluded from the backup to avoid storing them twice. Losing the phone does not lose the pictures. But deleting a picture on the phone also removes it from that library after a short grace period, which is a different failure than the one a backup protects against.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On a computer.&lt;/strong&gt; Connecting the phone by cable and copying to a machine gives you a full local copy with no quota and no monthly fee, limited only by free disk space. For large libraries it is the roomiest option, and a restore over cable is the fastest because everything pours back in one session.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checkbox that decides how useful the copy is
&lt;/h2&gt;

&lt;p&gt;When you back up to a computer, one setting changes the value of the result: encryption. An encrypted local backup includes categories an ordinary one skips, such as saved Wi-Fi passwords, health data, and call history. Restoring it does not force you to re-enter every account by hand.&lt;/p&gt;

&lt;p&gt;The trade is that you must choose a password and keep it. Lose it and the copy is unreadable, by design. Write it somewhere that is not the phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automation beats intention
&lt;/h2&gt;

&lt;p&gt;A backup that depends on remembering is a backup that eventually stops. Cloud copies run on their own; local copies can be scheduled or at least tied to a routine, such as the first day of the month when the phone charges overnight next to the computer.&lt;/p&gt;

&lt;p&gt;The point is not frequency for its own sake. It is that the copy should be fresher than the worst realistic gap you can tolerate. For someone who photographs work every day, a copy from last month is nearly worthless. For someone whose phone holds little more than messages and contacts, a monthly copy is plenty.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the copy, do not trust it
&lt;/h2&gt;

&lt;p&gt;This is the step almost nobody performs. A backup has not been proven until it has been opened.&lt;/p&gt;

&lt;p&gt;For a cloud copy, open the backup settings and confirm the completion time is recent and the size looks plausible. For a local copy, connect the phone and inspect the backup in the device app: the date and the estimated size should match what you expect.&lt;/p&gt;

&lt;p&gt;Then go one step further and restore something small onto a spare device or a fresh profile. Seeing your own photos and a couple of messages come back is the only evidence that matters. A backup you have never opened is a hope, not a plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Restoring to a new phone without losing anything
&lt;/h2&gt;

&lt;p&gt;The restore itself is mostly waiting, but the order protects you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set up the new phone far enough to reach the transfer screen, then choose to restore from your backup rather than starting clean.&lt;/li&gt;
&lt;li&gt;Sign in with the same account that owns the backup.&lt;/li&gt;
&lt;li&gt;Let the restore finish before opening apps or downloading large files, so the phone is not competing with itself.&lt;/li&gt;
&lt;li&gt;Re-enroll Face or fingerprint data, which is never restored.&lt;/li&gt;
&lt;li&gt;Check the few things that live outside the backup: photos in the cloud library, messages inside chat apps with their own storage, and any document stored in an online drive.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the restore stalls, the usual cause is a weak connection or a phone that is not plugged in. Patience plus power fixes most of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short checklist you can run in ten quiet minutes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Confirm the cloud copy is completing, and check how much room it has left.&lt;/li&gt;
&lt;li&gt;Decide whether photos belong in the backup or in photo sync, and make that decision explicit.&lt;/li&gt;
&lt;li&gt;If you keep a local copy, turn on encryption and store the password off the phone.&lt;/li&gt;
&lt;li&gt;List the handful of things you would hate to lose and verify each one is covered somewhere.&lt;/li&gt;
&lt;li&gt;Open the backup and confirm it is recent. Once a year, restore a small piece of it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is technical. It is the difference between owning a copy and owning a belief.&lt;/p&gt;

&lt;p&gt;The full walkthrough, including the settings on each screen, is on the original post at tanit365.com.&lt;/p&gt;

</description>
      <category>iphone</category>
      <category>backup</category>
      <category>productivity</category>
      <category>privacy</category>
    </item>
  </channel>
</rss>
