<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Niclas</title>
    <description>The latest articles on DEV Community by Niclas (@driftya).</description>
    <link>https://dev.to/driftya</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3740640%2F8948c69d-c239-4fca-a772-f87f3d8797cb.png</url>
      <title>DEV Community: Niclas</title>
      <link>https://dev.to/driftya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/driftya"/>
    <language>en</language>
    <item>
      <title>Teaching an AI Coding Agent to Review Its Own Work with Code Meridian</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Fri, 19 Jun 2026 08:31:38 +0000</pubDate>
      <link>https://dev.to/driftya/teaching-an-ai-coding-agent-to-review-its-own-work-with-code-meridian-2p08</link>
      <guid>https://dev.to/driftya/teaching-an-ai-coding-agent-to-review-its-own-work-with-code-meridian-2p08</guid>
      <description>&lt;p&gt;Here I am refactoring:&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fflo5qeqsn5krsc0lv0m8.jpeg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fflo5qeqsn5krsc0lv0m8.jpeg" alt=" " width="800" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback from evaluation:&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F34t7n73ktw5lw2zi1jhh.jpeg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F34t7n73ktw5lw2zi1jhh.jpeg" alt=" " width="603" height="788"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Suggestion for improving the tool:&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ljzgc3mm6hwzsx1pggh.jpeg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ljzgc3mm6hwzsx1pggh.jpeg" alt=" " width="716" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code Meridian is an open-source context tool for AI coding agents. It indexes a project into a graph so agents can reason about relationships in the codebase instead of only reading isolated files.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Driftya/code-meridian" rel="noopener noreferrer"&gt;https://github.com/Driftya/code-meridian&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Learn more:&lt;br&gt;
&lt;a href="https://driftya.com/content/how-codemeridian-helps-me-work-on-driftya" rel="noopener noreferrer"&gt;https://driftya.com/content/how-codemeridian-helps-me-work-on-driftya&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>csharp</category>
    </item>
    <item>
      <title>I updated CodeMeridian’s positioning: local graph memory for AI coding agents. It indexes your repo into Neo4j and exposes precise context through MCP, helping agents understand what matters before editing.</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Wed, 10 Jun 2026 13:59:09 +0000</pubDate>
      <link>https://dev.to/driftya/i-updated-codemeridians-positioning-local-graph-memory-for-ai-coding-agents-it-indexes-your-repo-49b0</link>
      <guid>https://dev.to/driftya/i-updated-codemeridians-positioning-local-graph-memory-for-ai-coding-agents-it-indexes-your-repo-49b0</guid>
      <description></description>
      <category>agents</category>
      <category>ai</category>
      <category>mcp</category>
      <category>tooling</category>
    </item>
    <item>
      <title>CodeMeridian: Giving AI Coding Agents a Project Map Before They Edit</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Tue, 09 Jun 2026 09:58:20 +0000</pubDate>
      <link>https://dev.to/driftya/codemeridian-giving-ai-coding-agents-a-project-map-before-they-edit-4g7k</link>
      <guid>https://dev.to/driftya/codemeridian-giving-ai-coding-agents-a-project-map-before-they-edit-4g7k</guid>
      <description>&lt;p&gt;AI coding agents feel sharp when a project is small.&lt;/p&gt;

&lt;p&gt;They can scan a few files, understand the shape, and make useful changes. In that phase, the project still fits inside the agent’s short-term memory. The architecture is obvious. The dangerous files are nearby. The blast radius is small.&lt;/p&gt;

&lt;p&gt;But something changes when a project reaches MVP size.&lt;/p&gt;

&lt;p&gt;The agent still sounds confident, but it starts guessing.&lt;/p&gt;

&lt;p&gt;It finds a nearby file and assumes it is the right one.&lt;br&gt;
It trusts stale documentation.&lt;br&gt;
It misses hidden callers.&lt;br&gt;
It forgets architecture boundaries.&lt;br&gt;
It edits something that was not really part of the task.&lt;/p&gt;

&lt;p&gt;I kept running into that problem while building larger projects.&lt;/p&gt;

&lt;p&gt;Source-level guardrails help. A CONTRIBUTING.md, AGENTS.md, or project instruction file can tell the agent how to behave.&lt;/p&gt;

&lt;p&gt;But those are still instructions.&lt;/p&gt;

&lt;p&gt;They are not facts.&lt;/p&gt;

&lt;p&gt;That is where the idea for CodeMeridian came from.&lt;/p&gt;

&lt;p&gt;What CodeMeridian is&lt;/p&gt;

&lt;p&gt;CodeMeridian is a local code knowledge graph for AI coding tools.&lt;/p&gt;

&lt;p&gt;It indexes a codebase into Neo4j and exposes that graph through MCP, so tools like GitHub Copilot, Claude Code, Codex-style agents, or other MCP-compatible clients can ask better questions before editing.&lt;/p&gt;

&lt;p&gt;The basic idea is:&lt;/p&gt;

&lt;p&gt;The assistant is the AI.&lt;br&gt;
CodeMeridian is the project map.&lt;/p&gt;

&lt;p&gt;It does not replace the coding assistant. It gives the assistant a structured way to ask about the codebase.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;p&gt;What calls this method?&lt;br&gt;
What tests cover this area?&lt;br&gt;
What files are likely in scope for this feature?&lt;br&gt;
Is the graph stale before I trust it?&lt;br&gt;
How is this frontend component connected to backend code?&lt;/p&gt;

&lt;p&gt;Why a graph?&lt;/p&gt;

&lt;p&gt;Code is already a graph.&lt;/p&gt;

&lt;p&gt;Methods call methods.&lt;br&gt;
Classes implement interfaces.&lt;br&gt;
Tests cover production paths.&lt;br&gt;
Frontend components call API clients.&lt;br&gt;
API handlers touch services.&lt;br&gt;
Services use repositories.&lt;br&gt;
Docs mention symbols.&lt;br&gt;
Projects depend on other projects.&lt;/p&gt;

&lt;p&gt;A normal file search can find text.&lt;/p&gt;

&lt;p&gt;A graph can answer relationship questions.&lt;/p&gt;

&lt;p&gt;That matters because many AI coding mistakes are relationship mistakes.&lt;/p&gt;

&lt;p&gt;The agent edits a method but misses its callers.&lt;br&gt;
It changes an interface without checking implementations.&lt;br&gt;
It deletes code that looks unused but is actually an entry point.&lt;br&gt;
It trusts documentation that no longer matches the code.&lt;/p&gt;

&lt;p&gt;CodeMeridian tries to make those relationships visible before the edit happens.&lt;/p&gt;

&lt;p&gt;A red line before the agent touches the code.&lt;/p&gt;

&lt;p&gt;What it currently indexes&lt;/p&gt;

&lt;p&gt;CodeMeridian currently supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C# through a Roslyn-based indexer&lt;/li&gt;
&lt;li&gt;TypeScript / TSX through a frontend indexer&lt;/li&gt;
&lt;li&gt;README and documentation files&lt;/li&gt;
&lt;li&gt;diagnostics&lt;/li&gt;
&lt;li&gt;optional embeddings for semantic similarity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The graph is stored locally in Neo4j.&lt;/p&gt;

&lt;p&gt;There is no CodeMeridian cloud service.&lt;/p&gt;

&lt;p&gt;No LLM API key is required for CodeMeridian itself. The AI assistant you use may have its own requirements, but the knowledge graph belongs to you.&lt;/p&gt;

&lt;p&gt;What the MCP tools can do&lt;/p&gt;

&lt;p&gt;The current toolset is focused on helping an agent understand impact, context, and risk.&lt;/p&gt;

&lt;p&gt;Some examples:&lt;/p&gt;

&lt;p&gt;find_impact&lt;/p&gt;

&lt;p&gt;Finds callers and transitive dependents before changing something.&lt;/p&gt;

&lt;p&gt;build_minimal_context&lt;/p&gt;

&lt;p&gt;Builds a bounded context pack for a target node, including callers, callees, likely files, tests, coverage gaps, token estimate, and model guidance.&lt;/p&gt;

&lt;p&gt;find_implementation_surface&lt;/p&gt;

&lt;p&gt;Ranks the files, classes, and methods most likely to be relevant for a feature goal.&lt;/p&gt;

&lt;p&gt;check_graph_freshness&lt;/p&gt;

&lt;p&gt;Reports whether the indexed graph looks trustworthy enough for exact implementation work.&lt;/p&gt;

&lt;p&gt;find_graph_drift&lt;/p&gt;

&lt;p&gt;Checks if the graph may be stale and whether re-indexing is recommended.&lt;/p&gt;

&lt;p&gt;find_stale_knowledge&lt;/p&gt;

&lt;p&gt;Looks for stale docs, unresolved mentions, orphaned concepts, and code references that no longer resolve.&lt;/p&gt;

&lt;p&gt;The goal is not to flood the agent with more text.&lt;/p&gt;

&lt;p&gt;The goal is to return the smallest useful architecture slice.&lt;/p&gt;

&lt;p&gt;The workflow I want&lt;/p&gt;

&lt;p&gt;The ideal workflow looks something like this:&lt;/p&gt;

&lt;p&gt;Use CodeMeridian before editing.&lt;br&gt;
Goal:&lt;br&gt;
Add unread reply notifications.&lt;br&gt;
Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find the likely implementation surface.&lt;/li&gt;
&lt;li&gt;Resolve exact symbols where possible.&lt;/li&gt;
&lt;li&gt;Check graph freshness.&lt;/li&gt;
&lt;li&gt;Build a minimal context pack.&lt;/li&gt;
&lt;li&gt;Identify related tests.&lt;/li&gt;
&lt;li&gt;Make the smallest safe change.&lt;/li&gt;
&lt;li&gt;Verify with tests.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is very different from:&lt;/p&gt;

&lt;p&gt;Search around and hope the right files are nearby.&lt;/p&gt;

&lt;p&gt;The first workflow gives the agent a map.&lt;/p&gt;

&lt;p&gt;The second gives it a flashlight and a haunted repo.&lt;/p&gt;

&lt;p&gt;Why local-first matters&lt;/p&gt;

&lt;p&gt;For this kind of tool, I wanted the graph to be local.&lt;/p&gt;

&lt;p&gt;The code structure, documentation, diagnostics, and remembered project knowledge should not need to live in someone else’s hosted service.&lt;/p&gt;

&lt;p&gt;Neo4j runs locally.&lt;br&gt;
The MCP server runs locally.&lt;br&gt;
The indexer runs locally.&lt;/p&gt;

&lt;p&gt;If you use a hosted assistant, that assistant still has its own data handling rules. But CodeMeridian itself is not a cloud knowledge store.&lt;/p&gt;

&lt;p&gt;What this is not&lt;/p&gt;

&lt;p&gt;CodeMeridian is not an AI model.&lt;/p&gt;

&lt;p&gt;It is not a replacement for tests.&lt;/p&gt;

&lt;p&gt;It is not a replacement for code review.&lt;/p&gt;

&lt;p&gt;It is not magic.&lt;/p&gt;

&lt;p&gt;It is a project memory layer for AI-assisted coding.&lt;/p&gt;

&lt;p&gt;The agent can still make mistakes. But with a graph, at least it can ask better questions first.&lt;/p&gt;

&lt;p&gt;Where I want to take it next&lt;/p&gt;

&lt;p&gt;The current version is early but usable.&lt;/p&gt;

&lt;p&gt;The next improvements I am thinking about are more workflow-focused:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;better usage prompts&lt;/li&gt;
&lt;li&gt;troubleshooting docs&lt;/li&gt;
&lt;li&gt;a small UI for reviewing frontend/backend link suggestions&lt;/li&gt;
&lt;li&gt;background graph enrichment&lt;/li&gt;
&lt;li&gt;test shield summaries&lt;/li&gt;
&lt;li&gt;change-session memory&lt;/li&gt;
&lt;li&gt;better Docker image publishing and install flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One feature I am especially interested in is a manual relationship workbench:&lt;/p&gt;

&lt;p&gt;The indexer could suggest possible frontend-to-backend links, such as:&lt;/p&gt;

&lt;p&gt;CreateNoteForm.tsx -&amp;gt; POST /api/notes -&amp;gt; NoteEndpoints.CreateAsync&lt;/p&gt;

&lt;p&gt;Then a developer could confirm or reject those links in a small UI.&lt;/p&gt;

&lt;p&gt;That would turn CodeMeridian from a passive index into a curated system map.&lt;/p&gt;

&lt;p&gt;Repo&lt;/p&gt;

&lt;p&gt;The project is here:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Driftya" rel="noopener noreferrer"&gt;
        Driftya
      &lt;/a&gt; / &lt;a href="https://github.com/Driftya/code-meridian" rel="noopener noreferrer"&gt;
        code-meridian
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A persistent code knowledge graph that gives GitHub Copilot a grounded, structural understanding of your codebase. It acts as the **deterministic context layer** — so Copilot doesn't drift or forget your architecture when working on large projects.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/Driftya/code-meridian/docs/assets/icon_512.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FDriftya%2Fcode-meridian%2FHEAD%2Fdocs%2Fassets%2Ficon_512.png" alt="CodeMeridian logo" width="160"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;CodeMeridian&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://www.nuget.org/packages/CodeMeridian.Indexer" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f72ed8cce9fe091d5dde03555049280b6bdd8ac187538c8c230ad749ce88cf57/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f436f64654d6572696469616e2e496e64657865722e737667" alt="NuGet"&gt;&lt;/a&gt;
&lt;a href="https://www.nuget.org/packages/CodeMeridian.Indexer" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3eeb7450f84eeb4bdae0ce36d1a1f32f07fa6ef2b9c01e269196ae1738d37d44/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f436f64654d6572696469616e2e496e64657865722e737667" alt="NuGet Downloads"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Driftya/code-meridian/actions/workflows/codeql.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/Driftya/code-meridian/actions/workflows/codeql.yml/badge.svg?branch=main" alt="CodeQL"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CodeMeridian is a persistent code knowledge graph for AI coding tools. It indexes your codebase into Neo4j and exposes that structure through MCP, so GitHub Copilot, Codex, Claude Code, and other MCP-compatible clients can ask precise questions before editing instead of guessing from open files.&lt;/p&gt;
&lt;p&gt;It is built to be the deterministic context layer for large codebases: callers, dependencies, tests, documentation, hotspots, dead code, and cross-project relationships stay available across sessions.&lt;/p&gt;
&lt;p&gt;No LLM API key required. The assistant is the AI; CodeMeridian is the knowledge engine.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why CodeMeridian?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Copilot can still read files beyond what is already open, but it has to spend context to discover them and the relationships do not persist. CodeMeridian makes that discovery explicit, cheaper, and reusable.&lt;/p&gt;
&lt;p&gt;The graph is yours. CodeMeridian stores indexed code structure, documentation, diagnostics, and remembered project knowledge in your Neo4j instance. Nothing is sent to a CodeMeridian cloud service. If…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Driftya/code-meridian" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Designing respectful notifications in a social platform.</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Tue, 03 Mar 2026 15:36:33 +0000</pubDate>
      <link>https://dev.to/driftya/designing-respectful-notifications-in-a-social-platform-41pc</link>
      <guid>https://dev.to/driftya/designing-respectful-notifications-in-a-social-platform-41pc</guid>
      <description>&lt;p&gt;Most social platforms treat notifications as engagement drivers. The more you return, the better it is for the system. Notifications become a lever to pull people back in, often regardless of whether they have shown recent activity.&lt;/p&gt;

&lt;p&gt;Questioning that assumption while building a small social platform. If a user has not interacted with the app in days or weeks, does it really make sense to keep sending notifications? At some point, reminders stop being helpful and start feeling like spam.&lt;/p&gt;

&lt;p&gt;The idea I settled on was simple: notifications should respond to user activity, not just system events.&lt;/p&gt;

&lt;p&gt;Instead of sending a notification for every qualifying action, the system allows only one notification per user activity window. If the user has already received a notification but has not returned to the platform, additional notifications are suppressed. In other words, inactivity acts as a natural brake.&lt;/p&gt;

&lt;p&gt;Technically, this is implemented using Redis as a persistent cache layer. When a notification is sent, a suppression key is written with a configurable expiration time. As long as that key exists, further notifications of that type are not delivered. If the user returns and interacts with the platform, the key can be cleared or reset. If they remain inactive, the suppression window eventually expires on its own.&lt;/p&gt;

&lt;p&gt;The expiration time is configurable per notification type. Some events are more time-sensitive than others, and the system allows different reset periods. In my current setup, the default window is seven days, but this can be adjusted without changing the core logic.&lt;/p&gt;

&lt;p&gt;This approach does introduce tradeoffs. A user who cares but checks the platform infrequently might miss intermediate updates. However, the design assumption is that meaningful engagement should restart when the user actively returns. Notifications are not meant to accumulate in the background; they are meant to signal something new once the user has shown interest again.&lt;/p&gt;

&lt;p&gt;The broader goal is to make notifications feel respectful. Instead of optimizing for frequency or return rate, the system optimizes for restraint. If someone is inactive, the platform should not keep tapping them on the shoulder.&lt;/p&gt;

&lt;p&gt;Designing notifications this way shifts the focus slightly. It moves away from maximizing engagement and toward minimizing unnecessary interruption. It is a small change technically, but it significantly changes the tone of the product.&lt;/p&gt;

&lt;p&gt;I am still refining the definition of “inactive” and exploring edge cases where suppression might hide something important. But the core principle remains the same: activity should trigger notifications, not the absence of it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>redis</category>
      <category>backend</category>
      <category>architecture</category>
    </item>
    <item>
      <title>How important is Web Accessibility?</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Sun, 15 Feb 2026 01:06:13 +0000</pubDate>
      <link>https://dev.to/driftya/how-important-is-web-accessibility-i8k</link>
      <guid>https://dev.to/driftya/how-important-is-web-accessibility-i8k</guid>
      <description>&lt;p&gt;Since I learned web programming I always thought just like security is somethings we should never skip I also think of web accessibility in the same regards for public sites but I also try to always implement it on internal tools as well. &lt;/p&gt;

&lt;p&gt;I am using this great tool from WAVE Web Accessibility Evaluation Tools (&lt;a href="https://wave.webaim.org/" rel="noopener noreferrer"&gt;https://wave.webaim.org/&lt;/a&gt;), does anyone else use it? I wonder if there are any alternatives that is better.&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%2Farnc0mi12svszrhyluzd.webp" 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%2Farnc0mi12svszrhyluzd.webp" alt=" " width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>web</category>
      <category>discuss</category>
    </item>
    <item>
      <title>IndexNow: Struggle with implementation (C#)</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Thu, 12 Feb 2026 16:12:37 +0000</pubDate>
      <link>https://dev.to/driftya/indexnow-struggle-with-implementation-c-5fn4</link>
      <guid>https://dev.to/driftya/indexnow-struggle-with-implementation-c-5fn4</guid>
      <description>&lt;p&gt;Some days ago I have been struggling with implementing IndexNow, I did almost exactly as mentioned here in this tutorial &lt;a href="https://www.bing.com/indexnow/getstarted#implementation" rel="noopener noreferrer"&gt;https://www.bing.com/indexnow/getstarted#implementation&lt;/a&gt;, but it did not work.&lt;/p&gt;

&lt;p&gt;The payload was correct and the data and the endpoint was right but I got bad request, I had no clue what to fix. &lt;/p&gt;

&lt;p&gt;The error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{\"code\":\"InvalidRequestParameters\",\"message\":\"Given request parameters are null or invalid\"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After finding &lt;a href="https://stackoverflow.com/questions/72629964/given-request-parameters-are-null-or-invalid-when-using-curl-to-submit-urls-wi" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/72629964/given-request-parameters-are-null-or-invalid-when-using-curl-to-submit-urls-wi&lt;/a&gt; on stackoverflow I changed endpoint to "&lt;a href="https://www.bing.com/IndexNow" rel="noopener noreferrer"&gt;https://www.bing.com/IndexNow&lt;/a&gt;" I finally found the cause.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;IndexNow submission failed with status LengthRequired.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The whole issue has been the http version all along which I never thought of as I have never had any reasons before to set that manually.&lt;/p&gt;

&lt;p&gt;The solution to fix the issue:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;            var request = new HttpRequestMessage(HttpMethod.Post, endpoint)
            {
                Version = HttpVersion.Version11,
                VersionPolicy = HttpVersionPolicy.RequestVersionExact,
                Content = new StringContent(
                    JsonSerializer.Serialize(payload, JsonSerializerOptions.Web),
                    Encoding.UTF8,
                    "application/json")
            };
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I hope it help someone who may struggle with the same issue.&lt;br&gt;
A small note, the correct endpoint is &lt;a href="https://api.indexnow.org/indexnow" rel="noopener noreferrer"&gt;https://api.indexnow.org/indexnow&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>indexnow</category>
      <category>csharp</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Remember what you vibe?</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Tue, 03 Feb 2026 07:43:00 +0000</pubDate>
      <link>https://dev.to/driftya/learn-what-you-vibe-219m</link>
      <guid>https://dev.to/driftya/learn-what-you-vibe-219m</guid>
      <description>&lt;p&gt;Hello, &lt;/p&gt;

&lt;p&gt;I recently started vibe coding and yes the output is fast but I feel personally the long term memory for knowing your project is declining.&lt;/p&gt;

&lt;p&gt;When I did commit and pullrequests I read the code and understand what it did and if it required any changes, but in long term I needed to go back again to remember the details. &lt;/p&gt;

&lt;p&gt;Writing my code myself it was much easier to remember the details. &lt;strong&gt;So how did I solve it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What I did, first make sure the agent follow the SOLID principle and KISS as much as possible, iterate over the code and extract all methods as much as possible (A lesson from Uncle Bob). Then I writes unit test myself, this make me remember the code much better when doing vibe coding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I am curious on how you solved it. Any Ideas?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Reasonable security baseline for self-hosted services 2026?</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Sun, 01 Feb 2026 01:06:05 +0000</pubDate>
      <link>https://dev.to/driftya/reasonable-security-baseline-for-self-hosted-services-2026-1jjk</link>
      <guid>https://dev.to/driftya/reasonable-security-baseline-for-self-hosted-services-2026-1jjk</guid>
      <description>&lt;p&gt;Running a hobby project on a self-hosted server and wanted a quick sanity check on whether this counts as a reasonable minimum security baseline in 2026.&lt;/p&gt;

&lt;p&gt;High-level setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux host&lt;/li&gt;
&lt;li&gt;Dockerized services&lt;/li&gt;
&lt;li&gt;Only 80/443 exposed publicly&lt;/li&gt;
&lt;li&gt;Reverse proxy terminating TLS (HTTPS enforced)&lt;/li&gt;
&lt;li&gt;ASP.NET (.NET 10) with built-in Identity + OAuth&lt;/li&gt;
&lt;li&gt;EF Core/ORM only (no raw SQL)&lt;/li&gt;
&lt;li&gt;auto-encoding, no user HTML rendering&lt;/li&gt;
&lt;li&gt;Basic security headers (CSP, HSTS, nosniff, referrer, permissions)&lt;/li&gt;
&lt;li&gt;Host firewall enabled (default deny incoming)&lt;/li&gt;
&lt;li&gt;Regular security updates (OS + container rebuilds, unattended upgrades)&lt;/li&gt;
&lt;li&gt;Rate limiting policies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t meant to be enterprise-grade, just sensible for a hobby app.&lt;br&gt;
Does this sound like a reasonable baseline?&lt;/p&gt;

&lt;p&gt;Any common blind spots people usually miss at this stage (ops, maintenance, or process-wise)? &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>security</category>
      <category>network</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Vibe coding before writing code?</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Fri, 30 Jan 2026 11:32:55 +0000</pubDate>
      <link>https://dev.to/driftya/vibe-coding-before-writing-code-2ko6</link>
      <guid>https://dev.to/driftya/vibe-coding-before-writing-code-2ko6</guid>
      <description>&lt;p&gt;Before I wrote much code on my current project, I wrote documents.&lt;/p&gt;

&lt;p&gt;The idea started after some frustration with social media. I spent time comparing different platforms and noticed how similar they all felt in practice. Most of them optimize for quick reactions and passive engagement. I kept wondering what kind of interaction would actually feel satisfying to respond to, where the creator might genuinely care about the reply, and where responding felt better than just clicking a like.&lt;/p&gt;

&lt;p&gt;I gave the idea space by discussing it back and forth with different AI models. Over time this turned into a large, unstructured dataset of thoughts, constraints, and possibilities. Instead of trying to code from that directly, I treated it as raw material that needed processing.&lt;/p&gt;

&lt;p&gt;Before doing that processing, I focused on orientation. As a programmer, what felt important to me was defining a Table of Contents in a README, writing a CONTRIBUTING guide, and creating an Agent.md file as an explicit entry point for prompting and discussion. These weren’t meant to lock decisions, but to give the project a shared mental baseline, even if that baseline was only for myself.&lt;/p&gt;

&lt;p&gt;I wrote down best practices, architectural boundaries, coding rules, and style decisions as early constraints. I then refined those documents iteratively, again using AI models, before moving deeper into implementation.&lt;/p&gt;

&lt;p&gt;These were the first steps I took before I could really start building.&lt;br&gt;
I’m curious how others approach this phase. Do you do something similar, or are there other practices you’ve found useful early on?&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>programming</category>
      <category>ai</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
