<?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>Forem: Caspar Bannink</title>
    <description>The latest articles on Forem by Caspar Bannink (@caspar_bannink_3728f095d1).</description>
    <link>https://forem.com/caspar_bannink_3728f095d1</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908117%2F6c89943c-9c97-4b2e-beff-8330fe8c2390.png</url>
      <title>Forem: Caspar Bannink</title>
      <link>https://forem.com/caspar_bannink_3728f095d1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/caspar_bannink_3728f095d1"/>
    <language>en</language>
    <item>
      <title>Building an AI email composer because copy-paste rental inquiries have a 12% response rate</title>
      <dc:creator>Caspar Bannink</dc:creator>
      <pubDate>Fri, 15 May 2026 14:07:27 +0000</pubDate>
      <link>https://forem.com/caspar_bannink_3728f095d1/building-an-ai-email-composer-because-copy-paste-rental-inquiries-have-a-12-response-rate-g9n</link>
      <guid>https://forem.com/caspar_bannink_3728f095d1/building-an-ai-email-composer-because-copy-paste-rental-inquiries-have-a-12-response-rate-g9n</guid>
      <description>&lt;p&gt;The Dublin rental market has a response rate problem. The average renter sends a generic inquiry to 20+ properties and hears back from maybe 2 or 3. I measured this through user interviews and it tracks with what academic research on UK/Irish rental markets has found: response rates for cold rental inquiries sit somewhere between 12% and 20% depending on the area and season.&lt;/p&gt;

&lt;p&gt;This is a signal quality problem wrapped in a UX problem. And it's exactly the kind of thing you can build against.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the data actually looks like
&lt;/h2&gt;

&lt;p&gt;When a listing goes live on Daft.ie (the dominant Irish rental portal), it typically receives 50-150 inquiries in the first 48 hours. There's no landlord-side inbox tooling beyond email forwarding. No status tags, no filtering, no templates for responses.&lt;/p&gt;

&lt;p&gt;The landlord opens it, skims a subset, replies to whoever seems credible and convenient, and moves on. The inquiry that lands in position #78 in their inbox could be from a perfect tenant. They'll never see it.&lt;/p&gt;

&lt;p&gt;On the applicant side, the constraint is symmetric. Renters know supply is short and competition is high. Rational strategy is to apply wide. So they send the same message to 20 places. Landlords recognize this pattern and deprioritize anything that sounds like a blast email. The market equilibrium is low signal on both sides.&lt;/p&gt;

&lt;h2&gt;
  
  
  The technical problem: generic text is detectable
&lt;/h2&gt;

&lt;p&gt;From a signal processing standpoint, a landlord reading 150 emails is doing a classification task. "Does this person seem like they actually want THIS property, or are they spamming everything?" Generic emails fail that classifier.&lt;/p&gt;

&lt;p&gt;What passes the classifier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mentions something specific from the listing (the garden, the commute distance to a named workplace, the pet policy)&lt;/li&gt;
&lt;li&gt;Answers the implicit screening questions (move-in date, lease length preference, employment type)&lt;/li&gt;
&lt;li&gt;Has a coherent reason for wanting that specific location&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Writing this for each of 20 properties manually is O(n) effort. Most people won't do it. That's the gap to build against.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built and how it works
&lt;/h2&gt;

&lt;p&gt;HomeScout has an AI email composer that generates property-specific inquiry drafts. The flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User finds a listing they want to apply to&lt;/li&gt;
&lt;li&gt;They click "Generate inquiry"&lt;/li&gt;
&lt;li&gt;The system reads the listing data (title, description, location, price, landlord-specified requirements if any)&lt;/li&gt;
&lt;li&gt;It generates a draft that references specifics from the listing and includes answers to the standard screening questions&lt;/li&gt;
&lt;li&gt;User reviews and edits before sending&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A few things we got wrong in early versions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Too formal.&lt;/strong&gt; First drafts sounded like legal correspondence. Real inquiry emails are conversational. People don't write "I would like to express my interest in the aforementioned property." They write "I'd love to come view this, I work nearby and the commute would be ideal."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hallucinating specifics.&lt;/strong&gt; Early versions made up details that weren't in the listing. "I noticed the property has a south-facing garden" when the listing said nothing about the garden's orientation. That's a problem when the landlord reads it. We added a strict constraint: only reference what's explicitly in the listing data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Missing the implicit screening questions.&lt;/strong&gt; The questions landlords actually care about (when can you move, how long do you want, are you employed) aren't always in the listing. We built a user profile layer so those answers get included from the renter's saved preferences rather than being generated per-inquiry.&lt;/p&gt;

&lt;h2&gt;
  
  
  The model choice question
&lt;/h2&gt;

&lt;p&gt;This is one of those tasks where the quality delta between models matters more than the cost delta. The difference between a mediocre and a good inquiry email is meaningful, and the output is user-facing in a context where the stakes are real (someone might get or not get a viewing based on this).&lt;/p&gt;

&lt;p&gt;We use GPT-4o for this feature. We tested smaller models. The failure modes were too common: hallucinated specifics, wrong tone, missing context from the listing. 4o is measurably better on this specific task. The cost is acceptable given the feature's value.&lt;/p&gt;

&lt;p&gt;We also considered fine-tuning on successful inquiry emails, but our dataset isn't large enough to make that worthwhile yet. It's on the roadmap once we have more throughput.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt engineering notes
&lt;/h2&gt;

&lt;p&gt;The prompt structure that works best for this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System prompt establishes the persona (renter, not an AI assistant) and the tone (conversational, specific, not corporate)&lt;/li&gt;
&lt;li&gt;Listing data is passed as structured context, not raw HTML scrape&lt;/li&gt;
&lt;li&gt;User profile answers are included as a short bullet list for the model to draw from&lt;/li&gt;
&lt;li&gt;Explicit negative instructions: don't fabricate specifics, don't use formal register, don't mention that this is AI-generated&lt;/li&gt;
&lt;li&gt;Output format: plain text, no subject line, 3-4 short paragraphs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The negative instructions matter more than the positive ones. The default model behavior drifts toward formality and generic language. You have to actively constrain it away from those patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  What comes next
&lt;/h2&gt;

&lt;p&gt;The honest answer is that email composer is a partial fix. The underlying problem is that landlord inboxes have no structure, so even a good inquiry can get lost. The complete solution involves building tools on the landlord side too: structured applicant pipelines, automated first-response, viewing scheduler. That's a different product scope.&lt;/p&gt;

&lt;p&gt;For now, improving inquiry quality is the lever we can pull on the renter side. And it does move the needle. Users who use the composer report better outcomes than users who don't.&lt;/p&gt;

&lt;p&gt;I wrote a longer breakdown of the full response rate problem and its market context here: &lt;a href="https://homescout.io/guide/why-landlords-never-reply-dublin-rental" rel="noopener noreferrer"&gt;https://homescout.io/guide/why-landlords-never-reply-dublin-rental&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Caspar Bannink. Founder of HomeScout.io. Building AI-powered rental search for Dublin.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>buildinpublic</category>
      <category>proptech</category>
    </item>
    <item>
      <title>Architecture of a Rental Aggregator: Scraping and Normalizing 90+ Sources</title>
      <dc:creator>Caspar Bannink</dc:creator>
      <pubDate>Thu, 14 May 2026 09:54:51 +0000</pubDate>
      <link>https://forem.com/caspar_bannink_3728f095d1/architecture-of-a-rental-aggregator-scraping-and-normalizing-90-sources-co2</link>
      <guid>https://forem.com/caspar_bannink_3728f095d1/architecture-of-a-rental-aggregator-scraping-and-normalizing-90-sources-co2</guid>
      <description>&lt;p&gt;Building a rental aggregator for Dublin means pulling data from a fragmented market: one dominant portal, a handful of mid-tier sites, dozens of letting agency websites, property management company portals, and a long tail of small sources. Here's how the system is structured and where the interesting problems are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why existing portals aren't enough
&lt;/h2&gt;

&lt;p&gt;The standard answer for finding Dublin rentals is Daft.ie. It has good coverage and solid search. The problem is that coverage isn't complete. Letting agencies list exclusively on their own websites. Some landlords use smaller portals. A non-trivial share of listings never hits Daft at all.&lt;/p&gt;

&lt;p&gt;If you're only searching Daft, you're seeing maybe 60-70% of what's available. For a renter in a tight market, that gap matters.&lt;/p&gt;

&lt;p&gt;An aggregator's value proposition is simple: search everything, show results in one place. The technical challenge is that "everything" means 90+ sources with no shared API, no standard format, and varying levels of scraping difficulty.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source taxonomy
&lt;/h2&gt;

&lt;p&gt;I classify sources into tiers based on scraping approach:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 1: Structured APIs or feeds.&lt;/strong&gt; A small number of sources expose RSS feeds or have semi-public JSON endpoints. These are easy. Pull, parse, done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 2: Consistent HTML structure.&lt;/strong&gt; Most mid-tier portals have stable enough HTML that a straightforward scraper works reliably. BeautifulSoup or Playwright depending on whether the content is server-rendered or JS-generated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 3: Letting agency sites.&lt;/strong&gt; These are the hardest. Each one is different. Some run on estate agent CMSes (Property Hive, Agentbox, PropertyBase), which gives you a consistent structure within a platform family. Others are custom-built or use generic CMS platforms with property listings bolted on. I maintain source-specific extractors for each one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 4: Social and informal.&lt;/strong&gt; Facebook Marketplace, some WhatsApp community channels that get scraped via publicly accessible links. Lower data quality, higher volume of noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  The scraping layer
&lt;/h2&gt;

&lt;p&gt;Each source has a scraper that handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discovery:&lt;/strong&gt; Finding listing URLs. Pagination, sitemap traversal, or feed parsing depending on source type.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extraction:&lt;/strong&gt; Pulling raw data from a listing page. Structured fields where available, falling back to HTML parsing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change detection:&lt;/strong&gt; Tracking whether a listing we've already seen has changed (price update, status change, taken down).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For JS-heavy sources I use Playwright with a headless Chromium instance. The overhead is significant compared to simple HTTP requests, so I only use it where necessary. Most letting agency sites are server-rendered and much cheaper to scrape.&lt;/p&gt;

&lt;p&gt;Rate limiting is handled per source. I track request timestamps per domain and enforce minimum intervals. The last thing you want is to get blocked from a source because you hammered it.&lt;/p&gt;

&lt;p&gt;`python&lt;br&gt;
class RateLimiter:&lt;br&gt;
    def &lt;strong&gt;init&lt;/strong&gt;(self, requests_per_minute: int):&lt;br&gt;
        self.min_interval = 60.0 / requests_per_minute&lt;br&gt;
        self.last_request: dict[str, float] = {}&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async def wait(self, domain: str):
    now = time.time()
    last = self.last_request.get(domain, 0)
    elapsed = now - last
    if elapsed &amp;lt; self.min_interval:
        await asyncio.sleep(self.min_interval - elapsed)
    self.last_request[domain] = time.time()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;`&lt;/p&gt;

&lt;h2&gt;
  
  
  The normalization layer
&lt;/h2&gt;

&lt;p&gt;Every extractor produces a raw record. The normalization pipeline converts raw records to canonical form. I covered this in detail in the data normalization post, but the key fields are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Price: always monthly EUR, with a qualifier (exact/from/on_application)&lt;/li&gt;
&lt;li&gt;Bedrooms: integer, separated from "box room" counts&lt;/li&gt;
&lt;li&gt;Location: normalized to neighborhood + postal district + lat/lng&lt;/li&gt;
&lt;li&gt;Pet policy: boolean or null (not inferred when absent)&lt;/li&gt;
&lt;li&gt;Available date: ISO 8601 or null&lt;/li&gt;
&lt;li&gt;Source provenance: which extractor, when fetched, source URL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The normalization step is where most of the bugs live. Edge cases in source formatting surface constantly. A source starts using a new price format. A letting agency relaunches their website with different HTML structure. I run normalization in a separate pass from extraction so I can reprocess raw records when normalization logic changes without re-scraping.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deduplication
&lt;/h2&gt;

&lt;p&gt;Cross-source deduplication is essential. The same property often appears on multiple sources. Without deduplication, a user would see the same listing three times with slightly different data.&lt;/p&gt;

&lt;p&gt;The deduplication approach is blocking plus similarity scoring:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Block by price band (+/- 10%) and geographic area (same district or adjacent)&lt;/li&gt;
&lt;li&gt;Within blocks, score similarity on address string, price, beds, baths, available date&lt;/li&gt;
&lt;li&gt;Pairs above the threshold get merged. The canonical record keeps the richest data from all matching sources.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This runs as a batch job after normalization completes for a crawl cycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Storage and freshness
&lt;/h2&gt;

&lt;p&gt;Listings go into Postgres. I keep full history: every time a listing changes, the previous state is preserved with a timestamp. This lets me track price changes over time, which surfaces useful signals (listings that drop in price are often still available and motivated to rent).&lt;/p&gt;

&lt;p&gt;Each listing has a &lt;code&gt;freshness_score&lt;/code&gt; that decays over time. The score starts high when a listing is first seen or updated, and drops on a schedule tuned to how frequently that source typically updates. Stale listings get surfaced to users with a staleness label rather than hidden completely, because they might still be available.&lt;/p&gt;

&lt;p&gt;The crawl cycle runs on a schedule per source. High-value sources (the main portals) run every 15-30 minutes. Long-tail sources run every few hours. The full catalog is refreshed within a 24-hour window at minimum.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this breaks down
&lt;/h2&gt;

&lt;p&gt;A few honest failure modes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Listings that go fast.&lt;/strong&gt; A listing can be posted and let within hours. If a source is on a 4-hour crawl cycle, the user might never see it. For the highest-priority sources I push the crawl frequency as high as the site tolerates. But there's no fix for a source that updates infrequently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data accuracy.&lt;/strong&gt; Scraped data is only as accurate as the source. Listings sometimes have wrong prices, wrong bed counts, or outdated availability dates. There's no reliable way to independently verify these without viewings. I surface source data as-is with the provenance visible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CAPTCHAs and bot detection.&lt;/strong&gt; Some sources actively block scraping. I don't fight these. If a source blocks me, I either find a publicly accessible feed or exclude that source.&lt;/p&gt;

&lt;p&gt;I wrote a more user-facing view of how the aggregation works at &lt;a href="https://homescout.io/guide/tools-find-apartment-dublin" rel="noopener noreferrer"&gt;https://homescout.io/guide/tools-find-apartment-dublin&lt;/a&gt;. This post is the technical layer underneath that.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Caspar Bannink. Founder of HomeScout.io. Building AI-powered rental search for Dublin.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>scraping</category>
      <category>architecture</category>
      <category>realestate</category>
    </item>
    <item>
      <title>I Moved to Dublin Without a Clue — So I Built a Tool to Fix Renting</title>
      <dc:creator>Caspar Bannink</dc:creator>
      <pubDate>Wed, 13 May 2026 17:58:23 +0000</pubDate>
      <link>https://forem.com/caspar_bannink_3728f095d1/i-moved-to-dublin-without-a-clue-so-i-built-a-tool-to-fix-renting-2mi9</link>
      <guid>https://forem.com/caspar_bannink_3728f095d1/i-moved-to-dublin-without-a-clue-so-i-built-a-tool-to-fix-renting-2mi9</guid>
      <description>&lt;p&gt;Two years ago I packed up my life in Amsterdam and moved to Dublin. I had a job offer, a suitcase, and zero understanding of how hard finding accommodation in Dublin actually is.&lt;/p&gt;

&lt;p&gt;I thought I knew rental markets. Amsterdam is expensive. London is expensive. But Dublin is a different kind of broken.&lt;/p&gt;

&lt;p&gt;Within a week of arriving I was spending three hours a day refreshing Daft.ie during work meetings, writing the same inquiry email over and over.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://homescout.io" rel="noopener noreferrer"&gt;HomeScout&lt;/a&gt; is what came out of that experience. Not because I had a startup idea. Because I was an expat in Dublin who could not believe how bad the system was.&lt;/p&gt;

&lt;h2&gt;
  
  
  What moving to Dublin as an expat actually looks like
&lt;/h2&gt;

&lt;p&gt;You land. You open Daft.ie. The first five pages are luxury new-builds. The normal places are buried on page eight.&lt;/p&gt;

&lt;p&gt;You find a two-bed in Rathmines for €1,800. Is that a good price? You have no idea. You are making a €21,600-a-year decision completely blind.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AI-powered natural language search.&lt;/strong&gt; Type what you want. &lt;a href="https://homescout.io" rel="noopener noreferrer"&gt;HomeScout&lt;/a&gt; understands natural language and returns exactly what you described.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Area intelligence.&lt;/strong&gt; Every listing shows average rent, price comparisons, and trends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI contract review.&lt;/strong&gt; Upload your lease. HomeScout flags unusual clauses and checks RPZ compliance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI rental agent.&lt;/strong&gt; Writes personalised inquiry emails, schedules viewings, follows up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Five languages.&lt;/strong&gt; English, Dutch, Spanish, French, and Portuguese.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;Build what you need. Remove more than you add. AI is only useful when it saves real time.&lt;/p&gt;

&lt;p&gt;If you are moving to Dublin — &lt;a href="https://homescout.io" rel="noopener noreferrer"&gt;HomeScout&lt;/a&gt; is free to start. No credit card, no trial period.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Caspar Bannink — founder of &lt;a href="https://homescout.io" rel="noopener noreferrer"&gt;HomeScout&lt;/a&gt;, built in Dublin after moving from Amsterdam in 2024.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>startup</category>
      <category>proptech</category>
      <category>ai</category>
      <category>dublin</category>
    </item>
    <item>
      <title>I built an agentic coding harness across three CLI hosts. Here is what actually works.</title>
      <dc:creator>Caspar Bannink</dc:creator>
      <pubDate>Wed, 13 May 2026 13:44:36 +0000</pubDate>
      <link>https://forem.com/caspar_bannink_3728f095d1/i-built-an-agentic-coding-harness-across-three-cli-hosts-here-is-what-actually-works-5gk8</link>
      <guid>https://forem.com/caspar_bannink_3728f095d1/i-built-an-agentic-coding-harness-across-three-cli-hosts-here-is-what-actually-works-5gk8</guid>
      <description>&lt;h1&gt;
  
  
  I built an agentic coding harness across three CLI hosts. Here is what actually works.
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;This article is a work in progress. I will keep updating it as the kit evolves.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Last spring, an agent rebuilt my email-templating system for the third time. Same logic, different repo, no memory of the previous two attempts. The speed of vibecoding was getting taxed by the cost of the agent forgetting what I had already shipped.&lt;/p&gt;

&lt;p&gt;The fix was not a smarter prompt. It was a smaller vocabulary.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://github.com/CBannink/agentic-coding-kit" rel="noopener noreferrer"&gt;agentic-coding-kit&lt;/a&gt;. 17 agents, 12 slash commands, 35+ PowerShell tools, a Playwright visual pipeline, and a memory system that compounds across sessions. It installs across Claude Code, OpenCode, and GitHub Copilot CLI from one canonical source. This post explains the full architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core idea: slash commands are workflows, agents are leaves
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://claude.com/blog/multi-agent-coordination-patterns" rel="noopener noreferrer"&gt;Anthropic's own docs&lt;/a&gt; say it plainly: "the main agent writes code, edits files, and runs commands itself, dispatching subagents in the background." Every successful open-source kit I surveyed follows this pattern. I learned it the hard way by building 21 wrapping orchestrator agents and killing them all.&lt;/p&gt;

&lt;p&gt;The kit has 12 commands: 8 workflows plus 4 utility commands (&lt;code&gt;/bootstrap-harness&lt;/code&gt;, &lt;code&gt;/kit-init&lt;/code&gt;, &lt;code&gt;/wiki-init&lt;/code&gt;, &lt;code&gt;/analyze&lt;/code&gt;).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Typical spawns&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/build&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scope, explore, implement, review, verify&lt;/td&gt;
&lt;td&gt;3-5 agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/review&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Surface, specialist, adversarial, false-positive verifier&lt;/td&gt;
&lt;td&gt;4-9 agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/investigate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hypothesis-driven debugging, evidence collection&lt;/td&gt;
&lt;td&gt;2-4 agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/plan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clarify scope, map files, stop for approval&lt;/td&gt;
&lt;td&gt;1-2 agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/refactor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Principle-driven restructuring with consequence tracing&lt;/td&gt;
&lt;td&gt;2-4 agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/redesign&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Aesthetic lock, capture, per-component design, visual diff&lt;/td&gt;
&lt;td&gt;4-8 agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/security-review&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Adversarial audit by attack class&lt;/td&gt;
&lt;td&gt;3-6 agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/analyze&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Multi-angle research with claim verification&lt;/td&gt;
&lt;td&gt;4-8 agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/bootstrap-harness&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Detect repo conventions, write to conventions.md&lt;/td&gt;
&lt;td&gt;1-2 agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/kit-init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Initialize .kit/context/ in a new repo&lt;/td&gt;
&lt;td&gt;0 agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/wiki-init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bootstrap .wiki/ from code evidence&lt;/td&gt;
&lt;td&gt;1-2 agents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These commands run differently on each host. In Claude Code and OpenCode, they run as slash commands where the main session acts as orchestrator and spawns leaf agents via the Task tool. In Copilot CLI (which does not support custom slash commands or orchestrator-style spawning), each workflow is a shell script: &lt;code&gt;kit-build.sh&lt;/code&gt; chains &lt;code&gt;copilot --agent workflow-explorer -p "..."&lt;/code&gt; followed by &lt;code&gt;copilot --agent workflow-implementer -p "..."&lt;/code&gt; as direct sequential commands. Different host architecture, same leaf agents, same phases.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the workflows actually work
&lt;/h2&gt;

&lt;p&gt;Every workflow starts the same way: &lt;code&gt;scope-classifier.ps1&lt;/code&gt; reads the git diff and classifies the task as ISOLATED (single file, 0 spawns), SHARED (multi-file, 3 spawns typical), or CRITICAL (auth, schema, migrations: 5 spawns, adversarial pass included). This determines the ceremony tier before anything else runs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbjgvy8hmt7to423mane.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbjgvy8hmt7to423mane.png" alt="The /build pipeline: five phases from scope classification to verification." width="720" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/build&lt;/code&gt;&lt;/strong&gt; is the most common. Phase 1 spawns &lt;code&gt;workflow-explorer&lt;/code&gt; to map files, trace dependencies, and return a structured brief (with wiki and specialist memory injected via resolvers). Phase 2 spawns &lt;code&gt;workflow-implementer&lt;/code&gt;, which writes code using &lt;code&gt;edit-with-lint.ps1&lt;/code&gt; for every change (atomic syntax check, revert on failure). Phase 3 spawns &lt;code&gt;workflow-reviewer&lt;/code&gt; (one reviewer, not seven, the adversarial pass only runs at CRITICAL tier). Phase 4 runs &lt;code&gt;test-loop.ps1&lt;/code&gt; and &lt;code&gt;verify-writeback.ps1&lt;/code&gt;. If verification fails, the session cannot claim completion. This is the Iron Law.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/investigate&lt;/code&gt;&lt;/strong&gt; runs hypothesis-driven debugging. It collects symptoms, generates ranked hypotheses, runs the cheapest test first, collects evidence, and outputs a build brief. The output is a diagnosis, not a fix. If the diagnosis warrants code changes, it hands off to &lt;code&gt;/build&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/review&lt;/code&gt;&lt;/strong&gt; fans out to specialist reviewers in parallel: &lt;code&gt;code-quality-reviewer&lt;/code&gt;, &lt;code&gt;security-reviewer&lt;/code&gt;, &lt;code&gt;api-reviewer&lt;/code&gt;, &lt;code&gt;testing-reviewer&lt;/code&gt;, and optionally &lt;code&gt;performance-reviewer&lt;/code&gt;, &lt;code&gt;adversarial-reviewer&lt;/code&gt;, &lt;code&gt;data-migration-reviewer&lt;/code&gt;. A &lt;code&gt;false-positive-verifier&lt;/code&gt; filters noise before the final report. Findings update &lt;code&gt;handoffs.md&lt;/code&gt; (active items), &lt;code&gt;memory.md&lt;/code&gt; (recurring patterns), and &lt;code&gt;reflections.md&lt;/code&gt; (workflow improvements).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/analyze&lt;/code&gt;&lt;/strong&gt; is for research, not code. It spawns 4 explorers in parallel (&lt;code&gt;architecture-explorer&lt;/code&gt;, &lt;code&gt;surface-explorer&lt;/code&gt;, &lt;code&gt;risk-explorer&lt;/code&gt;, &lt;code&gt;ops-explorer&lt;/code&gt;), then 4 theorists (&lt;code&gt;pragmatist&lt;/code&gt;, &lt;code&gt;skeptic&lt;/code&gt;, &lt;code&gt;security-reliability&lt;/code&gt;, &lt;code&gt;product-wedge&lt;/code&gt;), then a &lt;code&gt;claim-verifier&lt;/code&gt; that checks claims against actual code. Useful for "what is this codebase and where would I extend it."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/redesign&lt;/code&gt;&lt;/strong&gt; activates the Playwright visual pipeline (covered below). &lt;strong&gt;&lt;code&gt;/refactor&lt;/code&gt;&lt;/strong&gt; does principle-driven restructuring with consequence tracing. &lt;strong&gt;&lt;code&gt;/security-review&lt;/code&gt;&lt;/strong&gt; runs adversarial audit by attack class. &lt;strong&gt;&lt;code&gt;/bootstrap-harness&lt;/code&gt;&lt;/strong&gt; detects git workflow, architecture preferences, and PR review conventions from a repo and writes them to &lt;code&gt;.kit/context/conventions.md&lt;/code&gt; so other agents implement per the repo's actual style.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;goal-orchestrator&lt;/code&gt;&lt;/strong&gt; is different from all of these. It is the only agent that runs as a true autonomous loop. You give it a goal ("make all tests pass", "deploy to staging"), and it iterates until the goal is reached or it hits the convergence cap (6 iterations). It has mechanical stuck detection (same file, same line, same rule blocking for 3 iterations triggers rollback), an empty-diff watchdog, and a rollback gate that reverts iterations that worsen verification. It outputs a machine-parseable &lt;code&gt;GOAL_STATUS&lt;/code&gt; first line. This is for autonomous work, not interactive sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three agent layers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Workflow agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Generic transport: &lt;code&gt;workflow-explorer&lt;/code&gt;, &lt;code&gt;workflow-implementer&lt;/code&gt;, &lt;code&gt;workflow-reviewer&lt;/code&gt;, &lt;code&gt;workflow-skeptic&lt;/code&gt;, &lt;code&gt;workflow-ui-qa&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Specialist agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Domain experts spawned on demand: &lt;code&gt;code-quality-reviewer&lt;/code&gt;, &lt;code&gt;security-reviewer&lt;/code&gt;, &lt;code&gt;modularity-expert&lt;/code&gt;, &lt;code&gt;adversarial-reviewer&lt;/code&gt;, &lt;code&gt;final-verifier&lt;/code&gt;, &lt;code&gt;qa-agent&lt;/code&gt;, &lt;code&gt;spec-agent&lt;/code&gt;, &lt;code&gt;playwright-navigator&lt;/code&gt;, &lt;code&gt;ux-driver&lt;/code&gt;, &lt;code&gt;ui-driver&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Orchestrators&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;goal-orchestrator&lt;/code&gt; (autonomous convergence loops with stuck detection) and &lt;code&gt;pr-reviewer&lt;/code&gt; (holistic PR verdict per &lt;a href="https://google.github.io/eng-practices/review/reviewer/" rel="noopener noreferrer"&gt;Google's Code Review Guide&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frbcrlcirbe56nyzb2818.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frbcrlcirbe56nyzb2818.png" alt="17 agents across three layers: workflow, specialist, and orchestrator." width="700" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each specialist has its own memory at &lt;code&gt;.kit/context/agent-memory/{role}.md&lt;/code&gt;, lazy-loaded by &lt;code&gt;specialist-memory-resolver.ps1&lt;/code&gt;. Only the memory relevant to the spawned role gets embedded. This is the difference between an agent that burns 8000 tokens orienting itself and one that starts working immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Playwright design pipeline
&lt;/h2&gt;

&lt;p&gt;When &lt;code&gt;/redesign&lt;/code&gt; or a frontend &lt;code&gt;/build&lt;/code&gt; runs, the kit activates a visual pipeline that separates aesthetic direction from code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fclguzb0vnj8feurryvuj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fclguzb0vnj8feurryvuj.png" alt="The Playwright design pipeline: aesthetic lock through visual diff with structure gate." width="700" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Aesthetic lock.&lt;/strong&gt; &lt;code&gt;aesthetic-director&lt;/code&gt; reads &lt;code&gt;.wiki/features.md&lt;/code&gt; (the product context), proposes 2-3 named aesthetics (Swiss Minimalism, Glassmorphism, etc.), and writes &lt;code&gt;DESIGN.md&lt;/code&gt; with locked typography, palette, density, and motion rules. This creates consensus on what "looks right" before any code runs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Capture.&lt;/strong&gt; &lt;code&gt;playwright-explorer&lt;/code&gt; reads &lt;code&gt;.agents/screen-flows.yaml&lt;/code&gt; (screens, auth, selectors with multi-fallback arrays), starts the dev server, and captures numbered PNGs at 2x device scale (3840x2160). It never edits code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Structure critique.&lt;/strong&gt; &lt;code&gt;ux-driver&lt;/code&gt; reads the screenshots against &lt;code&gt;DESIGN.md&lt;/code&gt; and judges hierarchy, scannability, cognitive load, a11y, and empty/error/loading states. Returns &lt;code&gt;structure_ok=true/false&lt;/code&gt;. If false, &lt;code&gt;ui-driver&lt;/code&gt; is blocked and a restructure plan is returned first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Visual polish.&lt;/strong&gt; &lt;code&gt;ui-driver&lt;/code&gt; (only if &lt;code&gt;structure_ok=true&lt;/code&gt;) judges color, spacing, typography, and AI-slop patterns. It emits one change at a time, the code is updated, &lt;code&gt;playwright-explorer&lt;/code&gt; recaptures, and &lt;code&gt;visual-diff.ps1&lt;/code&gt; pairs before/after screenshots with pixel-level diff PNGs and a regression threshold of 5%.&lt;/p&gt;

&lt;p&gt;The key insight: structure before visuals. Polishing a bad layout wastes everyone's time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wiki and memory: how agents remember across sessions
&lt;/h2&gt;

&lt;p&gt;The kit splits context into two systems that compound across sessions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wiki&lt;/strong&gt; (&lt;code&gt;.wiki/&lt;/code&gt;) is the repo's structural documentation: &lt;code&gt;index.md&lt;/code&gt;, &lt;code&gt;architecture.md&lt;/code&gt;, &lt;code&gt;codebase.md&lt;/code&gt;, &lt;code&gt;features.md&lt;/code&gt;, and per-section pages in &lt;code&gt;sections/&lt;/code&gt;. Each section has size budgets (150 lines max) and a standard template: purpose, key files, inputs, outputs, interactions, non-obvious notes. &lt;code&gt;wiki-resolver.ps1&lt;/code&gt; lazy-loads only sections whose key files overlap with the current task. Agents never bulk-load the wiki tree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory&lt;/strong&gt; (&lt;code&gt;.kit/context/&lt;/code&gt;) is the operational state: &lt;code&gt;memory.md&lt;/code&gt; for durable repo facts. &lt;code&gt;handoffs.md&lt;/code&gt; for what was built, what tests passed, what is next. &lt;code&gt;reflections.md&lt;/code&gt; for suggested workflow improvements. &lt;code&gt;agent-memory/{role}.md&lt;/code&gt; for role-specific guidance ("in this repo, X is intentional, skip flagging").&lt;/p&gt;

&lt;p&gt;When I sit down Tuesday wondering what I worked on Friday, I open the handoff and have my answer in 30 seconds: task description, files touched, gates marked, what is left.&lt;/p&gt;

&lt;h2&gt;
  
  
  The self-improvement loop
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;post-session.ps1&lt;/code&gt; runs at session end with failure detectors: verification gate unmarked? Writeback skipped? Tests not logged? Each writes a structured entry to &lt;code&gt;reflections.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;auto-apply-reflect.ps1&lt;/code&gt; processes these entries in tiered safe buckets. Specialist memory accretion (3+ consistent false-positives auto-append to agent-memory). &lt;code&gt;conventions.md&lt;/code&gt; refinements. Spawn-budget tweaks. These auto-apply. Slash command body changes and tool logic rewrites are gated for manual &lt;code&gt;/reflect&lt;/code&gt; approval. Every auto-applied change is snapshotted and audit-logged.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfi3jx8jnyqm7g89xglm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfi3jx8jnyqm7g89xglm.png" alt="The kit proposing its own fix after detecting a recurring failure pattern." width="700" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  One canonical, three hosts
&lt;/h2&gt;

&lt;p&gt;Each CLI host wants agent files in a different format and silently rejects the others. Claude Code rejects BOM-prefixed files. OpenCode rejects Claude's &lt;code&gt;tools: A, B, C&lt;/code&gt; comma-string. Copilot rejects Unicode in descriptions over 300 characters.&lt;/p&gt;

&lt;p&gt;The kit maintains one canonical source at &lt;code&gt;~/.agents/global-instructions.md&lt;/code&gt;. &lt;code&gt;sync-all-hosts.ps1&lt;/code&gt; distributes it into each host's instruction file between &lt;code&gt;&amp;lt;!-- agentic-kit:begin/end --&amp;gt;&lt;/code&gt; markers, preserving anything outside the markers. Per-host sanitizers translate agent files at install time. All 17 agents load on all 3 hosts from one shared definition.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tools that enforce discipline
&lt;/h2&gt;

&lt;p&gt;35+ PowerShell scripts take discipline out of the prompt and put it in code.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it enforces&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;edit-with-lint.ps1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Syntax check on every edit, atomic revert on failure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;test-loop.ps1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Marks verification gate on pass, detects stuck loops (3 same-signature failures)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;verify-writeback.ps1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Checks docs updated alongside code changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;scope-classifier.ps1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Determines ceremony tier from git diff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;frontend-detector.ps1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Flags greenfield UI for aesthetic-director&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wiki-resolver.ps1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lazy-loads only relevant wiki sections into agent prompts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;specialist-memory-resolver.ps1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Injects role-specific repo memory into subagent prompts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;visual-diff.ps1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pixel-level before/after comparison with regression threshold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;auto-apply-reflect.ps1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Closes the self-improvement loop with tiered safe auto-apply&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The bash-dispatcher hook enforces at the protocol layer: dangerous filesystem ops blocked, &lt;code&gt;git push --force&lt;/code&gt; on main blocked, &lt;code&gt;git commit&lt;/code&gt; gated on verification evidence. Test success auto-marks the verification gate. The agent does not need to remember any of these rules. The harness does.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is next
&lt;/h2&gt;

&lt;p&gt;The kit runs on Claude Code today. In the next article, I will write about the hybrid setup I am testing: Claude Code as orchestrator, OpenCode Go at $10/month with DeepSeek V4 API keys for the fan-out layer. DeepSeek V4 Flash at $0.14/$0.28 per million tokens is 35x cheaper than Opus on input. A &lt;code&gt;/build&lt;/code&gt; with 3 reviewer spawns costs under $0.01.&lt;/p&gt;

&lt;p&gt;Fork it: &lt;a href="https://github.com/CBannink/agentic-coding-kit" rel="noopener noreferrer"&gt;github.com/CBannink/agentic-coding-kit&lt;/a&gt;. Open an issue if something breaks.&lt;/p&gt;




&lt;p&gt;I am Caspar Bannink, founder of HomeScout (AI rental search for Dublin) and Bannink Software Development.&lt;/p&gt;

&lt;p&gt;Side project: &lt;a href="https://homescout.io" rel="noopener noreferrer"&gt;homescout.io&lt;/a&gt;&lt;br&gt;
Personal LinkedIn: &lt;a href="https://www.linkedin.com/in/caspar-bannink-719440217/" rel="noopener noreferrer"&gt;linkedin.com/in/caspar-bannink-719440217&lt;/a&gt;&lt;br&gt;
HomeScout LinkedIn: &lt;a href="https://www.linkedin.com/company/homescout-io" rel="noopener noreferrer"&gt;linkedin.com/company/homescout-io&lt;/a&gt;&lt;br&gt;
Repo: &lt;a href="https://github.com/CBannink/agentic-coding-kit" rel="noopener noreferrer"&gt;github.com/CBannink/agentic-coding-kit&lt;/a&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>aiagents</category>
      <category>devtools</category>
      <category>powershell</category>
    </item>
    <item>
      <title>How AI is fixing the Dublin rental nightmare for expats in 2026</title>
      <dc:creator>Caspar Bannink</dc:creator>
      <pubDate>Mon, 11 May 2026 22:00:35 +0000</pubDate>
      <link>https://forem.com/caspar_bannink_3728f095d1/how-ai-is-fixing-the-dublin-rental-nightmare-for-expats-in-2026-4pfm</link>
      <guid>https://forem.com/caspar_bannink_3728f095d1/how-ai-is-fixing-the-dublin-rental-nightmare-for-expats-in-2026-4pfm</guid>
      <description>&lt;h1&gt;
  
  
  How AI is fixing the Dublin rental nightmare for expats in 2026
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8s5q1nmzarute4yqcwy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8s5q1nmzarute4yqcwy.png" alt="HomeScout homepage" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I moved from Amsterdam to Dublin two years ago. I spent four weeks in a co-living space burning through money while trying to decode a rental market I knew nothing about.&lt;/p&gt;

&lt;p&gt;Not because the tools did not exist. Because every tool was built for people who already knew the city.&lt;/p&gt;

&lt;p&gt;That is the expat problem in one sentence. You land in a country where you do not know the neighborhoods, cannot read the social norms in a listing, have no instinct for what a price should be, and sometimes cannot even communicate clearly in the language the forms are written in. The market does not slow down for any of that.&lt;/p&gt;

&lt;p&gt;In 2026, AI search is starting to fix parts of this. Not all of it. But enough that the experience is meaningfully different.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Daft.ie is not built for you
&lt;/h2&gt;

&lt;p&gt;Daft.ie is Ireland's dominant rental portal. It is useful if you grew up here.&lt;/p&gt;

&lt;p&gt;Type "2-bed apartment Dublin" and you get a list sorted by price. What you do not get: any context on which areas those results are in, what the commute times look like, whether a neighborhood is quiet or loud, or what €1,900/month actually means relative to local norms. The portal assumes you already have all of that in your head.&lt;/p&gt;

&lt;p&gt;If you have lived in Dublin your whole life, you do. If you flew in from Bangalore, São Paulo, or Rotterdam last Tuesday, you do not.&lt;/p&gt;

&lt;p&gt;There is no multilingual support. There is no explanation of what RPZ compliance means, or why some listings mention "HAP" and others do not, or what the difference is between a letting agent posting and a private landlord posting. You either know or you do not.&lt;/p&gt;

&lt;p&gt;The result is that expats make decisions with radically less information than locals. They apply to apartments in areas that look cheap on a map but have reasons for being cheap. They miss listings because they searched with the wrong terminology. They sign leases with clauses that would make an Irish renter laugh.&lt;/p&gt;

&lt;p&gt;This is not a complaint about Daft. It is a product that works well for its intended audience. Expats are not that audience.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes when the search is AI-native
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qstdd4hgr43n2zftpjx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qstdd4hgr43n2zftpjx.png" alt="HomeScout natural language search results" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first thing that changes is the input layer.&lt;/p&gt;

&lt;p&gt;Instead of working out the right filter settings, you describe what you want in your own terms. "I need something close to the tech quarter in the south docks, quiet enough to work from home, under €2,200, not on a main road." That search, in natural language, runs across Daft.ie, Rent.ie, and MyHome simultaneously and returns results ranked by match quality, not just price.&lt;/p&gt;

&lt;p&gt;For expats, this matters because you do not know the right Daft filters yet. You do not know that "Docklands" and "Grand Canal Dock" are the same area. You do not know that "city centre" on Daft spans everything from premium Ballsbridge to places you would not want to live. Natural language cuts through that.&lt;/p&gt;

&lt;p&gt;The second thing that changes is area context.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ewl7crtrisxt2mi3i89.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ewl7crtrisxt2mi3i89.png" alt="Area Explorer choropleth map" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HomeScout's Area Explorer shows commute time to a work address, walkability scores, average rent per square metre, and a plain-language description of what the neighborhood is like. For someone who has never been to Dublin before, this is the difference between applying blindly and applying with a real opinion.&lt;/p&gt;

&lt;p&gt;I wish I had had that. I spent a Saturday in my first week walking Stoneybatter, Phibsborough, and Drumcondra just to form opinions I could have read in two minutes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkhc6eidgt94rab9qlqsm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkhc6eidgt94rab9qlqsm.png" alt="Property cards with value score badges" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The third is value scoring. Each listing gets a price-relative-to-area score so you can see whether €1,850 in Rathmines is above or below what that area commands. For expats who have no local price intuition, this replaces the 6 months of market watching it normally takes to develop one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Rental Agent: monitoring from a different timezone
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs0oyrflgnckuk5155ffe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs0oyrflgnckuk5155ffe.png" alt="AI Rental Agent dashboard" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The single biggest structural disadvantage expats have is timezone.&lt;/p&gt;

&lt;p&gt;If you are in Singapore making a decision about a Dublin rental, you are 7 to 9 hours ahead. The best listings go live during Dublin business hours. By the time you wake up and check, 40 people have applied.&lt;/p&gt;

&lt;p&gt;HomeScout's AI Rental Agent runs 24/7 and matches new listings against your saved search criteria the moment they appear. When a match lands, you get a push notification immediately, not on the next refresh cycle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flivx4z46tujoiqz6pgwg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flivx4z46tujoiqz6pgwg.png" alt="Auto-apply safeguards panel" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The auto-apply feature goes further. You pre-approve a cover letter template and set the criteria under which the agent can apply on your behalf. It is not automatic spam. There are 5 safeguards: you approve the template, you opt in per search, a scam filter blocks suspicious listings, a daily cap prevents overreach, and a kill switch lets you stop it instantly. Within those limits, the agent applies within seconds of a listing going live, not after your morning coffee.&lt;/p&gt;

&lt;p&gt;For expats searching from abroad, this changes the competitive position completely. You are no longer automatically at a disadvantage because of where you are sleeping.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contract review when the law is unfamiliar to you
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4uzz0lknhk0ozzk3zexu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4uzz0lknhk0ozzk3zexu.png" alt="Contract review interface" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Irish lease law has specific rules that most expats do not know before they arrive.&lt;/p&gt;

&lt;p&gt;RPZ (Rent Pressure Zone) caps mean rent inside most Dublin areas can only rise 2% per year. Notice periods run from 28 days for tenancies under 6 months to 196 days for tenancies over 7 years. The deposit maximum is one month's rent. Any lease clause that contradicts Irish tenancy law is unenforceable, regardless of what the paper says.&lt;/p&gt;

&lt;p&gt;HomeScout's contract review tool reads a lease and flags clauses that are unusual, potentially unenforceable, or worth questioning before you sign. It also checks RPZ compliance: if a listing is in an RPZ area and the rent history looks off, the review surfaces that.&lt;/p&gt;

&lt;p&gt;For non-native English speakers, this is especially useful because legal language in a second language is genuinely hard. A clause that a native speaker parses in 10 seconds can take a non-native speaker several minutes to decode, and sometimes they still get it wrong. The review tool outputs plain-language summaries of each flagged clause, not legalese.&lt;/p&gt;

&lt;p&gt;This does not replace a solicitor for high-value or unusual situations. But for a standard Dublin tenancy agreement, it catches the things worth catching.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five languages, because Dublin is international
&lt;/h2&gt;

&lt;p&gt;Dublin's rental market is filled with people who moved there from everywhere. The tech sector alone brings in workers from 40 or 50 countries. A significant number of them are searching for rentals in their second or third language.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6cxyy5z15wnvs36yi77b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6cxyy5z15wnvs36yi77b.png" alt="Renter profile and document vault" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HomeScout supports English, Spanish, Hindi, Dutch, and Portuguese. Search, area context, value explanations, and contract review all work in all five languages. You can run your entire rental search in the language you think most clearly in.&lt;/p&gt;

&lt;p&gt;I built Dutch support partly for selfish reasons. My Dutch colleagues in Dublin had the same problem I did, and "just use English" is a real but unsatisfying answer when you are already under stress from a move.&lt;/p&gt;

&lt;p&gt;Spanish and Portuguese together cover most of Latin America and the Iberian Peninsula. Hindi covers one of the largest sending communities in Dublin's tech workforce. These are not token additions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is still limited
&lt;/h2&gt;

&lt;p&gt;Honest disclosure: AI search does not fix the supply problem.&lt;/p&gt;

&lt;p&gt;Dublin has roughly 1,500 active rental listings at any given moment against demand that far exceeds that. No tool closes the supply gap. What AI search does is make sure that in a competitive market, you are competing with full information and optimal timing instead of one hand tied behind your back.&lt;/p&gt;

&lt;p&gt;The auto-apply feature does not guarantee viewings. It guarantees that your application arrives at a competitive time. Agents and landlords still choose.&lt;/p&gt;

&lt;p&gt;Area Explorer data is updated weekly, not in real-time. Rent prices shift faster than the underlying data does in fast-moving periods.&lt;/p&gt;

&lt;p&gt;The contract review tool flags issues; it does not give legal advice. If a landlord pushes back on a flagged clause, you still need a human conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it before you land
&lt;/h2&gt;

&lt;p&gt;The 7-day free trial requires no payment card. If you are planning a move to Dublin in the next 3 months, running a few test searches before you arrive is worth the 10 minutes. You will understand the market and the neighborhoods faster than any amount of Googling will give you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://homescout.io" rel="noopener noreferrer"&gt;Start your free trial at homescout.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dublin-first today. Cork, Galway, and Limerick coverage is in progress for later in 2026.&lt;/p&gt;




&lt;p&gt;I am Caspar Bannink, founder of HomeScout (AI rental search for Dublin) and Bannink Software Development. I moved from Amsterdam to Dublin two years ago and built the tool I wish I had.&lt;/p&gt;

&lt;p&gt;Check out my side project: &lt;a href="https://homescout.io" rel="noopener noreferrer"&gt;homescout.io&lt;/a&gt;&lt;br&gt;
Personal LinkedIn: &lt;a href="https://www.linkedin.com/in/caspar-bannink-719440217/" rel="noopener noreferrer"&gt;linkedin.com/in/caspar-bannink-719440217&lt;/a&gt;&lt;br&gt;
HomeScout LinkedIn: &lt;a href="https://www.linkedin.com/company/homescout-io" rel="noopener noreferrer"&gt;linkedin.com/company/homescout-io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>expat</category>
      <category>ai</category>
      <category>proptech</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Everything HomeScout Can Do (And Why I Built It After Moving to Dublin)</title>
      <dc:creator>Caspar Bannink</dc:creator>
      <pubDate>Fri, 01 May 2026 21:38:37 +0000</pubDate>
      <link>https://forem.com/caspar_bannink_3728f095d1/everything-homescout-can-do-and-why-i-built-it-after-moving-to-dublin-4aoa</link>
      <guid>https://forem.com/caspar_bannink_3728f095d1/everything-homescout-can-do-and-why-i-built-it-after-moving-to-dublin-4aoa</guid>
      <description>&lt;h1&gt;
  
  
  Everything HomeScout Can Do (And Why I Built It After Moving to Dublin)
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://medium.com/p/def3291c8c8a" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I moved from the Netherlands to Dublin about two years ago. I had a job lined up, a rough idea of which neighbourhoods looked interesting, and what I thought was a reasonable budget. What I did not have was any idea how broken the rental search experience in this city actually is.&lt;/p&gt;

&lt;p&gt;Within the first week I was refreshing Daft.ie on my phone during work meetings, copy-pasting the same inquiry email to thirty letting agents, and genuinely losing sleep over apartments I missed because I did not check listings fast enough. Coming from Amsterdam I thought I knew expensive rental markets. Dublin turned out to be worse, with fewer tools to help you make sense of it.&lt;/p&gt;

&lt;p&gt;After about a month of this, I started building &lt;a href="https://homescout.io" rel="noopener noreferrer"&gt;HomeScout&lt;/a&gt;. Not because I wanted to launch a startup. Because I was tired of the way things worked and I knew they could be better. I ended up using HomeScout to find my own apartment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxqzfd0etlb3zaweqstfz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxqzfd0etlb3zaweqstfz.png" alt="HomeScout homepage" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem Nobody Was Solving
&lt;/h2&gt;

&lt;p&gt;You land in Dublin, you need a place to live, you open Daft.ie. It's the main listing site. Everyone uses it. And the search is terrible.&lt;/p&gt;

&lt;p&gt;You know exactly what you want. A two-bedroom apartment near Google Docks, under €2,000, that allows pets. Simple enough. Instead of typing that sentence, you get 15 dropdown menus. Location picker. Min price. Max price. Bedrooms. Property type. And even after clicking through all of those, the results don't really match what you asked for.&lt;/p&gt;

&lt;p&gt;The first five pages are dominated by expensive new-build developments. Shiny complexes charging €3,000-plus for a one-bed. The normal, affordable apartments that regular people actually rent are buried deep in the results.&lt;/p&gt;

&lt;p&gt;Then there's the pricing problem. You find a one-bed in Rathmines listed at €1,800. Is that a good deal? Overpriced? About to go up? You have no way to know. No area data, no comparison tools, no market intelligence. You're making one of the biggest financial decisions of your month completely blind.&lt;/p&gt;

&lt;p&gt;If you do find a place, the lease arrives. Forty pages of legal text. Clauses about things you've never heard of. Is this break clause normal in Ireland? Is that deposit retention term a red flag? You could hire a solicitor, but not for every lease you review.&lt;/p&gt;

&lt;p&gt;Meanwhile you're emailing twenty-plus agents. Replies arrive at random times. Your inbox becomes chaos. It's a full-time job alongside your actual full-time job. Good properties disappear within hours. If you're not refreshing every twenty minutes, you miss them. Every inquiry email you send looks like everyone else's, one of fifty identical messages in the agent's inbox.&lt;/p&gt;

&lt;p&gt;I dealt with all of this firsthand. Not as a product researcher. As a frustrated renter who could not believe how bad the experience was. So I built &lt;a href="https://homescout.io" rel="noopener noreferrer"&gt;HomeScout&lt;/a&gt; to fix it. All of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built to Fix It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Search That Understands English
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd5c2hrips4f2dw5t8i1n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd5c2hrips4f2dw5t8i1n.png" alt="Natural language search results" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was the first thing I built, because it was the first thing that drove me up the wall. On HomeScout, you type what you want in plain English. &lt;em&gt;"2 bed apartment in Rathmines under 2000 that allows pets."&lt;/em&gt; The AI picks up on what you mean and returns matching listings. No dropdowns. No guessing which filter combination might work.&lt;/p&gt;

&lt;p&gt;You can be as specific or as vague as you want. "Something near a DART station with a balcony" works just as well as "3 bed house in Drumcondra between 1800 and 2200." The search adapts to how you think about your housing needs rather than forcing you into rigid categories.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Match Score + Value Score: Know If It's a Good Deal
&lt;/h3&gt;

&lt;p&gt;Every property gets two scores. The &lt;strong&gt;AI Match Score&lt;/strong&gt; tells you how well a listing fits what you actually asked for, explained in plain language ("matches your commute, over budget by €150, no balcony"). The &lt;strong&gt;Value Score&lt;/strong&gt; tells you whether the asking rent is fair for that neighbourhood, based on comparable properties, location quality, condition, and BER energy rating.&lt;/p&gt;

&lt;p&gt;No more guessing. No more overpaying because you didn't know the going rate for a two-bed in Stoneybatter. Agents and landlords have always had more information than tenants. These two scores finally flip the table.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Rental Agent: Stop Refreshing, Start Living
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2bu3f7buap3m8akwptwb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2bu3f7buap3m8akwptwb.png" alt="Auto apply panel" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This one changed how I think about apartment hunting entirely. You describe your dream property once, budget, area, bedrooms, whatever matters, and the AI Rental Agent scans the market around the clock. The moment something matching your criteria appears, you get notified.&lt;/p&gt;

&lt;p&gt;No more refreshing Daft every twenty minutes during your lunch break. No more missing a perfect apartment because you were in a meeting when it was listed. If you want to go further, the Agent can auto-send your pre-approved inquiry template the moment a match lands (capped at 5 sends per day with a kill switch on every email). The Dublin market moves fast, a good two-bed can get fifty inquiries in the first hour. Being notified instantly makes a real difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Contract Review: Your 30-Second Solicitor
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpq6o6mp9ejhe265bz4e4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpq6o6mp9ejhe265bz4e4.png" alt="Contract review upload" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You get a lease. It's forty pages. You upload the PDF to HomeScout. Within thirty seconds the AI has read every clause, flagged potential red flags, checked RPZ (Rent Pressure Zone) compliance, and highlighted anything unusual compared to standard Irish leases.&lt;/p&gt;

&lt;p&gt;Is that deposit clause normal? Is this break clause fair? Can the landlord actually do that inspection thing? You get clear answers without booking a solicitor appointment. It doesn't replace legal advice for complex situations, but for the "is this lease reasonable?" question that every renter has, it's exactly what you need.&lt;/p&gt;

&lt;h3&gt;
  
  
  Smart Inbox: One Place for All Agent Communication
&lt;/h3&gt;

&lt;p&gt;Instead of losing track of twenty email threads across your personal inbox, all your agent communication lives in one organised place inside HomeScout. Every conversation tied to the property it's about, with full history.&lt;/p&gt;

&lt;p&gt;The real power is in AI email generation and reply analysis. When you reach out to an agent, the AI drafts a personalised inquiry using your renter profile, your employment status, your move-in timeline, relevant details that make you sound like a serious, organised applicant. Not a generic "Hi, is this still available?" that agents get hundreds of per day.&lt;/p&gt;

&lt;p&gt;When the agent replies, the AI reads it, classifies the sentiment (positive / negative / needs info), and suggests next actions. You review everything before it sends. You can edit it, change the tone, add details. Nothing goes out without your approval.&lt;/p&gt;

&lt;h3&gt;
  
  
  Viewing Scheduler: No More Calendar Chaos
&lt;/h3&gt;

&lt;p&gt;When you're viewing five or six properties in a week, keeping track of when and where becomes its own challenge. HomeScout has a built-in viewing scheduler with ICS calendar export. Book viewings, export them to your calendar, get reminders, and track which ones you've attended and what you thought of each.&lt;/p&gt;

&lt;p&gt;Simple. But when I was hunting I once showed up to a viewing on the wrong day because I'd mixed up two properties in my head. That doesn't happen when everything is organised in one system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Renter Resume: Stand Out From the Crowd
&lt;/h3&gt;

&lt;p&gt;Dublin's rental market is brutally competitive. When an agent has fifty applications for one apartment, anything that makes you look more prepared and professional helps.&lt;/p&gt;

&lt;p&gt;Your renter resume on HomeScout is a digital profile with your employment details, references, and key documents. When you apply for a property, you can share your complete profile with one click instead of rewriting your life story and attaching the same documents every single time. Faster for you, better impression on the agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Document Vault: Everything in One Secure Place
&lt;/h3&gt;

&lt;p&gt;Payslips in your email. Lease in your downloads folder. Reference letter somewhere on your phone. Every application means hunting through folders and inboxes for the same files.&lt;/p&gt;

&lt;p&gt;HomeScout's document vault is encrypted storage for all your rental documents, AES-256-GCM at rest, key derived per user. Leases, payslips, employer references, ID copies. When an agent asks for your last three payslips, you open the vault and share them. Your sensitive financial documents aren't sitting in a regular cloud folder.&lt;/p&gt;

&lt;h3&gt;
  
  
  Market Scout: Understand Dublin Before You Search
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfq0z35j5crjct7qklyg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfq0z35j5crjct7qklyg.png" alt="Dublin choropleth map" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're new to Dublin, you probably don't know the difference between Rathmines and Ranelagh, or why Phibsborough costs half of what Ballsbridge does. &lt;strong&gt;Market Scout&lt;/strong&gt; (formerly Area Explorer) is an interactive choropleth map of 28 Dublin neighbourhoods, colour-coded by real rent data and overlaid with 63 landmark markers.&lt;/p&gt;

&lt;p&gt;Before you even run your first search, you can explore the city and understand what different areas actually cost. Orientation that takes weeks to figure out on your own, available in thirty seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Property Comparison + Price History
&lt;/h3&gt;

&lt;p&gt;Saved properties get side-by-side comparison mode and a price-history sparkline, so you can see whether that €2,100 listing was €1,850 three months ago. Useful both for knowing what's moving and for politely asking an agent why the price jumped.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Free and What's Not
&lt;/h2&gt;

&lt;p&gt;I wanted HomeScout to be genuinely useful even if you never pay a cent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explorer (Free, forever):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;20 AI searches per month&lt;/li&gt;
&lt;li&gt;5 saved properties&lt;/li&gt;
&lt;li&gt;1 lifetime free AI contract review&lt;/li&gt;
&lt;li&gt;1 active AI Rental Agent brief + 1 match per week (blurred previews for the rest)&lt;/li&gt;
&lt;li&gt;No Market Scout, no viewing scheduler, no email drafting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enough to get a feel for the platform, try the AI search, and run one contract through the review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HomeScout (€17.99/month, or €42.99 Season Pass for 3 months):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unlimited AI searches, saved properties, saved searches, AI email drafting&lt;/li&gt;
&lt;li&gt;Full Market Scout access&lt;/li&gt;
&lt;li&gt;Unlimited AI Rental Agent (with auto-apply, 5 sends/day cap)&lt;/li&gt;
&lt;li&gt;Unlimited AI contract review&lt;/li&gt;
&lt;li&gt;Viewing scheduler + ICS calendar export&lt;/li&gt;
&lt;li&gt;Commute calculator&lt;/li&gt;
&lt;li&gt;Unlimited document vault&lt;/li&gt;
&lt;li&gt;Property comparison + advanced filters&lt;/li&gt;
&lt;li&gt;Priority support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Season Pass works out to roughly €14.33/month, designed for the realistic length of a Dublin apartment hunt. I priced it below the cost of a single solicitor consultation because the tools should be accessible to normal renters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team plans&lt;/strong&gt; are per-seat with volume discounts for relocation teams and HR departments moving multiple people into Dublin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;If any of this resonated with your own experience of apartment hunting in Dublin, give &lt;a href="https://homescout.io" rel="noopener noreferrer"&gt;HomeScout&lt;/a&gt; a try. The free Explorer plan doesn't require a credit card.&lt;/p&gt;

&lt;p&gt;I built this because I was tired of fighting with Daft.ie at 11pm on a Tuesday, wondering if that apartment in Stoneybatter was fairly priced or if I was about to get ripped off. If that sounds familiar, you'll probably get a lot out of it. And if you end up catching a listing twenty minutes after it goes live because the AI Rental Agent pinged you while you were actually enjoying your lunch break instead of doom-scrolling Daft, that's exactly why I built the thing.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
  </channel>
</rss>
