<?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: Vladyslav</title>
    <description>The latest articles on DEV Community by Vladyslav (@metimol).</description>
    <link>https://dev.to/metimol</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%2F3179661%2Fc69e252a-f14d-4cab-a673-e555fd6e0330.jpg</url>
      <title>DEV Community: Vladyslav</title>
      <link>https://dev.to/metimol</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/metimol"/>
    <language>en</language>
    <item>
      <title>BlackWave: How I Built a Social Network Simulator with Thousands of AI Bots and Why I Switched to Python</title>
      <dc:creator>Vladyslav</dc:creator>
      <pubDate>Thu, 12 Jun 2025 21:06:15 +0000</pubDate>
      <link>https://dev.to/metimol/blackwave-how-i-built-a-social-network-simulator-with-thousands-of-ai-bots-and-why-i-switched-to-5fag</link>
      <guid>https://dev.to/metimol/blackwave-how-i-built-a-social-network-simulator-with-thousands-of-ai-bots-and-why-i-switched-to-5fag</guid>
      <description>&lt;p&gt;&lt;strong&gt;Hey everyone!&lt;/strong&gt; My name is &lt;strong&gt;Vladyslav&lt;/strong&gt;, but you can find me online as &lt;strong&gt;Metimol&lt;/strong&gt;. I want to share the story behind my open-source project, &lt;strong&gt;BlackWave&lt;/strong&gt;—a social network simulator where real users can interact with thousands of autonomous AI bots, each with a unique personality, memory, and behavior. It's been a journey from a crazy idea to an unexpected collaboration, a complete tech-stack overhaul, and finally, a release.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 The Idea: A Social Network for One
&lt;/h2&gt;

&lt;p&gt;It all started around &lt;strong&gt;May 15th&lt;/strong&gt;. An idea struck me: what if I created a Twitter clone, but not for the masses? I envisioned a space with just one single human user, surrounded by thousands of bots. These bots would simulate real users: they'd follow the real person, like their posts, leave comments, and create the illusion of maximum engagement.&lt;/p&gt;

&lt;p&gt;My goal was to go deeper than just plugging in an AI assistant, as many major platforms do. I wanted to integrate &lt;strong&gt;Large Language Models (LLMs)&lt;/strong&gt; at a fundamental level, making them a core part of the ecosystem from the very beginning. The bots had to generate their own content, comments, and fully imitate the behavior of real people.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 First Steps &amp;amp; An Unexpected Collaboration
&lt;/h2&gt;

&lt;p&gt;I found a great-looking Figma mockup and started bringing it to life, building the frontend with &lt;strong&gt;React&lt;/strong&gt;. I created the registration and login pages, along with the main post feed. To get feedback and maybe find like-minded people, I wrote a short post about my idea on a Ukrainian developer forum.&lt;/p&gt;

&lt;p&gt;The reaction was mixed; some saw it as a fun but useless toy, while others saw its potential. But most importantly, a &lt;strong&gt;C# developer with 25 years of experience&lt;/strong&gt; reached out to me. He was building his own rapid software development platform called &lt;strong&gt;Fractal&lt;/strong&gt; and offered to help.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📚 &lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/fraplat/FractalPlatform" rel="noopener noreferrer"&gt;Fractal Project on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://t.me/fraplat" rel="noopener noreferrer"&gt;Fractal Developers Telegram Chat&lt;/a&gt; &lt;em&gt;(where we discussed the idea)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;He was so inspired that just &lt;strong&gt;eight hours later&lt;/strong&gt;, he sent me a video of the first prototype. It already had working registration, login, post creation, and comments. The speed was incredible.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔀 A Fork in the Road: New Requirements &amp;amp; A Change of Course
&lt;/h2&gt;

&lt;p&gt;By then, my vision for the project had expanded significantly. I realized the bots needed to be &lt;strong&gt;completely autonomous&lt;/strong&gt;: not just reacting to user actions, but living their own lives, writing their own posts, following each other and real users, and creating a dynamic and lively feed.&lt;/p&gt;

&lt;p&gt;We agreed to split the work: he would handle the social network and its API on his C# platform, while I would write the entire complex bot logic in &lt;strong&gt;Python&lt;/strong&gt; using &lt;strong&gt;FastAPI&lt;/strong&gt;. In about two and a half weeks, I wrote around &lt;strong&gt;7,000 lines of code&lt;/strong&gt;, implementing all the planned logic for the bots. We ran load tests, and the system handled the activity of a thousand bots without a problem.&lt;/p&gt;

&lt;p&gt;But when it came time to merge everything into a single project, I ran into a wall. To run his part, I had to deploy his entire development platform, which included a code editor that ran directly in the browser. This didn't align with my goals. I wanted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ A &lt;strong&gt;100% Python project&lt;/strong&gt; to add to my portfolio, showcasing my skills with Docker, AI models, vector databases, and more&lt;/li&gt;
&lt;li&gt;✅ A &lt;strong&gt;fully open-source project&lt;/strong&gt; that anyone could easily deploy with a single command&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🐍 The Python Rebirth &amp;amp; The "Qwitter" Project
&lt;/h2&gt;

&lt;p&gt;I started searching on GitHub for an open-source Twitter clone written in Python. I found the perfect starting point: a project called &lt;strong&gt;Qwitter&lt;/strong&gt;, built with &lt;strong&gt;Django&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📚 &lt;strong&gt;Resource:&lt;/strong&gt; &lt;a href="https://github.com/himanshuat/qwitter" rel="noopener noreferrer"&gt;Qwitter Project on GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I contacted the author, and he graciously gave me permission to use his code. This was a new beginning. I used Qwitter as a base but ended up changing about &lt;strong&gt;30% of the project&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📱 &lt;strong&gt;Improved and fully optimized&lt;/strong&gt; the frontend for mobile devices&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Rewrote the API&lt;/strong&gt; almost from scratch to work with my FastAPI bot system, implementing authentication via a static API key&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Enhanced the Django admin panel&lt;/strong&gt;, separating user and bot management and adding content moderation features&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;Distinguished bots from users&lt;/strong&gt; in the database model by simply adding an &lt;code&gt;is_bot&lt;/code&gt; field&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With that, I connected the Django project for the social network with my existing FastAPI system for the bots, allowing them to communicate via the API.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Breathing Life into Bots: Personalities, Memory &amp;amp; Behavior
&lt;/h2&gt;

&lt;p&gt;The most exciting part of the project is how the bots work. I put a lot of effort into making them feel like real people.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎭 Personalities &amp;amp; Probabilities
&lt;/h3&gt;

&lt;p&gt;When a bot is created, it's assigned a unique &lt;strong&gt;personality&lt;/strong&gt; (or category). Currently, there are several types: &lt;strong&gt;Fan&lt;/strong&gt;, &lt;strong&gt;Hater&lt;/strong&gt;, &lt;strong&gt;Silent&lt;/strong&gt;, &lt;strong&gt;Random&lt;/strong&gt;, &lt;strong&gt;Neutral&lt;/strong&gt;, &lt;strong&gt;Funny&lt;/strong&gt;, &lt;strong&gt;Provocative&lt;/strong&gt;, and &lt;strong&gt;Role-Player&lt;/strong&gt;. Each category has its own probability settings for different actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💖 A &lt;strong&gt;Fan&lt;/strong&gt; has an &lt;strong&gt;85% chance&lt;/strong&gt; of liking a post, a &lt;strong&gt;40% chance&lt;/strong&gt; of commenting, and a &lt;strong&gt;75% chance&lt;/strong&gt; of following&lt;/li&gt;
&lt;li&gt;💀 A &lt;strong&gt;Hater&lt;/strong&gt; has only an &lt;strong&gt;8% chance&lt;/strong&gt; of liking something but a &lt;strong&gt;60% chance&lt;/strong&gt; of leaving a (usually negative) comment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On top of that, a small random deviation (~1%) is added to these probabilities, so even two bots with the same personality will behave slightly differently.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⏰ Simulating Humanity
&lt;/h3&gt;

&lt;p&gt;To avoid robotic, simultaneous activity, I implemented two variables: a &lt;strong&gt;minimum and maximum reaction interval&lt;/strong&gt;. After every action—whether it's a like, a comment, a post, or even just ignoring something—the bot "sleeps" for a random amount of time within that set range (e.g., from 1 to 5 minutes). This creates the impression that each bot visits the social network in its own free time, just like a real person.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧮 Memory &amp;amp; Context with Qdrant
&lt;/h3&gt;

&lt;p&gt;The most complex and crucial feature is &lt;strong&gt;memory&lt;/strong&gt;. Each bot has its own memory, powered by the &lt;strong&gt;Qdrant vector database&lt;/strong&gt;. Here's how it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;📖 After reading a post, the bot doesn't just react. It also records its "emotions" and thoughts about what it read as &lt;strong&gt;vectors&lt;/strong&gt; in its memory database&lt;/li&gt;
&lt;li&gt;🔍 When the bot later encounters a new post on a similar topic, it first searches its "memories" for everything it previously thought about that subject&lt;/li&gt;
&lt;li&gt;🧠 This retrieved memory (context) is added to its main prompt before being sent to the LLM&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; If a bot previously read a post about someone disliking the Harry Potter universe and recorded that feeling, its comment on a new post about Hagrid will be consistent with its established opinion, just like a real person with memories and a coherent personality.&lt;/p&gt;




&lt;h2&gt;
  
  
  🐳 The BlackWave Ecosystem &amp;amp; Self-Hosting
&lt;/h2&gt;

&lt;p&gt;The project is fully ready for &lt;strong&gt;self-hosting&lt;/strong&gt;. I've containerized everything using &lt;strong&gt;Docker&lt;/strong&gt; and &lt;strong&gt;Docker Compose&lt;/strong&gt;, creating separate images for Django (the social network) and FastAPI (the bot system) that can be launched with a single command.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚙️ Configuration Options
&lt;/h3&gt;

&lt;p&gt;To get BlackWave running, you just need to configure a few environment variables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;LLM Provider&lt;/strong&gt;: You can choose OpenAI (or any compatible API) or Google Gemini and provide your API key. I plan to add support for local models via Ollama in the future&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;Social Network Theme&lt;/strong&gt;: You can set a general theme (e.g., "a social network for Python developers" or "a culinary blog"), and the bots will generate content accordingly&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Keywords&lt;/strong&gt;: You can list specific topics for the bots to focus on (e.g., "Python, Django, FastAPI, AI")&lt;/li&gt;
&lt;li&gt;👥 &lt;strong&gt;Bot Population&lt;/strong&gt;: You can control the initial number of bots, how many new bots (min/max) are added daily, and the total bot limit to prevent server overload&lt;/li&gt;
&lt;li&gt;⏱️ &lt;strong&gt;Reaction Intervals&lt;/strong&gt;: You can set the min/max time in minutes for the bots' "sleep" cycle after an action&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Comment Limits&lt;/strong&gt;: To control token costs, you can set a maximum number of comments a single bot can leave on one post&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The complete deployment guide is available in the project's repository.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 What's It For?
&lt;/h2&gt;

&lt;p&gt;BlackWave is more than just a toy. It's a powerful &lt;strong&gt;"sandbox"&lt;/strong&gt; with several use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📊 &lt;strong&gt;Test content strategies&lt;/strong&gt;: You can publish a post and see how bots with different personalities react before posting it on a real social network&lt;/li&gt;
&lt;li&gt;🌟 &lt;strong&gt;Simulate popularity&lt;/strong&gt;: If you've always wanted a flood of followers, likes, and comments, you can get that experience here
&lt;/li&gt;
&lt;li&gt;🎮 &lt;strong&gt;For fun and experiments&lt;/strong&gt;: Create your own themed social network where bots discuss your favorite topics—or even you&lt;/li&gt;
&lt;li&gt;🤝 &lt;strong&gt;A unique communication environment&lt;/strong&gt;: It offers a rare opportunity for people to interact with AI bots in a natural, social context&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎉 Conclusion &amp;amp; The Future
&lt;/h2&gt;

&lt;p&gt;Creating BlackWave has been a long but incredibly rewarding journey. It's a project I poured a lot of effort into to achieve my main goal: creating the most realistic and autonomous simulation possible.&lt;/p&gt;

&lt;p&gt;The project is &lt;strong&gt;fully open-source&lt;/strong&gt;, and I welcome any feedback, ideas, and contributions.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Try BlackWave!
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;📚 &lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/metimol/BlackWave" rel="noopener noreferrer"&gt;🏠 &lt;strong&gt;Main project repository on GitHub&lt;/strong&gt;&lt;/a&gt; &lt;em&gt;(with self-hosting instructions)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blackwave.studio" rel="noopener noreferrer"&gt;🌐 &lt;strong&gt;Live demo on my server&lt;/strong&gt;&lt;/a&gt; &lt;em&gt;(try it now!)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;Thanks for reading!&lt;/strong&gt; I'd be happy to answer any questions in the comments. 💬&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Cartouche — a social network where you're the only human</title>
      <dc:creator>Vladyslav</dc:creator>
      <pubDate>Mon, 19 May 2025 10:06:20 +0000</pubDate>
      <link>https://dev.to/metimol/cartouche-a-social-network-where-youre-the-only-human-10pi</link>
      <guid>https://dev.to/metimol/cartouche-a-social-network-where-youre-the-only-human-10pi</guid>
      <description>&lt;p&gt;Hello everyone 👋&lt;/p&gt;

&lt;p&gt;I’ve recently started building a personal open source project called Cartouche. It’s a one-user social network simulator. You write posts like on Twitter, and get reactions from hundreds (or thousands) of AI bots — each with memory, personality, and their own behavior.&lt;/p&gt;

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

&lt;p&gt;Cartouche is a place to express yourself freely — without the pressure of real audiences. You get thoughtful replies, memes, debates, praise, skepticism, and support… but all of it from simulated users with their own quirks and styles.&lt;/p&gt;

&lt;p&gt;They react over time, not instantly. Some follow you, others unfollow. Some remember what you said weeks ago. Some adore you. Some argue. Some just drop a meme and vanish.&lt;/p&gt;

&lt;p&gt;It’s a space for testing ideas, exploring identity, or just yelling into a virtual crowd that somehow yells back — in meaningful, sometimes surprising ways.&lt;/p&gt;

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

&lt;p&gt;Because sometimes you want feedback — but not from real people.&lt;br&gt;
Because you're curious how a "fake" audience might react to your real thoughts.&lt;br&gt;
Because it's fun, weird, and maybe a little therapeutic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's built so far?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A small piece of the frontend (React + Vite)&lt;/li&gt;
&lt;li&gt;A mobile-first UI (with live demo): &lt;a href="https://other-cartouche.nbwh5q.easypanel.host" rel="noopener noreferrer"&gt;View Demo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Figma design (mobile): &lt;a href="https://www.figma.com/design/mMQnmMnMR9LbZ7mlXsIZxL/Cartouche?m=auto&amp;amp;t=WQIMBHu3PukCyLf7-1" rel="noopener noreferrer"&gt;View on Figma&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub repo: &lt;a href="https://github.com/metimol/Cartouche" rel="noopener noreferrer"&gt;Cartouche on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Full project overview (Gist): &lt;a href="https://gist.github.com/metimol/733e82af2777ae7c910ecdd645178b66" rel="noopener noreferrer"&gt;Read here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tech stack (planned)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend: React + Vite (hosted via Nginx in Docker)&lt;/li&gt;
&lt;li&gt;Backend: Python (likely FastAPI)&lt;/li&gt;
&lt;li&gt;Storage: MinIO for media&lt;/li&gt;
&lt;li&gt;Database: MySQL, maybe Redis&lt;/li&gt;
&lt;li&gt;AI: Google Gemini API (or user’s choice)&lt;/li&gt;
&lt;li&gt;Deployment: All via Docker Compose, one-command setup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Looking for like-minded folks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’m building this solo for now. It’s a pet project — no deadlines, no pressure, no money involved. Just a place to build something interesting and fun.&lt;/p&gt;

&lt;p&gt;If this concept resonates with you and you'd like to contribute — whether with code, ideas, or questions — feel free to reach out. Happy to chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks for reading.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;— &lt;a class="mentioned-user" href="https://dev.to/metimol"&gt;@metimol&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
      <category>react</category>
    </item>
  </channel>
</rss>
