<?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: Arslon Erkinov</title>
    <description>The latest articles on DEV Community by Arslon Erkinov (@cyberb0x).</description>
    <link>https://dev.to/cyberb0x</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3738228%2F382a7cbb-bef9-43a0-906b-9c50d0de5537.jpeg</url>
      <title>DEV Community: Arslon Erkinov</title>
      <link>https://dev.to/cyberb0x</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cyberb0x"/>
    <language>en</language>
    <item>
      <title>Today’s Progress Update — Food Blog Project</title>
      <dc:creator>Arslon Erkinov</dc:creator>
      <pubDate>Mon, 20 Apr 2026 18:15:16 +0000</pubDate>
      <link>https://dev.to/cyberb0x/todays-progress-update-food-blog-project-f9</link>
      <guid>https://dev.to/cyberb0x/todays-progress-update-food-blog-project-f9</guid>
      <description>&lt;p&gt;A productive day working on my Food Blog Platform 🍰&lt;/p&gt;

&lt;p&gt;Here’s what I accomplished today:&lt;/p&gt;

&lt;p&gt;🔹 Improved recipe listing performance and fixed filtering edge cases&lt;br&gt;
🔹 Enhanced live search functionality (faster + more stable results)&lt;br&gt;
🔹 Fixed pagination behavior with category filters&lt;br&gt;
🔹 Polished UI elements (spacing, hover effects, responsiveness)&lt;br&gt;
🔹 Improved like system stability and animation consistency&lt;br&gt;
🔹 Refactored parts of the Django views for cleaner structure&lt;/p&gt;

&lt;p&gt;💡 Small but important step toward a more scalable and production-ready project.&lt;/p&gt;

&lt;p&gt;Each improvement brings the platform closer to a real-world product experience 🚀&lt;/p&gt;

&lt;p&gt;Next steps:&lt;br&gt;
➡️ User authentication system&lt;br&gt;
➡️ Favorites/bookmarks feature&lt;br&gt;
➡️ Deployment setup&lt;/p&gt;

&lt;h1&gt;
  
  
  Python #Django #FullStack #WebDevelopment #100DaysOfCode #FoodTech
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwgd5547umxkn459ctvkr.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%2Fwgd5547umxkn459ctvkr.png" alt=" " width="800" height="352"&gt;&lt;/a&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%2F5gkxoj1dmmq1jiorzk6u.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%2F5gkxoj1dmmq1jiorzk6u.png" alt=" " width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>Day 18 — Migrating Django Rate Limiting to Redis (Production Architecture)</title>
      <dc:creator>Arslon Erkinov</dc:creator>
      <pubDate>Tue, 10 Mar 2026 13:59:52 +0000</pubDate>
      <link>https://dev.to/cyberb0x/day-18-migrating-django-rate-limiting-to-redis-production-architecture-3ebh</link>
      <guid>https://dev.to/cyberb0x/day-18-migrating-django-rate-limiting-to-redis-production-architecture-3ebh</guid>
      <description>&lt;p&gt;Today I moved my Django REST API from in-memory throttling to Redis-based rate limiting.&lt;/p&gt;

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

&lt;p&gt;Because in-memory rate limiting (LocMemCache):&lt;br&gt;
Breaks in multi-instance deployments&lt;br&gt;
Doesn’t scale horizontally&lt;br&gt;
Is not production-safe&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I implemented:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Redis-based Rate Limiter&lt;br&gt;
Atomic counters&lt;br&gt;
Plan-based limits&lt;br&gt;
24-hour TTL&lt;br&gt;
Proper 429 response handling&lt;br&gt;
Usage tracking even on failures&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remaining requests exposed via header&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Clean Architecture&lt;br&gt;
Removed legacy limiter file&lt;br&gt;
Removed duplicate imports&lt;br&gt;
Centralized rate limiting logic&lt;br&gt;
Clean exception handling using DRF Throttled&lt;/p&gt;

&lt;p&gt;✅ Observability&lt;br&gt;
Usage logging for 200 / 400 / 429 responses&lt;br&gt;
Redis debug endpoint for monitoring rate keys&lt;br&gt;
Ready for SaaS analytics layer&lt;/p&gt;

&lt;p&gt;Now the backend is:&lt;br&gt;
Horizontally scalable&lt;br&gt;
Cloud-ready&lt;br&gt;
Production-safe&lt;br&gt;
Clean and maintainable&lt;/p&gt;

&lt;p&gt;This is how you build infrastructure before UI.&lt;br&gt;
Next step: more backend hardening before moving to interface.&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%2Fvbmsgisbbh7n86uyhl35.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%2Fvbmsgisbbh7n86uyhl35.png" alt=" " width="418" height="95"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>Day 17 – Building SaaS-Grade Analytics for My AI Phishing Defense Platform</title>
      <dc:creator>Arslon Erkinov</dc:creator>
      <pubDate>Mon, 02 Mar 2026 21:40:16 +0000</pubDate>
      <link>https://dev.to/cyberb0x/day-17-building-saas-grade-analytics-for-my-ai-phishing-defense-platform-715</link>
      <guid>https://dev.to/cyberb0x/day-17-building-saas-grade-analytics-for-my-ai-phishing-defense-platform-715</guid>
      <description>&lt;p&gt;Today I focused entirely on backend robustness.&lt;/p&gt;

&lt;p&gt;Instead of jumping to UI, I strengthened the analytics layer.&lt;/p&gt;

&lt;p&gt;What I Added&lt;br&gt;
1️⃣ API Usage Monitoring&lt;br&gt;
Status codes&lt;br&gt;
Request latency (ms)&lt;br&gt;
Per-API-key tracking&lt;br&gt;
Error rate calculation&lt;/p&gt;

&lt;p&gt;2️⃣ Risk Intelligence Metrics&lt;br&gt;
High / Medium / Low distribution&lt;br&gt;
Risk percentage breakdown&lt;br&gt;
7-day usage trends&lt;br&gt;
Average risk score over time&lt;/p&gt;

&lt;p&gt;3️⃣ Performance Metrics&lt;br&gt;
Average latency&lt;br&gt;
Error rate (%)&lt;br&gt;
Per-plan breakdown&lt;br&gt;
Real Bug I Faced&lt;br&gt;
I hit this error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sqlite3.OperationalError: no such column: analyzer_apiusage.latency_ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model was updated, but the database schema wasn’t.&lt;br&gt;
Classic migration issue.&lt;/p&gt;

&lt;p&gt;The fix:&lt;br&gt;
Run makemigrations&lt;br&gt;
Run migrate&lt;br&gt;
Ensure correct module imports in models/init.py&lt;/p&gt;

&lt;p&gt;Lesson:&lt;br&gt;
Your ORM and your DB schema must always stay aligned.&lt;br&gt;
Why This Matters&lt;br&gt;
Before building UI, backend must be stable.&lt;/p&gt;

&lt;p&gt;Now the system:&lt;br&gt;
Tracks performance&lt;br&gt;
Measures abuse&lt;br&gt;
Prepares for production&lt;br&gt;
Supports SaaS analytics dashboards&lt;/p&gt;

&lt;p&gt;Next step: Backend hardening before frontend.&lt;br&gt;
Security is not just detection — it’s architecture.&lt;/p&gt;

&lt;h1&gt;
  
  
  django #ai #cybersecurity #backend #saas
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>Building a Real Analytics Engine in Django (AI Security SaaS)</title>
      <dc:creator>Arslon Erkinov</dc:creator>
      <pubDate>Wed, 25 Feb 2026 17:32:40 +0000</pubDate>
      <link>https://dev.to/cyberb0x/building-a-real-analytics-engine-in-django-ai-security-saas-bb6</link>
      <guid>https://dev.to/cyberb0x/building-a-real-analytics-engine-in-django-ai-security-saas-bb6</guid>
      <description>&lt;p&gt;Today I implemented a production-style analytics layer for my AI Phishing Defense Platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What was added?&lt;/strong&gt;&lt;br&gt;
Global Usage Metrics&lt;br&gt;
Total requests&lt;br&gt;
Requests today&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Risk Distribution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;High / Medium / Low counts&lt;br&gt;
Percentage breakdown&lt;br&gt;
Product-ready formatting&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Daily Usage Trend&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using:&lt;/p&gt;

&lt;p&gt;TruncDate + Count&lt;br&gt;
This produces a 7-day usage trend that can directly power charts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per-User Stats&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each PRO API key now sees:&lt;br&gt;
Its own total request count&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clean JSON Structure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of returning flat data, the response is structured for dashboards:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "global_stats": {...},&lt;br&gt;
  "risk_distribution": {...},&lt;br&gt;
  "usage_by_plan": {...},&lt;br&gt;
  "daily_usage_trend": [...],&lt;br&gt;
  "my_usage": {...}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;This makes frontend integration trivial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architectural Takeaway&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Good analytics endpoints are:&lt;br&gt;
Aggregated at DB level&lt;br&gt;
Role-protected&lt;br&gt;
Plan-aware&lt;br&gt;
Structurally clean&lt;br&gt;
Frontend-ready&lt;/p&gt;

&lt;p&gt;This project is now evolving from an API experiment into a monetizable security SaaS.&lt;/p&gt;

&lt;p&gt;Next milestone:&lt;br&gt;
Latency tracking + error rate monitoring.&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%2Fyduggcdpywin8lb42w6a.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%2Fyduggcdpywin8lb42w6a.png" alt=" " width="800" height="830"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>Day 17 — Building PRO-Only Analytics in a Django SaaS Platform</title>
      <dc:creator>Arslon Erkinov</dc:creator>
      <pubDate>Tue, 24 Feb 2026 22:23:52 +0000</pubDate>
      <link>https://dev.to/cyberb0x/day-17-building-pro-only-analytics-in-a-django-saas-platform-nah</link>
      <guid>https://dev.to/cyberb0x/day-17-building-pro-only-analytics-in-a-django-saas-platform-nah</guid>
      <description>&lt;p&gt;Today I implemented role-based access control for analytics in my AI Phishing Defense Platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What was the goal?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Allow only PRO and ENTERPRISE API keys to access advanced usage statistics.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What was implemented?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Custom API Key Authentication&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instead of default DRF token auth, I built a custom:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;class APIKeyAuthentication(BaseAuthentication)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It reads:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;X-API-Key: &amp;lt;key&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And attaches:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;request.api_key&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;to the request.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Important lesson:&lt;br&gt;
Authentication must be side-effect free.&lt;br&gt;
No DB updates inside authenticate().&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Custom Permission Layer&lt;br&gt;
&lt;em&gt;class ProPlanOnly(BasePermission)&lt;/em&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;API key exists&lt;/li&gt;
&lt;li&gt;Key is active&lt;/li&gt;
&lt;li&gt;Plan is in ("pro", "enterprise")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates clean separation:&lt;/p&gt;

&lt;p&gt;Authentication → Who are you?&lt;br&gt;
Permission → Are you allowed here?&lt;/p&gt;

&lt;p&gt;Usage Tracking System&lt;/p&gt;

&lt;p&gt;Every request now logs:&lt;/p&gt;

&lt;p&gt;endpoint&lt;br&gt;
method&lt;br&gt;
status code&lt;br&gt;
timestamp&lt;br&gt;
API key reference&lt;/p&gt;

&lt;p&gt;This enables real SaaS metrics later.&lt;/p&gt;

&lt;p&gt;Real Bug Found &amp;amp; Fixed&lt;br&gt;
I accidentally had duplicate URL routes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;analytics/usage/&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Django resolves first match only.&lt;/p&gt;

&lt;p&gt;Lesson learned:&lt;br&gt;
URL duplication silently overrides logic.&lt;/p&gt;

&lt;p&gt;Architecture Now&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;*&lt;em&gt;Anonymous *&lt;/em&gt;→ basic limited access&lt;/li&gt;
&lt;li&gt;*&lt;em&gt;Free *&lt;/em&gt;→ tracked analysis&lt;/li&gt;
&lt;li&gt;*&lt;em&gt;Pro *&lt;/em&gt;→ analysis + analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project is evolving from a demo into a monetizable security SaaS.&lt;/p&gt;

&lt;p&gt;Tomorrow: analytics expansion layer.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>From String Fields to Real Architecture — Fixing Audit Logging in Django</title>
      <dc:creator>Arslon Erkinov</dc:creator>
      <pubDate>Fri, 13 Feb 2026 20:35:23 +0000</pubDate>
      <link>https://dev.to/cyberb0x/from-string-fields-to-real-architecture-fixing-audit-logging-in-django-52h5</link>
      <guid>https://dev.to/cyberb0x/from-string-fields-to-real-architecture-fixing-audit-logging-in-django-52h5</guid>
      <description>&lt;p&gt;Today I closed Day 17 — Part 1 of my AI Phishing Defense Platform.&lt;/p&gt;

&lt;p&gt;The system was “working”… but architecturally wrong.&lt;br&gt;
The Problem&lt;br&gt;
Audit logs were storing API keys as plain strings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That breaks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;relational integrity&lt;/li&gt;
&lt;li&gt;analytics joins&lt;/li&gt;
&lt;li&gt;usage aggregation&lt;/li&gt;
&lt;li&gt;long-term scalability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It looked like this:&lt;br&gt;
&lt;code&gt;api_key = models.CharField(max_length=64)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That’s not production-grade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Refactor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I replaced it with:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;api_key = models.ForeignKey(&lt;br&gt;
    APIKey,&lt;br&gt;
    null=True,&lt;br&gt;
    blank=True,&lt;br&gt;
    on_delete=models.SET_NULL,&lt;br&gt;
)&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;proper usage aggregation&lt;/li&gt;
&lt;li&gt;accurate plan tracking&lt;/li&gt;
&lt;li&gt;clean JOIN queries&lt;/li&gt;
&lt;li&gt;future-ready analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What Broke&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;As expected, migrations and existing logic exploded:&lt;/li&gt;
&lt;li&gt;ForeignKey assignment errors&lt;/li&gt;
&lt;li&gt;IntegrityError on status_code&lt;/li&gt;
&lt;li&gt;Rate limit filters pointing to wrong fields&lt;/li&gt;
&lt;li&gt;Audit logger passing strings instead of instances&lt;/li&gt;
&lt;li&gt;This is normal when upgrading architecture.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What Was Fixed&lt;/strong&gt;&lt;br&gt;
• Correct FK assignment&lt;br&gt;
• Refactored log_audit_event&lt;br&gt;
• Unified rate limit logic&lt;br&gt;
• Clean APIUsage logging&lt;br&gt;
• Plan-aware audit entries&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now the system tracks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anonymous&lt;/li&gt;
&lt;li&gt;Free&lt;/li&gt;
&lt;li&gt;Pro&lt;/li&gt;
&lt;li&gt;Status codes&lt;/li&gt;
&lt;li&gt;Daily usage&lt;/li&gt;
&lt;li&gt;Endpoint analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lesson&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don’t build demos.&lt;/li&gt;
&lt;li&gt;Build systems that survive refactoring.&lt;/li&gt;
&lt;li&gt;Architecture debt always shows up later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Day 17 is about backend maturity.&lt;br&gt;
Tomorrow: analytics expansion layer.&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%2Fqh0y7dnedusrimt7c5ia.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%2Fqh0y7dnedusrimt7c5ia.png" alt=" " width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>Day 16 (Part 4 &amp; Part 5): Audit Logs, Migrations, and Stability</title>
      <dc:creator>Arslon Erkinov</dc:creator>
      <pubDate>Mon, 09 Feb 2026 19:23:58 +0000</pubDate>
      <link>https://dev.to/cyberb0x/day-16-part-4-part-5-audit-logs-migrations-and-stability-3c99</link>
      <guid>https://dev.to/cyberb0x/day-16-part-4-part-5-audit-logs-migrations-and-stability-3c99</guid>
      <description>&lt;p&gt;Day 16 (Part 4 &amp;amp; Part 5): Audit Logs, Migrations, and Stability&lt;/p&gt;

&lt;p&gt;Today’s work was about making the backend reliable, not just functional.&lt;/p&gt;

&lt;p&gt;I focused on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designing a proper AuditLog model&lt;/li&gt;
&lt;li&gt;Migrating from a raw field to a ForeignKey relationship&lt;/li&gt;
&lt;li&gt;Dealing with broken migrations after schema changes&lt;/li&gt;
&lt;li&gt;Resetting and rebuilding the database cleanly&lt;/li&gt;
&lt;li&gt;Verifying audit logging through real request simulations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This part of the project reinforced an important lesson:&lt;br&gt;
backend engineering isn’t only about writing new code —&lt;br&gt;
&lt;strong&gt;it’s about maintaining data integrity as the system evolves.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With Day 16 fully completed (Part 4 &amp;amp; 5),&lt;br&gt;
I’m ready to move forward to &lt;strong&gt;Day 17&lt;/strong&gt;, where I’ll work on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;li&gt;API quotas&lt;/li&gt;
&lt;li&gt;Usage tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for following along 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>Designing a Production-Grade API Control Layer</title>
      <dc:creator>Arslon Erkinov</dc:creator>
      <pubDate>Fri, 06 Feb 2026 21:35:03 +0000</pubDate>
      <link>https://dev.to/cyberb0x/designing-a-production-grade-api-control-layer-4cf</link>
      <guid>https://dev.to/cyberb0x/designing-a-production-grade-api-control-layer-4cf</guid>
      <description>&lt;p&gt;&lt;strong&gt;Day 16 · Part 4&lt;/strong&gt; — Designing a Production-Grade API Control Layer&lt;/p&gt;

&lt;p&gt;In this stage of the project, I focused on something many apps postpone — API control and observability.&lt;/p&gt;

&lt;p&gt;What I implemented:&lt;/p&gt;

&lt;p&gt;🔐 Authentication&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API key–based auth&lt;/li&gt;
&lt;li&gt;Unified request contract (request.api_key_obj)&lt;/li&gt;
&lt;li&gt;No implicit globals or hidden state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🛂 Permissions&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plan-aware permissions (Pro / Enterprise only)&lt;/li&gt;
&lt;li&gt;Explicit access boundaries at the view level&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚦 Rate Limiting&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Daily limits per API key&lt;/li&gt;
&lt;li&gt;Plan-driven quotas&lt;/li&gt;
&lt;li&gt;Cache-backed, deterministic, testable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📜 Audit Logging&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Target hashing (privacy by design)&lt;/li&gt;
&lt;li&gt;IP masking&lt;/li&gt;
&lt;li&gt;Immutable audit records&lt;/li&gt;
&lt;li&gt;Zero dependency on views’ internal logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key architectural rule:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Views should not “know” how security works — they should only consume it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This makes the system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;safer to evolve&lt;/li&gt;
&lt;li&gt;easier to test&lt;/li&gt;
&lt;li&gt;compliant with real security audits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Day 16 · Part 4 is complete.&lt;br&gt;
Next step: &lt;strong&gt;usage tracking &amp;amp; billing foundations.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>architecture</category>
      <category>security</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Hardening a Security API with DRF Serializers</title>
      <dc:creator>Arslon Erkinov</dc:creator>
      <pubDate>Tue, 03 Feb 2026 11:46:27 +0000</pubDate>
      <link>https://dev.to/cyberb0x/hardening-a-security-api-with-drf-serializers-30a6</link>
      <guid>https://dev.to/cyberb0x/hardening-a-security-api-with-drf-serializers-30a6</guid>
      <description>&lt;p&gt;&lt;strong&gt;Day 16: Hardening a Security API with DRF Serializers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Wrapped up &lt;strong&gt;Day 16 / Part 3&lt;/strong&gt; of my AI Phishing Defense Platform.&lt;/p&gt;

&lt;p&gt;This stage was about cleaning up the API layer and making it production-ready:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key changes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replaced manual request parsing with DRF serializers&lt;/li&gt;
&lt;li&gt;Enforced strict URL validation at the framework level&lt;/li&gt;
&lt;li&gt;Unified error handling (serializer.errors)&lt;/li&gt;
&lt;li&gt;Ensured audit logs are written only after successful validation&lt;/li&gt;
&lt;li&gt;All tests passing ✔️&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why serializers matter more than people think:&lt;br&gt;
In security-related APIs, accepting malformed input silently is a bug — not a feature.&lt;br&gt;
Serializers give:&lt;/p&gt;

&lt;p&gt;deterministic validation&lt;/p&gt;

&lt;p&gt;consistent error contracts&lt;/p&gt;

&lt;p&gt;safer evolution of the API&lt;/p&gt;

&lt;p&gt;No ML yet. No hype.&lt;br&gt;
Just building the foundation correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next (Day 16 / Part 4):&lt;/strong&gt;&lt;br&gt;
rate limits, permissions, and real-world abuse protection.&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%2Ffppgl58mx19wqiless1w.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%2Ffppgl58mx19wqiless1w.png" alt=" " width="776" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>Designing Analytics for a Security-Focused Django API Day 15</title>
      <dc:creator>Arslon Erkinov</dc:creator>
      <pubDate>Fri, 30 Jan 2026 10:10:32 +0000</pubDate>
      <link>https://dev.to/cyberb0x/designing-analytics-for-a-security-focused-django-api-day-15-5e97</link>
      <guid>https://dev.to/cyberb0x/designing-analytics-for-a-security-focused-django-api-day-15-5e97</guid>
      <description>&lt;p&gt;Today I focused on the analytics and internal observability of my phishing detection platform.&lt;/p&gt;

&lt;p&gt;Key takeaways from this stage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analytics should live separately from core business logic&lt;/li&gt;
&lt;li&gt;URL routing clarity prevents long-term technical debt&lt;/li&gt;
&lt;li&gt;API-key–scoped statistics are critical for SaaS-style products&lt;/li&gt;
&lt;li&gt;Import errors are often symptoms of deeper architectural problems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Implemented:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usage stats by plan&lt;/li&gt;
&lt;li&gt;Risk score aggregation&lt;/li&gt;
&lt;li&gt;Verdict distribution&lt;/li&gt;
&lt;li&gt;Admin vs user-level analytics separation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This wasn’t about shipping fast —&lt;br&gt;
it was about making sure the system can be trusted, monitored, and extended.&lt;/p&gt;

&lt;p&gt;Next: testing and public-facing API improvements.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>AI Phishing Defense Platform Day 13</title>
      <dc:creator>Arslon Erkinov</dc:creator>
      <pubDate>Wed, 28 Jan 2026 19:11:46 +0000</pubDate>
      <link>https://dev.to/cyberb0x/ai-phishing-defense-platform-day-13-4690</link>
      <guid>https://dev.to/cyberb0x/ai-phishing-defense-platform-day-13-4690</guid>
      <description>&lt;p&gt;Day 13 completed: API Security &amp;amp; Usage Tracking&lt;/p&gt;

&lt;p&gt;Today I finished Day 13 of building my AI Phishing Defense Platform.&lt;br&gt;
What’s implemented:&lt;br&gt;
✅ API Keys (per user)&lt;br&gt;
✅ Endpoint protection&lt;br&gt;
✅ Custom rate limiting (production-ready, no third-party magic)&lt;br&gt;
✅ API usage tracking (endpoint, method, time)&lt;br&gt;
✅ Architecture ready for SaaS billing &amp;amp; plans&lt;/p&gt;

&lt;p&gt;This is no longer a “pet project”.&lt;br&gt;
It’s a real API product foundation — scalable, secure, and measurable.&lt;/p&gt;

&lt;p&gt;Next step:&lt;br&gt;
 📊 Plans, quotas, admin dashboard, and SaaS polish.&lt;/p&gt;

&lt;p&gt;I’m building this long-term with a clear goal:&lt;br&gt;
strong portfolio, real users, and global impact.&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%2F9kmh21muibs6zyierywg.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%2F9kmh21muibs6zyierywg.png" alt=" " width="800" height="364"&gt;&lt;/a&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%2F6xej25vfahvx2f042mhk.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%2F6xej25vfahvx2f042mhk.png" alt=" " width="800" height="451"&gt;&lt;/a&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%2Frfugn1yh1yusonr8hd9g.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%2Frfugn1yh1yusonr8hd9g.png" alt=" " width="800" height="299"&gt;&lt;/a&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%2Fk11z9k0kjpxbwjwpwdq8.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%2Fk11z9k0kjpxbwjwpwdq8.png" alt=" " width="800" height="410"&gt;&lt;/a&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%2Fozt9gckz7rrxuwl3nsv2.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%2Fozt9gckz7rrxuwl3nsv2.png" alt=" " width="800" height="536"&gt;&lt;/a&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%2Fqz66zfw874i3j8ez29wm.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%2Fqz66zfw874i3j8ez29wm.png" alt=" " width="749" height="517"&gt;&lt;/a&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%2Fp33vdz8sjklpj4ggpd39.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%2Fp33vdz8sjklpj4ggpd39.png" alt=" " width="790" height="663"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>AI Phishing Defense Platform Day 14</title>
      <dc:creator>Arslon Erkinov</dc:creator>
      <pubDate>Wed, 28 Jan 2026 19:08:30 +0000</pubDate>
      <link>https://dev.to/cyberb0x/ai-phishing-defense-platform-day-14-2cgp</link>
      <guid>https://dev.to/cyberb0x/ai-phishing-defense-platform-day-14-2cgp</guid>
      <description>&lt;p&gt;Day 14 completed — AI Phishing Defense Platform&lt;/p&gt;

&lt;p&gt;I’m building an enterprise-ready phishing detection platform focused on real-world security, not demos.&lt;/p&gt;

&lt;p&gt;What’s already implemented:&lt;br&gt;
 • API-first architecture with API keys&lt;br&gt;
 • Rate limiting &amp;amp; abuse protection&lt;br&gt;
 • Multi-layer URL analysis (heuristics + AI scoring + reputation)&lt;br&gt;
 • Explainable threat reports (human-readable &amp;amp; technical)&lt;br&gt;
 • Usage analytics and observability mindset&lt;/p&gt;

&lt;p&gt;This project is designed with a security-first approach:&lt;br&gt;
 • No implicit trust in user input&lt;br&gt;
 • Explainable verdicts for audit &amp;amp; compliance&lt;br&gt;
 • Monitoring for false positives, latency, and abuse&lt;/p&gt;

&lt;p&gt;Goal: build a real-world security platform that could operate at scale for developers, SOC teams, and businesses.&lt;/p&gt;

&lt;p&gt;More coming soon — Day 15 will focus on detection depth and explainability.&lt;/p&gt;

&lt;p&gt;Хэштег#CyberSecurity Хэштег#AI Хэштег#Phishing Хэштег#Django Хэштег#SecurityEngineering Хэштег#Startup Хэштег#OpenToWork&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>cybersecurity</category>
      <category>security</category>
    </item>
  </channel>
</rss>
