<?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</title>
    <description>The most recent home feed on DEV Community.</description>
    <link>https://dev.to</link>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed"/>
    <language>en</language>
    <item>
      <title>Why Every Developer Will Eventually Design AI Systems</title>
      <dc:creator>Jaideep Parashar</dc:creator>
      <pubDate>Fri, 06 Mar 2026 06:18:41 +0000</pubDate>
      <link>https://dev.to/jaideepparashar/why-every-developer-will-eventually-design-ai-systems-1khf</link>
      <guid>https://dev.to/jaideepparashar/why-every-developer-will-eventually-design-ai-systems-1khf</guid>
      <description>&lt;p&gt;For most of software history, developers primarily built deterministic systems.&lt;/p&gt;

&lt;p&gt;You wrote logic.&lt;br&gt;
You defined rules.&lt;br&gt;
The machine executed them.&lt;/p&gt;

&lt;p&gt;The developer’s job was to translate human intent into precise instructions.&lt;/p&gt;

&lt;p&gt;AI introduces a different paradigm.&lt;/p&gt;

&lt;p&gt;Instead of encoding every rule manually, developers increasingly design systems that interpret context, generate outputs, and make decisions under uncertainty.&lt;/p&gt;

&lt;p&gt;This doesn’t create a new profession separate from software engineering.&lt;/p&gt;

&lt;p&gt;It gradually transforms the role itself.&lt;/p&gt;

&lt;p&gt;Over time, nearly every developer will find themselves designing AI systems—whether they planned to or not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Is Becoming a General Infrastructure Layer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the past, AI lived in specialized domains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;research labs&lt;/li&gt;
&lt;li&gt;recommendation engines&lt;/li&gt;
&lt;li&gt;search ranking systems&lt;/li&gt;
&lt;li&gt;large enterprise data platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Today it is becoming embedded everywhere.&lt;/p&gt;

&lt;p&gt;Applications increasingly include AI for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;natural language interaction&lt;/li&gt;
&lt;li&gt;automation&lt;/li&gt;
&lt;li&gt;classification and prediction&lt;/li&gt;
&lt;li&gt;personalization&lt;/li&gt;
&lt;li&gt;decision support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just as web APIs and cloud services became universal infrastructure, AI capabilities are now integrating into everyday software.&lt;/p&gt;

&lt;p&gt;Developers don’t need to specialize in machine learning to use them.&lt;/p&gt;

&lt;p&gt;They simply become part of the system stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Shift From Rule-Based Systems to Context-Based Systems&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Traditional software requires developers to specify every behavior.&lt;/p&gt;

&lt;p&gt;AI-based systems operate differently.&lt;/p&gt;

&lt;p&gt;Instead of defining exact rules, developers increasingly define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;context&lt;/li&gt;
&lt;li&gt;constraints&lt;/li&gt;
&lt;li&gt;goals&lt;/li&gt;
&lt;li&gt;evaluation criteria&lt;/li&gt;
&lt;li&gt;boundaries for safe operation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system interprets these elements to generate outcomes dynamically.&lt;/p&gt;

&lt;p&gt;This moves engineering from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;writing explicit logic&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;designing decision environments.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Developers become responsible for shaping how intelligent behavior emerges within the system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developers Already Design Systems; AI Expands That Responsibility&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Software engineers have always designed systems.&lt;/p&gt;

&lt;p&gt;They decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;architecture&lt;/li&gt;
&lt;li&gt;data flows&lt;/li&gt;
&lt;li&gt;service boundaries&lt;/li&gt;
&lt;li&gt;error handling&lt;/li&gt;
&lt;li&gt;performance trade-offs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI systems add new dimensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;behavior variability&lt;/li&gt;
&lt;li&gt;probabilistic outputs&lt;/li&gt;
&lt;li&gt;feedback loops&lt;/li&gt;
&lt;li&gt;evaluation metrics&lt;/li&gt;
&lt;li&gt;model selection and orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are extensions of existing engineering responsibilities, not entirely new disciplines.&lt;/p&gt;

&lt;p&gt;Developers simply move further into systems-level thinking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Features Gradually Turn Into AI Products&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Many teams begin by adding small AI capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chat interfaces&lt;/li&gt;
&lt;li&gt;automated summaries&lt;/li&gt;
&lt;li&gt;content suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But once these features prove useful, they expand.&lt;/p&gt;

&lt;p&gt;Over time they influence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;user experience&lt;/li&gt;
&lt;li&gt;business workflows&lt;/li&gt;
&lt;li&gt;automation pipelines&lt;/li&gt;
&lt;li&gt;operational decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, the application itself becomes AI-native.&lt;/p&gt;

&lt;p&gt;And the developers maintaining it must understand how the AI behaves within the system.&lt;/p&gt;

&lt;p&gt;This naturally pushes developers into AI system design roles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineering Becomes Behavior Design&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI systems behave differently from traditional software.&lt;/p&gt;

&lt;p&gt;They can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;produce varying outputs&lt;/li&gt;
&lt;li&gt;change behavior over time&lt;/li&gt;
&lt;li&gt;respond to subtle context differences&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developers must therefore design systems that answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What constitutes a correct output?&lt;/li&gt;
&lt;li&gt;When should a human intervene?&lt;/li&gt;
&lt;li&gt;How do we detect drift or degraded performance?&lt;/li&gt;
&lt;li&gt;What happens when the AI is uncertain?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are engineering challenges focused on behavior governance, not just code execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Doesn’t Require Becoming an ML Researcher&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Designing AI systems does not require every developer to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;train models from scratch&lt;/li&gt;
&lt;li&gt;study advanced statistics&lt;/li&gt;
&lt;li&gt;become machine learning specialists&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead, developers increasingly work with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APIs and foundation models&lt;/li&gt;
&lt;li&gt;orchestration frameworks&lt;/li&gt;
&lt;li&gt;evaluation tools&lt;/li&gt;
&lt;li&gt;workflow automation layers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The focus shifts toward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;integration&lt;/li&gt;
&lt;li&gt;system architecture&lt;/li&gt;
&lt;li&gt;operational monitoring&lt;/li&gt;
&lt;li&gt;safe deployment practices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In many cases, the hardest problems are product and system design questions, not mathematical ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Systems Require Ongoing Operations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Traditional software often stabilizes once deployed.&lt;/p&gt;

&lt;p&gt;AI systems behave more like living systems.&lt;/p&gt;

&lt;p&gt;They require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;continuous monitoring&lt;/li&gt;
&lt;li&gt;evaluation of output quality&lt;/li&gt;
&lt;li&gt;updates as models evolve&lt;/li&gt;
&lt;li&gt;adjustments to prompts or context&lt;/li&gt;
&lt;li&gt;human oversight in sensitive cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means developers increasingly participate in AI operations alongside traditional DevOps practices.&lt;/p&gt;

&lt;p&gt;The lifecycle of the system becomes continuous rather than static.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Competitive Advantage Moves Toward System Thinking&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because AI simplifies certain implementation tasks, the most valuable skills shift toward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;problem framing&lt;/li&gt;
&lt;li&gt;architectural clarity&lt;/li&gt;
&lt;li&gt;workflow design&lt;/li&gt;
&lt;li&gt;trade-off evaluation&lt;/li&gt;
&lt;li&gt;reliability and safety planning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developers who understand how AI fits into larger systems will deliver the most value.&lt;/p&gt;

&lt;p&gt;The difference will not be who can call an AI API.&lt;/p&gt;

&lt;p&gt;It will be who can design systems where AI works reliably and responsibly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Transformation Is Inevitable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;History shows a clear pattern.&lt;/p&gt;

&lt;p&gt;Developers once had to manage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;physical servers&lt;/li&gt;
&lt;li&gt;networking hardware&lt;/li&gt;
&lt;li&gt;operating systems manually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cloud infrastructure abstracted those concerns.&lt;/p&gt;

&lt;p&gt;Later, developers integrated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;web services&lt;/li&gt;
&lt;li&gt;authentication platforms&lt;/li&gt;
&lt;li&gt;distributed systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each wave introduced complexity that became standard practice.&lt;/p&gt;

&lt;p&gt;AI is following the same path.&lt;/p&gt;

&lt;p&gt;Today it feels specialized.&lt;/p&gt;

&lt;p&gt;Within a decade it will feel foundational.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Takeaway&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Developers are not being replaced by AI.&lt;/p&gt;

&lt;p&gt;They are being asked to operate at a higher level of abstraction.&lt;/p&gt;

&lt;p&gt;Instead of writing every rule, they will increasingly design systems that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;interpret context&lt;/li&gt;
&lt;li&gt;make probabilistic decisions&lt;/li&gt;
&lt;li&gt;collaborate with human judgment&lt;/li&gt;
&lt;li&gt;improve through feedback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI does not remove the need for developers.&lt;/p&gt;

&lt;p&gt;It expands their responsibility from writing deterministic programs to designing intelligent systems.&lt;/p&gt;

&lt;p&gt;And as AI becomes embedded in every layer of software, that responsibility will eventually touch nearly every developer.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>OpenTableAPI for Developers: Build APIs from Your Table Data</title>
      <dc:creator>Priyantha Weerasinghe</dc:creator>
      <pubDate>Fri, 06 Mar 2026 06:12:46 +0000</pubDate>
      <link>https://dev.to/priyantha_weerasinghe_1d4/opentableapi-for-developers-build-apis-from-your-table-data-27nh</link>
      <guid>https://dev.to/priyantha_weerasinghe_1d4/opentableapi-for-developers-build-apis-from-your-table-data-27nh</guid>
      <description>&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.opentableapi.com" rel="noopener noreferrer"&gt;https://www.opentableapi.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Modern applications rely heavily on APIs to connect services, power user interfaces, and share data between systems. Traditionally, developers build backend applications, manage servers, design databases, and implement CRUD APIs just to expose simple data.&lt;br&gt;
OpenTableAPI simplifies this entire process.&lt;br&gt;
OpenTableAPI allows developers to turn table-based business data directly into APIs without building a backend system from scratch.&lt;br&gt;
Instead of creating and hosting a backend application with a database, teams can use OpenTableAPI as an online CMS and API platform.&lt;br&gt;
This means:&lt;br&gt;
No need to build CRUD APIs&lt;br&gt;
No need to manage a backend server&lt;br&gt;
No need to host a database on a VPS&lt;/p&gt;

&lt;p&gt;Developers can simply create tables, manage data through a CMS interface, and instantly access the data through APIs.&lt;br&gt;
This makes OpenTableAPI a powerful option for teams that want a CMS-like system for data management combined with developer-ready APIs.&lt;/p&gt;

&lt;p&gt;Why Developers Use OpenTableAPI &lt;br&gt;
Developers and teams use OpenTableAPI because it removes the complexity of building and maintaining backend infrastructure.&lt;br&gt;
Key benefits include:&lt;br&gt;
Instant APIs from table data&lt;/p&gt;

&lt;p&gt;Online CMS interface to manage records&lt;br&gt;
No need to build a backend application&lt;br&gt;
No need to host a VPS server for APIs&lt;br&gt;
No need to manage a database server&lt;br&gt;
API-first architecture for developers&lt;/p&gt;

&lt;p&gt;Instead of building a traditional stack like:&lt;br&gt;
Frontend → Backend Application → Database&lt;br&gt;
OpenTableAPI simplifies it to:&lt;br&gt;
Frontend / Backend App → OpenTableAPI&lt;br&gt;
This significantly reduces development time and infrastructure management.&lt;/p&gt;

&lt;p&gt;OpenTableAPI as an Online CMS &lt;br&gt;
OpenTableAPI works similarly to a content management system (CMS) but is designed for developers who need APIs.&lt;br&gt;
You can:&lt;br&gt;
Create tables&lt;br&gt;
Define columns&lt;br&gt;
Insert and edit records&lt;br&gt;
Manage operational data&lt;br&gt;
Access everything through APIs&lt;/p&gt;

&lt;p&gt;Just like a CMS, users can manage content through a web interface, while developers can consume the same data through REST APIs.&lt;br&gt;
This makes it ideal for:&lt;br&gt;
Product data&lt;/p&gt;

&lt;p&gt;Internal tools&lt;br&gt;
Operational dashboards&lt;br&gt;
Configuration data&lt;br&gt;
Lightweight SaaS applications&lt;/p&gt;

&lt;p&gt;Core API Concept 📦&lt;br&gt;
In OpenTableAPI, each table automatically becomes an API resource.&lt;br&gt;
For every table, the system generates a set of standard REST endpoints.&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%2F67zpnfptcf7dvah0rc44.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%2F67zpnfptcf7dvah0rc44.png" alt=" " width="782" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because every table follows the same structure, developers can integrate quickly without learning custom API patterns.&lt;/p&gt;

&lt;p&gt;Authentication and Access Control &lt;br&gt;
OpenTableAPI secures all requests using API keys.&lt;br&gt;
Requests must include the API key in the header:&lt;br&gt;
X-API-Key: &lt;br&gt;
Each project can generate multiple API keys, and every key can have different permissions.&lt;br&gt;
Permissions can be restricted by:&lt;br&gt;
Table&lt;/p&gt;

&lt;p&gt;Endpoint type (GET, POST, PUT, DELETE)&lt;/p&gt;

&lt;p&gt;This allows developers to control exactly who can read or modify data.&lt;/p&gt;

&lt;p&gt;CMS-Style Permission System &lt;br&gt;
OpenTableAPI includes a CMS-style permission model.&lt;br&gt;
You can control access similar to how permissions work in a traditional CMS.&lt;br&gt;
Users or API keys can be given:&lt;br&gt;
Read Only Access&lt;br&gt;
Users can view data but cannot modify it.&lt;br&gt;
Example use cases:&lt;br&gt;
Analytics dashboards&lt;/p&gt;

&lt;p&gt;Public APIs&lt;/p&gt;

&lt;p&gt;Frontend applications displaying data&lt;/p&gt;

&lt;p&gt;Edit Access&lt;br&gt;
Users can create and update records.&lt;br&gt;
Example use cases:&lt;br&gt;
Admin dashboards&lt;/p&gt;

&lt;p&gt;Internal operational tools&lt;/p&gt;

&lt;p&gt;Content editors&lt;/p&gt;

&lt;p&gt;This ensures safe collaboration between teams while protecting important data.&lt;/p&gt;

&lt;p&gt;Example Usage Flow &lt;br&gt;
A typical developer workflow looks like this:&lt;br&gt;
Create a project&lt;/p&gt;

&lt;p&gt;Create tables and define columns&lt;/p&gt;

&lt;p&gt;Add or manage records through the CMS&lt;/p&gt;

&lt;p&gt;Generate API keys&lt;/p&gt;

&lt;p&gt;Configure table and endpoint permissions&lt;/p&gt;

&lt;p&gt;Access data through API endpoints&lt;/p&gt;

&lt;p&gt;Within minutes, developers can go from structured data to a working API.&lt;/p&gt;

&lt;p&gt;Best Practices for Developers &lt;br&gt;
To build secure and scalable integrations, follow these best practices.&lt;br&gt;
Use Separate Projects for Environments&lt;br&gt;
Create different projects for:&lt;br&gt;
Development&lt;/p&gt;

&lt;p&gt;Staging&lt;/p&gt;

&lt;p&gt;Production&lt;/p&gt;

&lt;p&gt;This prevents development changes from affecting production data.&lt;/p&gt;

&lt;p&gt;Use Separate API Keys for Applications&lt;br&gt;
Use different API keys for:&lt;br&gt;
Frontend applications&lt;/p&gt;

&lt;p&gt;Backend services&lt;/p&gt;

&lt;p&gt;Internal tools&lt;/p&gt;

&lt;p&gt;This allows you to control and restrict access for each system independently.&lt;/p&gt;

&lt;p&gt;Apply Least-Privilege Permissions&lt;br&gt;
Enable only the required endpoints.&lt;br&gt;
Example:&lt;br&gt;
Frontend apps → GET only&lt;/p&gt;

&lt;p&gt;Admin tools → POST, PUT&lt;/p&gt;

&lt;p&gt;Automation jobs → specific tables only&lt;/p&gt;

&lt;p&gt;Validate Input Before Sending to the API&lt;br&gt;
Applications should validate user input before sending data to OpenTableAPI to avoid incorrect or malformed records.&lt;/p&gt;

&lt;p&gt;Rotate API Keys Periodically&lt;br&gt;
Regular API key rotation improves system security and prevents long-term exposure if a key is leaked.&lt;/p&gt;

&lt;p&gt;Business Value &lt;br&gt;
OpenTableAPI bridges the gap between data management and developer APIs.&lt;br&gt;
It allows teams to:&lt;br&gt;
Manage data through a CMS-style interface&lt;/p&gt;

&lt;p&gt;Access the same data through structured APIs&lt;/p&gt;

&lt;p&gt;Eliminate the need for custom backend infrastructure&lt;/p&gt;

&lt;p&gt;This approach provides:&lt;br&gt;
Faster development cycles&lt;/p&gt;

&lt;p&gt;Lower infrastructure costs&lt;/p&gt;

&lt;p&gt;Simpler collaboration between developers and non-technical teams&lt;/p&gt;

&lt;p&gt;Instead of maintaining a backend server and database, teams can use OpenTableAPI as their data backend and API layer.&lt;/p&gt;

&lt;p&gt;OpenTableAPI transforms simple tables into a powerful CMS and API platform — allowing developers to build applications faster without managing backend infrastructure.&lt;/p&gt;

</description>
      <category>api</category>
      <category>backend</category>
      <category>tooling</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Vibe Coding Challenge - Day 8: Case Files Dedective Game</title>
      <dc:creator>labdays</dc:creator>
      <pubDate>Fri, 06 Mar 2026 06:04:19 +0000</pubDate>
      <link>https://dev.to/labdays/vibe-coding-challenge-day-8-case-files-dedective-game-33o7</link>
      <guid>https://dev.to/labdays/vibe-coding-challenge-day-8-case-files-dedective-game-33o7</guid>
      <description>&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%2Fgk391ywtq8pne29sdu5q.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%2Fgk391ywtq8pne29sdu5q.webp" alt=" " width="800" height="774"&gt;&lt;/a&gt;&lt;br&gt;
Each one is a unique and different detective game. Artificial Conan Doyle&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Announcement&lt;/strong&gt;&lt;br&gt;
My detective game, Case Files, which I released today, seems to be a good example of this type of game in terms of visuals and interface. You can create case files on any topic and content you want, collect clues, and examine suspects like a detective.&lt;br&gt;
If you'd like to try it, the link is below 👇&lt;br&gt;
&lt;a href="https://casefiles.labdays.io/" rel="noopener noreferrer"&gt;casefiles.labdays.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context&lt;/strong&gt;&lt;br&gt;
I started the Vibe Coding Challenge. I plan to release a new product every day, and today is my 7th day. You can visit my website (&lt;a href="https://labdays.io/" rel="noopener noreferrer"&gt;labdays.io&lt;/a&gt;) to learn about the process.&lt;/p&gt;

&lt;p&gt;Notes from the 8th day of the Challenge&lt;br&gt;
AI is quite good at the frontend, but when it comes to the backend, it gravitates towards stacks with external dependencies and requires dashboard setups like Supabase.&lt;br&gt;
I'm using Vercel for deployments, and the backend operations are resource-intensive. I need to find a more cost-effective stack and deployment option.&lt;br&gt;
The best thing about Vibe Coding is that you don't even know the features on your site. You just think, "Wow, I hadn't thought of that, it's amazing!"&lt;br&gt;
I admire the work that comes out. However, I'm also curious how far it can continue to be developed. It leaps 100 steps forward initially. However, when you try to build upon it, it cannot linearly add another 100 steps. Its capabilities decrease as the codebase grows.&lt;br&gt;
Doing a project every day is really tiring, but also satisfying. I couldn't continue without the dopamine it gives me.&lt;br&gt;
People are slowly starting to notice my projects. I need to produce more advanced work and develop open-source projects that everyone can use.&lt;br&gt;
I'm realizing that everything digital is starting to become worthless with artificial intelligence. It is not only daily projects like mine that are losing value. I doubt even the projects that are number 1 on Product Hunt are making any profit. I think nowadays, developers are creating for each other in the digital environment. Ordinary people are completely oblivious to all this.&lt;br&gt;
Digital products have become devalued. We need to try to create things that bridge the gap between the digital world and the real world.&lt;br&gt;
The more connected something is to the physical world, the more valuable it becomes.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>What is Engineer persona?</title>
      <dc:creator>Pavanipriya Sajja</dc:creator>
      <pubDate>Fri, 06 Mar 2026 06:01:42 +0000</pubDate>
      <link>https://dev.to/priya_sajja_c336921bbda87/what-is-engineer-persona-5e29</link>
      <guid>https://dev.to/priya_sajja_c336921bbda87/what-is-engineer-persona-5e29</guid>
      <description>&lt;h2&gt;
  
  
  What is an Engineer persona in a user research method?
&lt;/h2&gt;

&lt;p&gt;A user persona is a &lt;strong&gt;research-based&lt;/strong&gt;, fictional but realistic representation of a user group, built from patterns found in &lt;strong&gt;real data, interviews, and observations&lt;/strong&gt;. It gives your team a shared mental model of who you're building for.&lt;/p&gt;

&lt;p&gt;For Example: A persona for a platform Engineer isn’t one specific person at your company. It's what you learned from interviewing 15 platform engineers across different orgs, distilled into one coherent, usable profile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it is important to consider?:
&lt;/h2&gt;

&lt;p&gt;Developer experience projects fail not because engineers lack skill, but because teams build for an imagined user instead of a researched one. Personas make the real user visible inside engineering decisions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;73% of DevEx friction&lt;/strong&gt; comes from tools not matching how developers actually think and work — not from technical limitations alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3X Teams&lt;/strong&gt; using personas in design reviews are significantly more likely to catch usability issues before engineering investment begins.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How these personas are useful:
&lt;/h2&gt;

&lt;p&gt;These personas help teams make better decisions by keeping real users at the center of every conversation. Instead of guessing, debates and discussions are grounded in actual evidence from users. Features get prioritized based on what engineers truly struggle with day to day.&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%2Fxkionpfz2ie87lv4xt36.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%2Fxkionpfz2ie87lv4xt36.png" alt="A hand-drawn educational infographic on a clean white background illustrating how user personas improve product development through evidence-based debates, prioritized features, task-oriented documentation, and tailored onboarding." width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Documentation is written around the tasks and goals engineers actually have, not just technical specs. Onboarding is scoped to the right starting point so new users aren't overwhelmed or under-informed. And in every meeting, there's a clear answer to the question "who is this actually for?"  which keeps everyone aligned and focused.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why DevEx is Different from Consumer UX?
&lt;/h2&gt;

&lt;p&gt;Developers are power users with strong mental models and well-established workflows. While they can handle complex systems like Kubernetes, they have very little tolerance for friction in their critical path tasks such as debugging, deploying, or scaling applications. &lt;/p&gt;

&lt;p&gt;Unlike consumer UX, which often focuses on visual delight, enjoyable interactions and engagement in platforms like Instagram, Developer Experience (DevEx) focuses on reducing cognitive load. A DevEx persona therefore emphasizes clarity, efficiency, and predictable workflows so engineers can complete high-frequency, high-stakes tasks with minimal mental effort.&lt;/p&gt;

&lt;p&gt;👉 In simple terms: Consumer UX tries to make products enjoyable, but Developer experience tries to make complex tasks faster, clearer, and less mentally exhausting.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to create a Engineer persona?
&lt;/h2&gt;

&lt;p&gt;Creating a developer persona is different from creating a typical consumer persona. Instead of focusing on demographics, DevEx personas focus on workflows, tools, goals, and friction points in technical tasks. Here is a practical step-by-step approach.&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%2Fhu6f8nr81tojxhxrwrzr.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%2Fhu6f8nr81tojxhxrwrzr.png" alt="A five-step process diagram for creating an engineer persona, featuring sketches of researchers interviewing, data mapping, persona profiles, workflow diagrams, and a final validation session with a group of developers." width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Start With Real Research Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Developer personas should always be based on real evidence, not assumptions.&lt;/p&gt;

&lt;p&gt;You can collect data through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developer surveys&lt;/li&gt;
&lt;li&gt;Interviews with engineers&lt;/li&gt;
&lt;li&gt;Observing real workflows&lt;/li&gt;
&lt;li&gt;Reviewing support issues or GitHub discussions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For teams building infrastructure platforms like Kubernetes, this might include understanding how engineers deploy, debug, and manage clusters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Identify Behavioral Patterns&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After collecting data, analyze it to find patterns in how developers work.&lt;/p&gt;

&lt;p&gt;Look for similarities in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Goals (deploy faster, automate operations, reduce downtime)&lt;/li&gt;
&lt;li&gt;Pain points (configuration complexity, unclear errors, manual steps)&lt;/li&gt;
&lt;li&gt;Workflows (CI/CD pipelines, CLI usage, automation scripts)&lt;/li&gt;
&lt;li&gt;Tool usage (for example Docker or Terraform)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These patterns help define distinct developer groups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Define the Persona Structure&lt;/strong&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%2Fnui4of1nvmo29uzpqqbn.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%2Fnui4of1nvmo29uzpqqbn.png" alt="Image of a persona with key elements" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A developer persona usually includes the following sections:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Role and Context:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Job role (Platform Engineer, Developer, SRE)&lt;br&gt;
Experience level&lt;br&gt;
Type of environment they work in&lt;/p&gt;

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

&lt;p&gt;What they are trying to achieve in their workflow&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Tasks:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;High-frequency tasks like deploying services, debugging failures, or scaling clusters&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pain Points:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Friction points in their daily workflow&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools and Ecosystem:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Technologies and platforms they regularly use&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mental Models:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How they expect systems to behave&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is useful as a decision-making tool.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;4. Focus on Workflows Instead of Demographics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In DevEx, demographics are less important. Instead of describing age or hobbies, focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deployment processes&lt;/li&gt;
&lt;li&gt;debugging patterns&lt;/li&gt;
&lt;li&gt;infrastructure management workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the persona &lt;strong&gt;actionable for engineering teams.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Validate With Developers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once the persona is drafted, review it with actual engineers. Ask questions like:&lt;/p&gt;

&lt;p&gt;Does this reflect your real workflow?&lt;br&gt;
Are the pain points accurate?&lt;br&gt;
What is missing?&lt;/p&gt;

&lt;p&gt;This step helps ensure the persona reflects &lt;strong&gt;real developer behavior&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 In simple terms: A developer persona is created by studying real developer workflows, identifying patterns in their goals and challenges, and translating those insights into a clear representation that helps teams design better developer tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools to Create Developer Personas
&lt;/h2&gt;

&lt;p&gt;What tools should we use to design personas? Typically, UX researchers create personas using tools such as Figma or Miro, or other platforms that provide ready-made persona templates. In these tools, researchers usually add persona data directly into the template format.&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%2Fja8n4pokeu4vht4t55f9.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%2Fja8n4pokeu4vht4t55f9.png" alt="An illustration contrasting Figma and Miro (marked with red crosses) against Google Docs and Sheets (marked with green checkmarks) to show that document tools are more efficient for engineer collaboration and feedback." width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This approach works well when collaborating with UX design teams or teammates who are already familiar with these design tools. However, when working with developer experience teams, it is important to choose tools that developers can easily access and use to provide feedback.&lt;/p&gt;

&lt;p&gt;For this reason, I chose to use Google Sheets to build the persona. A spreadsheet allows the information to be organized in a clear tabular format, making it easier for developers to review the data and add feedback directly.&lt;/p&gt;

&lt;p&gt;Choosing the right tool makes collaboration easier and more effective. It also helps avoid repeating the same work across multiple tools, saving both time and effort.&lt;/p&gt;

&lt;h2&gt;
  
  
  How many personas that you actually need or build and how can we prioritize?
&lt;/h2&gt;

&lt;p&gt;The number of personas you need depends on the diversity of users and their workflows, but in most DevEx or platform products, teams typically build 3–5 core personas. Building too many personas can dilute focus and make it harder for teams to use them in decision-making.&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%2Fbt7u0aniggw4cira5zss.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%2Fbt7u0aniggw4cira5zss.png" alt="An educational infographic sketch illustrating persona development, featuring a guide on building 3–5 core personas, a prioritization pyramid (Primary, Secondary, Tertiary), and a 2x2 matrix mapping " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. How Many Personas Are Usually Needed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In developer-focused products (for example platforms built around Kubernetes), teams usually identify a small set of representative roles such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Platform Engineers – manage infrastructure and clusters&lt;/li&gt;
&lt;li&gt;Application Developers – deploy and run applications&lt;/li&gt;
&lt;li&gt;SRE / Operations Engineers – maintain reliability and monitor systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each persona represents distinct &lt;strong&gt;goals, workflows, and pain points, not just job titles&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 A good rule is: Create enough personas to represent different behaviors, but not so many that teams cannot remember or use them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. How to Prioritize Personas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not all personas should have equal weight. Prioritization usually depends on three factors:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frequency of Use:&lt;/strong&gt; Which users interact with the system the most? And High-frequency users should often be prioritized.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact on the System:&lt;/strong&gt; Which users influence the platform architecture or adoption? For example, platform engineers often shape how tools like Kubernetes are configured across organizations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Critical Workflows:&lt;/strong&gt; Which personas perform the most critical tasks (deployment, scaling, debugging)? And Improving their experience usually delivers the highest value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Persona Prioritization Model&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Teams often classify personas into three levels: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Primary Persona:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;The main user the product is designed for, &lt;br&gt;
Most design decisions should support their workflows&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Secondary Persona:&lt;/strong&gt; Important users but with fewer or overlapping needs&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tertiary Persona:&lt;/strong&gt; Users who interact occasionally or indirectly&lt;/p&gt;

&lt;p&gt;👉 Focus design decisions around one primary persona, support 1–2 secondary personas, and avoid building too many additional ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Teams can use this persona?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp5cb8ue9k8iyttuw4br6.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%2Fp5cb8ue9k8iyttuw4br6.png" alt="An illustrated five-step workflow on a clean white background demonstrating how engineering teams use a developer persona to align goals, prioritize features, and improve technical decision-making." width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Personas are useful for engineering teams in several practical ways during a project. Here are five key ways they help:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Aligning the Team Around the User&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Personas give engineers a clear understanding of &lt;strong&gt;who they are building for&lt;/strong&gt;. This helps teams avoid assumptions and focus on real developer needs, especially when building complex systems like Kubernetes platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Prioritizing Features&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Personas help teams decide which features matter most. If a feature supports the primary persona’s workflow, it should usually be prioritized over less critical improvements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Identifying Workflow Friction:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By mapping goals and pain points, personas reveal where developers struggle in their workflows, helping engineering teams focus on reducing friction in high-frequency tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Supporting Design and Architecture Decisions:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Personas help engineers understand mental models and expected workflows, which guides better decisions when designing APIs, tools, or developer platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Improving Communication Across Teams:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Personas create a shared language between product, UX, and engineering teams, making discussions about user needs clearer and more consistent.&lt;/p&gt;

&lt;p&gt;👉 Personas help engineering teams align on users, prioritize features, reduce workflow friction, guide design decisions, and improve collaboration across teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion:
&lt;/h2&gt;

&lt;p&gt;Engineer personas are a practical research tool that keeps real developer needs at the center of every product decision. By grounding design and engineering conversations in actual workflows, goals, and pain points rather than assumptions. &lt;/p&gt;

&lt;p&gt;Teams can reduce friction, prioritize the right features, and build platforms that developers genuinely want to use. Whether you're designing for Kubernetes, internal tooling, or any developer facing product, a well researched persona is one of the simplest ways to close the gap between what teams build and what engineers actually need.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>opensource</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Next.js Rebuilt, NumPy in TypeScript, Six AI Predictions</title>
      <dc:creator>Adam</dc:creator>
      <pubDate>Fri, 06 Mar 2026 05:53:59 +0000</pubDate>
      <link>https://dev.to/urbanisierung/nextjs-rebuilt-numpy-in-typescript-six-ai-predictions-3ob0</link>
      <guid>https://dev.to/urbanisierung/nextjs-rebuilt-numpy-in-typescript-six-ai-predictions-3ob0</guid>
      <description>&lt;p&gt;&lt;a href="https://amplifying.ai/research/claude-code-picks" rel="noopener noreferrer"&gt;Edwin Ong and Alex Vikati&lt;/a&gt; ran Claude Code against 2,430 real repos with zero prompting — no tool names, no hints — and just watched what it picked. The result is rare, unbiased observational data on how AI coding agents actually behave when left to their own devices.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://newsletter.pragmaticengineer.com/p/the-future-of-software-engineering-with-ai" rel="noopener noreferrer"&gt;Gergely Orosz&lt;/a&gt; returns from The Pragmatic Summit with six predictions for the future of software engineering in the AI era (spoiler: your career is not over, but it is changing). &lt;a href="https://newsletter.posthog.com/p/the-engineeringification-of-everything" rel="noopener noreferrer"&gt;Ian Vanagas from PostHog&lt;/a&gt; asks the quieter question: why is every role already starting to feel like an engineering role?&lt;/p&gt;

&lt;p&gt;Cloudflare had a productive week. &lt;a href="https://blog.cloudflare.com/code-mode-mcp/" rel="noopener noreferrer"&gt;Code Mode&lt;/a&gt; compresses entire APIs into 1,000 tokens for agent context — the context window problem just shrunk. Their official &lt;a href="https://github.com/cloudflare/agents" rel="noopener noreferrer"&gt;Agents SDK&lt;/a&gt; ships for production deployments. And, for the boldest move of the week: &lt;a href="https://blog.cloudflare.com/vinext/" rel="noopener noreferrer"&gt;one Cloudflare engineer rebuilt Next.js from scratch with AI&lt;/a&gt; in a single week. Meanwhile, &lt;a href="https://stripe.dev/blog/minions-stripes-one-shot-end-to-end-coding-agents-part-2" rel="noopener noreferrer"&gt;Stripe continues the Minions series&lt;/a&gt; with part 2 of their one-shot, end-to-end coding agents.&lt;/p&gt;

&lt;p&gt;On the web platform: &lt;a href="https://una.im/border-shape" rel="noopener noreferrer"&gt;Una Kravets introduces CSS border-shape&lt;/a&gt; — the beginning of the non-rectangular web without clip-path hacks. &lt;a href="https://httptoolkit.com/blog/dictionary-compression-performance-zstd-brotli/" rel="noopener noreferrer"&gt;Tim Perry&lt;/a&gt; declares dictionary compression (zstd/Brotli) ridiculously good and finally here — web payloads could shrink dramatically overnight. There's also &lt;a href="https://stackinsight.dev/blog/memory-leak-empirical-study" rel="noopener noreferrer"&gt;a thorough empirical study across 500 repositories on frontend memory leaks&lt;/a&gt;, and &lt;a href="https://marmelab.com/blog/2026/02/23/do-you-know-psql.html" rel="noopener noreferrer"&gt;nine PostgreSQL features&lt;/a&gt; Thiery Michel wishes he'd known sooner.&lt;/p&gt;

&lt;p&gt;Tools this week: &lt;a href="https://github.com/riii111/sabiql" rel="noopener noreferrer"&gt;sabiql&lt;/a&gt; is a driver-less TUI for querying PostgreSQL from your terminal, and &lt;a href="https://github.com/dupontcyborg/numpy-ts" rel="noopener noreferrer"&gt;numpy-ts&lt;/a&gt; brings 94% of NumPy's API to TypeScript — scientific computing finally joins the JavaScript ecosystem.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

&lt;p&gt;Signup &lt;a href="https://weeklyfoo.com" rel="noopener noreferrer"&gt;here&lt;/a&gt; for the newsletter to get the weekly digest right into your inbox.&lt;/p&gt;

&lt;p&gt;Find the 13 highlighted links of &lt;a href="https://weeklyfoo.com" rel="noopener noreferrer"&gt;weeklyfoo&lt;/a&gt; #126:&lt;/p&gt;




&lt;p&gt;&lt;a href="https://amplifying.ai/research/claude-code-picks" rel="noopener noreferrer"&gt;&lt;h3&gt;What Claude Code Actually Chooses&lt;/h3&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;by Edwin Ong, Alex Vikati&lt;/p&gt;

&lt;p&gt;We pointed Claude Code at real repos 2,430 times and watched what it chose. No tool names in any prompt. Open-ended questions only.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;🚀 Read it!, ai, code, claude&lt;/small&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://blog.cloudflare.com/code-mode-mcp/" rel="noopener noreferrer"&gt;&lt;h3&gt;Code Mode&lt;/h3&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;by Matt Carey&lt;/p&gt;

&lt;p&gt;Give agents an entire API in 1,000 tokens&lt;/p&gt;

&lt;p&gt;&lt;small&gt;📰 Good to know, ai, mcp, cloudlfare&lt;/small&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://stripe.dev/blog/minions-stripes-one-shot-end-to-end-coding-agents-part-2" rel="noopener noreferrer"&gt;&lt;h3&gt;Minions&lt;/h3&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;by Alistair Gray&lt;/p&gt;

&lt;p&gt;Stripe’s one-shot, end-to-end coding agents—Part 2&lt;/p&gt;

&lt;p&gt;&lt;small&gt;📰 Good to know, ai, stripe&lt;/small&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://newsletter.posthog.com/p/the-engineeringification-of-everything" rel="noopener noreferrer"&gt;&lt;h3&gt;The engineeringification of everything&lt;/h3&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;by Ian Vanagas&lt;/p&gt;

&lt;p&gt;Why every role seems like an engineering role now (and what it means for you)&lt;/p&gt;

&lt;p&gt;&lt;small&gt;📰 Good to know, engineering&lt;/small&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://httptoolkit.com/blog/dictionary-compression-performance-zstd-brotli/" rel="noopener noreferrer"&gt;&lt;h3&gt;Dictionary Compression is finally here, and it's ridiculously good&lt;/h3&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;by Tim Perry&lt;/p&gt;

&lt;p&gt;Dictionary compression could completely change how applications send data over the web.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;📰 Good to know, compression&lt;/small&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://newsletter.pragmaticengineer.com/p/the-future-of-software-engineering-with-ai" rel="noopener noreferrer"&gt;&lt;h3&gt;The Future of Software Engineering with AI: Six Predictions&lt;/h3&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;by Gergely Orosz&lt;/p&gt;

&lt;p&gt;Notes from The Pragmatic Summit and ‘The Future of Software Development’ workshop&lt;/p&gt;

&lt;p&gt;&lt;small&gt;📰 Good to know, ai&lt;/small&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://stackinsight.dev/blog/memory-leak-empirical-study" rel="noopener noreferrer"&gt;&lt;h3&gt;Frontend Memory Leaks&lt;/h3&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;by Ko-Hsin Liang&lt;/p&gt;

&lt;p&gt;A 500-Repository Static Analysis and Five-Scenario Benchmark Study&lt;/p&gt;

&lt;p&gt;&lt;small&gt;📰 Good to know, memory, leak, frontend&lt;/small&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://marmelab.com/blog/2026/02/23/do-you-know-psql.html" rel="noopener noreferrer"&gt;&lt;h3&gt;9 Advanced PostgreSQL Features I Wish I Knew Sooner&lt;/h3&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;by Thiery Michel&lt;/p&gt;

&lt;p&gt;My first instinct was to write application-level validation, but something felt off. Surely PostgreSQL had a better way?&lt;/p&gt;

&lt;p&gt;&lt;small&gt;📰 Good to know, postgres, database&lt;/small&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://una.im/border-shape" rel="noopener noreferrer"&gt;&lt;h3&gt;border-shape&lt;/h3&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;by Una Kravets&lt;/p&gt;

&lt;p&gt;the future of the non-rectangular web&lt;/p&gt;

&lt;p&gt;&lt;small&gt;📰 Good to know, css&lt;/small&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://github.com/cloudflare/agents" rel="noopener noreferrer"&gt;&lt;h3&gt;Cloudflare Agents&lt;/h3&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;by Cloudflare&lt;/p&gt;

&lt;p&gt;Build and deploy AI Agents on Cloudflare&lt;/p&gt;

&lt;p&gt;&lt;small&gt;🧰 Tools, ai, cloudflare&lt;/small&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://blog.cloudflare.com/vinext/" rel="noopener noreferrer"&gt;&lt;h3&gt;How we rebuilt Next.js with AI in one week&lt;/h3&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;by Steve Faulkner&lt;/p&gt;

&lt;p&gt;Last week, one engineer and an AI model rebuilt the most popular front-end framework from scratch.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;🧰 Tools, ai, nextjs, cloudflare, vinext&lt;/small&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://github.com/riii111/sabiql" rel="noopener noreferrer"&gt;&lt;h3&gt;sabiql&lt;/h3&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;by riii111&lt;/p&gt;

&lt;p&gt;A fast, driver-less TUI to browse, query, and edit PostgreSQL databases&lt;/p&gt;

&lt;p&gt;&lt;small&gt;🧰 Tools, postgres, database, cli&lt;/small&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://github.com/dupontcyborg/numpy-ts" rel="noopener noreferrer"&gt;&lt;h3&gt;numpy-ts&lt;/h3&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;by Nico D.&lt;/p&gt;

&lt;p&gt;Full NumPy, in TypeScript/JavaScript (94% coverage)&lt;/p&gt;

&lt;p&gt;&lt;small&gt;🧰 Tools, math, array, matrix&lt;/small&gt;&lt;/p&gt;




&lt;p&gt;Want to read more? Check out the full article &lt;a href="https://weeklyfoo.com/foos/foo-126/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To sign up for the weekly newsletter, visit &lt;a href="https://weeklyfoo.com" rel="noopener noreferrer"&gt;weeklyfoo.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>weeklyfoo</category>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>🔐 Matching in the Dark: Zero‑Knowledge Filtering Using 32‑Bit Bitmasks</title>
      <dc:creator>Venkat</dc:creator>
      <pubDate>Fri, 06 Mar 2026 05:51:27 +0000</pubDate>
      <link>https://dev.to/vrannang1/matching-in-the-dark-zero-knowledge-filtering-using-32-bit-bitmasks-5boh</link>
      <guid>https://dev.to/vrannang1/matching-in-the-dark-zero-knowledge-filtering-using-32-bit-bitmasks-5boh</guid>
      <description>&lt;p&gt;&lt;em&gt;This is Part 2 of a series on building a privacy-first dating platform for HIV-positive communities. &lt;a href="https://dev.to/vrannang1/building-a-zero-knowledge-dating-platform-for-hiv-positive-communities-5f5k"&gt;Building a Zero-Knowledge Dating Platform for HIV-Positive Communities&lt;/a&gt; if you haven't already.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Imagine a database breach. Your dating app's servers are compromised.&lt;/p&gt;

&lt;p&gt;For most users, that's embarrassing. For an HIV-positive person on a conventional dating platform, it can mean losing a job, losing housing, or losing family. The stakes are not hypothetical — they are documented, they are real, and they are why this system was built the way it was.&lt;/p&gt;

&lt;p&gt;In Part 1, I explained the overall architecture: everything is encrypted client-side using TweetNaCl before it touches the backend. No names, no photos, no health status, no location, no lifestyle — nothing readable ever reaches the server.&lt;/p&gt;

&lt;p&gt;But that creates a problem that isn't immediately obvious:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If the server is completely blind, how does it know who to match you with?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This article explains the first half of the answer: &lt;strong&gt;blind bitmask filtering using 32-bit integers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the &lt;strong&gt;hard filter layer&lt;/strong&gt; — gender, marital status, region, and other categorical attributes. The next article covers the &lt;strong&gt;soft filter layer&lt;/strong&gt; — AI embeddings and Hamming distance for deeper compatibility.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Not Just Encrypt the Filters Too?
&lt;/h2&gt;

&lt;p&gt;You might think: encrypt the filter values and compare encrypted data server-side. The problem is that standard encryption is non-deterministic by design — the same value encrypted twice produces different ciphertext, so you can't compare encrypted strings without either homomorphic encryption (expensive, complex, slow) or leaking the values.&lt;/p&gt;

&lt;p&gt;We needed something the server could compare &lt;em&gt;without understanding&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That's where integers come in.&lt;/p&gt;




&lt;h2&gt;
  
  
  ☕ The Core Idea: Switches, Not Strings
&lt;/h2&gt;

&lt;p&gt;The server cannot store or search strings like &lt;code&gt;"Woman"&lt;/code&gt;, &lt;code&gt;"Single"&lt;/code&gt;, &lt;code&gt;"East"&lt;/code&gt;, or &lt;code&gt;"Espresso lover"&lt;/code&gt;. But the server &lt;strong&gt;can compare integers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A 32-bit integer is just &lt;strong&gt;32 on/off switches&lt;/strong&gt;. The frontend assigns meaning to each switch. The backend never sees the dictionary that explains what each switch means.&lt;/p&gt;

&lt;p&gt;This is the key insight: &lt;strong&gt;meaning lives in the client. The server only handles math.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every user profile generates two masks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identity Mask (&lt;code&gt;i_mask&lt;/code&gt;)&lt;/strong&gt; — "Who I am"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preference Mask (&lt;code&gt;p_mask&lt;/code&gt;)&lt;/strong&gt; — "Who I want"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The frontend sets bits using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;i_mask&lt;/span&gt; &lt;span class="o"&gt;|=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;bit&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;p_mask&lt;/span&gt; &lt;span class="o"&gt;|=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;bit&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only the resulting integers are sent to the server. The dictionary that maps bits to human meaning never leaves the browser.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Bitmask Layout
&lt;/h2&gt;

&lt;p&gt;Here's a simplified version of the layout used in this platform:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bits&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Values&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0–1&lt;/td&gt;
&lt;td&gt;Gender&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;bit 0&lt;/code&gt; = Man, &lt;code&gt;bit 1&lt;/code&gt; = Woman&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2–3&lt;/td&gt;
&lt;td&gt;Marital Status&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;bit 2&lt;/code&gt; = Single, &lt;code&gt;bit 3&lt;/code&gt; = Divorced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4–7&lt;/td&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;bit 4&lt;/code&gt; = North, &lt;code&gt;bit 5&lt;/code&gt; = South, &lt;code&gt;bit 6&lt;/code&gt; = East, &lt;code&gt;bit 7&lt;/code&gt; = West&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8–9&lt;/td&gt;
&lt;td&gt;Coffee Preference&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;bit 8&lt;/code&gt; = Espresso, &lt;code&gt;bit 9&lt;/code&gt; = Latte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10–31&lt;/td&gt;
&lt;td&gt;Reserved&lt;/td&gt;
&lt;td&gt;Future attributes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This table exists only in the frontend source code. The backend has no awareness of it. Even if someone reads the Erlang source, they will find no reference to gender, region, or coffee preferences — only integers and bitwise operations.&lt;/p&gt;




&lt;h2&gt;
  
  
  ☕ A Concrete Example
&lt;/h2&gt;

&lt;p&gt;Let's walk through two real users being matched — the way the server experiences it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User A — who she is:&lt;/strong&gt;&lt;br&gt;
Woman, Single, East, Espresso → &lt;code&gt;i_mask = 330&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User A — who she wants:&lt;/strong&gt;&lt;br&gt;
Man, Single, East or North, Espresso → &lt;code&gt;p_mask = 431&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User B — who he is:&lt;/strong&gt;&lt;br&gt;
Man, Single, East, Espresso → &lt;code&gt;i_mask = 273&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User B — who he wants:&lt;/strong&gt;&lt;br&gt;
Woman, Single, East, Espresso or Latte → &lt;code&gt;p_mask = 459&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The server receives four numbers: &lt;code&gt;330&lt;/code&gt;, &lt;code&gt;431&lt;/code&gt;, &lt;code&gt;273&lt;/code&gt;, &lt;code&gt;459&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It has no idea that 330 means "Woman from the East who drinks Espresso." It's just a number. What it &lt;em&gt;can&lt;/em&gt; do is check whether these two people are mutually compatible — without knowing what compatibility means in human terms.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚡ The Matching Logic in Erlang
&lt;/h2&gt;

&lt;p&gt;Three lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight erlang"&gt;&lt;code&gt;&lt;span class="nv"&gt;ISeeThem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;MyPMask&lt;/span&gt; &lt;span class="ow"&gt;band&lt;/span&gt; &lt;span class="nv"&gt;OtherIMask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=/=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nv"&gt;TheySeeMe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;OtherPMask&lt;/span&gt; &lt;span class="ow"&gt;band&lt;/span&gt; &lt;span class="nv"&gt;MyIMask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=/=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nv"&gt;IsMatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;ISeeThem&lt;/span&gt; &lt;span class="ow"&gt;andalso&lt;/span&gt; &lt;span class="nv"&gt;TheySeeMe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;band&lt;/code&gt; is bitwise AND. If User A's preference mask overlaps with User B's identity mask, and vice versa — it's a match. Both sides have to see each other.&lt;/p&gt;

&lt;p&gt;No strings. No JOINs on plaintext columns. No semantic understanding required. Just a CPU instruction that runs in nanoseconds across thousands of profiles.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔒 Why This Is Genuinely Zero-Knowledge
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The server cannot reverse the integers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;330&lt;/code&gt; does not reveal Woman, Single, East, or Espresso. It's an integer. Without the bit-to-meaning dictionary, it's permanently opaque. Even with the source code of the frontend, an attacker would need to know &lt;em&gt;which bits were set by which user&lt;/em&gt; — and the mapping only exists client-side at the moment a profile is built.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A breach leaks nothing meaningful.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the database is compromised, attackers get encrypted blobs and a list of integers. The integers reveal nothing about health status, preferences, or identity without the dictionary — which lives only in the browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's fast.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bitwise AND is one of the cheapest operations a CPU can perform. Matching 100,000 profiles takes milliseconds. There's no performance tradeoff for the privacy guarantee.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No false positives.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;(maskA band maskB) =/= 0&lt;/code&gt;, the overlap is guaranteed. The math doesn't lie.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ How It Fits the Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────┐
│        Frontend          │
│  (Vue + TweetNaCl)       │
├──────────────────────────┤
│ - Collect profile fields │
│ - Generate i_mask/p_mask │
│ - Encrypt profile vault  │
│ - Send: masks + blob     │
└─────────────┬────────────┘
              │
              ▼
┌──────────────────────────┐
│         Backend          │
│   (Erlang + Mnesia)      │
├──────────────────────────┤
│ - Store encrypted blob   │
│ - Store bitmasks         │
│ - Bitwise AND matching   │
│ - Return matched IDs     │
└──────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend returns matched user IDs. The frontend then fetches and decrypts those profiles locally. At no point does the server assemble a readable picture of anyone.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ What This Doesn't Protect Against
&lt;/h2&gt;

&lt;p&gt;Honesty matters here — especially for a community where trust is everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Match count leakage.&lt;/strong&gt; The server knows &lt;em&gt;how many&lt;/em&gt; profiles match a given user, even if it doesn't know why. A user with very specific filters (only one bit set) might have a match count that's statistically revealing. This is a known limitation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timing analysis.&lt;/strong&gt; A sophisticated attacker watching query patterns over time could infer rough filter characteristics from response times. This is mitigated by query normalisation, but not eliminated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The dictionary is in the source code.&lt;/strong&gt; The frontend is public. Anyone can read the bit-to-meaning mapping. The protection isn't that the dictionary is secret — it's that the server never has it, so a server-side breach reveals nothing. Client-side attacks (malware, compromised devices) are a separate threat model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This layer only handles hard filters.&lt;/strong&gt; It can't assess compatibility, shared values, or personality. That's what the embedding layer is for.&lt;/p&gt;

&lt;p&gt;No system is perfectly zero-knowledge. The goal is to make the cost of a breach as close to zero as possible, for the people who have the most to lose.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌑 Why This Matters
&lt;/h2&gt;

&lt;p&gt;For HIV-positive users, every piece of data that touches a server is a potential liability. This bitmask system lets the platform filter by relationship style, region, lifestyle, and preferences — without the server ever learning what those preferences are.&lt;/p&gt;

&lt;p&gt;It's not a perfect solution. But it moves the trust boundary from "trust us not to misuse your data" to "we architecturally cannot access your data." For people who have been let down by institutions before, that difference is everything.&lt;/p&gt;

&lt;p&gt;The platform is live at &lt;a href="https://hivpositivematches.com" rel="noopener noreferrer"&gt;HIVPositiveMatches.com&lt;/a&gt; — built on everything this series covers.&lt;/p&gt;




&lt;h2&gt;
  
  
  ▶️ Coming Next: Zero-Knowledge AI Matching
&lt;/h2&gt;

&lt;p&gt;The bitmask layer handles hard categorical filters. But compatibility is more than checkbox matching.&lt;/p&gt;

&lt;p&gt;In Part 3, I'll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How the browser generates semantic embeddings locally&lt;/li&gt;
&lt;li&gt;How they're binarized into compact binary vectors&lt;/li&gt;
&lt;li&gt;How the server computes similarity using Hamming distance&lt;/li&gt;
&lt;li&gt;Why this reveals nothing about the underlying text&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The bitmask layer finds &lt;em&gt;possible&lt;/em&gt; matches. The embedding layer finds &lt;em&gt;meaningful&lt;/em&gt; ones — without the server understanding either.&lt;/p&gt;




</description>
      <category>algorithms</category>
      <category>privacy</category>
      <category>security</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Day 18 — Building a Linux Vulnerability Analyzer 🐧🔍</title>
      <dc:creator>Hafiz Shamnad</dc:creator>
      <pubDate>Fri, 06 Mar 2026 05:35:21 +0000</pubDate>
      <link>https://dev.to/hafiz_shamnad/day-18-building-a-linux-vulnerability-analyzer-895</link>
      <guid>https://dev.to/hafiz_shamnad/day-18-building-a-linux-vulnerability-analyzer-895</guid>
      <description>&lt;p&gt;In most cybersecurity learning paths, people focus on tools first. But sometimes the better exercise is building your own. Today I spent time creating a Linux vulnerability analyzer, a command line tool designed to audit a system and surface common security weaknesses.&lt;/p&gt;

&lt;p&gt;The idea is simple: treat the Linux machine like a fortress and walk through it gate by gate. Which services are listening? Which configurations are unsafe? Which permissions look suspicious? A small script can turn those questions into a structured security check.&lt;/p&gt;

&lt;p&gt;This tool performs a set of system audits that are commonly part of basic security assessments. It collects system information, inspects open ports, reviews SSH configuration, checks firewall status, enumerates user accounts, and looks for risky file permissions such as world writable files or SUID binaries. It also inspects running services and identifies available package updates that might contain security patches.&lt;/p&gt;

&lt;p&gt;What made this project interesting was designing it as a modular scanner. Each security check is treated as its own module, so scans can run individually or as part of a full system audit. This makes it easier to extend later with additional checks such as CVE lookups, Docker scanning, or kernel vulnerability analysis.&lt;/p&gt;

&lt;p&gt;Another focus was usability. Security tools are most useful when their output is readable, so the scanner produces a structured CLI report with clear sections and warning indicators. Instead of raw command outputs, the results are organized into human readable summaries that highlight potential issues quickly.&lt;/p&gt;

&lt;p&gt;At the end of the scan, the tool generates a concise security overview and can optionally export the findings as a JSON report for further analysis or automation workflows.&lt;/p&gt;

&lt;p&gt;Projects like this help reinforce how many security insights come directly from the operating system itself. Linux already exposes a lot of valuable signals through logs, configuration files, and system commands. The challenge is collecting and presenting them in a meaningful way.&lt;/p&gt;

&lt;p&gt;Building small security utilities like this is a great way to understand how real auditing tools work under the hood.&lt;/p&gt;

&lt;p&gt;Day by day, the goal is simple: learn by building.&lt;/p&gt;

&lt;h3&gt;
  
  
  Detailed Code Explanation
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;vulnscan&lt;/code&gt; is a &lt;strong&gt;Python-based command-line security auditing tool&lt;/strong&gt; designed to analyze Linux desktops and servers for common security issues.&lt;/p&gt;

&lt;p&gt;It performs several checks including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System information collection&lt;/li&gt;
&lt;li&gt;Open port discovery&lt;/li&gt;
&lt;li&gt;SSH configuration audit&lt;/li&gt;
&lt;li&gt;Firewall status verification&lt;/li&gt;
&lt;li&gt;User account analysis&lt;/li&gt;
&lt;li&gt;World-writable file detection&lt;/li&gt;
&lt;li&gt;SUID binary detection&lt;/li&gt;
&lt;li&gt;Failed login detection&lt;/li&gt;
&lt;li&gt;Running service enumeration&lt;/li&gt;
&lt;li&gt;Package update checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The results are displayed in a &lt;strong&gt;structured CLI interface&lt;/strong&gt; and can also be exported as &lt;strong&gt;JSON reports&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. Shebang and Script Header
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This line tells Linux to run the script using &lt;strong&gt;Python 3 from the system environment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The header comment explains the tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vulnscan - Linux Vulnerability Analyzer
A comprehensive security auditing tool with rich CLI output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This indicates the tool is designed to produce &lt;strong&gt;clean terminal output using the Rich library&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Importing Required Modules
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each module serves a purpose:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;subprocess&lt;/td&gt;
&lt;td&gt;Run Linux shell commands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;argparse&lt;/td&gt;
&lt;td&gt;Handle CLI arguments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;os&lt;/td&gt;
&lt;td&gt;File permission checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;json&lt;/td&gt;
&lt;td&gt;Export scan results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;datetime&lt;/td&gt;
&lt;td&gt;Timestamp scans&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pathlib&lt;/td&gt;
&lt;td&gt;File path handling&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The scanner relies heavily on &lt;strong&gt;Linux commands executed via subprocess&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Rich CLI Output Support
&lt;/h1&gt;

&lt;p&gt;The tool attempts to import the &lt;strong&gt;Rich library&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;rich.console&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;rich.table&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Table&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;rich.panel&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Panel&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rich allows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;colored output&lt;/li&gt;
&lt;li&gt;tables&lt;/li&gt;
&lt;li&gt;progress spinners&lt;/li&gt;
&lt;li&gt;formatted panels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If Rich is &lt;strong&gt;not installed&lt;/strong&gt;, the tool falls back to &lt;strong&gt;plain text mode&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example fallback logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ImportError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;RICH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simple console class replaces Rich output.&lt;/p&gt;

&lt;p&gt;This ensures the tool &lt;strong&gt;works even on minimal systems&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Command Execution Helper
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function runs shell commands safely.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Captures stdout&lt;/li&gt;
&lt;li&gt;Prevents crashes&lt;/li&gt;
&lt;li&gt;Timeout protection&lt;/li&gt;
&lt;li&gt;Always returns output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;run("uname -r")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;6.5.0-21-generic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  5. Status Tag Generator
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creates &lt;strong&gt;status labels&lt;/strong&gt; for results.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✔ OK
✗ WARN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Used when displaying scan results.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Section Header Printer
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_section&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creates &lt;strong&gt;visual separation between scan sections&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;────────────────── SSH Security Audit ──────────────────
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  7. System Information Scan
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;system_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Collects &lt;strong&gt;basic system information&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Commands used:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;grep PRETTY_NAME /etc/os-release&lt;/td&gt;
&lt;td&gt;OS name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;uname -r&lt;/td&gt;
&lt;td&gt;kernel version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;uname -m&lt;/td&gt;
&lt;td&gt;architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hostname&lt;/td&gt;
&lt;td&gt;system hostname&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;uptime -p&lt;/td&gt;
&lt;td&gt;system uptime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;free -h&lt;/td&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;df -h&lt;/td&gt;
&lt;td&gt;disk usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;who&lt;/td&gt;
&lt;td&gt;logged in users&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OS: Ubuntu 22.04
Kernel: 6.2
RAM: 8GB
Disk: 40% used
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps identify &lt;strong&gt;outdated or unsupported systems&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Open Port Detection
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;open_ports&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ss -tuln
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lists:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TCP ports&lt;/li&gt;
&lt;li&gt;UDP ports&lt;/li&gt;
&lt;li&gt;listening services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tcp LISTEN 0.0.0.0:22
tcp LISTEN 0.0.0.0:80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open ports can expose services to attackers.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. SSH Security Audit
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ssh_audit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Analyzes &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Checks include:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Risk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PermitRootLogin&lt;/td&gt;
&lt;td&gt;attackers login as root&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PasswordAuthentication&lt;/td&gt;
&lt;td&gt;brute force risk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PermitEmptyPasswords&lt;/td&gt;
&lt;td&gt;empty password accounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocol&lt;/td&gt;
&lt;td&gt;insecure SSH v1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MaxAuthTries&lt;/td&gt;
&lt;td&gt;brute force attempts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoginGraceTime&lt;/td&gt;
&lt;td&gt;session hijacking window&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Example result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PermitRootLogin = yes   WARN
PasswordAuthentication = yes   WARN
Protocol = 2   OK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps detect &lt;strong&gt;weak SSH configurations&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Firewall Status Check
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;firewall_check&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Checks three firewall systems:&lt;/p&gt;

&lt;h3&gt;
  
  
  UFW
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ufw status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  iptables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;iptables -L INPUT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  firewalld
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl is-active firewalld
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UFW: inactive
iptables rules: 3
firewalld: inactive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A disabled firewall is a &lt;strong&gt;major security risk&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. User Account Audit
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;user_audit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reads:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/etc/passwd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Extracts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;username&lt;/li&gt;
&lt;li&gt;UID&lt;/li&gt;
&lt;li&gt;home directory&lt;/li&gt;
&lt;li&gt;shell&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Important checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;interactive shells&lt;/li&gt;
&lt;li&gt;sudo users&lt;/li&gt;
&lt;li&gt;root accounts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user1 uid=1000 shell=/bin/bash
root uid=0 sudo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Privilege escalation often targets &lt;strong&gt;misconfigured user accounts&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  12. World Writable File Scan
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;world_writable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;find / -perm -0002
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This identifies files &lt;strong&gt;any user can modify&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/tmp/testfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These files can be abused for &lt;strong&gt;privilege escalation&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  13. SUID Binary Detection
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;suid_files&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;find / -perm -4000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SUID files execute &lt;strong&gt;with root privileges&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/usr/bin/passwd
/usr/bin/sudo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Attackers often exploit vulnerable SUID binaries.&lt;/p&gt;




&lt;h1&gt;
  
  
  14. Failed Login Detection
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;failed_logins&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Checks:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;If unavailable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;journalctl sshd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This identifies &lt;strong&gt;brute force attempts&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Failed password for root from 192.168.1.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  15. Running Services
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;running_services&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl list-units --type=service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh.service
nginx.service
mysql.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Attack surface increases with &lt;strong&gt;more running services&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  16. Package Update Check
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;package_updates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Detects package manager automatically:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Manager&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;APT&lt;/td&gt;
&lt;td&gt;apt list --upgradable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNF/YUM&lt;/td&gt;
&lt;td&gt;dnf check-update&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Example result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Upgradable packages: 12
Security updates: 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outdated packages often contain &lt;strong&gt;known CVEs&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  17. Display Functions
&lt;/h1&gt;

&lt;p&gt;Several display functions format scan results.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;display_ports()
display_users()
display_services()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When Rich is enabled, results appear as &lt;strong&gt;tables&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Proto   State     Address
tcp     LISTEN    0.0.0.0:22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  18. Scan Summary
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;display_summary&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Counts warnings such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;insecure SSH settings&lt;/li&gt;
&lt;li&gt;world writable files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scan completed: 2026-03-06 10:20
Warnings found: 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  19. JSON Export
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;export_json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Allows exporting scan results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vulnscan --export report.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example output file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
 "ssh": {...},
 "ports": {...}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;automation&lt;/li&gt;
&lt;li&gt;SIEM ingestion&lt;/li&gt;
&lt;li&gt;reporting&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  20. CLI Argument Parsing
&lt;/h1&gt;

&lt;p&gt;Handled using &lt;strong&gt;argparse&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example commands:&lt;/p&gt;

&lt;p&gt;Run full scan&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Run specific modules&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vulnscan -m ssh firewall ports
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Export report&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vulnscan --export report.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;List modules&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vulnscan --list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quiet mode&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vulnscan -q
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  21. Module System
&lt;/h1&gt;

&lt;p&gt;Modules are defined in a dictionary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;MODULES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;system_info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;open_ports&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the scanner &lt;strong&gt;modular and extensible&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Adding new checks becomes easy.&lt;/p&gt;




&lt;h1&gt;
  
  
  22. Main Function
&lt;/h1&gt;

&lt;p&gt;The main function orchestrates everything:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parse CLI arguments&lt;/li&gt;
&lt;li&gt;Select modules&lt;/li&gt;
&lt;li&gt;Run scans&lt;/li&gt;
&lt;li&gt;Display results&lt;/li&gt;
&lt;li&gt;Export report&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Parse arguments
↓
Run selected modules
↓
Display results
↓
Export report (optional)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Final Outcome
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;vulnscan&lt;/code&gt; provides a &lt;strong&gt;quick security overview of a Linux system&lt;/strong&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%2Fllax903f44w390f4iioj.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%2Fllax903f44w390f4iioj.png" alt=" " width="800" height="313"&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%2Fxae9ts2agia80752js30.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%2Fxae9ts2agia80752js30.png" alt=" " width="800" height="197"&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%2Fucesbd1r4hp7vgcpq0qs.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%2Fucesbd1r4hp7vgcpq0qs.png" alt=" " width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Capabilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System auditing&lt;/li&gt;
&lt;li&gt;SSH security analysis&lt;/li&gt;
&lt;li&gt;Firewall detection&lt;/li&gt;
&lt;li&gt;Port discovery&lt;/li&gt;
&lt;li&gt;Permission checks&lt;/li&gt;
&lt;li&gt;User privilege analysis&lt;/li&gt;
&lt;li&gt;Service enumeration&lt;/li&gt;
&lt;li&gt;Package update checks&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Possible Future Improvements
&lt;/h1&gt;

&lt;p&gt;To make the tool even more powerful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CVE lookup via NVD API&lt;/li&gt;
&lt;li&gt;Docker container scanning&lt;/li&gt;
&lt;li&gt;Cron job auditing&lt;/li&gt;
&lt;li&gt;Kernel vulnerability detection&lt;/li&gt;
&lt;li&gt;Risk scoring engine&lt;/li&gt;
&lt;li&gt;HTML security reports&lt;/li&gt;
&lt;li&gt;CIS benchmark checks&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;Tools that analyze Linux security often look similar on the surface, but they are built for very different moments in a security workflow.&lt;/p&gt;

&lt;p&gt;My &lt;strong&gt;Linux vulnerability analyzer&lt;/strong&gt; focuses on &lt;strong&gt;security auditing and system hygiene&lt;/strong&gt;. It checks things like SSH configuration, firewall status, open ports, user privileges, file permissions, and available package updates. The goal is to give administrators or learners a clear overview of how securely a system is configured and highlight areas that need improvement.&lt;/p&gt;

&lt;p&gt;In contrast, &lt;strong&gt;LinPEAS&lt;/strong&gt; is designed for a completely different scenario. It is used after an attacker or penetration tester already has access to a machine and wants to discover &lt;strong&gt;privilege escalation paths&lt;/strong&gt;. Instead of auditing configuration health, it searches aggressively for ways to gain higher privileges such as sudo misconfigurations, writable services, exposed credentials, or kernel exploits.&lt;/p&gt;

&lt;p&gt;So while both tools analyze a Linux system, their goals differ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A vulnerability analyzer helps &lt;strong&gt;defenders audit and harden systems&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;LinPEAS helps &lt;strong&gt;attackers or penetration testers find ways to escalate privileges&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding this distinction is important because security is not just about breaking systems, but also about &lt;strong&gt;building and maintaining them securely&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>programming</category>
      <category>python</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>I compiled 459 landlord-tenant statutes into a database and built free tools on top of it</title>
      <dc:creator>Kyle</dc:creator>
      <pubDate>Fri, 06 Mar 2026 05:13:04 +0000</pubDate>
      <link>https://dev.to/rentsolveai/i-compiled-459-landlord-tenant-statutes-into-a-database-and-built-free-tools-on-top-of-it-2l7i</link>
      <guid>https://dev.to/rentsolveai/i-compiled-459-landlord-tenant-statutes-into-a-database-and-built-free-tools-on-top-of-it-2l7i</guid>
      <description>&lt;p&gt;I'm a solo founder building a property management platform. Along the way I needed to solve a compliance problem: every state has different rules for security deposits, evictions, late fees, rent increases, entry notice, habitability, and fair housing. A lease that's legal in Texas can violate laws in New York.&lt;/p&gt;

&lt;p&gt;So I compiled the actual statutes. 459 records covering all 50 states and Washington DC. Every record includes the rule summary and the statute citation so you can verify it yourself.&lt;/p&gt;

&lt;p&gt;Once I had the data, I realized it was useful beyond just my product. So I built 4 free tools on top of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tools
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Landlord-Friendly State Scorecard&lt;/strong&gt; - grades every state A through F across 5 categories: deposit rules, eviction speed, rent control, late fees, and entry requirements. You can look up a single state or see the full ranking.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rentsolve.ai/tools/landlord-friendly-scorecard" rel="noopener noreferrer"&gt;rentsolve.ai/tools/landlord-friendly-scorecard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security Deposit Calculator&lt;/strong&gt; - pick a state, enter the rent amount, and it shows you the max deposit allowed, return deadline, interest requirements, and penalty for late return.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rentsolve.ai/tools/security-deposit-calculator" rel="noopener noreferrer"&gt;rentsolve.ai/tools/security-deposit-calculator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ROI Calculator&lt;/strong&gt; - plug in purchase price, down payment, rent, vacancy, and expenses. Get cash on cash return, cap rate, and a full monthly breakdown.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rentsolve.ai/tools/roi-calculator" rel="noopener noreferrer"&gt;rentsolve.ai/tools/roi-calculator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Law Lookup&lt;/strong&gt; - pick a state and a topic and get the rule summary with the actual statute citation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rentsolve.ai/tools/law-lookup" rel="noopener noreferrer"&gt;rentsolve.ai/tools/law-lookup&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it's built
&lt;/h2&gt;

&lt;p&gt;All four tools are static HTML/CSS/JS. No framework, no build step, no backend calls. The data is embedded directly in the page as a JS object. Deployed on Cloudflare Pages.&lt;/p&gt;

&lt;p&gt;I went this route because I wanted the tools to load instantly and work without authentication. No API rate limits to worry about, no server costs, and Cloudflare handles caching and CDN automatically.&lt;/p&gt;

&lt;p&gt;The data itself was compiled by reviewing state revised statutes, annotated codes, and landlord-tenant acts. Each record includes the state, the topic category, a plain-language summary, and the statute citation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some interesting things in the data
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;24 states have zero cap on how much a landlord can charge for a security deposit&lt;/li&gt;
&lt;li&gt;Georgia and West Virginia let landlords file for eviction immediately with no mandatory notice period&lt;/li&gt;
&lt;li&gt;Only 3 jurisdictions have statewide rent control: California, Oregon, and DC&lt;/li&gt;
&lt;li&gt;Massachusetts won't let you charge a late fee until rent is 30 days past due&lt;/li&gt;
&lt;li&gt;14 states have no specific statute on how much notice a landlord must give before entering&lt;/li&gt;
&lt;li&gt;DC protects over 21 classes under fair housing law including personal appearance and political affiliation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What the data powers
&lt;/h2&gt;

&lt;p&gt;The database is the backbone of &lt;a href="https://rentsolve.ai" rel="noopener noreferrer"&gt;RentSolve AI&lt;/a&gt;, the property management platform I'm building. When a landlord drafts a lease through the app, the AI pulls the correct deposit limits, required disclosures, late fee rules, and notice periods for their specific state. The tools are free standalone versions of that same data.&lt;/p&gt;

&lt;p&gt;I also published the data as a series of 50-state comparison articles on the &lt;a href="https://rentsolve.ai/blog" rel="noopener noreferrer"&gt;blog&lt;/a&gt; covering each category with sortable tables and FAQ schema.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;I'm working on adding more categories to the database: required landlord disclosures by state, pet deposit rules, and lease renewal requirements. If you have questions about any specific state's rules, happy to look it up.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>javascript</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>I Built a Physics Certification Layer for Motion Data — Here's What I Found</title>
      <dc:creator>timbo4u</dc:creator>
      <pubDate>Fri, 06 Mar 2026 05:09:47 +0000</pubDate>
      <link>https://dev.to/timbo4u1/i-built-a-physics-certification-layer-for-motion-data-heres-what-i-found-4dbp</link>
      <guid>https://dev.to/timbo4u1/i-built-a-physics-certification-layer-for-motion-data-heres-what-i-found-4dbp</guid>
      <description>&lt;p&gt;TL;DR: I trained a classifier on robot motion data and kept getting weird failures. The data looked fine. It wasn't fine. So I wrote a tool that checks whether sensor data actually obeys the laws of physics before you train on it. Here's what I learned.&lt;/p&gt;

&lt;p&gt;The Problem Nobody Talks About&lt;br&gt;
When you train a model on images or text, bad data is annoying but recoverable — you clean it, re-label it, filter it. The model is usually forgiving.&lt;br&gt;
When you train a physical AI system — a prosthetic hand, a robot arm, a rehabilitation exoskeleton — bad training data doesn't just hurt accuracy. It teaches the system physically impossible movement patterns. A prosthetic hand trained on corrupted EMG data fails the person wearing it. A humanoid robot trained on synthetic motion data that violates rigid-body kinematics learns to move like a cartoon.&lt;br&gt;
The problem is that most motion datasets have no quality floor. They contain:&lt;/p&gt;

&lt;p&gt;Synthetic data generated without real sensors (no actual physics coupling)&lt;br&gt;
Corrupted recordings with dropped samples and sensor drift&lt;br&gt;
Mislabeled actions where the label doesn't match the measured physics&lt;/p&gt;

&lt;p&gt;And there's no standard way to detect any of this.&lt;br&gt;
I decided to build one.&lt;/p&gt;

&lt;p&gt;The Idea: Check the Physics, Not the Labels&lt;br&gt;
Instead of asking "does this data look human?" (subjective, learnable by fakes), I asked: does this data obey the physical laws that govern human movement?&lt;br&gt;
A real human arm moving through space has to satisfy:&lt;/p&gt;

&lt;p&gt;Rigid body kinematics — accelerometer and gyroscope on the same limb must couple: a = α×r + ω²×r. Two sensors on the same rigid body cannot disagree.&lt;br&gt;
Jerk bounds — human motion minimizes jerk (third derivative of position). Flash &amp;amp; Hogan proved this in 1985. Superhuman jerk = sensor spike or synthetic artifact.&lt;br&gt;
EMG-acceleration timing — muscle electrical activation precedes limb acceleration by ~75ms. If acceleration comes first, something is wrong.&lt;br&gt;
Resonance frequency — human forearm tremor is 8–12Hz. Always. Vibrations at 40Hz = mechanical noise.&lt;br&gt;
BCG heartbeat — a wrist IMU on a resting human shows the mechanical heartbeat signature at 1–3Hz. No signal = not a human.&lt;/p&gt;

&lt;p&gt;These aren't heuristics. They're physics. You can't fake them without running a full skeletal simulation.&lt;/p&gt;

&lt;p&gt;What I Built: S2S&lt;br&gt;
Pure Python, zero external dependencies, runs anywhere including embedded systems.&lt;br&gt;
pythonfrom s2s_standard_v1_3.s2s_physics_v1_3 import PhysicsEngine&lt;/p&gt;

&lt;p&gt;result = PhysicsEngine().certify(&lt;br&gt;
    imu_raw={&lt;br&gt;
        "timestamps_ns": [...],&lt;br&gt;
        "accel": [...],   # [[ax, ay, az], ...] m/s²&lt;br&gt;
        "gyro": [...],    # [[gx, gy, gz], ...] rad/s&lt;br&gt;
    },&lt;br&gt;
    segment="forearm"&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;print(result['tier'])               # GOLD / SILVER / BRONZE / REJECTED&lt;br&gt;
print(result['physical_law_score']) # 0–100&lt;br&gt;
print(result['laws_passed'])        # ['rigid_body_kinematics', 'jerk_bounds', ...]&lt;br&gt;
Each passing record gets an Ed25519 cryptographic signature — tamper-evident provenance. This matters in medical and safety-critical contexts where data chain-of-custody is audited.&lt;br&gt;
bashpip install s2s-certify&lt;/p&gt;

&lt;p&gt;The Result That Surprised Me&lt;br&gt;
Real iPhone 11 IMU data (37 seconds of natural hand movement) versus synthetic data generated to look similar:&lt;br&gt;
MetricReal HumanSyntheticRigid body coupling r0.35-0.01Jerk P95 (m/s³)25.854.0Resonance (Hz)5.413.3Physics score69/10053/100Certification tierSILVERBRONZE&lt;br&gt;
r=0.35 (real) vs r=-0.01 (synthetic) — physics alone, no labels, no training required.&lt;br&gt;
Applied to 10,360 windows from UCI HAR + PAMAP2: 9,050 certified (87.4%), 1,310 rejected for physics violations. Those 1,310 windows aren't low quality — they're physically impossible.&lt;/p&gt;

&lt;p&gt;Level 4: Where It Gets Interesting&lt;br&gt;
The single-sensor laws are powerful, but the most interesting result came from kinematic chain consistency across multiple sensors.&lt;br&gt;
PAMAP2 has 3 IMUs — hand, chest, ankle. These sensors don't just need to look right individually. They have to be consistent with each other at the physics level:&lt;/p&gt;

&lt;p&gt;Ankle leads chest in jerk timing by 50–100ms (force propagates up the skeleton)&lt;br&gt;
Dominant locomotion frequency must agree across all three sensors&lt;br&gt;
Coupling between segments must respect joint constraints&lt;/p&gt;

&lt;p&gt;A synthetic generator can fool single-sensor checks by learning the right statistics. It cannot fake cross-sensor timing without running a complete rigid-body skeletal simulation.&lt;br&gt;
Results on PAMAP2 (12 activity classes):&lt;br&gt;
MethodF1 ScoreSingle chest IMU baseline0.7969Multi-sensor naive concat0.8308 (+3.39%)S2S kinematic chain filter0.8399 (+0.91% over concat)Net vs single sensor+4.23%&lt;br&gt;
+4.23% F1 improvement, using 46% less data with curriculum training.&lt;/p&gt;

&lt;p&gt;Using the Physics Score as a Training Loss&lt;br&gt;
You don't have to use S2S as a hard filter. Use the score as a soft loss term:&lt;br&gt;
python# s2s_torch.py — physics-aware training loss&lt;br&gt;
import torch&lt;br&gt;
from s2s_standard_v1_3.s2s_physics_v1_3 import PhysicsEngine&lt;/p&gt;

&lt;p&gt;class S2SPhysicsLoss(torch.nn.Module):&lt;br&gt;
    def &lt;strong&gt;init&lt;/strong&gt;(self, task_loss_fn, lambda_physics=0.1):&lt;br&gt;
        super().&lt;strong&gt;init&lt;/strong&gt;()&lt;br&gt;
        self.task_loss = task_loss_fn&lt;br&gt;
        self.lambda_physics = lambda_physics&lt;br&gt;
        self.engine = PhysicsEngine()&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def forward(self, predictions, targets, imu_batch):
    task_l = self.task_loss(predictions, targets)
    scores = []
    for sample in imu_batch:
        result = self.engine.certify(sample)
        scores.append(result['physical_law_score'] / 100.0)
    physics_scores = torch.tensor(scores, dtype=torch.float32)
    physics_penalty = (1.0 - physics_scores).mean()
    return task_l + self.lambda_physics * physics_penalty
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The formula: L = L_task + λ × (1 - physics_score/100)&lt;br&gt;
Models trained with this loss learn to prefer physically plausible outputs, not just statistically likely ones.&lt;/p&gt;

&lt;p&gt;Motion Domain Taxonomy&lt;br&gt;
Not all motion has the same physics envelope. A surgeon's hand and a sprinter's leg are both valid human motion, but with completely different jerk budgets.&lt;br&gt;
DomainJerk ≤Coupling r ≥Robot use casePRECISION80 m/s³0.30Surgical robots, prosthetic handsPOWER200 m/s³0.30Warehouse arms, exoskeletonsSOCIAL180 m/s³0.15Service robots, HRILOCOMOTION300 m/s³0.15Bipedal robots, prosthetic legsDAILY_LIVING150 m/s³0.20Home robots, elder careSPORT500 m/s³0.10Athletic training&lt;br&gt;
The domain classifier automatically assigns one of these to incoming data, then tunes physics thresholds accordingly. You don't want to reject a sprinter for having "too much jerk."&lt;/p&gt;

&lt;p&gt;Live Demos&lt;br&gt;
No install needed:&lt;/p&gt;

&lt;p&gt;📱 Phone IMU demo — open on your phone, move it, watch real-time physics certification&lt;br&gt;
🎥 Pose camera demo — MoveNet tracks 17 body joints and certifies your movement live&lt;/p&gt;

&lt;p&gt;What's Next&lt;br&gt;
The most useful thing right now: if you work with motion data for any application — robotics, prosthetics, sports science, rehab — try running your dataset through S2S and tell me what the rejection rate is. Every new dataset that gets certified (or fails interestingly) teaches something about what's actually in these benchmarks.&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/timbo4u1" rel="noopener noreferrer"&gt;
        timbo4u1
      &lt;/a&gt; / &lt;a href="https://github.com/timbo4u1/S2S" rel="noopener noreferrer"&gt;
        S2S
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;S2S — Physics-Certified Sensor Data&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Physics-certified motion data for prosthetics, robotics, and Physical AI.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;S2S is a physics validation layer for human motion sensor data. Before training a prosthetic hand, surgical robot, or humanoid — run your IMU data through S2S. It verifies the data obeys 11 biomechanical laws and issues a certificate. Bad data gets rejected before it reaches your model.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pypi.org/project/s2s-certify/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ad1a639ac4e3775cc7b07422663518e60a55c81f8058b65da4c8cccb2700b480/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f7332732d63657274696679" alt="PyPI"&gt;&lt;/a&gt;
&lt;a href="https://doi.org/10.5281/zenodo.18878307" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1af42fedf443fe5e1fe6290e83de63c44d9cc94fbffbab39e4059cb411e9f535/68747470733a2f2f7a656e6f646f2e6f72672f62616467652f444f492f31302e353238312f7a656e6f646f2e31383837383330372e737667" alt="DOI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/timbo4u1/S2S/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/timbo4u1/S2S/actions/workflows/ci.yml/badge.svg" alt="S2S CI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/timbo4u1/S2S/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/41824edb22d2109efb4379e4486b9a58a0e495707d35695a9dabdc72ff140725/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d42534c2d2d312e312d626c75652e737667" alt="License: BSL-1.1"&gt;&lt;/a&gt;
&lt;a href="https://github.com/timbo4u1/S2S/README.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e115a70b47171326abc8f13ca55b2fafacdcafce1f251fed5b1ead0195717f56/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e392b2d626c75652e737667" alt="Python 3.9+"&gt;&lt;/a&gt;
&lt;a href="https://github.com/timbo4u1/S2S/README.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/735efba26a98d0a3134ba51865827811c13743d3d2028ec655f466d67f856dbd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646570656e64656e636965732d7a65726f2d677265656e2e737667" alt="Zero Dependencies"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Live Demos&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://timbo4u1.github.io/S2S" rel="nofollow noopener noreferrer"&gt;→ IMU Demo — open on your phone&lt;/a&gt;&lt;/strong&gt; · Real-time certification using phone accelerometer + gyroscope&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://timbo4u1.github.io/S2S/pose.html" rel="nofollow noopener noreferrer"&gt;→ Pose Demo — camera + skeleton&lt;/a&gt;&lt;/strong&gt; · 17-joint body tracking with live physics certification&lt;/p&gt;
&lt;p&gt;No install needed. All processing runs on your device. No data sent anywhere.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Problem&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Physical AI (robots, prosthetics, exoskeletons) is trained on motion data. But most datasets contain synthetic data that violates physics, corrupted recordings, and mislabeled actions — with no way to verify the data came from a real human moving in physically…&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/timbo4u1/S2S" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;BSL-1.1 license — free for research/education, converts to Apache 2.0 on 2028-01-01.&lt;br&gt;
PyPI: pip install s2s-certify · DOI: 10.5281/zenodo.18878307 · Preprint: hal-05531246&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>robotics</category>
      <category>datascience</category>
      <category>python</category>
    </item>
    <item>
      <title>Honest question for devs: have you ever been beaten by AI on something you thought was your strength?</title>
      <dc:creator>Sukriti Singh</dc:creator>
      <pubDate>Fri, 06 Mar 2026 05:09:19 +0000</pubDate>
      <link>https://dev.to/sukriti_singh/honest-question-for-devs-have-you-ever-been-beaten-by-ai-on-something-you-thought-was-your-2417</link>
      <guid>https://dev.to/sukriti_singh/honest-question-for-devs-have-you-ever-been-beaten-by-ai-on-something-you-thought-was-your-2417</guid>
      <description>&lt;p&gt;I just published a piece about competing against LLMs on VibeCode Arena&lt;br&gt;
same prompt, same scoring criteria, no framing advantage.&lt;/p&gt;

&lt;p&gt;The AI scored higher than me on accessibility. First pass.&lt;br&gt;
I've been writing accessible UI for years.&lt;/p&gt;

&lt;p&gt;Made me realise I was coasting on an assumption rather than actually&lt;br&gt;
verifying where I stand.&lt;/p&gt;

&lt;p&gt;Curious for anyone who's done a real side-by-side comparison:&lt;br&gt;
→ What's one area where AI surprised you?&lt;br&gt;
→ One area where you held up better than expected?&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/sukriti_singh" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F3808995%2F6a6a7805-7de2-4030-ba74-dc7fbe997145.jpg" alt="sukriti_singh"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/sukriti_singh/i-watched-gpt-and-claude-fight-over-the-same-code-heres-what-i-learned-2ebe" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I Watched GPT and Claude Fight Over the Same Code. Here's What I Learned.&lt;/h2&gt;
      &lt;h3&gt;Sukriti Singh ・ Mar 6&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>discuss</category>
      <category>ai</category>
      <category>career</category>
      <category>programming</category>
    </item>
    <item>
      <title>TreeSet in Java</title>
      <dc:creator>Nanthini Ammu</dc:creator>
      <pubDate>Fri, 06 Mar 2026 04:58:53 +0000</pubDate>
      <link>https://dev.to/nanthini_ammu_ac02ad32802/treeset-in-java-5eg7</link>
      <guid>https://dev.to/nanthini_ammu_ac02ad32802/treeset-in-java-5eg7</guid>
      <description>&lt;h4&gt;
  
  
  What is TreeSet?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Stores unique elements.&lt;/li&gt;
&lt;li&gt;Maintains elements in sorted order (ascending by default).&lt;/li&gt;
&lt;li&gt;Does not allow duplicates.&lt;/li&gt;
&lt;li&gt;It is part of the Java Collections Framework in Java and implements the Set interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example :
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import java.util.TreeSet;

public class Learn {
    public static void main(String[] args) {

        TreeSet tr = new TreeSet();
        tr.add(1000);
        tr.add(300);
        tr.add(500);
        tr.add(10);
        System.out.println(tr);

    }
}

//Even though we inserted 1000 first, TreeSet keeps them sorted.

Output: [10, 300, 500, 1000]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Duplicate Example :
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import java.util.TreeSet;

public class Learn {
    public static void main(String[] args) {

        TreeSet tr = new TreeSet();
        tr.add(1000);
        tr.add(1000);
        tr.add(500);
        tr.add(500);
        System.out.println(tr);

    }
}

//Duplicate values are ignored.

Output : [500, 1000]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Null Example :
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import java.util.TreeSet;

public class Learn {
    public static void main(String[] args) {

        TreeSet tr = new TreeSet();
        tr.add(null);
        System.out.println(tr);

    }
}

//TreeSet does not allow null.

Output : NullPointerException

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Important TreeSet Methods:
&lt;/h4&gt;

&lt;h5&gt;
  
  
  add():
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;To add element/Object.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;tr.add(500);&lt;/p&gt;

&lt;h5&gt;
  
  
  remove():
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;To remove element/Object.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;tr.remove(500);&lt;/p&gt;

&lt;h5&gt;
  
  
  contains():
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;To check if element/Object exist.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;tr.contains(500);&lt;/p&gt;

&lt;h5&gt;
  
  
  size():
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;To find the number of elements/objects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;tr.size();&lt;/p&gt;

&lt;h5&gt;
  
  
  first():
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;To find the smallest element/object.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;tr.first();&lt;/p&gt;

&lt;h5&gt;
  
  
  last():
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;To find the largets element/object.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;tr.last();&lt;/p&gt;

&lt;h5&gt;
  
  
  higher():
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;To find the next greater element/object.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;tr.higher(50);&lt;/p&gt;

&lt;h5&gt;
  
  
  lower():
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;To find the previous element/object.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;tr.lower(200);&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Learn {
    public static void main(String[] args) {

        TreeSet tr = new TreeSet();
        tr.add(500);
        tr.add(200);
        tr.add(1000);
        tr.add(50);
        tr.add(10);
        System.out.println(tr);
        tr.remove(500);
        System.out.println(tr);
        System.out.println(tr.size());
        System.out.println(tr.first());
        System.out.println(tr.last());
        System.out.println(tr.higher(50));
        System.out.println(tr.lower(200));



    }
}

Output: 

[10, 50, 200, 500, 1000] //add
[10, 50, 200, 1000]      //remove element 500
4                        //size
10                       //first element
1000                     //last element
200                      //next higher to element 50
50                       //next lower to element 200

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>beginners</category>
      <category>computerscience</category>
      <category>java</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Architecting for Vulnerability: Introducing Protective Computing Core v1.0</title>
      <dc:creator>CrisisCore-Systems</dc:creator>
      <pubDate>Fri, 06 Mar 2026 04:55:40 +0000</pubDate>
      <link>https://dev.to/crisiscoresystems/architecting-for-vulnerability-introducing-protective-computing-core-v10-91g</link>
      <guid>https://dev.to/crisiscoresystems/architecting-for-vulnerability-introducing-protective-computing-core-v10-91g</guid>
      <description>&lt;p&gt;Most software is built on a dangerous premise: the Stability Assumption.&lt;/p&gt;

&lt;p&gt;We assume the user has a stable network, stable cognitive capacity, a secure physical environment, and institutional trust. When those conditions hold, modern cloud native architecture works beautifully.&lt;/p&gt;

&lt;p&gt;But when people enter a vulnerability state, the Stability Assumption collapses. Cloud dependent apps lock people out of their own data. Helpful auto sync features broadcast metadata from compromised networks. Irreversible actions happen when someone does not have the attention or time to read a modal carefully.&lt;/p&gt;

&lt;p&gt;Here is the part we do not say out loud enough. In a crisis, software does not just fail. It can become coercive. You get logged out, you cannot recover the account, your data is suddenly somewhere else, and the only path forward is to comply with whatever the system demands.&lt;/p&gt;

&lt;p&gt;We need a systems engineering discipline for designing software under conditions of human vulnerability.&lt;/p&gt;

&lt;p&gt;Today, I am open sourcing Protective Computing Core v1.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boundary notes, because truth matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;This is not medical advice.&lt;/li&gt;
&lt;li&gt;This is not a regulatory compliance claim.&lt;/li&gt;
&lt;li&gt;This is not a claim of perfect security.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Protective Computing?
&lt;/h2&gt;

&lt;p&gt;Protective Computing is not a privacy manifesto. It is a strict, testable engineering discipline.&lt;/p&gt;

&lt;p&gt;It provides a formal vocabulary and a pattern library for building systems that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;degrade safely&lt;/li&gt;
&lt;li&gt;contain failures locally&lt;/li&gt;
&lt;li&gt;defend user agency under asymmetric power conditions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The v1.0 Core introduces a normative specification (MUST, SHOULD, MUST NOT), plus a conformance model you can actually review.&lt;/p&gt;

&lt;p&gt;Read the spec here:&lt;br&gt;&lt;br&gt;
&lt;a href="https://protective-computing.github.io/docs/spec/v1.0.html" rel="noopener noreferrer"&gt;https://protective-computing.github.io/docs/spec/v1.0.html&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The core pillars
&lt;/h2&gt;

&lt;p&gt;Protective Computing Core is built around four pillars. Each one exists because a specific failure pattern keeps hurting people.&lt;/p&gt;
&lt;h3&gt;
  
  
  1) Local Authority Pattern
&lt;/h3&gt;

&lt;p&gt;The system MUST preserve user authority over locally stored critical data in the absence of network connectivity. Network transport is treated as an optional enhancement, not a dependency for essential utility.&lt;/p&gt;

&lt;p&gt;What this prevents: the classic offline lie where the app looks usable, but the moment the network drops the user loses access to their own records.&lt;/p&gt;
&lt;h3&gt;
  
  
  2) Exposure Surface Minimization
&lt;/h3&gt;

&lt;p&gt;The system MUST NOT increase its exposure surface during crisis state escalation. Analytics, third party telemetry, and remote logging are default off and hard gated.&lt;/p&gt;

&lt;p&gt;What this prevents: silent data exhaust during the exact window when a user is least able to notice, consent, or defend themselves.&lt;/p&gt;
&lt;h3&gt;
  
  
  3) Reversible State Pattern
&lt;/h3&gt;

&lt;p&gt;The system MUST NOT introduce irreversible state transitions during declared vulnerability states unless explicitly confirmed. High impact destructive actions require bounded restoration windows where security invariants allow.&lt;/p&gt;

&lt;p&gt;What this prevents: permanent harm caused by a single misclick, mistype, or foggy moment.&lt;/p&gt;
&lt;h3&gt;
  
  
  4) Explicit Degradation Modes
&lt;/h3&gt;

&lt;p&gt;The system cannot just go offline. It MUST define explicit degradation modes (Connectivity Degradation, Cognitive Degradation, Institutional Latency) and map how essential utility is preserved in each state.&lt;/p&gt;

&lt;p&gt;What this prevents: ambiguous failure where nobody knows what is safe, what is unavailable, and what the system is doing behind the scenes.&lt;/p&gt;
&lt;h2&gt;
  
  
  The reference implementation: PainTracker
&lt;/h2&gt;

&lt;p&gt;To prove these patterns are implementable in standard web technologies, I built a reference implementation:&lt;br&gt;&lt;br&gt;
&lt;a href="https://paintracker.ca" rel="noopener noreferrer"&gt;https://paintracker.ca&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PainTracker is an offline first PWA designed for users tracking chronic health data, a highly sensitive payload often logged during high cognitive or physical distress.&lt;/p&gt;

&lt;p&gt;Instead of a traditional SaaS architecture, PainTracker implements Protective Computing through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Encrypted IndexedDB persistence (primary database lives on device)&lt;/li&gt;
&lt;li&gt;Zero knowledge vault gating (local security boundary, no remote auth dependency)&lt;/li&gt;
&lt;li&gt;Unlock only bounded reversibility (pending wipe window that only a successful unlock can abort)&lt;/li&gt;
&lt;li&gt;Hard telemetry gating (verifiable kill switch for outbound requests not explicitly initiated by the user)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repo:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/CrisisCore-Systems/pain-tracker" rel="noopener noreferrer"&gt;https://github.com/CrisisCore-Systems/pain-tracker&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Example: bounded reversibility without weakening security
&lt;/h2&gt;

&lt;p&gt;Standard security dictates that after N failed unlock attempts, a local vault should wipe.&lt;/p&gt;

&lt;p&gt;But under cognitive overload, people mistype passwords. An immediate wipe causes irreversible loss. A generic cancel button weakens brute force resistance.&lt;/p&gt;

&lt;p&gt;Protective Computing requires a bounded restoration window that does not weaken the security invariant.&lt;/p&gt;

&lt;p&gt;Here is the shape of the solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Bounded reversibility under asymmetric power defense&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleFailedUnlock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;failedAttempts&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;failedAttempts&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;MAX_FAILED_UNLOCK_ATTEMPTS&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;privacySettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vaultKillSwitchEnabled&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 1) Enter a bounded degradation state&lt;/span&gt;
    &lt;span class="c1"&gt;// 2) Disclose the pending irreversible action&lt;/span&gt;
    &lt;span class="c1"&gt;// 3) Only a successful cryptographic unlock can abort the timer&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;enterPendingWipeState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;windowMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;failed_unlock_threshold&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;onExpire&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;executeEmergencyWipe&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nx"&gt;UI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;showWarning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Vault will wipe in 10s. Enter correct passphrase to abort.&lt;/span&gt;&lt;span class="dl"&gt;"&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;Notice the constraint. There is no cancelWipe() function exposed to the UI. The only path to reversibility is proving local authority.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stateDiagram-v2
  [*] --&amp;gt; Normal
  Normal --&amp;gt; PendingWipe: N failed unlocks &amp;amp; kill switch enabled
  PendingWipe --&amp;gt; Normal: successful unlock within window
  PendingWipe --&amp;gt; Wiped: window expired
  Wiped --&amp;gt; [*]
  note right of PendingWipe: user sees warning UI
  note right of Normal: regular operation
  note right of Wiped: data erased
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Measuring posture: the Protective Legitimacy Score (PLS)
&lt;/h2&gt;

&lt;p&gt;In this space, marketing claims like military grade encryption or secure by design are useless. Engineers and regulators need auditable transparency.&lt;/p&gt;

&lt;p&gt;Alongside the Core spec, I am publishing a measurement instrument called the Protective Legitimacy Score (PLS). PLS is not a certification. It is a structured disclosure format that forces maintainers to state:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what vulnerability conditions they assume&lt;/li&gt;
&lt;li&gt;what compliance level they claim&lt;/li&gt;
&lt;li&gt;what they do not claim&lt;/li&gt;
&lt;li&gt;where they deviate, and why&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PLS rubric (PDF):&lt;br&gt;
&lt;a href="https://protective-computing.github.io/PLS_RUBRIC_v1_0_rc1.pdf" rel="noopener noreferrer"&gt;https://protective-computing.github.io/PLS_RUBRIC_v1_0_rc1.pdf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Audit evidence index:&lt;br&gt;
&lt;a href="https://github.com/protective-computing/protective-computing.github.io/blob/main/AUDIT_EVIDENCE.md" rel="noopener noreferrer"&gt;https://github.com/protective-computing/protective-computing.github.io/blob/main/AUDIT_EVIDENCE.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Compliance audit matrix:&lt;br&gt;
&lt;a href="https://github.com/protective-computing/protective-computing.github.io/blob/main/COMPLIANCE_AUDIT_MATRIX.md" rel="noopener noreferrer"&gt;https://github.com/protective-computing/protective-computing.github.io/blob/main/COMPLIANCE_AUDIT_MATRIX.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The goal is simple: replace vibes with checkable posture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The call for Reference Implementation B
&lt;/h2&gt;

&lt;p&gt;PainTracker proves the discipline works for localized health telemetry. But Protective Computing is domain agnostic.&lt;/p&gt;

&lt;p&gt;These patterns are exactly what is needed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;disaster response cache applications&lt;/li&gt;
&lt;li&gt;coercion resistant messaging interfaces&lt;/li&gt;
&lt;li&gt;offline first journalistic tooling&lt;/li&gt;
&lt;li&gt;legal aid and housing workflows under institutional delay&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to contribute, here is the most useful path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read the spec v1.0: &lt;a href="https://protective-computing.github.io/docs/spec/v1.0.html" rel="noopener noreferrer"&gt;https://protective-computing.github.io/docs/spec/v1.0.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pick one requirement you think is wrong, too vague, or unbuildable.&lt;/li&gt;
&lt;li&gt;Submit a review with a concrete counterexample and a better verification procedure.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Review invitation:&lt;br&gt;
&lt;a href="https://protective-computing.github.io/docs/independent-review.html" rel="noopener noreferrer"&gt;https://protective-computing.github.io/docs/independent-review.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Independent review checklist:&lt;br&gt;
&lt;a href="https://github.com/protective-computing/protective-computing.github.io/blob/main/INDEPENDENT_REVIEW_CHECKLIST.md" rel="noopener noreferrer"&gt;https://github.com/protective-computing/protective-computing.github.io/blob/main/INDEPENDENT_REVIEW_CHECKLIST.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I do not need agreement. I need pressure testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Canonical archive (Zenodo)
&lt;/h2&gt;

&lt;p&gt;If you want the citable artifacts and stable versions, Protective Computing is archived as a Zenodo community. This is the cleanest place to reference exact releases without link rot.&lt;/p&gt;

&lt;p&gt;Community:&lt;br&gt;
&lt;a href="https://zenodo.org/communities/protective-computing/records" rel="noopener noreferrer"&gt;https://zenodo.org/communities/protective-computing/records&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Core canon (Overton Framework v1.3):&lt;br&gt;
&lt;a href="https://doi.org/10.5281/zenodo.18688516" rel="noopener noreferrer"&gt;https://doi.org/10.5281/zenodo.18688516&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Field Guide v0.1:&lt;br&gt;
&lt;a href="https://doi.org/10.5281/zenodo.18782339" rel="noopener noreferrer"&gt;https://doi.org/10.5281/zenodo.18782339&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PLS rubric DOI:&lt;br&gt;
&lt;a href="https://doi.org/10.5281/zenodo.18783432" rel="noopener noreferrer"&gt;https://doi.org/10.5281/zenodo.18783432&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Start here, and support the work if it helped
&lt;/h2&gt;

&lt;p&gt;Fastest route through the catalog (series index):&lt;br&gt;
&lt;a href="https://dev.to/crisiscoresystems/start-here-paintracker-crisiscore-build-log-privacy-first-offline-first-no-surveillance-3h0k"&gt;https://dev.to/crisiscoresystems/start-here-paintracker-crisiscore-build-log-privacy-first-offline-first-no-surveillance-3h0k&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sponsor the build (keeps it independent of surveillance funding):&lt;br&gt;
&lt;a href="https://paintracker.ca/sponsor" rel="noopener noreferrer"&gt;https://paintracker.ca/sponsor&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Star the repo:&lt;br&gt;
&lt;a href="https://github.com/CrisisCore-Systems/pain-tracker" rel="noopener noreferrer"&gt;https://github.com/CrisisCore-Systems/pain-tracker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we change the architectural defaults, we can stop building software that breaks exactly when people need it most.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>privacy</category>
      <category>offlinefirst</category>
      <category>engineering</category>
    </item>
  </channel>
</rss>
