<?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: James</title>
    <description>The latest articles on Forem by James (@james12345000).</description>
    <link>https://forem.com/james12345000</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%2F3922069%2Fe6e17221-d0b6-4f6d-98b9-cc53e335ed89.png</url>
      <title>Forem: James</title>
      <link>https://forem.com/james12345000</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/james12345000"/>
    <language>en</language>
    <item>
      <title>Minimum Viable DSGVO Compliance for Startups</title>
      <dc:creator>James</dc:creator>
      <pubDate>Wed, 13 May 2026 23:05:43 +0000</pubDate>
      <link>https://forem.com/james12345000/minimum-viable-dsgvo-compliance-for-startups-34mh</link>
      <guid>https://forem.com/james12345000/minimum-viable-dsgvo-compliance-for-startups-34mh</guid>
      <description>&lt;h1&gt;
  
  
  The 5-Minute DSGVO Compliance Checklist for Web Projects
&lt;/h1&gt;

&lt;p&gt;DSGVO compliance isn't a legal essay. It's a set of technical and procedural decisions. Here's the checklist we use before any project launch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Collection
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;List all data you collect&lt;/strong&gt; (name, email, IP, cookies, analytics)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;For each: why do you need it?&lt;/strong&gt; (purpose limitation)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;For each: how long do you keep it?&lt;/strong&gt; (storage limitation)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Can you delete it on user request?&lt;/strong&gt; (right to erasure)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Measures
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;HTTPS everywhere&lt;/strong&gt; (TLS 1.3)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;No third-party trackers&lt;/strong&gt; (Google Analytics, Facebook Pixel) without consent&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Cookie banner&lt;/strong&gt; for non-essential cookies (strict opt-in)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Server location&lt;/strong&gt; in EU (or SCCs for non-EU)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Access logs&lt;/strong&gt; stripped of PII or rotated after 30 days&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Database encryption&lt;/strong&gt; at rest&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Documentation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Privacy policy&lt;/strong&gt; (German + English, plain language)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Data processing agreement&lt;/strong&gt; (if using third-party services)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Incident response plan&lt;/strong&gt; (72-hour notification requirement)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;User rights procedure&lt;/strong&gt; (how to handle access/erasure requests)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Team
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Data protection officer&lt;/strong&gt; (required for &amp;gt; 10 employees processing personal data)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Employee training&lt;/strong&gt; (annual, documented)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Access controls&lt;/strong&gt; (role-based, minimal privilege)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Wins
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Replace Google Analytics&lt;/strong&gt; with Plausible (€9/month, EU-hosted, no cookies).&lt;br&gt;
&lt;strong&gt;Replace reCAPTCHA&lt;/strong&gt; with hCaptcha or Friendly Captcha (better privacy posture).&lt;br&gt;
&lt;strong&gt;Host in EU&lt;/strong&gt; (Hetzner, OVH, Scaleway — all cheaper than AWS anyway).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Truth
&lt;/h2&gt;

&lt;p&gt;Most DSGVO violations aren't malicious. They're careless:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Forgetting to add a privacy policy&lt;/li&gt;
&lt;li&gt;Logging IPs indefinitely&lt;/li&gt;
&lt;li&gt;Using US-hosted analytics without SCCs&lt;/li&gt;
&lt;li&gt;Not documenting data flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This checklist fixes the careless mistakes. The hard stuff (legitimate interest assessments, DPIAs) comes later — but only after the basics are solid.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Graham Miranda is the founder of Graham Miranda UG (Berlin, HRB 36794), building DSGVO-compliant automation and privacy tools.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>infrastructure</category>
      <category>selfhosted</category>
      <category>vps</category>
      <category>hetzner</category>
    </item>
    <item>
      <title>Launching in Germany? Run This Checklist First</title>
      <dc:creator>James</dc:creator>
      <pubDate>Wed, 13 May 2026 23:04:38 +0000</pubDate>
      <link>https://forem.com/james12345000/launching-in-germany-run-this-checklist-first-4k14</link>
      <guid>https://forem.com/james12345000/launching-in-germany-run-this-checklist-first-4k14</guid>
      <description>&lt;h1&gt;
  
  
  The 5-Minute DSGVO Compliance Checklist for Web Projects
&lt;/h1&gt;

&lt;p&gt;DSGVO compliance isn't a legal essay. It's a set of technical and procedural decisions. Here's the checklist we use before any project launch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Collection
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;List all data you collect&lt;/strong&gt; (name, email, IP, cookies, analytics)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;For each: why do you need it?&lt;/strong&gt; (purpose limitation)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;For each: how long do you keep it?&lt;/strong&gt; (storage limitation)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Can you delete it on user request?&lt;/strong&gt; (right to erasure)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Measures
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;HTTPS everywhere&lt;/strong&gt; (TLS 1.3)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;No third-party trackers&lt;/strong&gt; (Google Analytics, Facebook Pixel) without consent&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Cookie banner&lt;/strong&gt; for non-essential cookies (strict opt-in)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Server location&lt;/strong&gt; in EU (or SCCs for non-EU)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Access logs&lt;/strong&gt; stripped of PII or rotated after 30 days&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Database encryption&lt;/strong&gt; at rest&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Documentation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Privacy policy&lt;/strong&gt; (German + English, plain language)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Data processing agreement&lt;/strong&gt; (if using third-party services)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Incident response plan&lt;/strong&gt; (72-hour notification requirement)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;User rights procedure&lt;/strong&gt; (how to handle access/erasure requests)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Team
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Data protection officer&lt;/strong&gt; (required for &amp;gt; 10 employees processing personal data)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Employee training&lt;/strong&gt; (annual, documented)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Access controls&lt;/strong&gt; (role-based, minimal privilege)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Wins
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Replace Google Analytics&lt;/strong&gt; with Plausible (€9/month, EU-hosted, no cookies).&lt;br&gt;
&lt;strong&gt;Replace reCAPTCHA&lt;/strong&gt; with hCaptcha or Friendly Captcha (better privacy posture).&lt;br&gt;
&lt;strong&gt;Host in EU&lt;/strong&gt; (Hetzner, OVH, Scaleway — all cheaper than AWS anyway).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Truth
&lt;/h2&gt;

&lt;p&gt;Most DSGVO violations aren't malicious. They're careless:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Forgetting to add a privacy policy&lt;/li&gt;
&lt;li&gt;Logging IPs indefinitely&lt;/li&gt;
&lt;li&gt;Using US-hosted analytics without SCCs&lt;/li&gt;
&lt;li&gt;Not documenting data flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This checklist fixes the careless mistakes. The hard stuff (legitimate interest assessments, DPIAs) comes later — but only after the basics are solid.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Graham Miranda is the founder of Graham Miranda UG (Berlin, HRB 36794), building DSGVO-compliant automation and privacy tools.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ethics</category>
      <category>webscraping</category>
      <category>privacy</category>
      <category>business</category>
    </item>
    <item>
      <title>DSGVO Compliance in 5 Minutes: A Practical Checklist</title>
      <dc:creator>James</dc:creator>
      <pubDate>Wed, 13 May 2026 23:03:32 +0000</pubDate>
      <link>https://forem.com/james12345000/dsgvo-compliance-in-5-minutes-a-practical-checklist-2l1p</link>
      <guid>https://forem.com/james12345000/dsgvo-compliance-in-5-minutes-a-practical-checklist-2l1p</guid>
      <description>&lt;h1&gt;
  
  
  The 5-Minute DSGVO Compliance Checklist for Web Projects
&lt;/h1&gt;

&lt;p&gt;DSGVO compliance isn't a legal essay. It's a set of technical and procedural decisions. Here's the checklist we use before any project launch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Collection
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;List all data you collect&lt;/strong&gt; (name, email, IP, cookies, analytics)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;For each: why do you need it?&lt;/strong&gt; (purpose limitation)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;For each: how long do you keep it?&lt;/strong&gt; (storage limitation)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Can you delete it on user request?&lt;/strong&gt; (right to erasure)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Measures
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;HTTPS everywhere&lt;/strong&gt; (TLS 1.3)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;No third-party trackers&lt;/strong&gt; (Google Analytics, Facebook Pixel) without consent&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Cookie banner&lt;/strong&gt; for non-essential cookies (strict opt-in)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Server location&lt;/strong&gt; in EU (or SCCs for non-EU)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Access logs&lt;/strong&gt; stripped of PII or rotated after 30 days&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Database encryption&lt;/strong&gt; at rest&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Documentation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Privacy policy&lt;/strong&gt; (German + English, plain language)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Data processing agreement&lt;/strong&gt; (if using third-party services)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Incident response plan&lt;/strong&gt; (72-hour notification requirement)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;User rights procedure&lt;/strong&gt; (how to handle access/erasure requests)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Team
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Data protection officer&lt;/strong&gt; (required for &amp;gt; 10 employees processing personal data)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Employee training&lt;/strong&gt; (annual, documented)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Access controls&lt;/strong&gt; (role-based, minimal privilege)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Wins
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Replace Google Analytics&lt;/strong&gt; with Plausible (€9/month, EU-hosted, no cookies).&lt;br&gt;
&lt;strong&gt;Replace reCAPTCHA&lt;/strong&gt; with hCaptcha or Friendly Captcha (better privacy posture).&lt;br&gt;
&lt;strong&gt;Host in EU&lt;/strong&gt; (Hetzner, OVH, Scaleway — all cheaper than AWS anyway).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Truth
&lt;/h2&gt;

&lt;p&gt;Most DSGVO violations aren't malicious. They're careless:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Forgetting to add a privacy policy&lt;/li&gt;
&lt;li&gt;Logging IPs indefinitely&lt;/li&gt;
&lt;li&gt;Using US-hosted analytics without SCCs&lt;/li&gt;
&lt;li&gt;Not documenting data flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This checklist fixes the careless mistakes. The hard stuff (legitimate interest assessments, DPIAs) comes later — but only after the basics are solid.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Graham Miranda is the founder of Graham Miranda UG (Berlin, HRB 36794), building DSGVO-compliant automation and privacy tools.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>osint</category>
      <category>intelligence</category>
      <category>security</category>
      <category>tools</category>
    </item>
    <item>
      <title>Search Index Architecture for Privacy-First Engines</title>
      <dc:creator>James</dc:creator>
      <pubDate>Wed, 13 May 2026 23:02:26 +0000</pubDate>
      <link>https://forem.com/james12345000/search-index-architecture-for-privacy-first-engines-hmd</link>
      <guid>https://forem.com/james12345000/search-index-architecture-for-privacy-first-engines-hmd</guid>
      <description>&lt;h1&gt;
  
  
  Elasticsearch vs. PostgreSQL Full-Text: Search Engine Indexing Deep Dive
&lt;/h1&gt;

&lt;p&gt;Every search engine needs an index. The question is: which technology builds it?&lt;/p&gt;

&lt;h2&gt;
  
  
  PostgreSQL Full-Text Search
&lt;/h2&gt;

&lt;p&gt;Built-in since PostgreSQL 8.3. Surprisingly capable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero additional infrastructure&lt;/li&gt;
&lt;li&gt;ACID compliance (index stays consistent with data)&lt;/li&gt;
&lt;li&gt;Good for &amp;lt; 1M documents&lt;/li&gt;
&lt;li&gt;Supports German stemming, compound word handling&lt;/li&gt;
&lt;li&gt;tsvector/tsquery is fast for simple needs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No distributed search&lt;/li&gt;
&lt;li&gt;Limited faceting and aggregation&lt;/li&gt;
&lt;li&gt;Relevance scoring is basic&lt;/li&gt;
&lt;li&gt;No built-in synonym support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Elasticsearch
&lt;/h2&gt;

&lt;p&gt;The industry standard for search.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distributed by design (shards, replicas)&lt;/li&gt;
&lt;li&gt;Advanced relevance scoring (BM25, custom functions)&lt;/li&gt;
&lt;li&gt;Real-time indexing&lt;/li&gt;
&lt;li&gt;Faceting, aggregation, geospatial&lt;/li&gt;
&lt;li&gt;Plugin ecosystem (synonyms, analyzers)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Additional infrastructure (cluster management)&lt;/li&gt;
&lt;li&gt;Memory hungry (heap size tuning required)&lt;/li&gt;
&lt;li&gt;Eventually consistent (not ACID)&lt;/li&gt;
&lt;li&gt;Complex query DSL learning curve&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What We Chose (and Why)
&lt;/h2&gt;

&lt;p&gt;We use &lt;strong&gt;both&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt;: Primary data store, user accounts, query logs (minimal), metadata&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elasticsearch&lt;/strong&gt;: Search index only, rebuilt from PostgreSQL nightly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This hybrid gives us ACID for critical data and search performance for queries. If Elasticsearch fails, we can rebuild from PostgreSQL. If PostgreSQL is slow for search, Elasticsearch handles it.&lt;/p&gt;

&lt;h2&gt;
  
  
  German Language Challenges
&lt;/h2&gt;

&lt;p&gt;German search is harder than English:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compound words ("Datenschutzgrundverordnung")&lt;/li&gt;
&lt;li&gt;Umlaut normalization (ä → ae or a?)&lt;/li&gt;
&lt;li&gt;Case inflection&lt;/li&gt;
&lt;li&gt;Dialect variations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our solution: Custom Elasticsearch analyzer chain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ICU tokenizer (handles compound words)&lt;/li&gt;
&lt;li&gt;German stemmer (Snowball)&lt;/li&gt;
&lt;li&gt;Umlaut normalizer (ä → a, ö → o, ü → u)&lt;/li&gt;
&lt;li&gt;Synonym filter (DSGVO → Datenschutzgrundverordnung)&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Graham Miranda builds search infrastructure at Graham Miranda UG (Berlin, HRB 36794).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>frontend</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Full-Text Search at Scale: Our Indexing Choice</title>
      <dc:creator>James</dc:creator>
      <pubDate>Wed, 13 May 2026 23:01:21 +0000</pubDate>
      <link>https://forem.com/james12345000/full-text-search-at-scale-our-indexing-choice-33ai</link>
      <guid>https://forem.com/james12345000/full-text-search-at-scale-our-indexing-choice-33ai</guid>
      <description>&lt;h1&gt;
  
  
  Elasticsearch vs. PostgreSQL Full-Text: Search Engine Indexing Deep Dive
&lt;/h1&gt;

&lt;p&gt;Every search engine needs an index. The question is: which technology builds it?&lt;/p&gt;

&lt;h2&gt;
  
  
  PostgreSQL Full-Text Search
&lt;/h2&gt;

&lt;p&gt;Built-in since PostgreSQL 8.3. Surprisingly capable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero additional infrastructure&lt;/li&gt;
&lt;li&gt;ACID compliance (index stays consistent with data)&lt;/li&gt;
&lt;li&gt;Good for &amp;lt; 1M documents&lt;/li&gt;
&lt;li&gt;Supports German stemming, compound word handling&lt;/li&gt;
&lt;li&gt;tsvector/tsquery is fast for simple needs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No distributed search&lt;/li&gt;
&lt;li&gt;Limited faceting and aggregation&lt;/li&gt;
&lt;li&gt;Relevance scoring is basic&lt;/li&gt;
&lt;li&gt;No built-in synonym support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Elasticsearch
&lt;/h2&gt;

&lt;p&gt;The industry standard for search.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distributed by design (shards, replicas)&lt;/li&gt;
&lt;li&gt;Advanced relevance scoring (BM25, custom functions)&lt;/li&gt;
&lt;li&gt;Real-time indexing&lt;/li&gt;
&lt;li&gt;Faceting, aggregation, geospatial&lt;/li&gt;
&lt;li&gt;Plugin ecosystem (synonyms, analyzers)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Additional infrastructure (cluster management)&lt;/li&gt;
&lt;li&gt;Memory hungry (heap size tuning required)&lt;/li&gt;
&lt;li&gt;Eventually consistent (not ACID)&lt;/li&gt;
&lt;li&gt;Complex query DSL learning curve&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What We Chose (and Why)
&lt;/h2&gt;

&lt;p&gt;We use &lt;strong&gt;both&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt;: Primary data store, user accounts, query logs (minimal), metadata&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elasticsearch&lt;/strong&gt;: Search index only, rebuilt from PostgreSQL nightly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This hybrid gives us ACID for critical data and search performance for queries. If Elasticsearch fails, we can rebuild from PostgreSQL. If PostgreSQL is slow for search, Elasticsearch handles it.&lt;/p&gt;

&lt;h2&gt;
  
  
  German Language Challenges
&lt;/h2&gt;

&lt;p&gt;German search is harder than English:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compound words ("Datenschutzgrundverordnung")&lt;/li&gt;
&lt;li&gt;Umlaut normalization (ä → ae or a?)&lt;/li&gt;
&lt;li&gt;Case inflection&lt;/li&gt;
&lt;li&gt;Dialect variations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our solution: Custom Elasticsearch analyzer chain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ICU tokenizer (handles compound words)&lt;/li&gt;
&lt;li&gt;German stemmer (Snowball)&lt;/li&gt;
&lt;li&gt;Umlaut normalizer (ä → a, ö → o, ü → u)&lt;/li&gt;
&lt;li&gt;Synonym filter (DSGVO → Datenschutzgrundverordnung)&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Graham Miranda builds search infrastructure at Graham Miranda UG (Berlin, HRB 36794).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>elasticsearch</category>
      <category>postgres</category>
      <category>search</category>
      <category>database</category>
    </item>
    <item>
      <title>Building a Search Index: Elasticsearch vs. PostgreSQL</title>
      <dc:creator>James</dc:creator>
      <pubDate>Wed, 13 May 2026 23:00:15 +0000</pubDate>
      <link>https://forem.com/james12345000/building-a-search-index-elasticsearch-vs-postgresql-4ag5</link>
      <guid>https://forem.com/james12345000/building-a-search-index-elasticsearch-vs-postgresql-4ag5</guid>
      <description>&lt;h1&gt;
  
  
  Elasticsearch vs. PostgreSQL Full-Text: Search Engine Indexing Deep Dive
&lt;/h1&gt;

&lt;p&gt;Every search engine needs an index. The question is: which technology builds it?&lt;/p&gt;

&lt;h2&gt;
  
  
  PostgreSQL Full-Text Search
&lt;/h2&gt;

&lt;p&gt;Built-in since PostgreSQL 8.3. Surprisingly capable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero additional infrastructure&lt;/li&gt;
&lt;li&gt;ACID compliance (index stays consistent with data)&lt;/li&gt;
&lt;li&gt;Good for &amp;lt; 1M documents&lt;/li&gt;
&lt;li&gt;Supports German stemming, compound word handling&lt;/li&gt;
&lt;li&gt;tsvector/tsquery is fast for simple needs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No distributed search&lt;/li&gt;
&lt;li&gt;Limited faceting and aggregation&lt;/li&gt;
&lt;li&gt;Relevance scoring is basic&lt;/li&gt;
&lt;li&gt;No built-in synonym support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Elasticsearch
&lt;/h2&gt;

&lt;p&gt;The industry standard for search.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distributed by design (shards, replicas)&lt;/li&gt;
&lt;li&gt;Advanced relevance scoring (BM25, custom functions)&lt;/li&gt;
&lt;li&gt;Real-time indexing&lt;/li&gt;
&lt;li&gt;Faceting, aggregation, geospatial&lt;/li&gt;
&lt;li&gt;Plugin ecosystem (synonyms, analyzers)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Additional infrastructure (cluster management)&lt;/li&gt;
&lt;li&gt;Memory hungry (heap size tuning required)&lt;/li&gt;
&lt;li&gt;Eventually consistent (not ACID)&lt;/li&gt;
&lt;li&gt;Complex query DSL learning curve&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What We Chose (and Why)
&lt;/h2&gt;

&lt;p&gt;We use &lt;strong&gt;both&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt;: Primary data store, user accounts, query logs (minimal), metadata&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elasticsearch&lt;/strong&gt;: Search index only, rebuilt from PostgreSQL nightly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This hybrid gives us ACID for critical data and search performance for queries. If Elasticsearch fails, we can rebuild from PostgreSQL. If PostgreSQL is slow for search, Elasticsearch handles it.&lt;/p&gt;

&lt;h2&gt;
  
  
  German Language Challenges
&lt;/h2&gt;

&lt;p&gt;German search is harder than English:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compound words ("Datenschutzgrundverordnung")&lt;/li&gt;
&lt;li&gt;Umlaut normalization (ä → ae or a?)&lt;/li&gt;
&lt;li&gt;Case inflection&lt;/li&gt;
&lt;li&gt;Dialect variations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our solution: Custom Elasticsearch analyzer chain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ICU tokenizer (handles compound words)&lt;/li&gt;
&lt;li&gt;German stemmer (Snowball)&lt;/li&gt;
&lt;li&gt;Umlaut normalizer (ä → a, ö → o, ü → u)&lt;/li&gt;
&lt;li&gt;Synonym filter (DSGVO → Datenschutzgrundverordnung)&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Graham Miranda builds search infrastructure at Graham Miranda UG (Berlin, HRB 36794).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dsgvo</category>
      <category>gdpr</category>
      <category>compliance</category>
      <category>legal</category>
    </item>
    <item>
      <title>The Berlin Tech Ecosystem: A Founder's Guide</title>
      <dc:creator>James</dc:creator>
      <pubDate>Wed, 13 May 2026 22:59:10 +0000</pubDate>
      <link>https://forem.com/james12345000/the-berlin-tech-ecosystem-a-founders-guide-2ip8</link>
      <guid>https://forem.com/james12345000/the-berlin-tech-ecosystem-a-founders-guide-2ip8</guid>
      <description>&lt;h1&gt;
  
  
  Running a Tech Business in Berlin: Costs, Compliance, and Community
&lt;/h1&gt;

&lt;p&gt;Berlin isn't the cheapest European city for startups. But it offers something rare: a combination of technical talent, regulatory clarity, and startup density that creates genuine competitive advantage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Costs (2026)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Expense&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Office (WeWork / similar)&lt;/td&gt;
&lt;td&gt;€400-800/person&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer salary (mid-level)&lt;/td&gt;
&lt;td&gt;€4,500-6,500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hetzner VPS (production)&lt;/td&gt;
&lt;td&gt;€15-45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Legal/accounting (UG)&lt;/td&gt;
&lt;td&gt;€300-500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Health insurance (public)&lt;/td&gt;
&lt;td&gt;€350-450/person&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rent (1BR apartment)&lt;/td&gt;
&lt;td&gt;€1,000-1,500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Total burn for 3-person team: ~€18,000-25,000/month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a UG (Not GmbH)
&lt;/h2&gt;

&lt;p&gt;The Unternehmergesellschaft (UG) is Germany's "mini-GmbH":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;€1 minimum capital (vs. €25,000 for GmbH)&lt;/li&gt;
&lt;li&gt;Same liability protection&lt;/li&gt;
&lt;li&gt;Same legal standing&lt;/li&gt;
&lt;li&gt;Must retain 25% of profits until €25,000 reached (then convert to GmbH)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For bootstrapped founders, the UG structure removes the capital barrier entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compliance Advantage
&lt;/h2&gt;

&lt;p&gt;Berlin-based means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DSGVO compliance by default (German data protection authority)&lt;/li&gt;
&lt;li&gt;EU AI Act jurisdiction clear&lt;/li&gt;
&lt;li&gt;German contract law (predictable, well-tested)&lt;/li&gt;
&lt;li&gt;Tax treaties across EU and globally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For B2B clients, "Berlin-based" signals regulatory maturity that "Delaware-based" does not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Community
&lt;/h2&gt;

&lt;p&gt;Berlin's tech scene is dense and collaborative:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weekly meetups for every technology stack&lt;/li&gt;
&lt;li&gt;Strong open-source culture&lt;/li&gt;
&lt;li&gt;EU-funded research partnerships&lt;/li&gt;
&lt;li&gt;Talent pool from TU Berlin, HU Berlin, and international graduates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The competition for talent is real. But so is the quality.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Graham Miranda is the founder of Graham Miranda UG (Berlin, HRB 36794).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>startup</category>
      <category>berlin</category>
      <category>privacy</category>
      <category>founder</category>
    </item>
    <item>
      <title>Why We Incorporated in Berlin (Not Delaware)</title>
      <dc:creator>James</dc:creator>
      <pubDate>Wed, 13 May 2026 22:58:04 +0000</pubDate>
      <link>https://forem.com/james12345000/why-we-incorporated-in-berlin-not-delaware-1ml3</link>
      <guid>https://forem.com/james12345000/why-we-incorporated-in-berlin-not-delaware-1ml3</guid>
      <description>&lt;h1&gt;
  
  
  Running a Tech Business in Berlin: Costs, Compliance, and Community
&lt;/h1&gt;

&lt;p&gt;Berlin isn't the cheapest European city for startups. But it offers something rare: a combination of technical talent, regulatory clarity, and startup density that creates genuine competitive advantage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Costs (2026)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Expense&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Office (WeWork / similar)&lt;/td&gt;
&lt;td&gt;€400-800/person&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer salary (mid-level)&lt;/td&gt;
&lt;td&gt;€4,500-6,500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hetzner VPS (production)&lt;/td&gt;
&lt;td&gt;€15-45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Legal/accounting (UG)&lt;/td&gt;
&lt;td&gt;€300-500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Health insurance (public)&lt;/td&gt;
&lt;td&gt;€350-450/person&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rent (1BR apartment)&lt;/td&gt;
&lt;td&gt;€1,000-1,500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Total burn for 3-person team: ~€18,000-25,000/month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a UG (Not GmbH)
&lt;/h2&gt;

&lt;p&gt;The Unternehmergesellschaft (UG) is Germany's "mini-GmbH":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;€1 minimum capital (vs. €25,000 for GmbH)&lt;/li&gt;
&lt;li&gt;Same liability protection&lt;/li&gt;
&lt;li&gt;Same legal standing&lt;/li&gt;
&lt;li&gt;Must retain 25% of profits until €25,000 reached (then convert to GmbH)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For bootstrapped founders, the UG structure removes the capital barrier entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compliance Advantage
&lt;/h2&gt;

&lt;p&gt;Berlin-based means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DSGVO compliance by default (German data protection authority)&lt;/li&gt;
&lt;li&gt;EU AI Act jurisdiction clear&lt;/li&gt;
&lt;li&gt;German contract law (predictable, well-tested)&lt;/li&gt;
&lt;li&gt;Tax treaties across EU and globally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For B2B clients, "Berlin-based" signals regulatory maturity that "Delaware-based" does not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Community
&lt;/h2&gt;

&lt;p&gt;Berlin's tech scene is dense and collaborative:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weekly meetups for every technology stack&lt;/li&gt;
&lt;li&gt;Strong open-source culture&lt;/li&gt;
&lt;li&gt;EU-funded research partnerships&lt;/li&gt;
&lt;li&gt;Talent pool from TU Berlin, HU Berlin, and international graduates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The competition for talent is real. But so is the quality.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Graham Miranda is the founder of Graham Miranda UG (Berlin, HRB 36794).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>webscraping</category>
      <category>tutorial</category>
      <category>automation</category>
    </item>
    <item>
      <title>Berlin Startup Costs 2026: Real Numbers</title>
      <dc:creator>James</dc:creator>
      <pubDate>Wed, 13 May 2026 22:56:59 +0000</pubDate>
      <link>https://forem.com/james12345000/berlin-startup-costs-2026-real-numbers-5hk1</link>
      <guid>https://forem.com/james12345000/berlin-startup-costs-2026-real-numbers-5hk1</guid>
      <description>&lt;h1&gt;
  
  
  Running a Tech Business in Berlin: Costs, Compliance, and Community
&lt;/h1&gt;

&lt;p&gt;Berlin isn't the cheapest European city for startups. But it offers something rare: a combination of technical talent, regulatory clarity, and startup density that creates genuine competitive advantage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Costs (2026)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Expense&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Office (WeWork / similar)&lt;/td&gt;
&lt;td&gt;€400-800/person&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer salary (mid-level)&lt;/td&gt;
&lt;td&gt;€4,500-6,500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hetzner VPS (production)&lt;/td&gt;
&lt;td&gt;€15-45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Legal/accounting (UG)&lt;/td&gt;
&lt;td&gt;€300-500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Health insurance (public)&lt;/td&gt;
&lt;td&gt;€350-450/person&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rent (1BR apartment)&lt;/td&gt;
&lt;td&gt;€1,000-1,500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Total burn for 3-person team: ~€18,000-25,000/month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a UG (Not GmbH)
&lt;/h2&gt;

&lt;p&gt;The Unternehmergesellschaft (UG) is Germany's "mini-GmbH":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;€1 minimum capital (vs. €25,000 for GmbH)&lt;/li&gt;
&lt;li&gt;Same liability protection&lt;/li&gt;
&lt;li&gt;Same legal standing&lt;/li&gt;
&lt;li&gt;Must retain 25% of profits until €25,000 reached (then convert to GmbH)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For bootstrapped founders, the UG structure removes the capital barrier entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compliance Advantage
&lt;/h2&gt;

&lt;p&gt;Berlin-based means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DSGVO compliance by default (German data protection authority)&lt;/li&gt;
&lt;li&gt;EU AI Act jurisdiction clear&lt;/li&gt;
&lt;li&gt;German contract law (predictable, well-tested)&lt;/li&gt;
&lt;li&gt;Tax treaties across EU and globally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For B2B clients, "Berlin-based" signals regulatory maturity that "Delaware-based" does not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Community
&lt;/h2&gt;

&lt;p&gt;Berlin's tech scene is dense and collaborative:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weekly meetups for every technology stack&lt;/li&gt;
&lt;li&gt;Strong open-source culture&lt;/li&gt;
&lt;li&gt;EU-funded research partnerships&lt;/li&gt;
&lt;li&gt;Talent pool from TU Berlin, HU Berlin, and international graduates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The competition for talent is real. But so is the quality.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Graham Miranda is the founder of Graham Miranda UG (Berlin, HRB 36794).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>germany</category>
      <category>business</category>
    </item>
    <item>
      <title>Building a Privacy Frontend with Next.js</title>
      <dc:creator>James</dc:creator>
      <pubDate>Wed, 13 May 2026 22:55:53 +0000</pubDate>
      <link>https://forem.com/james12345000/building-a-privacy-frontend-with-nextjs-4cb5</link>
      <guid>https://forem.com/james12345000/building-a-privacy-frontend-with-nextjs-4cb5</guid>
      <description>&lt;h1&gt;
  
  
  Why We Chose Next.js Over React for Our Privacy Search Engine
&lt;/h1&gt;

&lt;p&gt;Frontend frameworks seem interchangeable. For a privacy-focused product, the choice matters more than you'd think.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Privacy Problem with SPAs
&lt;/h2&gt;

&lt;p&gt;Traditional React SPAs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Execute all logic in the browser&lt;/li&gt;
&lt;li&gt;Make API calls directly to third parties&lt;/li&gt;
&lt;li&gt;Expose the user's IP to every service&lt;/li&gt;
&lt;li&gt;Require JavaScript (fingerprinting surface)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For asearchz.online, this was unacceptable. Every API call a user made would expose their IP to Bing, Brave, or other search sources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Next.js (Server-Side Rendering)
&lt;/h2&gt;

&lt;p&gt;With Next.js SSR:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;server&lt;/strong&gt; makes API calls to search sources&lt;/li&gt;
&lt;li&gt;User IP stays between user and our server only&lt;/li&gt;
&lt;li&gt;Results are rendered server-side, sent as HTML&lt;/li&gt;
&lt;li&gt;JavaScript is optional (works without it)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Performance Benefits
&lt;/h2&gt;

&lt;p&gt;SSR is actually faster for search:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First contentful paint: 200-300ms&lt;/li&gt;
&lt;li&gt;No hydration delay (content is already HTML)&lt;/li&gt;
&lt;li&gt;No client-side state management complexity&lt;/li&gt;
&lt;li&gt;CDN caching of rendered pages&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Trade-offs
&lt;/h2&gt;

&lt;p&gt;Next.js SSR has costs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server compute per request (higher than static)&lt;/li&gt;
&lt;li&gt;Less interactive without client JS&lt;/li&gt;
&lt;li&gt;Harder to implement real-time features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a search engine, these trade-offs are minimal. Users want fast results, not real-time collaboration.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User → Cloudflare CDN → Next.js Server → FastAPI Backend → Search APIs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The user's browser never talks to Bing, Brave, or any search source. Our server does. The user's IP is known only to us — and we don't log it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Graham Miranda builds privacy-first infrastructure at Graham Miranda UG (Berlin, HRB 36794).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>search</category>
      <category>python</category>
      <category>dsgvo</category>
    </item>
    <item>
      <title>Next.js vs. React: Privacy Implications</title>
      <dc:creator>James</dc:creator>
      <pubDate>Wed, 13 May 2026 22:54:48 +0000</pubDate>
      <link>https://forem.com/james12345000/nextjs-vs-react-privacy-implications-2m3o</link>
      <guid>https://forem.com/james12345000/nextjs-vs-react-privacy-implications-2m3o</guid>
      <description>&lt;h1&gt;
  
  
  Why We Chose Next.js Over React for Our Privacy Search Engine
&lt;/h1&gt;

&lt;p&gt;Frontend frameworks seem interchangeable. For a privacy-focused product, the choice matters more than you'd think.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Privacy Problem with SPAs
&lt;/h2&gt;

&lt;p&gt;Traditional React SPAs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Execute all logic in the browser&lt;/li&gt;
&lt;li&gt;Make API calls directly to third parties&lt;/li&gt;
&lt;li&gt;Expose the user's IP to every service&lt;/li&gt;
&lt;li&gt;Require JavaScript (fingerprinting surface)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For asearchz.online, this was unacceptable. Every API call a user made would expose their IP to Bing, Brave, or other search sources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Next.js (Server-Side Rendering)
&lt;/h2&gt;

&lt;p&gt;With Next.js SSR:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;server&lt;/strong&gt; makes API calls to search sources&lt;/li&gt;
&lt;li&gt;User IP stays between user and our server only&lt;/li&gt;
&lt;li&gt;Results are rendered server-side, sent as HTML&lt;/li&gt;
&lt;li&gt;JavaScript is optional (works without it)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Performance Benefits
&lt;/h2&gt;

&lt;p&gt;SSR is actually faster for search:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First contentful paint: 200-300ms&lt;/li&gt;
&lt;li&gt;No hydration delay (content is already HTML)&lt;/li&gt;
&lt;li&gt;No client-side state management complexity&lt;/li&gt;
&lt;li&gt;CDN caching of rendered pages&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Trade-offs
&lt;/h2&gt;

&lt;p&gt;Next.js SSR has costs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server compute per request (higher than static)&lt;/li&gt;
&lt;li&gt;Less interactive without client JS&lt;/li&gt;
&lt;li&gt;Harder to implement real-time features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a search engine, these trade-offs are minimal. Users want fast results, not real-time collaboration.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User → Cloudflare CDN → Next.js Server → FastAPI Backend → Search APIs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The user's browser never talks to Bing, Brave, or any search source. Our server does. The user's IP is known only to us — and we don't log it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Graham Miranda builds privacy-first infrastructure at Graham Miranda UG (Berlin, HRB 36794).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>infrastructure</category>
      <category>selfhosted</category>
      <category>vps</category>
      <category>hetzner</category>
    </item>
    <item>
      <title>Server-Side Rendering for Privacy: Our Frontend Choice</title>
      <dc:creator>James</dc:creator>
      <pubDate>Wed, 13 May 2026 22:53:42 +0000</pubDate>
      <link>https://forem.com/james12345000/server-side-rendering-for-privacy-our-frontend-choice-nal</link>
      <guid>https://forem.com/james12345000/server-side-rendering-for-privacy-our-frontend-choice-nal</guid>
      <description>&lt;h1&gt;
  
  
  Why We Chose Next.js Over React for Our Privacy Search Engine
&lt;/h1&gt;

&lt;p&gt;Frontend frameworks seem interchangeable. For a privacy-focused product, the choice matters more than you'd think.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Privacy Problem with SPAs
&lt;/h2&gt;

&lt;p&gt;Traditional React SPAs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Execute all logic in the browser&lt;/li&gt;
&lt;li&gt;Make API calls directly to third parties&lt;/li&gt;
&lt;li&gt;Expose the user's IP to every service&lt;/li&gt;
&lt;li&gt;Require JavaScript (fingerprinting surface)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For asearchz.online, this was unacceptable. Every API call a user made would expose their IP to Bing, Brave, or other search sources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Next.js (Server-Side Rendering)
&lt;/h2&gt;

&lt;p&gt;With Next.js SSR:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;server&lt;/strong&gt; makes API calls to search sources&lt;/li&gt;
&lt;li&gt;User IP stays between user and our server only&lt;/li&gt;
&lt;li&gt;Results are rendered server-side, sent as HTML&lt;/li&gt;
&lt;li&gt;JavaScript is optional (works without it)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Performance Benefits
&lt;/h2&gt;

&lt;p&gt;SSR is actually faster for search:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First contentful paint: 200-300ms&lt;/li&gt;
&lt;li&gt;No hydration delay (content is already HTML)&lt;/li&gt;
&lt;li&gt;No client-side state management complexity&lt;/li&gt;
&lt;li&gt;CDN caching of rendered pages&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Trade-offs
&lt;/h2&gt;

&lt;p&gt;Next.js SSR has costs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server compute per request (higher than static)&lt;/li&gt;
&lt;li&gt;Less interactive without client JS&lt;/li&gt;
&lt;li&gt;Harder to implement real-time features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a search engine, these trade-offs are minimal. Users want fast results, not real-time collaboration.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User → Cloudflare CDN → Next.js Server → FastAPI Backend → Search APIs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The user's browser never talks to Bing, Brave, or any search source. Our server does. The user's IP is known only to us — and we don't log it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Graham Miranda builds privacy-first infrastructure at Graham Miranda UG (Berlin, HRB 36794).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ethics</category>
      <category>webscraping</category>
      <category>privacy</category>
      <category>business</category>
    </item>
  </channel>
</rss>
