<?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: Devesh Pareek</title>
    <description>The latest articles on DEV Community by Devesh Pareek (@decipheringlogic).</description>
    <link>https://dev.to/decipheringlogic</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%2F4108446%2Fd12d9b2a-13d0-40fe-b260-dac5470e0d29.png</url>
      <title>DEV Community: Devesh Pareek</title>
      <link>https://dev.to/decipheringlogic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/decipheringlogic"/>
    <language>en</language>
    <item>
      <title>Agency Handover: How to Get a New Engineer Productive in Week One</title>
      <dc:creator>Devesh Pareek</dc:creator>
      <pubDate>Tue, 27 Oct 2026 14:00:20 +0000</pubDate>
      <link>https://dev.to/decipheringlogic/agency-handover-how-to-get-a-new-engineer-productive-in-week-one-jfi</link>
      <guid>https://dev.to/decipheringlogic/agency-handover-how-to-get-a-new-engineer-productive-in-week-one-jfi</guid>
      <description>&lt;p&gt;Handing a codebase from an agency to a first in-house engineer goes better when the code is split by domain and each domain carries its own schema, API and tests. This is the structure we use at Deciphering Logic and what the first week looks like.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with layer-based layouts
&lt;/h2&gt;

&lt;p&gt;A lot of codebases are organised by layer: controllers, models, services, tests. That works while the same people write everything. It makes handover slow, because one feature is spread across every layer.&lt;/p&gt;

&lt;p&gt;Take signup. The route is in one folder, the user model in another, the email verification in a service, the tests in a directory named after whenever they were written. A new engineer asking where signup lives gets a list of paths.&lt;/p&gt;

&lt;h2&gt;
  
  
  Organise by domain instead
&lt;/h2&gt;

&lt;p&gt;A domain is one part of the product: onboarding, payments, admin, an AI layer if there is one. Each domain owns its tables, its API and its tests.&lt;/p&gt;

&lt;p&gt;A layout like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;onboarding/
  schema/
  api/
  tests/
payments/
  schema/
  api/
  tests/
admin/
  schema/
  api/
  tests/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Signup is onboarding. The user table, the signup endpoints, email verification and their tests sit under one directory.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one rule that makes it work
&lt;/h2&gt;

&lt;p&gt;No domain writes to another domain's tables. If admin needs a user's plan, it asks payments through the payments API.&lt;/p&gt;

&lt;p&gt;That rule is what makes the folders mean something. Without it, the directories are cosmetic and a migration in one domain still breaks tests in another.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each domain hands over
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data model:&lt;/strong&gt; tables, columns, and which ones other domains may read through the API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API:&lt;/strong&gt; every endpoint, request and response shape.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests:&lt;/strong&gt; runnable with one command, with a plain note on what each group covers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Owner:&lt;/strong&gt; a named engineer who answers questions about that domain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tests do most of the work. They describe what the domain should do and fail when someone changes that. A new engineer who runs them on day one has a baseline before editing anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why admin goes first
&lt;/h2&gt;

&lt;p&gt;Admin reads from most of the product and writes to little of it. Reading the neighbouring APIs from the admin side shows how the domains connect.&lt;/p&gt;

&lt;p&gt;The risk is also lower. A bad admin change is a bug in an internal screen. A bad payments change touches money. So the hire takes admin in week one and we keep payments until they have read its tests and shipped a few changes elsewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  A week-one plan
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Day one:&lt;/strong&gt; run the admin tests with the domain owner, then read the admin API top to bottom.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Days two and three:&lt;/strong&gt; read the APIs of the neighbouring domains, onboarding first. The contract is enough at this stage, the code behind it can wait.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;By Friday:&lt;/strong&gt; ship one small change to admin through admin's own tests. A list filter, a new field on a user page.&lt;/p&gt;

&lt;p&gt;Payments keeps moving on its own backlog the whole time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checks that the handover worked
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;The hire finds where signup lives without asking anyone.&lt;/li&gt;
&lt;li&gt;The admin change shipped without touching files in other domains. If it did touch them, the boundary is in the wrong place.&lt;/li&gt;
&lt;li&gt;The hire has edited the owner notes or corrected an endpoint description.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When the hire has shipped several admin changes and read the payments tests end to end, payments moves over with the same four items.&lt;/p&gt;

&lt;h2&gt;
  
  
  If the agency already left
&lt;/h2&gt;

&lt;p&gt;The domain lines can still be drawn afterwards. Map each table to a domain, list the endpoints, group the tests by what they cover. The old code may only loosely follow the result, but the new engineer gets one directory per domain to start from.&lt;/p&gt;

&lt;p&gt;More on how we set up domain teams: &lt;a href="https://www.decipheringlogic.com/teams" rel="noopener noreferrer"&gt;https://www.decipheringlogic.com/teams&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Originally published at decipheringlogic.com&lt;/p&gt;

</description>
      <category>startup</category>
      <category>productdevelopment</category>
      <category>mvp</category>
    </item>
    <item>
      <title>Working With an Indian Team From Australia or NZ: The Daily Setup</title>
      <dc:creator>Devesh Pareek</dc:creator>
      <pubDate>Tue, 20 Oct 2026 08:51:47 +0000</pubDate>
      <link>https://dev.to/decipheringlogic/working-with-an-indian-team-from-australia-or-nz-the-daily-setup-226p</link>
      <guid>https://dev.to/decipheringlogic/working-with-an-indian-team-from-australia-or-nz-the-daily-setup-226p</guid>
      <description>&lt;h1&gt;
  
  
  Setting up a daily handoff between ANZ and Jaipur
&lt;/h1&gt;

&lt;p&gt;Working with a team in Jaipur from Sydney or Auckland has one constraint that shapes everything else. The round trip on a question is either minutes (inside the overlap) or about a day (outside it). Design around that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The clock
&lt;/h2&gt;

&lt;p&gt;IST is UTC+5:30 with no daylight saving. Sydney is UTC+10 (AEST) or UTC+11 (AEDT). Auckland is UTC+12 (NZST) or UTC+13 (NZDT). The gap runs from 4.5 to 7.5 hours and changes twice a year, because only your side moves.&lt;/p&gt;

&lt;p&gt;Assuming a 9:30 start in Jaipur:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Jaipur&lt;/th&gt;
&lt;th&gt;Sydney AEST&lt;/th&gt;
&lt;th&gt;Sydney AEDT&lt;/th&gt;
&lt;th&gt;Auckland NZST&lt;/th&gt;
&lt;th&gt;Auckland NZDT&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;9:30&lt;/td&gt;
&lt;td&gt;14:00&lt;/td&gt;
&lt;td&gt;15:00&lt;/td&gt;
&lt;td&gt;16:00&lt;/td&gt;
&lt;td&gt;17:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11:30&lt;/td&gt;
&lt;td&gt;16:00&lt;/td&gt;
&lt;td&gt;17:00&lt;/td&gt;
&lt;td&gt;18:00&lt;/td&gt;
&lt;td&gt;19:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13:30&lt;/td&gt;
&lt;td&gt;18:00&lt;/td&gt;
&lt;td&gt;19:00&lt;/td&gt;
&lt;td&gt;20:00&lt;/td&gt;
&lt;td&gt;21:00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Inside a normal working day that is roughly 2.5 to 3.5 hours for Sydney and 1 to 2 hours for Auckland.&lt;/p&gt;

&lt;h2&gt;
  
  
  The daily loop
&lt;/h2&gt;

&lt;p&gt;Five fixed points, same times every day:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your morning: read the team's end-of-day note, answer every question in the thread before lunch.&lt;/li&gt;
&lt;li&gt;Start of overlap: 15 to 20 minute call. Shipped, blocked, next. New work is briefed here, with the written brief already sent.&lt;/li&gt;
&lt;li&gt;Middle of the day: the team builds. You do not get pinged unless something is blocked.&lt;/li&gt;
&lt;li&gt;End of overlap: 20 to 30 minute review of what is on staging, on a screen share. Approve or send back with specifics.&lt;/li&gt;
&lt;li&gt;End of the Jaipur day: the team posts the note below.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  End-of-day note
&lt;/h2&gt;

&lt;p&gt;A plain template is enough:&lt;/p&gt;

&lt;p&gt;Done:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;...
Next:&lt;/li&gt;
&lt;li&gt;...
Blocked:&lt;/li&gt;
&lt;li&gt;...
Questions (numbered, each answerable in one line):&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Numbering matters. You reply by number, so every answer maps to a question and nothing gets lost in a long paragraph.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision log
&lt;/h2&gt;

&lt;p&gt;After each call the team posts what was decided: date, decision, owner. You confirm it or correct it in the thread. Keep it next to the specs, in the same wiki or repo, so it can be found later.&lt;/p&gt;

&lt;p&gt;Treat a decision as made once it is logged. Before that, two people can leave the call with different versions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Call or thread?
&lt;/h2&gt;

&lt;p&gt;If a question needs more than two or three round trips, it goes on the call. Each round trip outside the overlap can cost a day.&lt;/p&gt;

&lt;p&gt;On the call: scope trade-offs, unclear briefs, edge-case behaviour, what to cut this week, reviews of working software.&lt;/p&gt;

&lt;p&gt;In writing: specs, acceptance criteria, bug reports with reproduction steps, anything someone will look up in three months.&lt;/p&gt;

&lt;p&gt;Bring the question with the options listed. Whether refunds can be partial takes ten minutes. An open question about how payments should work takes the whole call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outside the overlap
&lt;/h2&gt;

&lt;p&gt;The end-of-day note arrives in your evening or overnight and waits until morning. Agree what counts as urgent, such as production down or customers unable to pay, and give it one named channel. Everything else waits for the next window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common failure modes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The call grows past 20 minutes. Cut the agenda back and move detail into a written doc.&lt;/li&gt;
&lt;li&gt;Questions arrive as one long paragraph. Number them.&lt;/li&gt;
&lt;li&gt;Decisions happen in direct messages. Move them to the thread and log them.&lt;/li&gt;
&lt;li&gt;The calendar breaks when your clocks change. Check both clocks that week, since the Jaipur side does not move.&lt;/li&gt;
&lt;li&gt;Nobody posts the note. Name one owner per thread on each side.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Thread layout
&lt;/h2&gt;

&lt;p&gt;One thread per part of the product: payments, onboarding, admin, and so on. It follows the way DL splits teams, one small team per domain, and it keeps each note short enough to read in a couple of minutes.&lt;/p&gt;

&lt;p&gt;Originally published at decipheringlogic.com&lt;/p&gt;

</description>
      <category>startup</category>
      <category>productdevelopment</category>
      <category>mvp</category>
    </item>
    <item>
      <title>EU AI Act Compliance Checklist for Scale-Up CTOs</title>
      <dc:creator>Devesh Pareek</dc:creator>
      <pubDate>Thu, 08 Oct 2026 13:48:44 +0000</pubDate>
      <link>https://dev.to/decipheringlogic/eu-ai-act-compliance-checklist-for-scale-up-ctos-2d3m</link>
      <guid>https://dev.to/decipheringlogic/eu-ai-act-compliance-checklist-for-scale-up-ctos-2d3m</guid>
      <description>&lt;h1&gt;
  
  
  EU AI Act: The Engineering Decisions That Actually Matter Before You Ship
&lt;/h1&gt;

&lt;p&gt;Most of the EU AI Act coverage focuses on fines and timelines. This post focuses on the decisions that affect your architecture, your data pipelines, and your team's sprint planning right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with risk classification
&lt;/h2&gt;

&lt;p&gt;The Act uses four tiers: unacceptable, high, limited, and minimal. Where your system lands determines almost everything else. High-risk is not based on your intent — it is based on use case and domain. Hiring tools, credit scoring, medical device software, and critical infrastructure management all land in high-risk regardless of how the underlying model works.&lt;/p&gt;

&lt;p&gt;If your model's output feeds into a decision in one of those domains, start from the assumption of high-risk and work backwards. Classification is a written decision, not an internal assumption. Assign an owner and get legal sign-off.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical documentation is an engineering problem
&lt;/h2&gt;

&lt;p&gt;For high-risk systems the Act requires a technical file with specific contents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System description and intended purpose&lt;/li&gt;
&lt;li&gt;Design logic and key design choices&lt;/li&gt;
&lt;li&gt;Training, validation, and testing data and methodology&lt;/li&gt;
&lt;li&gt;Accuracy, robustness, and cybersecurity metrics&lt;/li&gt;
&lt;li&gt;Risk management documentation&lt;/li&gt;
&lt;li&gt;Post-market monitoring plan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The documentation gap most teams have is in dataset provenance and the risk management log. If you are running MLflow or Weights and Biases, your experiment logs are the raw material. The missing piece is usually a dataset registry that records source, collection date, labeling methodology, and known limitations.&lt;/p&gt;

&lt;p&gt;Build the systems that generate this documentation from your existing tooling rather than writing it by hand. Hand-written compliance documents go stale immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human-in-the-loop is an architecture decision
&lt;/h2&gt;

&lt;p&gt;The Act requires that humans can understand, monitor, and intervene in high-risk system outputs. That is a spec, not a policy. In practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automated actions with no review step are a compliance gap for high-risk classifications&lt;/li&gt;
&lt;li&gt;Outputs must be interpretable enough that a reviewer can understand why a decision was reached&lt;/li&gt;
&lt;li&gt;Every decision must be logged and traceable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building HITL as an afterthought means building a review queue nobody uses. Design the intervention surface and the escalation thresholds into your model serving layer before the first production release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data governance additions on top of GDPR
&lt;/h2&gt;

&lt;p&gt;The Act does not replace GDPR. For high-risk systems, training data must meet quality criteria — relevant, representative, free of significant errors. You need to be able to demonstrate this on request.&lt;/p&gt;

&lt;p&gt;Key questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do you have a dataset registry?&lt;/li&gt;
&lt;li&gt;Can you produce it for a regulator or enterprise buyer?&lt;/li&gt;
&lt;li&gt;If training data included EU personal data, do you have a documented lawful basis?&lt;/li&gt;
&lt;li&gt;What is your process if a training dataset needs to be pulled after deployment?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last question is the one most teams cannot answer cleanly. Retraining or retiring a model quickly when a data source is found to be problematic is an operational and architectural requirement, not just a legal one.&lt;/p&gt;

&lt;h2&gt;
  
  
  GPAI deployer obligations
&lt;/h2&gt;

&lt;p&gt;If you are building on a foundation model rather than training your own, you cannot outsource compliance to your model provider. Their GPAI compliance covers their obligations. Your application-level risk classification, any fine-tuning you apply, and the transparency requirements of your deployed system are still yours.&lt;/p&gt;

&lt;p&gt;Get the technical documentation from your model provider. If they cannot provide it, treat it as a vendor risk issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do in the next 30 days
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Produce a written risk classification for each AI system you are shipping or planning to ship this quarter. One page per system, legal sign-off required.&lt;/li&gt;
&lt;li&gt;Run a gap analysis against the high-risk technical file requirements for any system that lands in that tier.&lt;/li&gt;
&lt;li&gt;Make the HITL architecture call before the next sprint for any high-risk system, not as a later iteration.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are small decisions in terms of time. They have large downstream effects on your architecture and your vendor contracts.&lt;/p&gt;




&lt;p&gt;Originally published at decipheringlogic.com&lt;/p&gt;

</description>
      <category>startup</category>
      <category>productdevelopment</category>
      <category>mvp</category>
    </item>
    <item>
      <title>Building a Restaurant Loyalty App That Talks to Your POS</title>
      <dc:creator>Devesh Pareek</dc:creator>
      <pubDate>Thu, 01 Oct 2026 06:01:09 +0000</pubDate>
      <link>https://dev.to/decipheringlogic/building-a-restaurant-loyalty-app-that-talks-to-your-pos-4d4b</link>
      <guid>https://dev.to/decipheringlogic/building-a-restaurant-loyalty-app-that-talks-to-your-pos-4d4b</guid>
      <description>&lt;h1&gt;
  
  
  Building a Restaurant Loyalty App That Talks to Your POS: The Integration Decisions That Actually Matter
&lt;/h1&gt;

&lt;p&gt;The loyalty logic in a restaurant app is not complicated. Points accrue on purchase, rewards redeem at a threshold, referrals credit when a new guest completes a qualifying visit. You can model that domain in an afternoon.&lt;/p&gt;

&lt;p&gt;The POS integration is a different problem entirely. It's where most restaurant-tech builds stall — not in the planning phase, but in week four of development when the team discovers that the POS only exposes data via hourly batch exports, or that bidirectional redemption requires a vendor partnership agreement nobody had applied for.&lt;/p&gt;

&lt;p&gt;This post covers the technical decisions that need to be made before a line of code is written.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the POS surface area
&lt;/h2&gt;

&lt;p&gt;Before you design anything, know exactly what your POS exposes and how.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloud-native platforms&lt;/strong&gt; (Toast, Square, Lightspeed, etc.) typically offer REST APIs with OAuth, sandbox environments, and reasonable documentation. Integration scope is predictable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-premise or legacy systems&lt;/strong&gt; may expose data only through a local database, a proprietary SDK, or scheduled CSV exports. Middleware is often required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Franchise-managed platforms&lt;/strong&gt; sometimes gate API access behind a developer or partner program. This takes time to apply for and isn't guaranteed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first technical spike in any POS integration project should be: authenticate against the sandbox, pull a transaction record, confirm the data model. If you can't do that in a day, you've found a constraint worth escalating before architecture decisions are made.&lt;/p&gt;

&lt;h2&gt;
  
  
  Map each data flow explicitly
&lt;/h2&gt;

&lt;p&gt;There are at least four distinct flows in a loyalty-plus-POS system, and they have different latency requirements and failure modes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flow&lt;/th&gt;
&lt;th&gt;Direction&lt;/th&gt;
&lt;th&gt;Latency&lt;/th&gt;
&lt;th&gt;Failure impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Transaction events&lt;/td&gt;
&lt;td&gt;POS → loyalty&lt;/td&gt;
&lt;td&gt;Near real-time or per-session&lt;/td&gt;
&lt;td&gt;Points not awarded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reward redemption&lt;/td&gt;
&lt;td&gt;Loyalty → POS&lt;/td&gt;
&lt;td&gt;Real-time at checkout&lt;/td&gt;
&lt;td&gt;Double redemption or failure at register&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menu/item data&lt;/td&gt;
&lt;td&gt;POS → loyalty&lt;/td&gt;
&lt;td&gt;Daily sync usually sufficient&lt;/td&gt;
&lt;td&gt;Stale data in app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customer identity&lt;/td&gt;
&lt;td&gt;Bidirectional&lt;/td&gt;
&lt;td&gt;At transaction time&lt;/td&gt;
&lt;td&gt;Misattributed points&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Redemption is the most operationally sensitive. If the loyalty app times out during a checkout and the POS can't confirm the discount, the cashier is stuck. That failure mode needs a defined fallback — manual override code, offline redemption queue, or graceful degradation — before you're in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  The identity problem
&lt;/h2&gt;

&lt;p&gt;Your loyalty app knows the customer. Your POS knows the transaction. They don't automatically agree on who made the purchase.&lt;/p&gt;

&lt;p&gt;Common matching approaches:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phone-number lookup at register&lt;/strong&gt; — low technical complexity, high dependency on cashier discipline. Expect a non-trivial miss rate in practice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;QR code from loyalty app&lt;/strong&gt; — works well in counter-service contexts, adds a step to the checkout flow. Reliable when customers use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Card-on-file linkage&lt;/strong&gt; — cleanest UX, depends on payment processor support (not just POS support). Not universally available.&lt;/p&gt;

&lt;p&gt;Whichever method you choose, design your attribution logic around its realistic failure rate. If 15-20% of transactions won't be attributed, your points balance display, dispute handling, and campaign logic need to account for that gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Offline behavior
&lt;/h2&gt;

&lt;p&gt;Restaurant environments lose connectivity. Food trucks, basements, festival stalls — these are real deployment contexts. Your integration needs an explicit position on what happens when the POS can't reach your loyalty backend.&lt;/p&gt;

&lt;p&gt;The standard approach is local transaction queuing on the POS with sync-on-reconnect. Points are awarded on sync, not in real time. This is acceptable for most use cases but breaks time-sensitive promotions and real-time redemption validation.&lt;/p&gt;

&lt;p&gt;For multi-unit or franchise deployments, offline behavior needs to be consistent across locations. Inconsistency at this level becomes a support and trust problem at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data model consequences of multi-location rules
&lt;/h2&gt;

&lt;p&gt;If a customer earns points at location A and redeems at location B, your data model needs to represent that clearly. If referrals can cross locations, you need a transaction-level location attribute on every event.&lt;/p&gt;

&lt;p&gt;These seem like business rules. They are — but they have schema-level consequences. Adding cross-location attribution to a data model that wasn't designed for it is a migration, not a feature flag.&lt;/p&gt;

&lt;p&gt;Get the business rules documented before the schema is designed. That's the constraint.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a pre-build integration spec should contain
&lt;/h2&gt;

&lt;p&gt;Before development starts, you want a document that covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;POS platform, API version, authentication method, sandbox access status&lt;/li&gt;
&lt;li&gt;Each data flow: direction, trigger, latency requirement, failure fallback&lt;/li&gt;
&lt;li&gt;Identity-matching method and expected attribution rate&lt;/li&gt;
&lt;li&gt;Offline behavior per integration point&lt;/li&gt;
&lt;li&gt;Multi-location data ownership and cross-location loyalty rules&lt;/li&gt;
&lt;li&gt;Redemption UX at the register and how it maps to POS API capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without this, the development team makes these decisions in code, under time pressure. Those decisions are expensive to reverse.&lt;/p&gt;

&lt;h2&gt;
  
  
  On the build itself
&lt;/h2&gt;

&lt;p&gt;The Grill Masters Pro Shop loyalty and referral system — a product we shipped — is an example of a build where POS integration was scoped before prototyping started, not discovered during development. The upfront questions about which POS, which data flows, and how redemption would work at the register shaped the architecture from the start.&lt;/p&gt;

&lt;p&gt;That scoping work is not glamorous. It's also the difference between a build that ships and one that stalls.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at decipheringlogic.com&lt;/em&gt;&lt;/p&gt;

</description>
      <category>startup</category>
      <category>productdevelopment</category>
      <category>mvp</category>
    </item>
    <item>
      <title>What Does a Clickable Prototype Actually Cost in 2026?</title>
      <dc:creator>Devesh Pareek</dc:creator>
      <pubDate>Thu, 24 Sep 2026 13:15:18 +0000</pubDate>
      <link>https://dev.to/decipheringlogic/what-does-a-clickable-prototype-actually-cost-in-2026-18nc</link>
      <guid>https://dev.to/decipheringlogic/what-does-a-clickable-prototype-actually-cost-in-2026-18nc</guid>
      <description>&lt;h1&gt;
  
  
  What Actually Drives App Prototype Cost in 2026?
&lt;/h1&gt;

&lt;p&gt;Most quotes non-technical founders receive for a "prototype" are actually quotes for a working product. The distinction matters because the cost difference is significant and the decision of which one you need is usually not technical — it is about what stage you are at.&lt;/p&gt;

&lt;p&gt;This post is aimed at developers and technical leads who advise founders, or who are themselves building something on the side. Understanding how prototype cost breaks down helps you scope better and set expectations earlier.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three variables that drive cost
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Scope&lt;/strong&gt; is the dominant factor. A prototype covering a single user flow — onboarding through one primary action — might take 40-60 hours of design time in a tool like Figma. A second user role roughly doubles that. A third flow with branching states doubles it again. Founders often describe four flows in a single paragraph without realizing it, and the scope estimate they receive reflects all four.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fidelity&lt;/strong&gt; is the second variable. Low-fidelity wireframes (grey boxes, placeholder copy) are faster to produce and better for early concept testing because users focus on flow rather than visual detail. High-fidelity prototypes (real brand, real copy, realistic interactions) cost $3,000-$5,000 more but are generally what you want for investor meetings or usability testing where visual credibility matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integrations&lt;/strong&gt; are where people get caught. A Figma prototype simulates data — there is no real API call. But some founders specifically need a live payment flow, a real calendar integration, or an actual EHR data pull to validate something specific. That requires code. A coded prototype with real integrations costs 3-5x more than a design prototype and takes longer to build. It is sometimes the right call, but most founders at the idea stage do not need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a prototype quote should include
&lt;/h2&gt;

&lt;p&gt;A few things to check when reading a prototype estimate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Screen count&lt;/strong&gt;: "as needed" is not a scope. Get a number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revision rounds&lt;/strong&gt;: time-capped or unlimited? Unlimited on a fixed-price engagement means the cost is hidden somewhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build plan&lt;/strong&gt;: a Figma file without technical documentation leaves the founder with no way to get a reliable engineering quote. The build plan — stack recommendations, integration requirements, rough cost range — should be included or explicitly priced.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coded vs. design prototype&lt;/strong&gt;: make sure the quote matches what was actually asked for. These are different products.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why the build plan matters as much as the prototype
&lt;/h2&gt;

&lt;p&gt;A clickable prototype answers the question: does this feel right to users and investors? A build plan answers the question: what would it actually take to build this? Without both, a founder either has something pretty with no engineering path, or a rough cost estimate with no way to communicate the product.&lt;/p&gt;

&lt;p&gt;The gap between prototype and build is where a lot of early-stage projects stall. Developers get handed a Figma file and a vague description. They make assumptions. Those assumptions cost money to unwind later.&lt;/p&gt;

&lt;p&gt;A build plan that covers the data model at a high level, the external integrations required, the non-obvious technical decisions (auth, offline support, multi-tenancy), and a sequenced feature roadmap for v1 gives an engineering team something to actually work from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rough cost ranges for 2026
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Typical range&lt;/th&gt;
&lt;th&gt;Timeline&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Low-fidelity wireframes, single flow&lt;/td&gt;
&lt;td&gt;$1,500 - $3,000&lt;/td&gt;
&lt;td&gt;1 week&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High-fidelity prototype, single flow&lt;/td&gt;
&lt;td&gt;$4,000 - $7,000&lt;/td&gt;
&lt;td&gt;2 weeks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High-fidelity prototype, two user roles&lt;/td&gt;
&lt;td&gt;$7,000 - $12,000&lt;/td&gt;
&lt;td&gt;2-3 weeks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prototype + build plan&lt;/td&gt;
&lt;td&gt;$5,000 - $10,000&lt;/td&gt;
&lt;td&gt;2 weeks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coded prototype with real integrations&lt;/td&gt;
&lt;td&gt;$15,000 - $30,000&lt;/td&gt;
&lt;td&gt;4-8 weeks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These ranges assume a competent product design team working against a reasonably clear brief. Offshore rates in some markets will be lower; US-based boutique agencies will be higher.&lt;/p&gt;

&lt;h2&gt;
  
  
  A note on timeline
&lt;/h2&gt;

&lt;p&gt;Two weeks is realistic for a single-flow, high-fidelity prototype. Three weeks for two user roles. If a quote says six weeks for a prototype, ask what is filling the time. Sometimes that reflects a team structure where design and feedback cycles are stretched across calendar time rather than compressed. Sometimes it is just padding.&lt;/p&gt;

&lt;p&gt;Compressing a prototype to 14 days forces scope decisions early. That is uncomfortable but useful — it surfaces the question of what is actually in v1 before anyone starts building.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical takeaway for developers advising founders
&lt;/h2&gt;

&lt;p&gt;When a founder you know says they received an $80,000 quote for their app idea, ask whether anyone scoped it as a prototype first. The answer is usually no. The agency answered the question they were given.&lt;/p&gt;

&lt;p&gt;A prototype engagement that produces a high-fidelity interactive demo and a build plan costs a fraction of a full build and gives both the founder and the future engineering team what they actually need to make a good decision about what to build next.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at decipheringlogic.com&lt;/em&gt;&lt;/p&gt;

</description>
      <category>startup</category>
      <category>productdevelopment</category>
      <category>mvp</category>
    </item>
    <item>
      <title>Building a candidate Readiness Score for a healthcare staffing marketplace</title>
      <dc:creator>Devesh Pareek</dc:creator>
      <pubDate>Wed, 16 Sep 2026 11:42:07 +0000</pubDate>
      <link>https://dev.to/decipheringlogic/building-a-candidate-readiness-score-for-a-healthcare-staffing-marketplace-5ac2</link>
      <guid>https://dev.to/decipheringlogic/building-a-candidate-readiness-score-for-a-healthcare-staffing-marketplace-5ac2</guid>
      <description>&lt;p&gt;Wanderly is a travel healthcare staffing marketplace: 663,000+ registered candidates, 500+ agencies. Recruiters there had one recurring question: of the thousands of candidates in my list, who do I call first?&lt;/p&gt;

&lt;p&gt;We built a Readiness Score to answer it. This is the version-one model, the reasoning behind its shape, and what we deliberately left out.&lt;/p&gt;

&lt;p&gt;## Three signals, not eight&lt;/p&gt;

&lt;p&gt;The full design had eight signals: recency, job views, clicks, applications, email and SMS engagement, an opt-out penalty, campaign participation, profile completeness. It was a good model. We shipped three:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Campaign engagement, 50%&lt;/li&gt;
&lt;li&gt;Application activity, 30%&lt;/li&gt;
&lt;li&gt;Profile completeness, 20%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fewer signals meant the score was explainable to a recruiter in one sentence, and it meant we could validate the model against sixty days of real pilot data before adding anything.&lt;/p&gt;

&lt;p&gt;## Recency decay&lt;/p&gt;

&lt;p&gt;Campaign engagement is decayed by recency: activity in the last 30 days counts at 1.0x, 31 to 90 days at 0.7x, 91 to 180 days at 0.4x, and nothing beyond the configured window. A reply from last week and a reply from five months ago are not the same signal.&lt;/p&gt;

&lt;p&gt;## Hard overrides&lt;/p&gt;

&lt;p&gt;Some things are switches, not inputs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opt-out (a STOP reply): score forced to 0 and the candidate is removed from every campaign audience, regardless of any other signal.&lt;/li&gt;
&lt;li&gt;Twelve months of total inactivity: score capped at 25.&lt;/li&gt;
&lt;li&gt;New candidate with no history: scored on profile completeness only, shown with a New badge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compliance sits outside the model. A weighted penalty can be outvoted by other signals; a hard override cannot.&lt;/p&gt;

&lt;p&gt;## Tiers&lt;/p&gt;

&lt;p&gt;Hot 70 to 100. Warm 40 to 69. Cold 20 to 39. Inactive 0 to 19. Minimum campaign-eligible score: 20. Weights are locked for v1; admins configure the time windows and the tier thresholds.&lt;/p&gt;

&lt;p&gt;## What the recruiter sees&lt;/p&gt;

&lt;p&gt;The number, a colour, and a breakdown: Campaign engagement 42/50, Application activity 24/30, Profile 18/20, based on the last 6 months. Opted-out candidates are flagged, not hidden.&lt;/p&gt;

&lt;p&gt;## What we left for v2&lt;/p&gt;

&lt;p&gt;Behavioural events (job views, time on job detail, pay comparisons, saves), agency-specific weights, and a second scoring mode for agencies that use the marketplace without the campaign product. All of it waits on real data from v1.&lt;/p&gt;

&lt;p&gt;Originally published at decipheringlogic.com&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>vectordatabase</category>
    </item>
    <item>
      <title>Wanderly case study</title>
      <dc:creator>Devesh Pareek</dc:creator>
      <pubDate>Wed, 16 Sep 2026 10:18:02 +0000</pubDate>
      <link>https://dev.to/decipheringlogic/wanderly-case-study-3b74</link>
      <guid>https://dev.to/decipheringlogic/wanderly-case-study-3b74</guid>
      <description>&lt;h1&gt;
  
  
  Building a candidate Readiness Score for a healthcare staffing marketplace
&lt;/h1&gt;

&lt;p&gt;Wanderly is a travel healthcare staffing marketplace: 663,000+ registered candidates, 500+ agencies. Recruiters there had one recurring question: of the thousands of candidates in my list, who do I call first?&lt;/p&gt;

&lt;p&gt;We built a Readiness Score to answer it. This is the version-one model, the reasoning behind its shape, and what we deliberately left out.&lt;/p&gt;

&lt;p&gt;## Three signals, not eight&lt;/p&gt;

&lt;p&gt;The full design had eight signals: recency, job views, clicks, applications, email and SMS engagement, an opt-out penalty, campaign participation, profile completeness. It was a good model. We shipped three:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Campaign engagement, 50%&lt;/li&gt;
&lt;li&gt;Application activity, 30%&lt;/li&gt;
&lt;li&gt;Profile completeness, 20%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fewer signals meant the score was explainable to a recruiter in one sentence, and it meant we could validate the model against sixty days of real pilot data before adding anything.&lt;/p&gt;

&lt;p&gt;## Recency decay&lt;/p&gt;

&lt;p&gt;Campaign engagement is decayed by recency: activity in the last 30 days counts at 1.0x, 31 to 90 days at 0.7x, 91 to 180 days at 0.4x, and nothing beyond the configured window. A reply from last week and a reply from five months ago are not the same signal.&lt;/p&gt;

&lt;p&gt;## Hard overrides&lt;/p&gt;

&lt;p&gt;Some things are switches, not inputs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opt-out (a STOP reply): score forced to 0 and the candidate is removed from every campaign audience, regardless of any other signal.&lt;/li&gt;
&lt;li&gt;Twelve months of total inactivity: score capped at 25.&lt;/li&gt;
&lt;li&gt;New candidate with no history: scored on profile completeness only, shown with a New badge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compliance sits outside the model. A weighted penalty can be outvoted by other signals; a hard override cannot.&lt;/p&gt;

&lt;p&gt;## Tiers&lt;/p&gt;

&lt;p&gt;Hot 70 to 100. Warm 40 to 69. Cold 20 to 39. Inactive 0 to 19. Minimum campaign-eligible score: 20. Weights are locked for v1; admins configure the time windows and the tier thresholds.&lt;/p&gt;

&lt;p&gt;## What the recruiter sees&lt;/p&gt;

&lt;p&gt;The number, a colour, and a breakdown: Campaign engagement 42/50, Application activity 24/30, Profile 18/20, based on the last 6 months. Opted-out candidates are flagged, not hidden.&lt;/p&gt;

&lt;p&gt;## What we left for v2&lt;/p&gt;

&lt;p&gt;Behavioural events (job views, time on job detail, pay comparisons, saves), agency-specific weights, and a second scoring mode for agencies that use the marketplace without the campaign product. All of it waits on real data from v1.&lt;/p&gt;

&lt;p&gt;Originally published at decipheringlogic.com&lt;/p&gt;

</description>
      <category>startup</category>
      <category>productdevelopment</category>
      <category>mvp</category>
    </item>
  </channel>
</rss>
