<?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: Carlo Luisito Adap</title>
    <description>The latest articles on DEV Community by Carlo Luisito Adap (@carloluisito).</description>
    <link>https://dev.to/carloluisito</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%2F2060889%2Fec8d62bc-86eb-477d-9b65-d300df47f3b1.png</url>
      <title>DEV Community: Carlo Luisito Adap</title>
      <link>https://dev.to/carloluisito</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/carloluisito"/>
    <language>en</language>
    <item>
      <title>What if your AI coding agent actually learned from working with you?</title>
      <dc:creator>Carlo Luisito Adap</dc:creator>
      <pubDate>Mon, 09 Mar 2026 17:44:24 +0000</pubDate>
      <link>https://dev.to/carloluisito/what-if-your-ai-coding-agent-actually-learned-from-working-with-you-5d19</link>
      <guid>https://dev.to/carloluisito/what-if-your-ai-coding-agent-actually-learned-from-working-with-you-5d19</guid>
      <description>&lt;p&gt;Right now, tools like Claude Code, Cursor, and Windsurf start every session with a blank slate. That architectural decision you explained yesterday? Gone. The debugging pattern that took 20 minutes to figure out? You'll explain it again tomorrow.&lt;/p&gt;

&lt;p&gt;I kept running into this, so I built Mind Keg MCP, an open-source memory server that gives AI agents persistent knowledge across sessions.&lt;br&gt;
The idea is simple: agents store small, atomic learnings as they work with you. Next session, they pull back what's relevant via semantic search. Knowledge compounds. The agent gets sharper the more you use it.&lt;/p&gt;

&lt;p&gt;A few things that made this practical to build and use:&lt;br&gt;
It works with any MCP-compatible agent: Claude Code, Cursor, Windsurf, Codex CLI, Gemini CLI, GitHub Copilot. Semantic search runs locally via ONNX embeddings, so there are no API keys and no costs. Learnings can be scoped per repo, per workspace, or globally. Everything lives in SQLite, zero config, fully offline, and it ships with API key auth and per-repo access control.&lt;/p&gt;

&lt;p&gt;Built with TypeScript and Node.js 22.&lt;/p&gt;

&lt;p&gt;npm install -g mindkeg-mcp&lt;br&gt;
GitHub: github.com/carloluisito/mindkeg-mcp&lt;/p&gt;

&lt;p&gt;Curious what others think. What context do you wish your AI coding tools actually remembered between sessions?&lt;/p&gt;

&lt;h1&gt;
  
  
  OpenSource #AI #MCP #DeveloperTools #CodingAgents #TypeScript
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>ClaudeDesk: Open-source PWA for Claude Code with session persistence and tool activity tracking</title>
      <dc:creator>Carlo Luisito Adap</dc:creator>
      <pubDate>Tue, 27 Jan 2026 13:16:39 +0000</pubDate>
      <link>https://dev.to/carloluisito/claudedesk-open-source-pwa-for-claude-code-with-session-persistence-and-tool-activity-tracking-4768</link>
      <guid>https://dev.to/carloluisito/claudedesk-open-source-pwa-for-claude-code-with-session-persistence-and-tool-activity-tracking-4768</guid>
      <description>&lt;p&gt;I open-sourced ClaudeDesk, a companion interface for Anthropic's Claude Code CLI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; Claude Code is a powerful AI coding assistant, but it runs in terminal with ephemeral sessions. You lose context when you close the terminal, and there's no easy way to see what Claude did after the fact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; ClaudeDesk provides a web-based session manager with:&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.amazonaws.com%2Fuploads%2Farticles%2Fut35fahs5uxu708saox6.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%2Fut35fahs5uxu708saox6.png" alt=" " width="800" height="649"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fhe3hw12xumm0lturwp75.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%2Fhe3hw12xumm0lturwp75.png" alt=" " width="800" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time tool activity timeline (file reads, edits, shell commands)&lt;/li&gt;
&lt;li&gt;Persistent sessions with full conversation history&lt;/li&gt;
&lt;li&gt;Git worktree isolation for safe experimentation&lt;/li&gt;
&lt;li&gt;Guided ship workflow (commit, push, PR creation)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tech stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend: Express + TypeScript + WebSocket&lt;/li&gt;
&lt;li&gt;Frontend: React + TailwindCSS&lt;/li&gt;
&lt;li&gt;Spawns Claude Code CLI with &lt;code&gt;--output-format stream-json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx claudedesk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub: &lt;a href="https://github.com/carloluisito/claudedesk" rel="noopener noreferrer"&gt;https://github.com/carloluisito/claudedesk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIT licensed. PRs welcome.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>claudeai</category>
      <category>claudecode</category>
    </item>
    <item>
      <title>Why PR Standards Always Decay (Even on Good Teams)</title>
      <dc:creator>Carlo Luisito Adap</dc:creator>
      <pubDate>Mon, 15 Dec 2025 07:35:38 +0000</pubDate>
      <link>https://dev.to/carloluisito/why-pr-standards-always-decay-even-on-good-teams-2ld1</link>
      <guid>https://dev.to/carloluisito/why-pr-standards-always-decay-even-on-good-teams-2ld1</guid>
      <description>&lt;p&gt;Most engineering teams don't fail because they lack smart people.&lt;/p&gt;

&lt;p&gt;They fail because &lt;strong&gt;standards slowly decay&lt;/strong&gt;, even when everyone agrees they're important.&lt;/p&gt;

&lt;p&gt;And the frustrating part is this:&lt;br&gt;
it happens even on &lt;em&gt;good&lt;/em&gt; teams.&lt;/p&gt;

&lt;p&gt;Teams with experienced engineers.&lt;br&gt;
Teams that care about quality.&lt;br&gt;
Teams that have CI, code reviews, and best practices written down somewhere.&lt;/p&gt;

&lt;p&gt;Yet over time, the same patterns show up.&lt;/p&gt;




&lt;h2&gt;
  
  
  The pattern everyone recognizes
&lt;/h2&gt;

&lt;p&gt;Early on, standards are clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;UI changes include screenshots&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Behavior changes include tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Risky changes include rollout notes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PRs explain &lt;em&gt;what&lt;/em&gt; and &lt;em&gt;why&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first, this is enforced naturally.&lt;br&gt;
People remind each other. Reviews are thoughtful. Feedback is consistent.&lt;/p&gt;

&lt;p&gt;Then the team grows.&lt;/p&gt;

&lt;p&gt;Suddenly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Screenshots are "usually" included&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tests are added "most of the time"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rollout plans exist... except when they don't&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PR comments repeat the same reminders&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing dramatic&lt;br&gt;
That's what makes it dangerous.&lt;/p&gt;

&lt;p&gt;Standards don't disappear --- they &lt;strong&gt;erode&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  "Just this once" is the most expensive phrase in engineering
&lt;/h2&gt;

&lt;p&gt;The decay almost never comes from bad intent.&lt;/p&gt;

&lt;p&gt;It comes from moments like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;"It's a small change."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"We're rushing a hotfix."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"I'll add tests later."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"The UI didn't really change."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"We've done this before."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each one feels reasonable in isolation.&lt;/p&gt;

&lt;p&gt;But standards don't decay in isolation --- they decay &lt;strong&gt;in aggregate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After enough exceptions, nobody is sure what's actually required anymore.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this isn't a people problem
&lt;/h2&gt;

&lt;p&gt;A common response is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If people don't follow standards, that's a performance issue."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's true in extreme cases --- but it misses the more common failure mode.&lt;/p&gt;

&lt;p&gt;Most standards erosion happens because of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;time pressure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;context switching&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unclear ownership&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reviewers missing things&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;seniors being offline&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fatigue from repeating the same feedback&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are fireable offenses.&lt;/p&gt;

&lt;p&gt;They're &lt;strong&gt;human limits interacting with scale&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As teams grow, relying on memory and vigilance becomes brittle.&lt;/p&gt;




&lt;h2&gt;
  
  
  The hidden cost: senior engineer fatigue
&lt;/h2&gt;

&lt;p&gt;Here's the part we don't talk about enough.&lt;/p&gt;

&lt;p&gt;When standards aren't enforced by the system, they're enforced by people.&lt;/p&gt;

&lt;p&gt;Usually the same people.&lt;/p&gt;

&lt;p&gt;Senior engineers become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;walking checklists&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;living linters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;human reminders&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They leave the same comments over and over:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can you add tests?"&lt;br&gt;
"Do we have a screenshot?"&lt;br&gt;
"What's the rollout plan?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Over time, this leads to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;review exhaustion&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rubber-stamping&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;resentment ("why do I always have to say this?")&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eventually, people stop fighting the decay.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why CI and code coverage don't solve this
&lt;/h2&gt;

&lt;p&gt;We already have great tools for certain things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;CI catches broken builds&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Linters catch syntax and style&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Coverage tools measure test presence&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But they &lt;strong&gt;cannot&lt;/strong&gt; enforce things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;whether a UI change has visual proof&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;whether a risky change has a rollout plan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;whether a behavior change was tested intentionally&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;whether an exception was justified&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those standards live in heads, docs, or tribal knowledge.&lt;/p&gt;

&lt;p&gt;And anything that lives only in people's heads will eventually drift.&lt;/p&gt;




&lt;h2&gt;
  
  
  Checklists help --- until they don't
&lt;/h2&gt;

&lt;p&gt;Some teams use PR templates or Jira workflows.&lt;/p&gt;

&lt;p&gt;They help, but they rely on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;humans remembering to check them&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reviewers enforcing them consistently&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;social pressure to comply&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Over time, they become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;ignored&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;copy-pasted&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;treated as ceremony&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, the checklist still exists --- but the standard is gone.&lt;/p&gt;




&lt;h2&gt;
  
  
  The uncomfortable tradeoff: speed vs certainty
&lt;/h2&gt;

&lt;p&gt;Every team eventually faces this tension.&lt;/p&gt;

&lt;p&gt;Strict standards can feel slow.&lt;br&gt;
Loose standards feel fast --- until something breaks.&lt;/p&gt;

&lt;p&gt;The real problem isn't choosing one over the other.&lt;/p&gt;

&lt;p&gt;It's that &lt;strong&gt;standards enforcement often depends on who's reviewing&lt;/strong&gt; and how much energy they have that day.&lt;/p&gt;

&lt;p&gt;That's not a stable system.&lt;/p&gt;




&lt;h2&gt;
  
  
  A different way to think about standards
&lt;/h2&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Did someone remember to enforce this?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Is this expectation explicit and verifiable?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When standards are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;explicit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;deterministic&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;applied consistently&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They stop feeling personal.&lt;/p&gt;

&lt;p&gt;They stop being debates.&lt;/p&gt;

&lt;p&gt;They stop relying on heroics.&lt;/p&gt;




&lt;h2&gt;
  
  
  This isn't about control --- it's about clarity
&lt;/h2&gt;

&lt;p&gt;Good engineers don't resist standards.&lt;br&gt;
They resist &lt;strong&gt;unclear, inconsistent enforcement&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When expectations are obvious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;juniors aren't guessing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;seniors aren't policing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;managers aren't arbitrating constantly&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everyone spends less energy arguing about &lt;em&gt;whether&lt;/em&gt; something is required --- and more on building.&lt;/p&gt;




&lt;h2&gt;
  
  
  An open question
&lt;/h2&gt;

&lt;p&gt;I don't think most teams need more reminders.&lt;/p&gt;

&lt;p&gt;They need fewer assumptions.&lt;/p&gt;

&lt;p&gt;I'm currently exploring ways to make engineering standards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;explicit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;provable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and consistently applied at merge time&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still early. Mostly listening.&lt;/p&gt;

&lt;p&gt;If this pattern feels familiar to you, I'd love to hear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;where standards break down on your team&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;what feels unfair to enforce&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;what you wish the system handled for you&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Stop Paying for Feature Flags: Meet ToggleNet, the Open-Source .NET Alternative</title>
      <dc:creator>Carlo Luisito Adap</dc:creator>
      <pubDate>Thu, 03 Jul 2025 08:06:40 +0000</pubDate>
      <link>https://dev.to/carloluisito/stop-paying-for-feature-flags-meet-togglenet-the-open-source-net-alternative-38h0</link>
      <guid>https://dev.to/carloluisito/stop-paying-for-feature-flags-meet-togglenet-the-open-source-net-alternative-38h0</guid>
      <description>&lt;p&gt;&lt;em&gt;How I built a full-featured feature flag system that rivals expensive SaaS solutions - and why you should consider it for your next .NET project&lt;/em&gt;&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%2Fhwbxgvn561zqtlqt2ocp.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%2Fhwbxgvn561zqtlqt2ocp.png" alt="ToggleNet Dashboard Overview" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's be honest: feature flags are no longer a "nice-to-have" - they're essential. But if you're like most developers, you've probably experienced the frustration of hitting limits on popular SaaS solutions or justifying yet another monthly subscription to your finance team.&lt;/p&gt;

&lt;p&gt;What if I told you there's a better way? &lt;/p&gt;

&lt;p&gt;After years of wrestling with expensive feature flag services and their limitations, I built &lt;strong&gt;ToggleNet&lt;/strong&gt; - a comprehensive, open-source feature flag SDK that brings enterprise-grade functionality to .NET applications without the enterprise price tag.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Current Solutions
&lt;/h2&gt;

&lt;p&gt;Before diving into ToggleNet, let's acknowledge the elephant in the room. Existing feature flag solutions generally fall into three categories:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SaaS Solutions&lt;/strong&gt; (LaunchDarkly, Split, etc.)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💸 Expensive monthly subscriptions ($50-$500+ per month)&lt;/li&gt;
&lt;li&gt;🔒 Your data lives on their servers
&lt;/li&gt;
&lt;li&gt;📊 Usage limits and per-seat pricing&lt;/li&gt;
&lt;li&gt;🎯 Great features, but at a premium cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Simple Open-Source Libraries&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Free and open&lt;/li&gt;
&lt;li&gt;❌ Limited to basic on/off functionality&lt;/li&gt;
&lt;li&gt;❌ No dashboard or management UI&lt;/li&gt;
&lt;li&gt;❌ Minimal targeting capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Build Your Own&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🛠 Complete control&lt;/li&gt;
&lt;li&gt;⏰ Months of development time&lt;/li&gt;
&lt;li&gt;🐛 All the bugs and edge cases to solve yourself&lt;/li&gt;
&lt;li&gt;🔄 Ongoing maintenance burden&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The sweet spot?&lt;/strong&gt; A feature-rich, open-source solution that doesn't compromise on functionality. That's exactly what ToggleNet delivers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes ToggleNet Different?
&lt;/h2&gt;

&lt;p&gt;Here's where things get interesting. ToggleNet isn't just another basic feature flag library - it's a complete feature management platform that rivals expensive SaaS solutions:&lt;/p&gt;

&lt;h3&gt;
  
  
  🎯 Sophisticated Targeting Beyond Percentages
&lt;/h3&gt;

&lt;p&gt;While most libraries stop at "show this to 20% of users," ToggleNet lets you create complex targeting rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Target enterprise customers in North America using mobile devices&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;userContext&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;UserContext&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;UserId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"user123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Attributes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"plan"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"enterprise"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"deviceType"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"mobile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"appVersion"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"2.1.0"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;showPremiumFeature&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_featureFlagManager&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsEnabledAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"premium-analytics"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;userContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Real talk:&lt;/strong&gt; This level of targeting usually costs hundreds per month in SaaS solutions. ToggleNet gives it to you for free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Targeting operators include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;String matching&lt;/strong&gt;: &lt;code&gt;Equals&lt;/code&gt;, &lt;code&gt;Contains&lt;/code&gt;, &lt;code&gt;StartsWith&lt;/code&gt;, &lt;code&gt;Regex&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;List operations&lt;/strong&gt;: &lt;code&gt;In&lt;/code&gt;, &lt;code&gt;NotIn&lt;/code&gt; (perfect for country codes, user segments)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Numeric comparisons&lt;/strong&gt;: &lt;code&gt;GreaterThan&lt;/code&gt;, &lt;code&gt;LessThan&lt;/code&gt; (age, account value, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Date operations&lt;/strong&gt;: &lt;code&gt;Before&lt;/code&gt;, &lt;code&gt;After&lt;/code&gt; (account creation date, subscription expiry)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version comparisons&lt;/strong&gt;: &lt;code&gt;VersionGreaterThan&lt;/code&gt;, &lt;code&gt;VersionLessThan&lt;/code&gt; (semantic versioning support)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⏰ Time-Based Scheduling (Set It and Forget It)
&lt;/h3&gt;

&lt;p&gt;Remember the last time you had to wake up at 3 AM to manually enable a Black Friday sale? Yeah, me too. ToggleNet's scheduling system eliminates those moments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Schedule your Black Friday sale to start automatically&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_scheduler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ScheduleActivationAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"black-friday-deals"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// Start time&lt;/span&gt;
    &lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromDays&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;                &lt;span class="c1"&gt;// Duration (through Cyber Monday)&lt;/span&gt;
    &lt;span class="s"&gt;"America/New_York"&lt;/span&gt;                   &lt;span class="c1"&gt;// Timezone support&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Need an emergency feature toggle? Activate temporarily right now&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_scheduler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ScheduleTemporaryActivationAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"emergency-maintenance-banner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromHours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Auto-disable in 2 hours&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; The timezone support is a game-changer for global applications. No more UTC conversion headaches.&lt;/p&gt;

&lt;h3&gt;
  
  
  📊 Built-in Analytics (No More Guessing)
&lt;/h3&gt;

&lt;p&gt;Stop wondering if anyone actually uses your features:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Automatic usage tracking&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;showNewCheckout&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_featureFlagManager&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsEnabledAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"redesigned-checkout"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;userContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Custom event tracking for conversions&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checkoutCompleted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_featureFlagManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TrackFeatureUsageAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"redesigned-checkout"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="s"&gt;"checkout-completed"&lt;/span&gt; &lt;span class="c1"&gt;// Custom context&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The analytics dashboard shows you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Who's using what&lt;/strong&gt; - User engagement per feature&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conversion tracking&lt;/strong&gt; - Did that new feature actually improve metrics?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-based insights&lt;/strong&gt; - Usage trends over 7, 30, or 90 days&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A/B test results&lt;/strong&gt; - Real data to drive decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎛 Professional Dashboard (No Code Required)
&lt;/h3&gt;

&lt;p&gt;Here's where ToggleNet really shines. While most open-source libraries leave you writing custom admin interfaces, ToggleNet includes a polished, production-ready dashboard:&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%2Fzxmlcwn8zbhdm61lxlhm.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%2Fzxmlcwn8zbhdm61lxlhm.png" alt="ToggleNet Dashboard" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What your non-technical team members will love:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Visual rule builder&lt;/strong&gt; - Create complex targeting without touching code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time testing&lt;/strong&gt; - See exactly how features appear for different users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scheduling interface&lt;/strong&gt; - Set up campaigns with a few clicks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analytics overview&lt;/strong&gt; - Charts and metrics that actually make sense&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure access&lt;/strong&gt; - Built-in authentication, no additional setup needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What you'll love as a developer:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No maintenance&lt;/strong&gt; - It just works&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive design&lt;/strong&gt; - Looks great on mobile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast performance&lt;/strong&gt; - Built with ASP.NET Core&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customizable&lt;/strong&gt; - Extend or modify as needed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started (Seriously, It's This Easy)
&lt;/h2&gt;

&lt;p&gt;Let me show you how quickly you can get ToggleNet running. This isn't marketing fluff - you can literally have feature flags working in under 10 minutes:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install the Packages
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package ToggleNet.Core
dotnet add package ToggleNet.EntityFrameworkCore
dotnet add package ToggleNet.Dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Configure Your Services
&lt;/h3&gt;

&lt;p&gt;Add this to your &lt;code&gt;Program.cs&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;ToggleNet.Dashboard&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;ToggleNet.Dashboard.Auth&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;ToggleNet.EntityFrameworkCore.Extensions&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Database setup (PostgreSQL or SQL Server)&lt;/span&gt;
&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddEfCoreFeatureStorePostgres&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetConnectionString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DefaultConnection"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s"&gt;"Development"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Dashboard with secure access&lt;/span&gt;
&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddToggleNetDashboard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DashboardUserCredential&lt;/span&gt; 
    &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="n"&gt;Username&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"admin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;Password&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"your-secure-password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Change this!&lt;/span&gt;
        &lt;span class="n"&gt;DisplayName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Administrator"&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Enable the dashboard&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseToggleNetDashboard&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Available at /feature-flags&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Use It in Your Controllers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductController&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Controller&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;FeatureFlagManager&lt;/span&gt; &lt;span class="n"&gt;_featureFlagManager&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ProductController&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FeatureFlagManager&lt;/span&gt; &lt;span class="n"&gt;featureFlagManager&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_featureFlagManager&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;featureFlagManager&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IActionResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;Details&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Check if user should see the new product recommendations&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;userAttributes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;GetUserCountry&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"isPremium"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HasClaim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"plan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"premium"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;showRecommendations&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_featureFlagManager&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsEnabledAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ai-recommendations"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Identity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;userAttributes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ProductViewModel&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Product&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;GetProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;ShowAIRecommendations&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;showRecommendations&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;View&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;That's it.&lt;/strong&gt; Your app now has enterprise-grade feature flag capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Scenarios (Where ToggleNet Shines)
&lt;/h2&gt;

&lt;p&gt;Let me share some scenarios where ToggleNet has proven its worth in production applications:&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Scenario 1: The "Gradual Enterprise Rollout"
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Week 1: Start with beta users only&lt;/span&gt;
&lt;span class="c1"&gt;// Targeting: betaTester = true, 100% rollout&lt;/span&gt;

&lt;span class="c1"&gt;// Week 2: Add enterprise customers in North America  &lt;/span&gt;
&lt;span class="c1"&gt;// Targeting: plan = "enterprise" AND country IN ["US", "CA"], 25% rollout&lt;/span&gt;

&lt;span class="c1"&gt;// Week 3: All enterprise customers globally&lt;/span&gt;
&lt;span class="c1"&gt;// Targeting: plan = "enterprise", 75% rollout&lt;/span&gt;

&lt;span class="c1"&gt;// Week 4: Everyone gets it&lt;/span&gt;
&lt;span class="c1"&gt;// No targeting rules, 100% rollout&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this works:&lt;/strong&gt; You catch issues early with your most engaged users, then gradually expand. If something breaks, you're not taking down your entire customer base.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌍 Scenario 2: The "Regional Compliance Feature"
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// GDPR compliance features only for EU users&lt;/span&gt;
&lt;span class="c1"&gt;// Targeting: country IN ["DE", "FR", "IT", "ES", "NL", ...], 100% rollout&lt;/span&gt;

&lt;span class="c1"&gt;// Different data retention policies by region&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;userRegion&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;GetUserRegion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;showExtendedRetention&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_featureFlagManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsEnabledAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"extended-data-retention"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;userRegion&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📱 Scenario 3: The "Mobile-First Feature"
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// New mobile checkout flow - only for mobile users with recent app versions&lt;/span&gt;
&lt;span class="c1"&gt;// Targeting: deviceType = "mobile" AND appVersion &amp;gt;= "3.2.0", 50% rollout&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;userContext&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;UserContext&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;UserId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Attributes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"deviceType"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsMobile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"mobile"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"desktop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"appVersion"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;GetAppVersion&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"connectionSpeed"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;GetConnectionSpeed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ⚡ Scenario 4: The "Emergency Response"
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Black Friday disaster? Enable maintenance mode instantly&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_scheduler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ScheduleTemporaryActivationAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"maintenance-mode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromMinutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Buy yourself time to fix things&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Traffic spike overwhelming a new feature? Dial it back immediately&lt;/span&gt;
&lt;span class="c1"&gt;// Change rollout from 100% to 10% via dashboard - no deployment needed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🧪 Scenario 5: The "A/B Test That Actually Matters"
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Test: Does the new onboarding flow improve conversion?&lt;/span&gt;
&lt;span class="c1"&gt;// Group A: Original flow (50% of new users)&lt;/span&gt;
&lt;span class="c1"&gt;// Group B: New flow (50% of new users)&lt;/span&gt;

&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;useNewOnboarding&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_featureFlagManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsEnabledAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"streamlined-onboarding"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; 
    &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"isNewUser"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"signupDate"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UtcNow&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Track the important metrics&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;onboardingCompleted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_featureFlagManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TrackFeatureUsageAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;useNewOnboarding&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"streamlined-onboarding"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"original-onboarding"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"onboarding-completed"&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Numbers Game: ToggleNet vs. SaaS Solutions
&lt;/h2&gt;

&lt;p&gt;Let's talk ROI. Here's what you're actually saving:&lt;/p&gt;

&lt;h3&gt;
  
  
  💰 Cost Comparison (Annual)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;th&gt;Small Team (5 devs)&lt;/th&gt;
&lt;th&gt;Medium Team (25 devs)&lt;/th&gt;
&lt;th&gt;Enterprise (100+ devs)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LaunchDarkly&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$1,200-$2,400/year&lt;/td&gt;
&lt;td&gt;$6,000-$12,000/year&lt;/td&gt;
&lt;td&gt;$25,000-$50,000+/year&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Harness (Split.io)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$2,000-$4,000/year&lt;/td&gt;
&lt;td&gt;$10,000-$20,000/year&lt;/td&gt;
&lt;td&gt;$40,000-$80,000+/year&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Optimizely&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$3,000-$6,000/year&lt;/td&gt;
&lt;td&gt;$15,000-$30,000/year&lt;/td&gt;
&lt;td&gt;$60,000-$120,000+/year&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ToggleNet&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Pricing estimates based on typical usage patterns and publicly available information. Actual costs may vary based on usage volume, MAU, and specific requirements.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Feature Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;SaaS Solutions&lt;/th&gt;
&lt;th&gt;ToggleNet&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Advanced Targeting&lt;/td&gt;
&lt;td&gt;✅ ($$$)&lt;/td&gt;
&lt;td&gt;✅ (Free)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time-based Scheduling&lt;/td&gt;
&lt;td&gt;✅ ($$$)&lt;/td&gt;
&lt;td&gt;✅ (Free)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analytics Dashboard&lt;/td&gt;
&lt;td&gt;✅ ($$$)&lt;/td&gt;
&lt;td&gt;✅ (Free)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unlimited Flags&lt;/td&gt;
&lt;td&gt;❌ (Limits)&lt;/td&gt;
&lt;td&gt;✅ (Unlimited)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unlimited Users&lt;/td&gt;
&lt;td&gt;❌ (Per-seat pricing)&lt;/td&gt;
&lt;td&gt;✅ (Unlimited)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Sovereignty&lt;/td&gt;
&lt;td&gt;❌ (Their servers)&lt;/td&gt;
&lt;td&gt;✅ (Your infrastructure)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom Integrations&lt;/td&gt;
&lt;td&gt;❌ (API limits)&lt;/td&gt;
&lt;td&gt;✅ (Full control)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Bottom line:&lt;/strong&gt; Even a small team saves thousands per year, and you get more features and control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production-Ready From Day One
&lt;/h2&gt;

&lt;p&gt;Don't let "open source" fool you into thinking this is a hobby project. ToggleNet is built for production:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔒 Security First
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Built-in authentication&lt;/strong&gt; - Dashboard is secured by default&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment isolation&lt;/strong&gt; - Separate configs for dev/staging/prod&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit trails&lt;/strong&gt; - Every change is logged&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data encryption&lt;/strong&gt; - Your feature flag data stays private&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚡ Performance Optimized
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minimal overhead&lt;/strong&gt; - Microsecond evaluation times&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database agnostic&lt;/strong&gt; - PostgreSQL or SQL Server support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connection pooling&lt;/strong&gt; - Handles high-traffic scenarios&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Async-first&lt;/strong&gt; - Non-blocking operations throughout&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛡 Battle-Tested
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive test suite&lt;/strong&gt; - Unit, integration, and performance tests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD pipeline&lt;/strong&gt; - Automated testing before every release&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-world usage&lt;/strong&gt; - Running in production environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic versioning&lt;/strong&gt; - Predictable updates and compatibility&lt;/li&gt;
&lt;/ul&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%2Fhv9bmvry59cx5lxlqtvu.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%2Fhv9bmvry59cx5lxlqtvu.png" alt="Analytics Dashboard" width="800" height="834"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Real-time analytics showing feature usage patterns and user engagement&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Choose ToggleNet?
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Compared to SaaS Solutions:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;No monthly costs&lt;/strong&gt; - One-time setup, forever free&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Data sovereignty&lt;/strong&gt; - Your data stays in your infrastructure&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;No limits&lt;/strong&gt; - Unlimited features, users, and requests&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Custom integrations&lt;/strong&gt; - Extend as needed&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Compared to Simple Libraries:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Advanced targeting&lt;/strong&gt; - Beyond simple percentage rollouts&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Time-based scheduling&lt;/strong&gt; - Automated feature lifecycle&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Built-in dashboard&lt;/strong&gt; - No need for separate UI tools&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Analytics included&lt;/strong&gt; - Track usage without external tools&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Compared to Building Your Own:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Battle-tested&lt;/strong&gt; - Production-ready with comprehensive tests&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Feature-complete&lt;/strong&gt; - Advanced capabilities out of the box&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Maintained and supported&lt;/strong&gt; - Regular updates and improvements&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Documentation&lt;/strong&gt; - Comprehensive guides and examples&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Getting Involved
&lt;/h2&gt;

&lt;p&gt;ToggleNet is open source and welcomes contributions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/carloluisito/ToggleNet" rel="noopener noreferrer"&gt;https://github.com/carloluisito/ToggleNet&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NuGet Package&lt;/strong&gt;: Available on NuGet Gallery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: Comprehensive guides and examples&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sample Application&lt;/strong&gt;: Complete working example included&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Contributing
&lt;/h3&gt;

&lt;p&gt;We welcome:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐛 Bug reports and fixes&lt;/li&gt;
&lt;li&gt;💡 Feature requests and implementations&lt;/li&gt;
&lt;li&gt;📚 Documentation improvements&lt;/li&gt;
&lt;li&gt;🧪 Additional test coverage&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Try It Today
&lt;/h2&gt;

&lt;p&gt;Ready to modernize your feature flag strategy? ToggleNet provides enterprise-grade functionality without the enterprise price tag.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Quick start&lt;/span&gt;
dotnet new webapi &lt;span class="nt"&gt;-n&lt;/span&gt; MyToggleNetApp
&lt;span class="nb"&gt;cd &lt;/span&gt;MyToggleNetApp
dotnet add package ToggleNet.Core
dotnet add package ToggleNet.EntityFrameworkCore
dotnet add package ToggleNet.Dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check out the &lt;a href="https://github.com/carloluisito/ToggleNet/tree/main/samples/SampleWebApp" rel="noopener noreferrer"&gt;complete sample application&lt;/a&gt; to see ToggleNet in action, or dive into the &lt;a href="https://github.com/carloluisito/ToggleNet#readme" rel="noopener noreferrer"&gt;comprehensive documentation&lt;/a&gt; to learn more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Feature flags are no longer optional in modern software development. The question isn't whether you need them - it's whether you want to pay hundreds or thousands per month for functionality you can get for free.&lt;/p&gt;

&lt;p&gt;ToggleNet proves that open source doesn't mean "basic" or "enterprise features sold separately." It means a community of developers building something better together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try ToggleNet today.&lt;/strong&gt; Your finance team will thank you, your developers will love the flexibility, and your customers will benefit from safer, more controlled feature rollouts.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's your experience with feature flag solutions? Have you calculated how much you're spending on SaaS alternatives? Drop a comment below and let's discuss! For questions, contributions, or just to say hi, visit the &lt;a href="https://github.com/carloluisito/ToggleNet" rel="noopener noreferrer"&gt;ToggleNet GitHub repository&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>featureflags</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
