<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  >
  <channel>
    <title>Ran Aroussi (Official Website)</title>
    <description>Software developer, financial tinkerer, and solo entrepreneur. Creator of yfinance and other popular Python libraries, founded Tradologics and offering CTO-as-a-Service at Automaze.</description>
    <link>https://aroussi.com/feed</link>
    <lastBuildDate>Mon, 15 Dec 2025 00:00:00 +0000</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <generator>PHP</generator>

    <image>
      <url>https://aroussi.com/assets/favicon.ico</url>
      <title>Ran Aroussi (Official Website)</title>
      <link>https://aroussi.com/feed</link>
      <width>32</width>
      <height>32</height>
    </image>
    <item>
      <title>From Junior Dev to 10x Senior (How AI Can Accelerate Developer Growth)</title>
      <link>https://aroussi.com/post/from-junior-to-10x-dev</link>
      <pubDate>Mon, 15 Dec 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/from-junior-to-10x-dev</guid>
      <description><![CDATA[<p>How AI Can Accelerate Developer Growth (If You Use It Right)</p>]]></description>
      <content:encoded><![CDATA[<p><em>Want a printable version? <a href="/assets/from-junior-to-10x-dev.pdf">Download the PDF</a></em><br>
<em>Prefer to read it on your Kindle? <a href="/assets/from-junior-to-10x-dev.epub">Download the ePub</a></em></p>
<hr />
<p>There's a narrative spreading through the industry: "AI is making junior developers obsolete."</p>
<p>Let me be direct: this is short-sighted thinking that will backfire.</p>
<p>Here's the math that people are missing: <strong>without juniors, there are no seniors.</strong> The senior engineers everyone is fighting to hire didn't emerge fully formed. They started as juniors who made mistakes, learned from them, and built the judgment that makes them valuable.</p>
<p>If companies stop hiring juniors because AI can "do the work," they're not solving a problem – they're creating a future talent crisis.</p>
<p>But here's what's actually true: <strong>AI can dramatically accelerate the journey from junior to senior – if you use it right.</strong></p>
<p>The key word is <em>if</em>.</p>
<hr />
<h2>The Lesson That Still Applies</h2>
<p>Years ago, when I was teaching people how to code, I wouldn't let them touch a keyboard for almost two months. No IDEs. No syntax. Just pen and paper. Flowcharts. Logic. Thinking things through.</p>
<p>And yes, they hated it.</p>
<p>Every cohort went through the same cycle: confusion, frustration, resistance… and then something clicked. The point was never to torture people. The point was to separate <em>thinking</em> from <em>typing</em>.</p>
<p>Today, I'm doing almost the exact same thing. Except now, the thing I'm keeping people away from isn't the keyboard. It's AI.</p>
<p><strong>AI didn't change the fundamental dynamic of learning. It just moved the shortcut.</strong></p>
<p>The developers who resisted the flowchart phase always struggled later. They could write syntax, but they couldn't solve problems. The ones who embraced the delay became the strongest engineers.</p>
<p>The same pattern is emerging with AI.</p>
<hr />
<h2>What AI Actually Changed (And What It Didn't)</h2>
<p>AI made output cheap. You can generate a landing page, an onboarding flow, a backend API – even an entire MVP – in minutes.</p>
<p>But the hardest part of building software was never typing. It was deciding what to build, understanding why, and knowing what comes next.</p>
<p><strong>AI doesn't automatically make juniors better.</strong> What it does is make bad thinking harder to spot.</p>
<p>You can look productive. You can ship something. You can even get early praise. And still not understand what you built.</p>
<h3>The Hidden Cost</h3>
<p>When someone generates code without understanding it:</p>
<ul>
<li><strong>They can't debug it.</strong> When something breaks, they're starting from zero.</li>
<li><strong>They can't extend it.</strong> The next feature becomes another "prompt and pray" session.</li>
<li><strong>They can't teach it.</strong> Knowledge doesn't transfer because there's no knowledge – just output.</li>
<li><strong>They don't learn and evolve.</strong> Each project starts from the same baseline.</li>
<li><strong>They accumulate debt.</strong> Every line they don't understand is a liability someone else will pay for.</li>
</ul>
<hr />
<h2>The Two Types of Knowledge</h2>
<p>Not all engineering knowledge is the same.</p>
<p><strong>Teachable knowledge</strong> you can learn from books, tutorials, and AI: syntax, design patterns, API documentation, best practices.</p>
<p><strong>Earned knowledge</strong> only comes from experience: what happens when a production database runs out of disk space at 3 AM, how systems actually behave under load, the intuition that something "feels wrong" before you can articulate why.</p>
<p>You cannot shortcut earned knowledge. No amount of AI prompting will give you the gut feeling that comes from debugging a cascading failure at 3 AM while stakeholders are breathing down your neck.</p>
<p>But here's the insight: <strong>AI can dramatically compress teachable knowledge acquisition, freeing up more time for earning experiential knowledge.</strong></p>
<p>The path from junior to senior used to take 5-10 years partly because so much time was spent learning syntax and memorizing APIs. AI eliminates most of that friction.</p>
<p>What's left is the stuff that matters: judgment, architecture, debugging under pressure, understanding systems holistically.</p>
<hr />
<h2>Why "Vibe Coding" Will Keep You Junior Forever</h2>
<p>There's a term going around that I really don't like: "vibe coding."</p>
<p>Not because AI is bad. But because the term celebrates skipping the hard part.</p>
<p>Vibe coding sounds creative and playful. But what it often means is: "I don't really know what's happening here, but the demo works."</p>
<p><strong>That's not engineering. That's gambling with better UX.</strong></p>
<p>When you vibe code, you don't build a mental model. You build a result. And results without models don't scale.</p>
<h3>The One-Shot Illusion</h3>
<p>People brag about "one-shotting" an app or MVP. You can one-shot output. But you can't one-shot understanding.</p>
<p>The real test happens a week later – when something breaks, when a user asks for a change, when you need to add the next feature.</p>
<p><strong>If your entire mental model is "ask AI and paste the answer," you don't have a system. You have a screenshot.</strong></p>
<hr />
<h2>The Accelerated Path</h2>
<p>Here's what my workflow looks like today, after 35+ years:</p>
<p><strong>I spend very little time writing code.</strong></p>
<p>Instead, I spend my time on planning, architecture, guiding AI, testing, review, and quality control. The actual code generation? AI does that.</p>
<p>But here's what's critical: <strong>I can do this because I've already built the mental models.</strong> I know what good code looks like. I can spot problems in AI-generated output. I understand the tradeoffs being made.</p>
<p>This is the endgame. This is what senior looks like in the AI era.</p>
<p>But you can't start here. If you try to adopt this workflow without foundational knowledge, you'll produce garbage confidently.</p>
<hr />
<h2>The Progression Model</h2>
<p>Instead of asking "Should juniors use AI?" the better question is: "When, and how?"</p>
<p>The answer: <strong>staged access</strong>. Not banned. Staged.</p>
<h3>Stage 1: Foundation (Weeks 1-8)</h3>
<p><strong>AI Role: Reviewer only</strong></p>
<p>Write pseudocode and flowcharts first. Implement solutions manually. Use AI to review, critique, or explain – not to write. When AI suggests something, explain <em>why</em> it's suggesting it.</p>
<p>This is the hardest stage because it requires discipline. You'll feel slow. You'll watch others "ship faster." Ignore them. They're building on sand.</p>
<h3>Stage 2: Assisted Implementation (Weeks 9-16)</h3>
<p><strong>AI Role: Collaborator</strong></p>
<p>Use AI for boilerplate and repetitive code. Review all generated code line-by-line. Modify and improve AI suggestions.</p>
<p><strong>The test:</strong> Can you debug it when it breaks? Can you extend it for the next feature? If yes, you're building real capability. If no, slow down.</p>
<h3>Stage 3: Full Leverage (Months 4-12)</h3>
<p><strong>AI Role: Force multiplier</strong></p>
<p>Strategically delegate well-understood tasks. Use AI for exploration and rapid prototyping. Maintain ownership of architecture and key decisions.</p>
<h3>Stage 4: Architect Mode (Year 1+)</h3>
<p><strong>AI Role: Implementation engine</strong></p>
<p>Spend 80-90% of your time on planning, architecture, and review. Write code only for the most critical or novel problems. Guide AI with precise specifications and constraints.</p>
<p><strong>The constant across all stages:</strong> Human thinking remains at 100%.</p>
<hr />
<h2>The Modern Flowchart</h2>
<p>The flowcharts I taught weren't about boxes and arrows. They were about <strong>delayed execution in service of clarity</strong>.</p>
<p>For visual learners, actual flowcharts and whiteboarding are still incredibly valuable. The medium matters less than the practice.</p>
<p>What you're building is a mental model of the entire application:</p>
<p><strong>Understanding the models/objects:</strong> What are the core entities? How do they relate? Where does data live and flow?</p>
<p><strong>Understanding the user flow:</strong> What triggers each action? What does the user see at each step? Where can things go wrong?</p>
<p><strong>Understanding sync vs. async:</strong> What happens immediately? What happens in the background? What if async operations fail? This is where junior developers consistently struggle – and where bugs hide.</p>
<h3>The Pre-AI Checklist</h3>
<p>Before opening any AI tool, answer these:</p>
<ol>
<li>What is the specific problem I'm solving? (One sentence, no jargon)</li>
<li>What are the inputs and outputs? (Concrete examples)</li>
<li>What are the constraints? (Performance, security, compatibility)</li>
<li>What are the edge cases? (What could go wrong?)</li>
<li>How will I verify the solution works? (Test criteria)</li>
<li>What do I expect the solution to look like? (Rough shape)</li>
</ol>
<p><strong>If you can't answer these questions, you're not ready to use AI effectively. You're ready to be confused by it.</strong></p>
<hr />
<h2>For Engineering Leaders: Why You Should Still Hire Juniors</h2>
<p>Some companies are reducing junior hiring because they believe AI can replace entry-level work. This is a mistake.</p>
<h3>The Talent Pipeline Problem</h3>
<p>Senior engineers don't materialize from thin air. If the industry stops investing in juniors, we're consuming a non-renewable resource.</p>
<p>The companies still hiring and developing juniors will have a massive advantage in 5-10 years when everyone else is fighting over a shrinking pool of seniors.</p>
<h3>The AI-Augmented Junior</h3>
<p>A junior using AI correctly can be productive much faster than previous generations. Ramp-up shrinks from 12-18 months to 4-6 months.</p>
<p>But this only works if you:</p>
<ol>
<li>Invest in the foundation phase (don't let them skip to "AI does everything")</li>
<li>Pair them with seniors who can evaluate AI-assisted output</li>
<li>Create psychological safety for them to admit when they don't understand</li>
<li>Measure learning, not just output</li>
</ol>
<hr />
<h2>Why This Matters for Teams</h2>
<p>If juniors are rewarded for shipping fast without understanding, seniors end up doing archaeology instead of architecture. That's how good teams burn out.</p>
<h3>The Team Anti-Patterns</h3>
<p><strong>The "AI Expert" Junior:</strong> Ships fast, can't explain anything, needs rescue on every bug.</p>
<p><strong>The Archaeology Sprint:</strong> Seniors spend 40% of their time reverse-engineering AI-generated code.</p>
<p><strong>The Invisible Debt:</strong> Everything works until it doesn't, then nobody knows why.</p>
<p><strong>The Knowledge Silo:</strong> Only the AI "knows" how the system works.</p>
<h3>The Team Best Practices</h3>
<ul>
<li><strong>Code review includes "explain this to me":</strong> If you can't explain it, you don't merge it.</li>
<li><strong>Architecture decisions are human decisions:</strong> AI can inform, but humans own the choices.</li>
<li><strong>Pairing includes AI discussion:</strong> Talk through what AI suggested and why you accepted or modified it.</li>
<li><strong>Documentation captures reasoning:</strong> Not just what, but why.</li>
</ul>
<hr />
<h2>The THINK-BUILD-VERIFY Loop</h2>
<p>A practical framework for AI-augmented development:</p>
<p><strong>THINK (Human-Led):</strong> Define problem clearly. Identify constraints. Sketch approach. Anticipate edge cases.</p>
<p><strong>BUILD (AI-Assisted):</strong> Accelerate with AI. Review every line. Modify for context. Maintain understanding.</p>
<p><strong>VERIFY (Human-Owned):</strong> Test against requirements. Check edge cases. Ensure explainability. Document reasoning.</p>
<h3>When to Use AI</h3>
<p><strong>Good uses:</strong> Boilerplate you understand but don't want to type. Exploring unfamiliar APIs. Generating test cases. Code review and suggestions. Explaining existing code.</p>
<p><strong>Dangerous uses:</strong> Architecture decisions you don't understand. Security-critical code without review. Performance-sensitive logic without testing. Anything you couldn't debug if it broke. Business logic you can't explain to a colleague.</p>
<hr />
<h2>The Future Is Amplification, Not Replacement</h2>
<p><strong>AI is making <em>undisciplined</em> developers obsolete – at every level.</strong></p>
<p>The junior who vibe codes without understanding? Obsolete. The senior who can't adapt their workflow to leverage AI? Also increasingly obsolete.</p>
<p>But the junior who uses AI as a learning accelerator while building real mental models? They'll reach senior-level capability faster than any previous generation.</p>
<p>And the companies smart enough to invest in these juniors? They're building the talent pipeline everyone else will be desperate for in five years.</p>
<p><strong>AI is a power tool.</strong> Seniors know where to cut. Juniors learn by measuring twice.</p>
<p>If we get this right, AI won't replace good engineers. It'll finally let them focus on what actually matters: solving hard problems, making sound decisions, and building things that last.</p>
<p><strong>The goal isn't to use AI less. It's to think more.</strong></p>
<hr />
<h2>Key Takeaways</h2>
<p><strong>For Junior Developers:</strong></p>
<ul>
<li>Resist using AI for code writing in the first 8 weeks</li>
<li>Use AI as a reviewer, not an author, until you have mental models</li>
<li>If you can't explain it, you don't understand it</li>
<li>Teachable knowledge can be compressed; earned knowledge cannot be skipped</li>
</ul>
<p><strong>For Engineering Leaders:</strong></p>
<ul>
<li>Without juniors, there are no seniors – invest now</li>
<li>AI-augmented juniors ramp faster, but need the foundation phase</li>
<li>"Explain this to me" is the new code review standard</li>
<li>The companies hiring juniors today win the talent war tomorrow</li>
</ul>
<p><strong>For Everyone:</strong></p>
<ul>
<li>AI made output cheap, not thinking cheap</li>
<li>Results without mental models don't scale</li>
<li>The goal is leverage without dependency</li>
</ul>]]></content:encoded>
      <category><![CDATA[ai]]></category><category><![CDATA[business]]></category><category><![CDATA[thoughts]]></category>
    </item>
    <item>
      <title>I'm Writing a Book on Production-Grade Agentic AI (And You Can Read It Now)</title>
      <link>https://aroussi.com/post/production-grade-agentic-ai</link>
      <pubDate>Thu, 09 Oct 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/production-grade-agentic-ai</guid>
      <description><![CDATA[<p>There are three things that make AI systems truly "agentic". Most systems have zero.</p>]]></description>
      <content:encoded><![CDATA[<p>I'm releasing "<a href="https://leanpub.com/production-agentic-ai">Production-Grade Agentic AI</a>" chapter-by-chapter on LeanPub, starting today. It's 40% done (over 200 pages), and you can read it as I write it.</p>
<p>Here's why I'm doing this – and why you might want to join early.</p>
<h2>The Problem I Keep Seeing</h2>
<p>If you've tried deploying AI agents to production, you know the pattern.</p>
<p>The demo works beautifully. You chain together some prompts, hook up a few tools, show it to stakeholders. Everyone's excited.</p>
<p>Then you try to scale it. And it collapses.</p>
<p><strong>The problem isn't the models.</strong> Claude, GPT-5, Gemini – they're incredible.</p>
<p><strong>The problem is nobody's teaching the infrastructure side.</strong> The memory management. The orchestration. The observability. The deployment patterns that make the difference between "cool demo" and "system that actually works."</p>
<p>We're all making the same mistakes because that institutional knowledge doesn't exist yet.</p>
<h2>So I'm Writing That Book</h2>
<p>I've spent 30+ years building production systems that scale – across finance, data infrastructure, and AI deployment. My open-source libraries get 10+ million downloads a month. I've been in the trenches building systems that <em>have</em> to work when money's on the line.</p>
<p>Over the past few years, I've been building agentic AI systems. Hitting the same walls everyone else hits. Figuring out what actually works in production.</p>
<p>"Production-Grade Agentic AI" is everything I wish existed when I started. A comprehensive, ~600-page guide covering:</p>
<ul>
<li>What actually makes systems "agentic" (the three pillars most systems are missing)</li>
<li>Memory systems that scale beyond toy examples</li>
<li>Orchestration that handles real-world failures</li>
<li>Observability that shows you what agents are thinking</li>
<li>Deployment patterns with automatic failover</li>
<li>Multi-model infrastructure to avoid vendor lock-in</li>
<li>Real production examples, not just demos</li>
</ul>
<p>This isn't vendor documentation. These are universal architecture patterns that work regardless of which LLM you're using.</p>
<h2>Why I'm Publishing While Writing</h2>
<p>Traditional publishing doesn't work for technical content that's evolving this fast. By the time a book goes through the full cycle, half the content is outdated.</p>
<p>More importantly: <strong>I want your feedback while I can still incorporate it.</strong></p>
<p>Your questions. Your confusion. Your "this doesn't make sense" moments. Your production war stories. They make the book better – not just for you, but for everyone who reads it after.</p>
<p>So I'm writing in public. Releasing chapters as I finish them. Building this with the community, not in isolation.</p>
<h2>Read It Now</h2>
<p>The book is available today on LeanPub at founder pricing: $5 minimum (pay what you want).</p>
<p><strong>Current status:</strong> 40% complete, over 200 pages already available</p>
<p><strong>Timeline:</strong> Complete by November 22, 2024</p>
<p><strong>Pricing:</strong> Increases every two weeks as content is added</p>
<ul>
<li><strong>Now - Oct 24:</strong> $4.99+ (Founder Tier)</li>
<li><strong>Oct 25 - Nov 7:</strong> $9.99+ (Early Access)</li>
<li><strong>Nov 8 - Nov 21:</strong> $14.99+ (Pre-Launch)</li>
<li><strong>Nov 22 - Dec 5:</strong> $49.99 (Launch Week – covers Black Friday)</li>
<li><strong>Dec 6+:</strong> $79.99 (Standard Price)</li>
</ul>
<p>Early readers also get access to a private GitHub repository with code examples, production templates, and community discussions.</p>
<p><strong><a href="https://leanpub.com/production-agentic-ai">Get early access on LeanPub →</a></strong></p>
<p>A hardcover edition will be available on Amazon for those who prefer physical books.</p>
<h2>Who This Is For</h2>
<p>Engineers, architects, and technical leads building AI systems beyond the prototype stage.</p>
<p>If you're tired of agents that work in demos but break in production – if you want to understand the infrastructure that makes agentic systems reliable at scale – this is for you.</p>
<p>The teams that figure this out first will have a massive advantage.</p>
<h2>Let's Build This Together</h2>
<p>We're figuring out production agentic AI together. Not from ivory tower research, but from the trenches of building systems that have to work.</p>
<p>Your experience matters. Your perspective matters.</p>
<p>Let's build agents that actually work in production.</p>
<p><strong><a href="https://leanpub.com/production-agentic-ai">Join the early access →</a></strong></p>
<hr />
<p><strong>Key changes:</strong></p>
<ol>
<li>Opens with the announcement as the lead</li>
<li>Explains the "why now" and "why this format"</li>
<li>Emphasizes the collaborative aspect</li>
<li>Makes the pricing and timeline more prominent</li>
<li>Stronger call-to-action throughout</li>
<li>Shorter, more scannable</li>
</ol>
<p>Want me to adjust the tone or emphasis?</p>]]></content:encoded>
      <category><![CDATA[ai]]></category><category><![CDATA[business]]></category><category><![CDATA[thoughts]]></category>
    </item>
    <item>
      <title>Why "Agent Workflow" is an Oxymoron (And Why It Matters)</title>
      <link>https://aroussi.com/post/why-agent-workflow-is-an-oxymoron</link>
      <pubDate>Tue, 23 Sep 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/why-agent-workflow-is-an-oxymoron</guid>
      <description><![CDATA[<p>The fundamental flaw in how we're building AI systems - and what to do about it</p>]]></description>
      <content:encoded><![CDATA[<p>The AI industry has a dirty secret: <strong>we're building "intelligent agents" that can't actually think.</strong></p>
<p>Walk into any AI conference, scan through GitHub's trending repositories, or browse the latest YC batch, and you'll see the same pattern everywhere: "AI workflow" tools, "agent orchestration platforms," and "intelligent automation" that reduces artificial intelligence to glorified script execution.</p>
<p>Here's the uncomfortable truth: <strong>"Agent workflow" is an oxymoron.</strong> And until we acknowledge this fundamental contradiction, we'll keep building brittle systems that break the moment reality doesn't match our templates.</p>
<h2>The Great Contradiction</h2>
<p>Let me be clear about what I mean:</p>
<p><strong>Workflows are deterministic sequences.</strong> They follow predefined steps: Step 1 → Step 2 → Step 3. They're designed by humans who think they can predict every possible scenario. They're rigid, brittle, and fundamentally reactive.</p>
<p><strong>Agents are supposed to be autonomous decision-makers.</strong> They should understand context, adapt to situations, and reason through problems. They should handle the unexpected gracefully, not crash when reality doesn't match the template.</p>
<p><strong>You cannot have both.</strong> The moment you force an "agent" into a workflow, you've eliminated its intelligence. You've created an expensive, unreliable script that happens to use LLMs for some of its steps.</p>
<h2>Why Everyone Got It Wrong</h2>
<p>The entire industry fell into this trap because workflows <em>feel</em> like control. CTOs and engineering managers look at AI agents and think: "This is powerful, but unpredictable. I need to control it with workflows."</p>
<p>So we built systems that look like this:</p>
<pre><code class="language-text text">Incident Detected
      ↓
Step 1: Analyze logs
      ↓
Step 2: Check runbooks
      ↓
Step 3: Execute remediation
      ↓
Step 4: Update ticket
      ↓
Step 5: Notify team</code></pre>
<p>And we called it "intelligent incident response."</p>
<p>But what happens when:</p>
<ul>
<li>The logs are in an unexpected format?</li>
<li>The runbook doesn't cover this specific scenario?</li>
<li>The remediation fails and needs adaptation?</li>
<li>The notification system is down?</li>
</ul>
<p><strong>The "intelligent agent" breaks.</strong> Because it was never intelligent – it was just a script with AI sprinkles.</p>
<h2>The Workflow Death Spiral</h2>
<p>Here's what happens to every workflow-based "AI" system:</p>
<pre><code class="language-text text">Initial Workflow
      ↓
Edge Case Appears
      ↓
Patch Added
      ↓
Complexity Increases
      ↓
More Edge Cases
      ↓
More Patches
      ↓
Unmaintainable Mess
      ↓
Complete Failure</code></pre>
<p>I call this the <strong>Workflow Death Spiral</strong>. Each patch makes the system more brittle, each edge case requires human intervention, and eventually, you have a Rube Goldberg machine that no one understands.</p>
<p>We've all seen it: the "simple" automation that now has 47 conditional branches, 23 exception handlers, and a 200-page runbook that no one reads. That's not intelligence – it's technical debt with an API key.</p>
<h2>What Real Intelligence Looks Like</h2>
<p>Here's how a truly autonomous system handles the same incident:</p>
<pre><code class="language-text text">Incident Detected → Agent receives context:

"We have an incident. Here's what I know about our systems,
our procedures, and our past responses. Now think."</code></pre>
<p>The agent doesn't follow steps. It <strong>reasons</strong>:</p>
<ul>
<li><em>"This looks similar to the database timeout issue from last month, but the symptoms are slightly different..."</em></li>
<li><em>"Let me check the logs, but I'll also look at network metrics since that was the root cause before..."</em></li>
<li><em>"The standard runbook suggests restarting the service, but given the current load, let me try scaling first..."</em></li>
<li><em>"I should notify the team, but let me gather more context first so I can give them actionable information..."</em></li>
</ul>
<p>Notice the difference? The agent isn't following a sequence – it's <strong>thinking through the problem</strong> using institutional knowledge as guidance, not gospel.</p>
<h2>The SOP Revolution: Knowledge vs. Scripts</h2>
<p>This is where Standard Operating Procedures (SOPs) come in – but not the way you think.</p>
<p>Most companies use SOPs as workflows: rigid sequences that must be followed exactly. But intelligent systems need SOPs as <strong>institutional knowledge</strong> – wisdom to reason over, not steps to execute blindly.</p>
<p>Instead of:</p>
<pre><code class="language-text text">SOP: Incident Response Workflow
1. Check logs
2. Consult runbook
3. Execute fix
4. Update ticket</code></pre>
<p>We need:</p>
<pre><code class="language-text text">SOP: Incident Response Knowledge
- Our systems typically fail in these patterns...
- When we see these symptoms, it usually means...
- Past incidents taught us that...
- Be careful of these edge cases...
- Always consider these factors...</code></pre>
<p>The difference is profound. The first creates robots. The second creates intelligent systems that can adapt, reason, and handle the unexpected.</p>
<h2>"But We Need Control!" - The Valid Concern</h2>
<p>I hear you. Autonomous systems sound scary. Let me address the elephant in the room: <strong>autonomous doesn't mean uncontrolled</strong>.</p>
<p>True intelligence operates within guardrails, not workflows:</p>
<ul>
<li><strong>Guardrails</strong>: "Never delete production data. Always preserve user privacy. Escalate if confidence &lt; 80%."</li>
<li><strong>Workflows</strong>: "If user says X, do Y. If user says Z, do Q."</li>
</ul>
<p>Guardrails define boundaries. Workflows define every step. One enables intelligence, the other prevents it.</p>
<p>Think of it this way: we don't give human employees step-by-step scripts for every possible situation. We give them principles, training, and boundaries. Why would we do less for AI systems that are supposed to be intelligent?</p>
<h3>How to Maintain Control Without Workflows:</h3>
<ol>
<li><strong>Observable Reasoning</strong>: Every decision includes a reasoning trace</li>
<li><strong>Reversible Actions</strong>: Built-in rollback capabilities</li>
<li><strong>Confidence Thresholds</strong>: Automatic escalation when uncertain</li>
<li><strong>Human Override</strong>: Always available, rarely needed</li>
<li><strong>Audit Trails</strong>: Complete record of decisions and why they were made</li>
</ol>
<h2>Test Your System: The Intelligence Litmus Test</h2>
<p>Is your "AI agent" actually intelligent? Run this diagnostic:</p>
<pre><code class="language-text text">□ Can it handle a scenario you didn't explicitly program?
□ When it fails, does it adapt or just error out?
□ Can it explain WHY it made a decision, not just WHAT it did?
□ Does adding new capabilities require rewriting workflows?
□ Can it learn from past incidents without code changes?
□ Does it get better over time or just accumulate patches?</code></pre>
<p><strong>Score:</strong></p>
<ul>
<li>0-2 checks: You have an expensive script</li>
<li>3-4 checks: You're halfway to intelligence</li>
<li>5-6 checks: You have a true autonomous agent</li>
</ul>
<h2>Why This Matters Now</h2>
<p>We're at a critical inflection point. The AI industry is racing to build "production-ready agent platforms," and almost everyone is building workflow engines with LLM steps.</p>
<p>This approach will fail. Not because the technology isn't ready, but because <strong>the architecture is fundamentally flawed.</strong></p>
<p>You cannot achieve autonomous intelligence by chaining deterministic steps. You cannot create adaptive systems by predicting every possible scenario. You cannot build truly intelligent agents by reducing them to glorified automation.</p>
<p>The companies building workflow-based systems are optimizing for the illusion of control while sacrificing the very intelligence that makes AI valuable. They're building faster horses while the automobile is being invented in the garage next door.</p>
<h2>Common Objections (And Why They're Wrong)</h2>
<p><strong>"But LLMs hallucinate!"</strong>
Yes, and humans make mistakes. The solution isn't to remove all decision-making capability – it's to ground decisions in knowledge and add appropriate guardrails.</p>
<p><strong>"This sounds expensive!"</strong>
What's more expensive: an intelligent system that handles edge cases, or an army of engineers constantly patching workflows that break in production?</p>
<p><strong>"We need compliance and auditability!"</strong>
Reasoning traces are MORE auditable than workflows. You can see exactly why a decision was made, not just that Step 3 was executed after Step 2.</p>
<p><strong>"Our team isn't ready for this!"</strong>
Your team is already drowning in workflow maintenance. Give them systems that think, not scripts to debug.</p>
<h2>The Migration Path: From Workflows to Intelligence</h2>
<p>If you're stuck with existing workflows (and who isn't?), here's your path forward:</p>
<ol>
<li><strong>Start with non-critical systems</strong> - Test autonomous reasoning where failures won't hurt</li>
<li><strong>Convert SOPs gradually</strong> - Transform procedures into knowledge bases one at a time</li>
<li><strong>Run in parallel</strong> - Let both systems operate simultaneously, compare results</li>
<li><strong>Measure what matters</strong> - Track adaptability, not just execution speed</li>
<li><strong>Expand based on confidence</strong> - Increase autonomy as trust builds</li>
</ol>
<p>This isn't a big-bang migration. It's an evolution from brittle to brilliant.</p>
<h2>The Path Forward</h2>
<p>So what does real autonomous AI infrastructure look like?</p>
<ol>
<li><strong>Agents that reason over knowledge, not execute workflows</strong></li>
<li><strong>SOPs as institutional wisdom, not rigid procedures</strong></li>
<li><strong>Context and memory that inform decisions, not just store data</strong></li>
<li><strong>Orchestration that coordinates intelligence, not manages scripts</strong></li>
<li><strong>Infrastructure that supports autonomy, not constrains it</strong></li>
</ol>
<p>This isn't just a philosophical distinction – it's a practical one. Workflow-based "agents" require constant human intervention, break on edge cases, and scale poorly. Truly autonomous systems adapt, learn, and handle the unexpected gracefully.</p>
<h2>The Bottom Line</h2>
<p>Every minute we spend building "AI workflow" tools is a minute spent moving backwards. We're taking the most powerful reasoning technology ever created and reducing it to expensive automation.</p>
<p>The companies that figure this out first – that build truly autonomous AI systems with intelligent guardrails instead of rigid workflows – will have an insurmountable advantage.</p>
<h2>The Challenge</h2>
<p>Here's my challenge to you: Take your most complex workflow-based "AI agent" and throw something 10% outside its design parameters at it. Watch it fail spectacularly. Then ask yourself: Is this the future we're building?</p>
<p>The real question isn't whether to build workflows or intelligence. It's whether you'll be disrupted by someone who chose intelligence while you were still debugging workflows.</p>
<p><strong>Your move.</strong></p>
<p>If this resonates with you, I'm working on a book about building production-grade agentic AI that goes deep into these architectural principles. <a href="https://aroussi.com/book">Sign up here</a> to get access to the first draft when it's ready.</p>]]></content:encoded>
      <category><![CDATA[ai]]></category><category><![CDATA[business]]></category><category><![CDATA[thoughts]]></category>
    </item>
    <item>
      <title>The Illusion of Progress</title>
      <link>https://aroussi.com/post/the-illusion-of-progress</link>
      <pubDate>Fri, 12 Sep 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/the-illusion-of-progress</guid>
      <description><![CDATA[<p>Why the companies building faster horses will get left behind by the ones building cars</p>]]></description>
      <content:encoded><![CDATA[<p>Back in 1997, I was running a little web development agency. I still remember clients asking me to <em>"make me an internet".</em> That was the brief.</p>
<p>I remember how one day, we were meeting with a major retail chain. Their "big move" into the digital age? Put their product catalog online. That's it. Customers would still have to call in orders or show up at the branch.</p>
<p>We sat in their corporate office surrounded by glossy brochures and award plaques. They even brought in the CEO himself to impress us.</p>
<p>They thought they were nailing it. In reality, they were already doomed. Amazon, eBay, and later Shopify were coming like a tidal wave. The business model was about to collapse. Power was shifting from physical storefronts to digital platforms.</p>
<p>But they couldn't see it. Because in their minds, they'd already "entered the internet". Job done.</p>
<p>That's not progress. That's the <em>illusion</em> of progress.</p>
<h2>Nokia's mistake (that wasn't really a mistake)</h2>
<p>We love to think Nokia and Blackberry ignored the iPhone. That they were arrogant or asleep at the wheel. The truth? They weren't.</p>
<p>When Steve Jobs unveiled the iPhone, Nokia's CFO said: <em>"This launch will benefit us. The iPhone will expand the market, and people will choose our N95".</em></p>
<p>They <a href="https://repo.aalto.fi/uncategorized/IO_926740c7-5165-439a-a020-5205aeb4d4d5/">thought they had it covered</a>. But they didn't. They were stuck in the same illusion of progress.</p>
<p>Because the winners weren't just "adding mobile". They were <em>becoming</em> mobile.</p>
<p><strong>Uber wasn't possible without GPS, a touchscreen, and an app store in everyone's pocket. Uber wasn't mobile-enabled. Uber <em>was</em> mobile.</strong></p>
<h2>The trap of "faster horses"</h2>
<p>You've probably heard the line often attributed to Henry Ford: <em>"If I had asked people what they wanted, they would have said faster horses".</em></p>
<p>That's the trap. Focusing on incremental improvements – faster, cheaper, shinier versions of what already exists – while missing the bigger shift entirely.</p>
<p>It's the same trap companies fall into when they think they're innovating by tweaking around the edges, instead of reimagining the game itself.</p>
<h2>Even Edison missed it</h2>
<p>When Edison lit up Pearl Street in Manhattan in 1882, he imagined a few thousand lightbulbs at peak demand. That was the vision.</p>
<p>He couldn't picture the ripple effect: washing machines, televisions, microwaves, computers. He couldn't see how electricity would reshape society itself – women entering the workforce, teenagers glued to PlayStations.</p>
<p>That's the thing with revolutions. We see the first step, not the avalanche that follows.</p>
<h2>Fast forward to 2025: "Make me an AI"</h2>
<p>Today, history repeats itself. "Make me an internet" has become "Make me an AI".</p>
<p>Companies are rolling out pet projects so the CEO can tell the board: <em>we're doing AI.</em> It's the modern record-company-website move.</p>
<p>And look – there's nothing wrong with experimenting. The danger is mistaking that for <em>progress</em>.</p>
<h2>The real questions</h2>
<p>When I ask myself if my own company has truly changed because of AI, the honest answer is: not enough.</p>
<p>The real question isn't <em>how do we add AI?</em></p>
<p>The questions are:</p>
<ul>
<li>What do we dismantle so we can rebuild?</li>
<li>How are our customers changing? (streaming vs. records)</li>
<li>How is the business model shifting? (taxis vs. Uber)</li>
<li>Where is the power moving? (customers? platforms?)</li>
<li>How do we deliver 10x the value? (Google vs. Yellow Pages)</li>
<li>What's our role in this new landscape?</li>
<li>And what will never change?</li>
</ul>
<p>Because if we don't ask those questions, we'll end up exactly like that foreclosed retail chain: sitting in a shiny boardroom, eating raisins, telling ourselves we're "relevant".</p>]]></content:encoded>
      <category><![CDATA[ai]]></category><category><![CDATA[business]]></category><category><![CDATA[thoughts]]></category>
    </item>
    <item>
      <title>Spec-Driven AI Development</title>
      <link>https://aroussi.com/post/spec-driven-ai-development</link>
      <pubDate>Fri, 22 Aug 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/spec-driven-ai-development</guid>
      <description><![CDATA[<p>From writing code to architecting systems. Why developers should adopt the new development discipline for the age of AI</p>]]></description>
      <content:encoded><![CDATA[<p>The way we build software is fundamentally changing. AI can now write code faster than any human, but there's a catch – it can't decide what to build or how to architect it.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">AI has changed the way we build software. We&#39;re now using the 50-20-30 principle: Devs spend 50% of their time planning, 20% coding, and 30% validating/testing.<br><br>And it works!<br>👇</p>&mdash; Ran Aroussi (@aroussi) <a href="https://twitter.com/aroussi/status/1958862375144366527?ref_src=twsrc%5Etfw">August 22, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>This guide presents a systematic approach to AI-assisted development that we've been refining at Automaze, where human developers focus on what they do best (thinking, planning, architecting) while AI handles what it does best (rapid implementation of well-defined specifications).</p>
<p>If you've felt overwhelmed trying to integrate AI into your development workflow, or if you've been burned by AI confidently building the wrong thing, this discipline will help you harness AI's power while maintaining control over your project's direction and quality.</p>
<h3>The Reality Check</h3>
<blockquote>
<p>Why AI Changes Everything (And Nothing)</p>
</blockquote>
<h4>What AI Can Do Today</h4>
<p>✅ <strong>Write code faster than any human</strong></p>
<ul>
<li>Generate boilerplate in seconds</li>
<li>Implement algorithms from descriptions</li>
<li>Create tests from examples</li>
<li>Refactor with perfect syntax</li>
</ul>
<h4>What AI Cannot Do (Yet)</h4>
<p>❌ <strong>Make architectural decisions</strong></p>
<ul>
<li>Choose between microservices vs monolith</li>
<li>Decide on caching strategies</li>
<li>Select the right database for your scale</li>
<li>Balance tradeoffs between performance and maintainability</li>
<li>Understand your specific business constraints</li>
</ul>
<h4>The Critical Insight</h4>
<blockquote>
<p>AI is an incredible executor, but a terrible architect</p>
</blockquote>
<p>AI will build exactly what you specify, and it will build it fast. But it will build it wrong if your spec is wrong, and it cannot tell you IF you should build it.</p>
<p>Your job as a developer isn't going away – it's evolving. The old model of 80% coding and 20% thinking is becoming 50% planning, 20% coding, and 30% validating. The developers who thrive will be the ones who embrace this shift.</p>
<hr />
<h3>The New Time Allocation</h3>
<blockquote>
<p>How Developers Should Spend Their Time in the age of AI</p>
</blockquote>
<h4>50% Planning &amp; Thinking</h4>
<p><strong>This is where your value lives</strong></p>
<p>Deep requirements analysis is now the core of your job. Interview stakeholders multiple times, challenge assumptions aggressively, document edge cases obsessively, and define failure modes explicitly. Your architectural decisions – system boundaries, data flow, scale considerations, and integration points – are what AI cannot do for you.</p>
<p>Every hour spent here saves 10 hours of rework.</p>
<h4>10-20% Coding with AI</h4>
<p><strong>The execution phase is now the shortest phase</strong></p>
<p>You're now a prompt engineer, not a code writer. A quality controller, not a typist. An architectural guardian, not an implementer. You provide context, and AI generates the implementation.</p>
<pre><code class="language-markdown markdown">You: "Implement the cache invalidation strategy from section 3.2"
AI: [Generates 200 lines of code]
You: "Add circuit breaker pattern for Redis"
AI: [Updates with fault tolerance]</code></pre>
<h4>20-30% Testing &amp; Fine-Tuning</h4>
<p><strong>Trust, but verify everything</strong></p>
<p>This isn't just running tests. It's validating against original requirements, stress testing edge cases, performance profiling, security auditing, and user experience validation. The fine-tuning loop becomes: AI generates, you test against spec, find gaps, update prompts, and repeat until perfect.</p>
<hr />
<h3>The Five-Phase Discipline</h3>
<blockquote>
<p>A Systematic Approach to AI-Assisted Development</p>
</blockquote>
<h4>Why "No Vibe Coding"</h4>
<p>AI amplifies ambiguity. While humans can infer intent, AI cannot. Humans question weird requirements; AI implements them. A vague instruction to AI produces confidently wrong code. "No vibe coding" isn't about rigidity – it's about clarity.</p>
<h4>Phase 1: Brainstorm</h4>
<p><strong>Think Deeper Than Comfortable</strong></p>
<p>Spend time exploring the problem space thoroughly. Write down multiple approaches and pick the best ones. Ask "what could go wrong" until you've exhausted possibilities. Consider how this fits your long-term vision, not just immediate needs.</p>
<p><strong>Deliverable:</strong> Rough notes, sketches, stakeholder feedback, initial constraints</p>
<h4>Phase 2: Document</h4>
<p><strong>Write Specs That Leave Nothing to Interpretation</strong></p>
<p>Your PRD must include:</p>
<ul>
<li><strong>Problem Statement</strong>: Why are we building this?</li>
<li><strong>Success Metrics</strong>: How do we measure success?</li>
<li><strong>User Stories</strong>: Who uses this and how?</li>
<li><strong>Acceptance Criteria</strong>: Specific, testable requirements</li>
<li><strong>Non-Goals</strong>: What we explicitly won't do</li>
<li><strong>Constraints</strong>: Technical, business, and resource limits</li>
</ul>
<p>❌ <strong>Bad:</strong> "The system should be fast"<br>
✅ <strong>Good:</strong> "API responses return within 200ms for 95% of requests under 1000 req/sec load"</p>
<h4>Phase 3: Plan</h4>
<p><strong>Make Technical Decisions Explicitly</strong></p>
<p>Create your implementation blueprint with technology choices and justifications, system architecture, data models, API contracts, and task decomposition. Always explain the WHY:</p>
<pre><code class="language-markdown markdown">Decision: Use PostgreSQL for user data
Why:
- ACID compliance required for financial data
- Complex queries needed for reporting
- Team expertise already exists
- Scaling to 1M users is sufficient</code></pre>
<h4>Phase 4: Execute</h4>
<p><strong>Build Exactly to Spec</strong></p>
<p>For each task: Load context and spec into AI, generate implementation, review against acceptance criteria, adjust prompts if needed, and commit when criteria are met. You're crafting prompts and providing context, not writing boilerplate or implementing standard patterns.</p>
<h4>Phase 5: Track</h4>
<p><strong>Maintain Transparent Progress</strong></p>
<p>Document what acceptance criteria were met, what decisions were made, what assumptions changed, and what blockers exist. Every decision documented, every change justified, every deviation explained. Your future self (and AI) will thank you.</p>
<hr />
<h3>Example: Building a Rate Limiter</h3>
<h4>The Old Way (Pre-AI)</h4>
<ol>
<li>Quick chat about requirements (30 min)</li>
<li>Start coding (2 days)</li>
<li>Realize edge cases throughout</li>
<li>Add features as discovered (ongoing)</li>
<li>Test and fix bugs (1 day)</li>
</ol>
<p><strong>Total: 3-4 days, multiple revisions</strong></p>
<h4>The New Way (AI-Assisted)</h4>
<p><strong>Day 1 Morning: Brainstorm (2 hours)</strong></p>
<ul>
<li>Interview API team about traffic patterns</li>
<li>Research rate limiting algorithms</li>
<li>Consider bypass mechanisms</li>
<li>Document failure modes</li>
</ul>
<p><strong>Day 1 Afternoon: Document (3 hours)</strong></p>
<pre><code class="language-markdown markdown">## PRD: Rat#e Limiter

#### Problem
API abuse is costing $50K/month in infrastructure

#### Success Metrics
- Reduce suspicious traffic by 80%
- Zero impact on legitimate users
- Response time overhead &lt;5ms

#### Acceptance Criteria
- [ ] Implements token bucket algorithm
- [ ] Supports 100K unique keys
- [ ] Redis-backed with local cache fallback
- [ ] Configurable per endpoint and user
- [ ] Graceful degradation on Redis failure</code></pre>
<p><strong>Day 2: Plan and Execute</strong></p>
<ul>
<li>Architecture: API Gateway plugin</li>
<li>Storage: Redis with local LRU cache</li>
<li>AI generates implementation per spec</li>
<li>Reviews and adjustments</li>
</ul>
<p><strong>Day 3: Test and Fine-tune</strong></p>
<ul>
<li>Load test with production patterns</li>
<li>Validate failure behavior</li>
<li>Performance profiling</li>
</ul>
<p><strong>Total: 2.5 days, zero architectural revisions</strong></p>
<hr />
<h3>The Mindset Shift</h3>
<blockquote>
<p>From Coder to Architect-Conductor</p>
</blockquote>
<p>You're not a typist anymore. Your identity shifts from "I write code" to "I design systems and ensure quality."</p>
<h4>The Skills That Matter Now</h4>
<ol>
<li><strong>Systems thinking</strong> - Understanding how pieces connect</li>
<li><strong>Clear communication</strong> - Writing specs AI can't misinterpret</li>
<li><strong>Edge case imagination</strong> - Thinking of what could go wrong</li>
<li><strong>Quality judgment</strong> - Knowing when code is production-ready</li>
<li><strong>Prompt engineering</strong> - Getting AI to build what you envisioned</li>
</ol>
<h4>What to Focus On</h4>
<p><strong>Invest in:</strong> System design, technical writing, domain modeling, requirements analysis, test strategy</p>
<p><strong>Worry less about:</strong> Syntax memorization, algorithm implementation, boilerplate patterns, code formatting</p>
<p>The uncomfortable truth: <strong>AI won't replace developers, but developers using AI will replace developers who don't.</strong> More specifically, developers who can architect and specify will replace developers who only code.</p>
<hr />
<h3>Context Optimization with Sub-Agents</h3>
<blockquote>
<p>Scaling AI Development Without Context Explosion</p>
</blockquote>
<p>As projects grow, context overwhelms. Claude's context window is large but not infinite, and full project context slows responses while increasing costs.</p>
<h4>The Sub-Agent Pattern</h4>
<pre><code class="language-markdown markdown">Main Agent (Orchestrator)
    ├── API Agent (owns backend context)
    ├── UI Agent (owns frontend context)
    ├── Data Agent (owns database context)
    └── Test Agent (owns test context)</code></pre>
<p>Each sub-agent gets ONLY relevant context. The API agent knows about endpoints and authentication but not CSS or frontend state. The UI agent knows components and design systems but not database schemas.</p>
<h4>Real Impact</h4>
<p><strong>Without Sub-Agents:</strong></p>
<ul>
<li>Context: 100K tokens</li>
<li>Response time: 45 seconds</li>
<li>Cost: $0.50 per interaction</li>
<li>Accuracy: Often references wrong components</li>
</ul>
<p><strong>With Sub-Agents:</strong></p>
<ul>
<li>Context: 10K tokens per agent</li>
<li>Response time: 8 seconds</li>
<li>Cost: $0.08 per interaction</li>
<li>Accuracy: High, focused domains</li>
</ul>
<h4>Sub-Agent Communication</h4>
<p>Sub-agents return structured summaries to the main orchestrator:</p>
<pre><code class="language-json json">{
  "agent": "api",
  "task": "auth-endpoints",
  "status": "complete",
  "decisions": [
    "Used JWT for stateless auth",
    "Implemented refresh token rotation"
  ],
  "interfaces": {
    "endpoints": ["/auth/login", "/auth/refresh"],
    "errors": ["AUTH_001", "AUTH_002"]
  },
  "concerns": [
    "Need Redis for rate limiting"
  ]
}</code></pre>
<p>Use sub-agents when you have clear domain boundaries, large codebases (&gt;100 files), or specialized domains. Avoid them for small scripts or tightly coupled systems.</p>
<hr />
<h3>Introducing CCPM</h3>
<blockquote>
<p>A Tool That Enforces This Discipline</p>
</blockquote>
<p>Good intentions aren't enough. It's easy to skip documentation under pressure, tempting to "just start coding," and difficult to coordinate multiple AI agents.</p>
<p><a href="https://github.com/automazeio/ccpm">CCPM</a> (Claude Code Project Management) is a tool that enforces this discipline:</p>
<ol>
<li><strong>Forces the five phases</strong> - Can't code without a spec</li>
<li><strong>Maintains context</strong> - No more re-explaining to AI</li>
<li><strong>Enables parallel AI agents</strong> - Multiple AIs on one project</li>
<li><strong>Creates audit trails</strong> - Every decision tracked in GitHub</li>
<li><strong>Integrates with existing tools</strong> - GitHub Issues as database</li>
</ol>
<h4>Quick Example</h4>
<pre><code class="language-bash bash"># Force#s you to brainstorm and document
/pm:prd-new feature-name

## Forces you to plan
/pm:prd-parse feature-name

## Enables parallel execution
/pm:epic-oneshot feature-name
/pm:issue-start 1234  # AI agent 1
/pm:issue-start 1235  # AI agent 2</code></pre>
<p><a href="https://github.com/automazeio/ccpm">CCPM</a> doesn't change the discipline – it enforces it. You could follow this process manually, but it does make it systematic and repeatable, especially powerful for team coordination.</p>
<hr />
<h3>Common Questions</h3>
<h4>"This seems like a lot of overhead"</h4>
<p>The overhead is front-loaded. You'll spend 2x time planning but 0.2x time debugging and reworking. Net win: 50% faster delivery with higher quality.</p>
<h4>"What if requirements change?"</h4>
<p>They will. But now changes are explicit, documented, and AI can refactor faster than you can type. Changes are less painful when specs exist.</p>
<h4>"What about exploratory coding?"</h4>
<p>Still valuable! But timebox it, call it what it is (research), and don't ship it. Use exploration to inform your spec, then build properly.</p>
<h4>"Is this just waterfall?"</h4>
<p>No. You can iterate, but each iteration follows the discipline. Think of it as "structured agility" – flexible in direction, disciplined in execution.</p>
<hr />
<h3>Your Next Steps</h3>
<h4>Start Small</h4>
<ol>
<li>Pick one small feature in your current project</li>
<li>Write a complete PRD before coding</li>
<li>Time yourself through all five phases</li>
<li>Use AI for execution following your spec exactly</li>
<li>Compare to your normal process</li>
</ol>
<h4>Build the Habit</h4>
<ul>
<li>Track your time allocation – aim for 50/20/30</li>
<li>Build your edge case muscle – list 10 for every feature</li>
<li>Practice prompt engineering – get faster at directing AI</li>
<li>Share your specs – get feedback from teammates</li>
</ul>
<h4>The Bottom Line</h4>
<p>The future belongs to developers who can:</p>
<ul>
<li>Think deeply about problems</li>
<li>Specify solutions precisely</li>
<li>Orchestrate AI execution</li>
<li>Validate quality rigorously</li>
</ul>
<p>The question isn't whether to adopt this discipline. The question is whether you'll adopt it before your competition does.</p>
<hr />
<h3>Share Your Experience</h3>
<p>This guide represents our current understanding of how to effectively blend human expertise with AI capabilities, but we know we're just scratching the surface.</p>
<p>If you're implementing these practices, hitting roadblocks, or discovering better patterns, I'd love to hear from you.</p>
<p><a href="https://x.com/aroussi/status/1958862375144366527">Share your experiences, successes, and failures</a> – the entire developer community benefits when we learn together.</p>
<hr />
<p><em>Remember: AI amplifies your decisions. Make them good ones.</em></p>
<hr />
<h4>Links</h4>
<ul>
<li>CCPM Tool: <a href="https://github.com/automazeio/ccpm">github.com/automazeio/ccpm</a></li>
</ul>]]></content:encoded>
      <category><![CDATA[ai]]></category><category><![CDATA[business]]></category><category><![CDATA[code]]></category>
    </item>
    <item>
      <title>How we fixed the context problem in AI-driven development</title>
      <link>https://aroussi.com/post/ccpm-claude-code-project-management</link>
      <pubDate>Wed, 20 Aug 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/ccpm-claude-code-project-management</guid>
      <description><![CDATA[<p>Our project management system for Claude Code using GitHub Issues and Git worktrees for parallel agent execution</p>]]></description>
      <content:encoded><![CDATA[<p>If you've tried to build anything substantial with AI agents, you know the pain. You start strong, but three days later you're explaining the same context for the fifth time, your parallel work is stepping on its own toes, and nobody knows what's actually done until someone brave enough opens that 47-file PR.</p>
<p>We built <a href="https://github.com/automazeio/ccpm">CCPM</a> (Claude Code Project Management) to fix this. It's a lightweight project management system that keeps AI agents on track by treating GitHub Issues as your source of truth and making every line of code traceable back to a spec.</p>
<h2>The Problem Nobody Talks About</h2>
<p>Here's what actually happens when you try to build with AI agents today:</p>
<p><strong>Monday:</strong> "Let's build a caching system!"
<strong>Tuesday:</strong> "Wait, why are we using Redis again?"
<strong>Wednesday:</strong> "Who decided on this architecture?"
<strong>Thursday:</strong> "These two agents just rewrote each other's work"
<strong>Friday:</strong> "I have no idea what's actually done"</p>
<p>Sound familiar? The issue isn't the AI. It's that most AI development happens in isolation: a single developer, working with Claude in their local environment, with progress trapped in chat logs. When you try to scale this up, everything falls apart.</p>
<h2>Breaking AI Development Out of Its Silo</h2>
<p>CCPM does something different: it makes AI development visible to your entire team. By using GitHub Issues as the backbone, we get:</p>
<p><strong>True team collaboration.</strong> Multiple Claude instances can work on the same project simultaneously. Your human teammates see AI progress in real-time through issue comments. No more "what did the AI do?" meetings.</p>
<p><strong>Seamless handoffs.</strong> An AI agent can start a task, a human developer can finish it, another AI can write the tests. The context travels with the issue, not trapped in someone's chat history.</p>
<p><strong>Scale that actually works.</strong> Add team members without onboarding friction. Run multiple AI agents in parallel on different issues. Your distributed team stays synchronized automatically, using the GitHub workflows they already know.</p>
<p>This isn't just project management. It's a collaboration protocol that lets humans and AI agents work together using infrastructure your team already trusts.</p>
<h2>No More Vibe Coding</h2>
<p>Here's our core principle: <strong>every line of code must trace back to a specification.</strong></p>
<p>We enforce a strict discipline:</p>
<ol>
<li><strong>Brainstorm</strong> thoroughly before touching code</li>
<li><strong>Document</strong> requirements that leave nothing to interpretation</li>
<li><strong>Plan</strong> with explicit technical decisions</li>
<li><strong>Execute</strong> exactly to spec</li>
<li><strong>Track</strong> progress transparently</li>
</ol>
<p>No shortcuts. No assumptions. No "I think this is what they meant." When an AI agent picks up a task, it knows exactly what to build because the spec says so.</p>
<h2>What CCPM Actually Does</h2>
<p>CCPM is refreshingly simple: write specs, turn them into GitHub Issues, and let agents work in parallel without conflicts.</p>
<p>Here's the workflow:</p>
<ol>
<li><strong>Write a real PRD</strong> (Product Requirements Document)</li>
<li><strong>Convert it to an epic</strong> with technical decisions baked in</li>
<li><strong>Decompose into tasks</strong> with clear acceptance criteria</li>
<li><strong>Sync to GitHub</strong> as properly linked issues</li>
<li><strong>Execute in parallel</strong> without stepping on each other (using Git worktrees)</li>
</ol>
<p>The magic is that everything stays connected. Your implementation traces back to your spec, your commits trace back to your issues, and your issues trace back to your PRD.</p>
<h2>A Real Example</h2>
<p>Let me show you what this looks like in practice. Say you're building a memory system for your app:</p>
<pre><code class="language-bash bash"># Start with a proper spec
/pm:prd-new memory-system
# Launches a guided session to capture requirements and constraints

# Convert to technical plan
/pm:prd-parse memory-system
# Creates an epic with architecture decisions

# Ship it to GitHub
/pm:epic-oneshot memory-system
# Creates GitHub issues with proper relationships

# Start working (in parallel!)
/pm:issue-start 1235  # API endpoints
/pm:issue-start 1236  # Frontend components
/pm:issue-start 1237  # Test suite

# Keep everyone informed
/pm:issue-sync 1235
# Updates flow to GitHub as comments</code></pre>
<p>Your whole team can see what's happening. Product managers check issue comments. Developers review PRs tied to specific acceptance criteria. Everything has a paper trail.</p>
<h2>Why GitHub Issues? (And Not Another Tool)</h2>
<p>We tried everything. Notion, Linear, custom databases. They all created the same problem: a silo between planning and code.</p>
<p>GitHub Issues live where your code lives. They give you:</p>
<ul>
<li>Comments for the audit trail</li>
<li>Labels for organization</li>
<li>Relationships for dependencies</li>
<li>An API everyone already knows</li>
<li>Webhooks your tools already use</li>
</ul>
<p>Plus, when an AI agent updates an issue, your human teammates see it immediately. The single source of truth isn't a concept, it's literally your issue tracker.</p>
<h2>The Parallel Execution Secret</h2>
<p>Here's something we discovered: most "single" tasks aren't single at all. That "implement auth" ticket? It's actually database changes, API endpoints, frontend components, tests, and documentation.</p>
<p>CCPM recognizes this. Each agent works in its own git worktree:</p>
<pre><code class="language-bash bash"># These all run simultaneously without conflicts
/pm:issue-start 1235  # Agent 1: API
/pm:issue-start 1236  # Agent 2: Frontend
/pm:issue-start 1237  # Agent 3: Tests</code></pre>
<p>No merge conflicts. No overwritten work. When they're done, you have a clean history with each commit tied to its acceptance criteria.</p>
<h2>The Unexpected Benefits</h2>
<p>After dogfooding this for a few months, we noticed things we didn't expect:</p>
<p><strong>Onboarding is instant.</strong> New team members (human or AI) can read the PRD, check the epic, and understand everything in minutes.</p>
<p><strong>Reviews are actually reviewable.</strong> Instead of a massive PR with "implemented stuff," you get targeted commits tied to specific criteria.</p>
<p><strong>The "what were we thinking?" problem disappears.</strong> Every weird decision has a paper trail back to its requirement.</p>
<p><strong>Remote teams love it.</strong> Async collaboration just works when everything flows through issues.</p>
<h2>Some Opinions We Baked In</h2>
<p>CCPM makes deliberate choices:</p>
<ul>
<li><strong>Specs aren't optional.</strong> No spec, no code. This keeps AI aligned and humans informed.</li>
<li><strong>Local-first, sync when ready.</strong> Work happens locally, GitHub gets updates when you choose.</li>
<li><strong>Issues over Projects.</strong> GitHub Projects are fine for visualization, but Issues are the source of truth.</li>
<li><strong>Boring tech wins.</strong> Shell scripts, markdown, git. Nothing fancy, everything debuggable.</li>
</ul>
<h2>Try It Yourself</h2>
<p>Getting started takes about two minutes:</p>
<pre><code class="language-bash bash"># Clone CCPM into your project
git clone https://github.com/automazeio/ccpm.git .claude/
cd .claude/

# Initialize everything
/pm:init

# Start your first feature
/pm:prd-new your-feature-name</code></pre>
<p>The system walks you through creating your first PRD, decomposing it into tasks, and syncing with GitHub.</p>
<h2>What's Next</h2>
<p>We're exploring a few directions:</p>
<ul>
<li><strong>Smarter agent specialization</strong> for different parts of your stack</li>
<li><strong>Better acceptance criteria validation</strong> before work begins</li>
<li><strong>Automatic PR creation</strong> when tasks complete</li>
</ul>
<p>But honestly, the current version already solves the core problem: keeping AI agents productive without losing your sanity, while letting your whole team see what's happening.</p>
<h2>The Bottom Line</h2>
<p>CCPM acknowledges a simple truth: AI agents need different workflows than humans, but they need to work together. It's the minimal system that makes this possible.</p>
<p>If you're tired of explaining context repeatedly, watching parallel work collide, or wondering what your AI agents actually accomplished, give CCPM a try. At worst, you'll have better specs. At best, you'll transform how your team ships software.</p>
<p>Check it out at <a href="https://github.com/automazeio/ccpm">github.com/automazeio/ccpm</a>. The README has everything you need to get started.</p>]]></content:encoded>
      <category><![CDATA[ai]]></category><category><![CDATA[business]]></category><category><![CDATA[productivity]]></category>
    </item>
    <item>
      <title>The funding gap: why revenue-based royalties are the missing piece for profitable builders</title>
      <link>https://aroussi.com/post/the-funding-gap</link>
      <pubDate>Fri, 04 Jul 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/the-funding-gap</guid>
      <description><![CDATA[<p>The missing funding framework for bootstrappers, indie hackers, and creators</p>]]></description>
      <content:encoded><![CDATA[<h2>The venture capital trap</h2>
<p>Let's be honest: venture capital works when you're building a billion-dollar rocket company or curing cancer. But most of us? We're building solid, real businesses – SaaS tools, newsletters, digital products, games – that serve paying customers from day one.</p>
<p>The problem? The standard funding paths weren't designed for that. In startup circles, admitting you <em>want</em> a profitable, long-term business is almost taboo. Everyone's pitching “the next big thing” while quietly burning through millions.</p>
<p>VC is an all-or-nothing bet. If you don't swing for a massive exit, you're considered a failure. But what if you want to build a good business, earn a living, and stay in control? That's where the gap appears.</p>
<h2>The profitable middle no one talks about</h2>
<p>While Twitter debates unicorns, thousands of founders are quietly building profitable businesses. Solo developers, small teams, indie hackers – pulling in $50k, $500k, $5M a year. They don't want forced exits or a boss in their boardroom – they just want practical cash to grow.</p>
<p>The SaaS revolution and creator economy made this possible: a single developer can launch software or a course that serves thousands of paying customers. And these builders figured something out: you don't need to lose money for years to build something valuable. You can charge from day one and stay alive without giving away your company.</p>
<p>But sometimes you <em>do</em> need more fuel – a new hire, marketing push, or a spin-off product. And that's when the funding gap appears.</p>
<h2>The funding squeeze</h2>
<p>Traditional banks don't get it – they want trucks, buildings, or collateral they can repossess. Revenue lenders often load you with painful payback terms. VC wants moonshots and unicorns.</p>
<p>So where do you turn if you need $50k–$500k to grow a project that's <em>already working</em>?</p>
<h2>What real builders actually need</h2>
<p>It's not rocket science:</p>
<ul>
<li><strong>Upfront support without selling control.</strong> Builders want funding, not new bosses.</li>
<li><strong>Shared upside.</strong> Supporters win when revenue comes in – not only at some distant exit.</li>
<li><strong>Project-based, flexible.</strong> Raise for what you need now, not the entire business.</li>
<li><strong>Clear, simple terms.</strong> Keep it standard. Keep it fair.</li>
</ul>
<h2>The fix: revenue-based royalties</h2>
<p>This is where royalties fit in.</p>
<p>Imagine this: a few early backers put up cash for your new SaaS feature or next game. In return, you share a small slice of that <em>project's</em> revenue as sales roll in – until they're paid back with a fair return.</p>
<p>No new board seats. No equity dilution. No forced exits. Just a clear agreement: "You backed this, you get a fair piece of what it earns."</p>
<h2>Reference price &amp; fair exit</h2>
<p>One key piece: a simple <strong>reference price</strong>. Everyone agrees upfront what the project is worth. If you sell, shut down, or merge the project before your backers are paid back in full, they get fair compensation based on that agreed number.</p>
<p>It's not about valuations and endless negotiations – it's just basic fairness. You stay in charge – they stay protected.</p>
<h2>Why early-stage backers should love it</h2>
<p>Unlike traditional “investing” that might take years to pay out – royalties flow when sales happen. Your supporters share in your upside <em>immediately</em>. The more you earn, the more they earn.</p>
<p>It's simple, aligned, and protects everyone if plans change.</p>
<h2>Who this helps</h2>
<p>Revenue-based royalties aren't for billion-dollar rocket ships. They're for:</p>
<ul>
<li>Indie SaaS with steady MRR.</li>
<li>Creators selling courses, newsletters, and digital products.</li>
<li>Game studios funding one title at a time.</li>
<li>Makers with multiple small projects.</li>
<li>Builders who want profit <em>and</em> freedom.</li>
</ul>
<h2>Making it real</h2>
<p>This works best when it's easy to use. So we're <a href="https://github.com/automazeio/open-royalties">open-sourcing two simple royalty agreement templates</a>:</p>
<ul>
<li><strong>Full version:</strong> includes a steering committee with a seat for your backers – so they can offer input while you keep control.</li>
<li><strong>Simple version:</strong> same structure but <em>no formal seat</em> – pure revenue sharing, minimal oversight.</li>
</ul>
<p>Both use clear terms: what % of revenue is shared, what return supporters receive, and how to handle exits fairly.</p>
<h2>Ready to try it?</h2>
<p>Grab the templates, adapt them for your next launch, and share your feedback. If you're a builder who cares about staying profitable <em>and</em> treating your early supporters well – this might be the missing piece you've been waiting for.</p>
<hr />
<p><a href="https://github.com/automazeio/open-royalties">Check out the Open Royalties repo →</a></p>]]></content:encoded>
      <category><![CDATA[thoughts]]></category><category><![CDATA[business]]></category>
    </item>
    <item>
      <title>Apple is spiraling... and it's showing</title>
      <link>https://aroussi.com/post/apple-research-smokescreen</link>
      <pubDate>Wed, 11 Jun 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/apple-research-smokescreen</guid>
      <description><![CDATA[<p>Why Apple's "research paper" is just a smokescreen</p>]]></description>
      <content:encoded><![CDATA[<p>If you really want to understand where Apple is today, ignore the overproduced (and under-delivering) <a href="https://developer.apple.com/videos/play/wwdc2025/101/">WWDC</a> show. Look past the perfectly choreographed transitions and the new "liquid glass" UI design (don't even get me started on that). Instead, pay attention to a research paper they quietly dropped a few days earlier. It says way more about Apple's state of mind than any keynote ever could.</p>
<p>It's called <a href="https://machinelearning.apple.com/research/illusion-of-thinking">The Illusion of Thinking</a>, and the main claim is simple:</p>
<p><strong>Today's advanced AI models are all smoke and mirrors.</strong></p>
<p>Except… the paper isn't really science. It's a signal. <strong>A red flag from a company that's lost its creative engine, stuck watching the world shift around it - fast.</strong> It's Apple, not innovating, but reacting. Not leading, but defending.</p>
<p>And they're scared.</p>
<blockquote>
<p>Before we continue...</p>
<p>Let me be clear: I say all this as someone who genuinely wants to root for Apple. I've been in the ecosystem for years. I don't want to go back to Windows. But if Apple keeps losing the plot, we may not get a choice.</p>
<p>Now that we got that out of the way, let's continue.</p>
</blockquote>
<h2>The research is a smokescreen</h2>
<p>The paper was obviously engineered to fail AI models. Tasks were deliberately impossible. The models weren't allowed to use code. It was set up so they'd look dumb. Why? To plant doubt. To confuse the market. To soften the blow just before Apple had to show how far behind it really is.</p>
<p>This wasn't science. It was strategy. And a desperate one.</p>
<h2>The Jobs momentum is gone</h2>
<p>Apple hasn't truly innovated in over a decade. That's not a hot take - it's just math.</p>
<p><strong>Steve Jobs left them with a 15-year tailwind. A soft cushion of innovation.</strong> Under Tim Cook, they squeezed every drop from that lead: optimized the supply chain, maximized profits, and turned the iPhone into a cash machine. But they didn't use that time to invent the next act.</p>
<p><strong>Now that cushion is gone.</strong></p>
<p>And what do we get? A rebranded Siri with the buzzword "intelligence" slapped on it.</p>
<p>Apple Intelligence isn't a leap forward. It's a scramble to catch up. Worse - it locks core AI features behind a hardware paywall. Want the basics everyone else is offering for free? That'll be $1,200 for a new iPhone.</p>
<p>The walled garden that once protected the user is now locking them in.</p>
<p>The real threat? It's not Google or OpenAI – it's <a href="https://openai.com/sam-and-jony/">Johnny and Sam</a>.</p>
<p>Apple knows the next big shift won't come from Cupertino.</p>
<p>It's coming from <strong>Johnny Ive</strong> - the guy who made Apple look like Apple - teaming up with <strong>Sam Altman</strong> - the guy who's redefining what software can be.</p>
<p>They're not building an app. They're building a new kind of device. One that might make the iPhone feel like a relic, just like the iPhone did to Nokia.</p>
<p><strong><em>That's</em></strong> the existential threat. And Apple sees it.</p>
<h2>A closer look at the "research"</h2>
<p>If you're wondering why the AI community rolled its eyes, here's a quick breakdown of the paper's greatest hits:</p>
<h4><strong>Claim #1:</strong> "We created a clean test environment with no known solutions"</h4>
<blockquote>
<p><strong>Reality:</strong> They used textbook problems like Towers of Hanoi – solved a million times, in every comp-sci course and all over the web. The models knew exactly what they were dealing with.</p>
</blockquote>
<h4><strong>Claim #2:</strong> "The model collapses on hard tasks, so it's not really thinking"</h4>
<blockquote>
<p><strong>Reality:</strong> That's not failure – that's resource management. The model knows the task is too long and complicated to be worth solving. That's efficiency, not a breakdown.</p>
</blockquote>
<h4><strong>Claim #3:</strong> "We banned the use of code to test pure reasoning"</h4>
<blockquote>
<p><strong>Reality:</strong> That's like testing a chef but banning knives. Translating problems into code is the reasoning method for machines. You can't strip it away and pretend the result means something.</p>
</blockquote>
<h4><strong>Claim #4:</strong> "The models failed because of weak reasoning"</h4>
<blockquote>
<p><strong>Reality:</strong> They failed because the test was physically impossible. The token limit was too small to contain the full solution. The test was rigged.</p>
</blockquote>
<h4><strong>Claim #5:</strong> "This is a rigorous scientific study"</h4>
<blockquote>
<p><strong>Reality:</strong> Real AI research happens across labs, universities, and companies. This was an Apple-only paper, published at a perfect PR moment. It's not science. It's marketing.</p>
</blockquote>
<h2>So where does that leave Apple?</h2>
<p>When a company stops building the future, it starts defending the past.</p>
<p>And that's exactly what we're seeing here: a fear response. From a brand that once defined what's next, now trying to slow the train down with whitepapers and lock-in strategies.</p>
<p>"Apple Intelligence" isn't about insight. <strong>It's a brand patch.</strong> And the research that came with it doesn't tell us anything new – except that Apple's leadership doesn't get what's happening.</p>
<p>Are today's models perfect? <strong>Of course not.</strong></p>
<p>Should we rely on them blindly? <strong>Definitely not.</strong></p>
<p>But right now, millions of people, companies, and teams are using AI to get things done.</p>
<p>This isn't theory. It's happening.</p>
<p>And Apple is standing on the sidelines, publishing papers designed to convince you it's all fake.</p>
<p>But here's the thing: you don't release something like that unless you're scared.</p>
<p>And Apple seems to be terrified.</p>]]></content:encoded>
      <category><![CDATA[thoughts]]></category>
    </item>
    <item>
      <title>Vibe Brainstorming</title>
      <link>https://aroussi.com/post/vibe-brainstorming</link>
      <pubDate>Tue, 03 Jun 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/vibe-brainstorming</guid>
      <description><![CDATA[<p>How I test ideas, challenge assumptions, and break down complex problems</p>]]></description>
      <content:encoded><![CDATA[<p>I've been asked many times about how I come up with ideas, how I decide what's worth building, and what my "framework" is for getting started.</p>
<p>The truth is – I don't really use a framework.</p>
<p>What I do have is a system. One that lives in my head, was built through repetition and intuition, and has evolved over decades of building things fast, throwing most of them away, and keeping only what's worth refining.</p>
<p>Some people might call it instinct. I call it experience layered with systems thinking.</p>
<p>And in this post, I want to show you how I work through new ideas – not with a whiteboard or a Notion template, but with a long conversation.</p>
<p>This isn't "vibe coding". This is <strong>vibe brainstorming</strong> – and it's how I test ideas, challenge assumptions, and break down complex problems before executing, presenting, or writing a single line of code.</p>
<hr />
<h2>Step 1: It starts with a spark</h2>
<p>Most of my ideas start the same way: a visual spark, a problem I face, or something I see that sets off a cascade of thoughts.</p>
<p>Could be a landing page. Could be a badly designed signup flow. Could be someone talking about a business they wish existed.</p>
<p>Once something clicks, I move fast. But not recklessly – I jump into a mode where I can explore it thoroughly.</p>
<p>That's when I open ChatGPT.</p>
<hr />
<h2>Step 2: Structured chaos</h2>
<p>The first thing I do is tell ChatGPT the core idea. Then I list the specific aspects I want to dive into:</p>
<ul>
<li>target user</li>
<li>pricing model</li>
<li>technical stack</li>
<li>project architecture</li>
<li>user experience</li>
<li>key features</li>
<li>potential challenges</li>
<li>distribution channels</li>
<li>...</li>
</ul>
<p>This becomes a sort of agenda for the brainstorming session.</p>
<p>Then we go deep. One by one.</p>
<p>I ask questions, share thoughts, and request pushback. That part's important – I want the AI to challenge me, not just echo back. I ask it to highlight contradictions, suggest alternatives, or poke holes in my logic.</p>
<p>Every time we "close" a topic, I ask ChatGPT to summarize it into a Markdown doc. Those summaries pile up quickly: one for UX, one for data modeling, one for monetization, etc.</p>
<p>This part usually takes hours and occasionally might even span over a few days. We go through every single detail and leave no stone unturned.￼</p>
<p>By the end, I've got a full research dump ready to feed into a custom GPT or a project doc.</p>
<hr />
<h2>Step 3: (If it's a software project)</h2>
<p>If the idea survives this gauntlet of questioning and reframing, I'll move on to Claude to turn the notes into a PRD (product requirements doc).</p>
<p>From there:</p>
<ul>
<li>I load the PRD into <a href="https://cursor.com">Cursor</a> with Claude 4.0 Sonnet (or Opus for large projects).</li>
<li>I use my <a href="https://github.com/eyaltoledano/claude-task-master">Taskmaster MCP</a> to break it into dev-ready tasks.</li>
<li>I work with Cursor to tackle tasks one by one.</li>
</ul>
<p>This is where past prep pays off. I have:</p>
<ul>
<li>A library of code snippets I've already documented and reused.</li>
<li>A custom design system, fully specced and AI-readable.</li>
<li>Clear standards that help AI produce outputs that match my style, preferences, and architecture.</li>
</ul>
<p>So it's not "let's see what the AI generates". It's more like working with an extremely fast junior dev who already knows your whole stack.</p>
<p><strong>I don't let the AI make architectural decisions. I watch it like a hawk and review its code before approving it.</strong> I also ask it to justify every function and every coding decision it's made (this usually results in cutting the code by at least 20%).</p>
<p><img src="/assets/img/vibe-coding.webp" alt="Vibe coding" /></p>
<hr />
<h2>This works for me</h2>
<p>This isn't meant to be prescriptive. I'm not saying you need to do things my way.</p>
<p>But I am saying that most productivity advice is garbage unless it helps you build a system that works for how your brain actually functions.</p>
<p>For me, writing things down isn't about creating a second brain – it's about clearing out mental RAM so I can think more clearly.</p>
<p>I don't use frameworks. But I do follow internal SOPs that are second nature by now (one of them is <a href="https://aroussi.com/post/my-productivity-framework">here</a>.)</p>
<p>And I don't spend time wondering if a problem is too big. I just start breaking it down:</p>
<ul>
<li>What's the core problem?</li>
<li>Who is it for?</li>
<li>What's the simplest version?</li>
<li>What are the dependencies?</li>
</ul>
<p>Whether it's a product idea, a tech problem, or a business model – if you can decompose it, you can evaluate it.</p>
<hr />
<h2>Final note</h2>
<p>There have been times I ignored my instinct. Times I didn't move fast.</p>
<p>One example is Tradologics. I waited too long, got caught up in trying to make it perfect, and the end result wasn't what I've set up to achieve. I'll write more about that in a future post.</p>
<p>But what I've learned is this: intuition is a muscle. You build it by thinking, building, evaluating, and repeating. If you do that long enough, you don't need a playbook.</p>
<p>You just need a spark – and a few hours to brainstorm the hell out of it.</p>]]></content:encoded>
      <category><![CDATA[productivity]]></category>
    </item>
    <item>
      <title>Agents Deserve Better than Retrofitted Frameworks</title>
      <link>https://aroussi.com/post/agents-deserve-better-than-retrofitted-frameworks</link>
      <pubDate>Tue, 06 May 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/agents-deserve-better-than-retrofitted-frameworks</guid>
      <description><![CDATA[<p>Why Building the Multi-Agent Future Requires Purpose-Built Infrastructure, Not LLM Wrappers</p>]]></description>
      <content:encoded><![CDATA[<p>As AI development accelerates, we're witnessing a paradigm shift in how we build intelligent systems. The era of single-model applications is giving way to sophisticated multi-agent ecosystems - collections of specialized AI agents working together to accomplish complex tasks. However, the frameworks we're using to build these systems haven't evolved at the same pace.</p>
<h2>The Problem with Retrofitted Solutions</h2>
<p>The current landscape of AI agent frameworks is littered with solutions that weren't designed for the multi-agent future we're building. Most popular frameworks began as simple LLM wrappers or chain-of-thought implementations, with agent capabilities bolted on as afterthoughts. This fundamental architectural limitation creates several critical problems:</p>
<h4>1. Excessive Boilerplate and Complexity</h4>
<p>Current frameworks require developers to write hundreds of lines of boilerplate code for even basic agent interactions. What should be simple agent definitions become buried under layers of configuration, tool specifications, and memory management code. This complexity increases the barrier to entry and slows down development cycles.</p>
<h4>2. Communication Protocol Limitations</h4>
<p>True agent systems require sophisticated communication protocols. Agents need to discover each other's capabilities, delegate tasks efficiently, and share context appropriately. Yet most frameworks offer minimal support for inter-agent communication, treating it as an advanced feature rather than a core requirement.</p>
<h4>3. Memory Architecture Shortcomings</h4>
<p>Agents require tiered memory systems - from short-term buffers to long-term persistent storage with semantic retrieval. Current frameworks typically offer simplistic memory implementations as add-ons rather than integrated components, forcing developers to build complex memory systems from scratch.</p>
<h4>4. Deployment and Scaling Challenges</h4>
<p>Production-ready agent systems need to scale beyond single processes and machines. Yet many frameworks are designed primarily for local development, with distributed deployment treated as an enterprise feature or left entirely to the developer to implement.</p>
<h4>5. The Demo-to-Production Gap</h4>
<p>Perhaps most frustrating is the "works in demos" problem. Many frameworks showcase impressive capabilities in controlled environments but fall apart in production settings with real-world constraints, memory limitations, and reliability requirements.</p>
<h2>What an Agent-Native Framework Should Offer</h2>
<p>To truly enable the multi-agent future, we need frameworks built from the ground up with agents as first-class citizens. Here's what a truly agent-native framework would prioritize:</p>
<h4>1. Declarative Agent Configuration</h4>
<p>Agent definitions should be simple, declarative, and version-controlled. Developers should be able to define complex agent capabilities in minimal YAML or JSON without sacrificing power or flexibility.</p>
<h4>2. Native Agent Communication</h4>
<p>Agent-to-agent communication protocols should be built into the core architecture, not added as an extension. This includes capability discovery, task delegation, and context sharing with appropriate security boundaries.</p>
<h4>3. Integrated Memory Systems</h4>
<p>Tiered memory architectures should be a core feature, with built-in support for buffer memory, long-term storage, and domain-specific knowledge bases. The framework should handle the complexity of memory management, allowing developers to focus on agent logic.</p>
<h4>4. Production-Ready Architecture</h4>
<p>Agent frameworks should support multiple deployment models from development to production, with built-in authentication, security, observability, and distributed execution capabilities.</p>
<h4>5. Standardized Tool Integration</h4>
<p>Integration with external tools and services should follow standardized protocols like the Model Control Protocol (MCP), allowing for consistent interaction patterns regardless of the underlying model provider.</p>
<h4>6. Multi-Modal Support</h4>
<p>Modern agents interact through text, images, audio, and video. A true agent framework should provide native support for multi-modal interactions without requiring significant additional code.</p>
<h2>The Path Forward</h2>
<p>The future of AI isn't single models or isolated agents - it's collaborative systems of specialized intelligences working together to solve complex problems. Building this future requires frameworks designed specifically for agent orchestration, not retrofitted solutions that treat agents as an advanced feature.</p>
<p>Developers deserve tools that make building sophisticated agent systems accessible without sacrificing power or flexibility. We need frameworks that handle the infrastructure complexity so developers can focus on creating intelligent, useful agent systems.</p>
<p>The multi-agent revolution is already underway. It's time our frameworks caught up.</p>]]></content:encoded>
      <category><![CDATA[ai]]></category>
    </item>
    <item>
      <title>Old School; New Tech</title>
      <link>https://aroussi.com/post/old-school-new-tech</link>
      <pubDate>Tue, 08 Apr 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/old-school-new-tech</guid>
      <description><![CDATA[<p>Yes, I'm starting a podcast.</p>]]></description>
      <content:encoded><![CDATA[<p><strong>TL;DR:</strong> I'm starting a podcast. I'm launching a podcast for non-tech founders: <em>Old School; New Tech</em></p>
<p>After nearly three decades building tech, launching products, and working alongside some of the smartest entrepreneurs out there — I've realized something that's been bugging me for a while:</p>
<p><strong>The tech world has been leaving traditional businesses behind.</strong></p>
<p>And that's a problem.</p>
<p>Because most of the economy aren't startups chasing funding.
They're consultants, contractors, agency owners, service providers, and family-run shops.
People who are brilliant at what they do, but weren't handed a playbook for navigating the modern digital world.</p>
<p>And the truth is: a lot of the technology out there <strong>is</strong> accessible, helpful, and ready to go — if someone shows you how to use it.</p>
<p>That's where this podcast comes in.</p>
<h2>Why I'm doing this now</h2>
<p>Over the past few years running <a href="https://automaze.io">Automaze</a>, I've had a front-row seat helping non-technical founders adopt automation, integrate AI, and use modern tools to streamline operations and grow faster — <strong>without hiring a full dev team</strong>.</p>
<p>And the results are incredible.</p>
<ul>
<li>A solo consultant closing more deals with a follow-up sequence.</li>
<li>A service business automating 20 hours a month of admin work.</li>
<li>A traditional agency scaling without growing headcount.</li>
</ul>
<p>But here's the thing:
<strong>Nobody's telling these stories.</strong></p>
<p>There are a million podcasts out there about SaaS startups, venture capital, and the latest dev frameworks. But almost none about what happens when a "regular business" gets smart about systems. And that gap is exactly what I want to fill.</p>
<p><em>Old School; New Tech</em> isn't just a podcast — it's part of a mission to level the playing field. Because tech doesn't need to be intimidating. It just needs to be explained in plain language, with practical use cases and a sense of what really works (and what doesn't).</p>
<h2>Introducing: <em>Old School; New Tech</em></h2>
<p>It's a podcast where I talk to real-world founders and operators who've modernized their businesses using simple tools — not code. Not VC funding. Just strategy, insight, and execution.</p>
<p>We break down how they did it, what tools they used, and what they learned along the way.</p>
<p>This isn't about billion-dollar exits or SaaS unicorns.
It's about <strong>practical wins, smarter systems, and staying competitive in 2025 and beyond.</strong></p>
<p>Some of these guests are using Airtable to replace spreadsheets. Others are integrating AI tools to generate content or automate repetitive tasks. And many are just figuring out the basics of getting their systems to talk to each other.</p>
<p>No fluff. No buzzwords. Just business owners sharing what's actually worked for them.</p>
<hr />
<h2>The trailer is live</h2>
<iframe src="https://www.buzzsprout.com/2468134/episodes/16934546?client_source=small_player&iframe=true" loading="lazy" width="100%" height="200" frameborder="0" scrolling="no"></iframe>
<p><a href="https://oldschoolnewtech.com">Subscribe on your favorite platform here</a> or by clicking the "share" link on the player above.</p>
<p>The first full episode drops at the <strong>end of this month.</strong></p>
<p>There's some great stuff coming up — real conversations with founders who've cracked the code on getting tech to actually help their business, not slow it down.</p>
<hr />
<h2>Want to be a guest?</h2>
<p>If you're a founder, owner, or operator who's using (or planning to use) technology to:</p>
<ul>
<li>Save time</li>
<li>Improve operations</li>
<li>Grow your business faster</li>
</ul>
<p>… I'd love to hear from you.</p>
<p>You can apply to be a guest right here:
👉 <a href="/podcast-form">Apply to be a guest on the podcast</a></p>
<p>The application only takes a minute, and I'll personally review every submission. If it looks like a match, I'll follow up with a call link to schedule your episode.</p>
<p>Whether you're a one-person show or running a company with a team of 50 — if you've found smart ways to leverage tech, I want to talk to you.</p>
<hr />
<h2>Let's level the playing field</h2>
<p>Tech shouldn't be reserved for the people who already live inside it.
<em>Old School; New Tech</em> is my way of helping more founders take advantage of what's already out there — and showing that you don't need to become a “tech company” to build a smarter business.</p>
<p>I truly believe this show can empower more business owners to make better, faster, more informed decisions about tech — and hopefully avoid some of the mistakes I've seen others make.</p>
<p>Hope you'll subscribe, share it with someone who needs it, and maybe even join me on the show.</p>
<h4>PS. Please share <a href="https://oldschoolnewtech.com">this link</a> with someone who needs it (or who you think needs it).</h4>
<p>Thanks!</p>]]></content:encoded>
      <category><![CDATA[podcast]]></category>
    </item>
    <item>
      <title>Building a lean AI-powered company</title>
      <link>https://aroussi.com/post/building-a-lean-ai-powered-company</link>
      <pubDate>Sun, 06 Apr 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/building-a-lean-ai-powered-company</guid>
      <description><![CDATA[<p>A vision for scaling without scaling headcount</p>]]></description>
      <content:encoded><![CDATA[<p>Over the past few months, I’ve been thinking about what it would take to build a modern company that doesn’t rely on hiring dozens of people to grow. A business where 80–90% of the day-to-day is handled by AI agents, leaving only the high-level planning and complex problem-solving to humans. A business that runs lean, fast, and profitably – with only one or two humans in the loop.</p>
<h2>The premise</h2>
<p>The idea is simple, but powerful:</p>
<blockquote>
<p>Can I create a profitable service business – like a design, development, or marketing agency where the majority of the "staff" are AI agents?</p>
</blockquote>
<p>These agents would handle everything from:</p>
<ul>
<li>Planning and project management</li>
<li>Client communications and account management</li>
<li>Scheduling and updates</li>
<li>Quality assurance and testing</li>
<li>Simple coding and repetitive dev tasks</li>
<li>Reporting, follow-ups, and documentation</li>
</ul>
<p>The goal is to offload most of the heavy lifting so that the human in the loop can focus on architecture, strategic planning, and creative direction.</p>
<h2>MUXI: the AI core</h2>
<p>At the heart of this vision is <a href="https://x.com/aroussi/status/1900602870678122774">MUXI</a>, a modular ecosystem for developing and orchestrating AI agents. It’s being designed as a lightweight alternative to platforms like LangChain or CrewAI, but with a focus on real-world use, automation, and custom workflows—not just demos.</p>
<p>MUXI will manage a network of agents with specialized roles: developer agents, project manager agents, account managers, schedulers, testers, etc. – and coordinate between them to execute tasks end-to-end.</p>
<p>These agents will be able to:</p>
<ul>
<li>Make autonomous decisions based on project context</li>
<li>Communicate with clients via Slack, WhatsApp, or email</li>
<li>Work with project tools like GitHub, Linear, Notion, and more</li>
<li>Use LLMs, MCP, APIs, and scriptable workflows to get things done</li>
</ul>
<p>Think of it as a command center that turns AI into your full-time team.</p>
<h2>Rolling it out in phases</h2>
<p>We’re approaching this in progressive stages to avoid overengineering and to get value quickly:</p>
<h5>Phase 1: Personal assistant</h5>
<p>MUXI will start as my personal executive assistant, helping me plan tasks, manage priorities, and track projects.</p>
<h5>Phase 2: Project manager</h5>
<p>Next, MUXI will handle internal project management, which includes creating tickets, following up, summarizing standups, etc.</p>
<h5>Phase 3: Account manager</h5>
<p>Once it’s reliable internally, MUXI will evolve into a client-facing account manager, providing updates, answering FAQs, and coordinating delivery milestones with minimal input from me.</p>
<h5>Phase 4: Autonomous developer</h5>
<p>In parallel, we’re building a dev agent to tackle repetitive tasks, set up new projects, run tests, and gradually take on more meaningful coding responsibilities with human review.</p>
<h2>Human-in-the-loop</h2>
<p>The idea isn’t to eliminate humans altogether but to give me, as a founder, the ability to operate at a larger scale with minimal headcount. Human interaction can still happen where it adds value – like onboarding, critical decisions, or creative brainstorming – but the day-to-day execution will be offloaded.</p>
<p>This makes the model scalable, affordable, and unique. For example, we could offer “Human CTO + AI team” packages that include weekly planning calls and a team of AI-powered agents who handle implementation, updates, and support.</p>
<h2>Pricing and positioning</h2>
<p>One interesting idea is to have transparent pricing and clarify that most of the work is done by AI. For some clients, that might be a dealbreaker. For those who care about price, speed, and outcomes - it could actually be a huge plus.</p>
<p>There’s even room for tiered pricing:</p>
<ul>
<li>Low-touch, AI-only plans</li>
<li>Hybrid plans with light human oversight</li>
<li>High-touch plans for those who want a dedicated manager</li>
</ul>
<h2>Building the right foundation</h2>
<p>While plenty of automation tools and agent frameworks are out there, most are too general, brittle, or not customizable enough for production use. Furthermore, I only use tools that I know exactly how they work under the hood.</p>
<p>That’s why I’m building this in-house using a mix of:</p>
<ul>
<li>agent orchestrators</li>
<li>custom-built agent infrastructure</li>
<li>API integrations with tools we already use</li>
<li>strong design systems and templates to keep quality consistent</li>
</ul>
<p>This also gives me full control over behavior, reliability, and customization - especially important when you're planning to expose agents to clients.</p>
<h2>Your thoughts?</h2>
<p>This is still very much in the early days, and I’d love feedback.</p>
<ul>
<li>What sounds exciting here?</li>
<li>What sounds naïve or risky?</li>
<li>Any gotchas you think I might be missing?</li>
</ul>
<p>Drop your thoughts in the thread. Always appreciate smart opinions 🙏</p>]]></content:encoded>
      <category><![CDATA[AI]]></category>
    </item>
    <item>
      <title>The Rise of AX (AI experience)</title>
      <link>https://aroussi.com/post/the-rise-of-ax</link>
      <pubDate>Wed, 26 Mar 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/the-rise-of-ax</guid>
      <description><![CDATA[<p>The internet isn't just for people anymore</p>]]></description>
      <content:encoded><![CDATA[<p>Over the last few months, I've gone deep into AI agent development — building, experimenting, and shipping. And here's what I've realized:</p>
<p>We're at the start of a major shift. Not just in how software works, but <em>who</em> it's built for.</p>
<p>I even <a href="https://x.com/aroussi/status/1904849255678042136">tweeted today</a> that we're turning Automaze into an AI-first company. That's how strongly I feel about this.</p>
<p>After building through multiple tech waves, this moment feels familiar. What's happening with AI today? It reminds me of the early internet. Or mobile in the 2010s. And like those waves, the gap between early adopters and everyone else is going to be <em>huge</em>.</p>
<p>This kind of shift shows up once every 10–15 years. You don't want to miss it.</p>
<p>Now here's the key point: this isn't just about slapping GPT into a chatbot. It's about rethinking your entire interface. Not just for humans — but for machines.</p>
<p>AI agents are becoming real users. They visit websites, read UIs, click buttons, and take actions for people. And just like human users, if your product is confusing or clunky, they'll fail.</p>
<p>That's why AX (<strong>AI experience</strong>) matters.</p>
<p>It's the next generation of UX.</p>
<hr />
<h2>3 Types of AI Traffic</h2>
<p>AI agents are starting to interact with software in new ways. Each one brings a different kind of “traffic” to your product. Just like we had to rethink UX for mobile, we now need to rethink it for non-human users.</p>
<p>Here are the three big types to know:</p>
<h3>1. Browser-based Agents</h3>
<p>These agents use your site just like a person would. They open a browser, read HTML, click buttons, and fill out forms.</p>
<p>OpenAI's Operator is a good example. So are Browserbase and Browser.use — which just raised $17M. Tools like these are powering apps like Manus. And usage is growing fast.</p>
<p>The problem? Most websites aren't built for bots.</p>
<p>Some aren't even built for phones.</p>
<p>And AI agents don't guess. They won't assume “Learn More” is your key CTA. They just follow what's in the DOM.</p>
<p>To make your product agent-friendly:</p>
<ul>
<li>Simplify layouts</li>
<li>Remove unnecessary clicks</li>
<li>Surface important info right away</li>
<li>Cut anything that's just visual fluff</li>
</ul>
<p>It's not about adding more UX polish. It's about making your product accessible <em>to machines</em>.</p>
<h3>2. API-based agents via MCP</h3>
<p>The second type of AI traffic comes through APIs — via something called the <a href="https://www.claudemcp.com">Model Context Protocol</a> (MCP).</p>
<p>MCP was suggested by Anthropic as the standard for AI agents to have a structured way to talk to your product instead of trying to scrape screens.</p>
<p>Think of it like the difference between guessing what a webpage says... and getting the clean JSON directly.</p>
<p>Big names like <strong>Stripe</strong> and <strong>Figma</strong> are already moving fast on MCP. As more agents adopt it, it'll become a baseline expectation — especially for API-driven products.</p>
<p>This is less about design, more about backend. But the impact is the same: if your app isn't machine-readable, agents will skip it.</p>
<h3>3. Your own company agent</h3>
<p>The third type of AI traffic is the one you control — your own branded agent.</p>
<p>Instead of waiting for agents to figure out your product, companies are starting to <em>build</em> their own. These agents sit on top of the app, offering users a simple, chat-based way to get things done.</p>
<p>You control the tone, the workflows, the features.</p>
<p>It's smoother for users. And it keeps them inside your ecosystem.</p>
<p><strong>This isn't about replacing MCP — it's a <em>complement</em>.</strong> Different use cases, different channels. You'll want both.</p>
<hr />
<h2>What to do right now?</h2>
<p>If you're building software in 2025, here's the deal:</p>
<p>You're no longer designing just for people. You're designing for machines, too.</p>
<p>Here's what to do:</p>
<h3>1. Clean up your frontend</h3>
<p>AI agents want clean, readable interfaces. This means:</p>
<ul>
<li>Clear HTML</li>
<li>Fewer layers of interaction</li>
<li>No visual clutter</li>
</ul>
<p>Make your UI machine-friendly.</p>
<h3>2. Introduce (or even prioritize) MCP</h3>
<p>If your product already has APIs, turn them into MCP-compatible interfaces. This gives agents a formal, predictable way to access your features — and keeps you ready for what's coming.</p>
<h3>3. Build your own agent</h3>
<p>If you don't have a conversational front-end for your app yet. Now's the time to start. This is your chance to shape the experience before someone else does it for you.</p>
<hr />
<h2>Building for agents = new business opportunities</h2>
<p>This isn't just a tech shift — it's a new market.</p>
<p>If you're a dev, indie hacker, or founder, here are some ways to tap in:</p>
<ul>
<li><strong>Sell AI workflows</strong> - Tools like n8n let you design agent-powered flows. You can sell them as templates, offer them as APIs, or host them as a service.</li>
<li><strong>Create knowledge-based agents</strong> - Instead of selling static courses, create chat-based tools that <em>use</em> your expertise. Whether it's marketing, coding, or legal advice — people want AI that feels personalized.</li>
<li><strong>Build and sell model APIs</strong> - Customize open-source models on platforms like Replit. Package and sell them — whether they write in a certain tone, generate images, or produce clean code.</li>
<li><strong>Vibe code</strong> - Build micro-apps, games, or tools with AI at your side. The speed is wild — and yes, people are monetizing through ads, sharing, and sponsorships.</li>
<li><strong>Offer services</strong> - Not everyone wants to DIY. Companies are actively looking for consultants and agencies who can build AI systems for them.</li>
</ul>
<p>This isn't hype. It's <a href="https://x.com/aroussi/status/1900602870678122774">already happening</a>.</p>
<hr />
<h2>Rethinking access and UX</h2>
<p>Back in the day, we had one rule: people = good, bots = bad.</p>
<p>That's how we built our security, analytics, and access systems.</p>
<p>But now? That line is blurring.</p>
<p>AI agents are technically bots — but they're a <em>good</em> kind of bots. They're trying to use your product, not abuse it.</p>
<p>If you treat them like old-school scrapers, you'll block them... and the users relying on them.</p>
<p>And here's the twist: by optimizing for agents, we might make things better for humans too.</p>
<p>Agents don't need ads, popups, or gimmicks.</p>
<p>They just need clear paths to action. And so do people.</p>
<p>If you give AI a fast, clutter-free version of your product... people are going to wonder why they don't get the same.</p>
<p>Designing for machines might help us rediscover <em>great</em> UX.</p>
<hr />
<h2>So, is this the end of human-only traffic?</h2>
<p>AI agents are already using your product. Not in some future. <em>Right now.</em></p>
<p>This is another structural wave — like mobile, like the internet.</p>
<p>And if you're building software today, you need to support:</p>
<ul>
<li>Simple UIs for browser-based agents</li>
<li>MCP endpoints for protocol-based access</li>
<li>First-party agents to control the experience</li>
</ul>
<p>Some users will be people. Some will be machines.</p>
<p>You need to serve both.</p>
<p>Ignore this shift, and you might fade into the background.</p>
<p>Embrace it, and you'll be way ahead.</p>
<p><em>The internet isn't just for humans anymore.</em></p>
<p>Time to build like it.</p>]]></content:encoded>
      <category><![CDATA[AI]]></category>
    </item>
    <item>
      <title>It's Your Fault</title>
      <link>https://aroussi.com/post/its-your-fault</link>
      <pubDate>Tue, 18 Mar 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/its-your-fault</guid>
      <description><![CDATA[<p>The hardest (and most liberating) truth</p>]]></description>
      <content:encoded><![CDATA[<p>Life has a way of throwing obstacles in our path. Strategies fail. Co-founders let you down. Family demands more. It's easy to point fingers. It's even easier to blame external factors like market conditions, bad luck, unfair treatment.</p>
<p>But here's the truth:</p>
<h3><strong>It's your fault.</strong></h3>
<p>And that's the best news you'll ever hear.</p>
<p>Why? Because if it's your fault, then you have the power to change it. If success, happiness, and progress are in someone else's hands, you're stuck waiting. But if they're in your hands, you can take action today.</p>
<h2>Why taking full responsibility is a superpower</h2>
<p>When you blame others, you give away your power. You become a passive participant in your own life, waiting for external forces to change before you can succeed. But when you accept full responsibility, you reclaim control.</p>
<p>Think about it:</p>
<ul>
<li>If your strategy isn't working, what are <em>you</em> going to do about it?</li>
<li>If your co-founder let you down, how will <em>you</em> pivot and move forward?</li>
<li>If family expectations feel overwhelming, how will <em>you</em> set boundaries and take ownership of your path?</li>
<li>If life keeps throwing challenges at you, how will <em>you</em> adapt, learn, and turn setbacks into stepping stones?</li>
</ul>
<p>By shifting your mindset from blame to responsibility, you stop reacting and start acting. You become the architect of your outcomes rather than a victim of circumstance.</p>
<p><strong>The most successful people in the world are not the ones who never fail.</strong> They are the ones who take responsibility for their failures and keep moving forward. They don't wait for permission to succeed. They take it upon themselves to figure things out, make changes, and push through obstacles.</p>
<h2>The difference between fault and responsibility</h2>
<p>You can't control everything that happens to you. A bad economy, an unexpected betrayal, or a failed partnership may not be your <em>fault</em>. But how you respond to it? That's 100% on you.</p>
<p>Taking responsibility doesn't mean beating yourself up. It means owning the situation, learning from it, and making deliberate choices to improve things. The moment you say, <em>“This is my responsibility,”</em> you activate problem-solving mode. You stop waiting for rescue and start creating solutions.</p>
<p>It also means being honest with yourself. If something keeps going wrong, what are you doing - or not doing - that's contributing to it? Maybe you're avoiding a tough conversation. Maybe you're hesitating on a big decision. Maybe you're letting fear hold you back.</p>
<p>Facing these hard truths is uncomfortable, but it's also the key to unlocking real change.</p>
<h2>The hardest (and most liberating) truth</h2>
<p>Success isn't some magical stroke of luck. It's an equation. The inputs are your choices, your mindset, and your actions. The more responsibility you take, the more control you gain.</p>
<p>When you accept that <em>everything</em> in your life (your wins, your failures, your circumstances) is ultimately up to you, something incredible happens. You stop making excuses. You stop waiting for someone else to fix things. You take action.</p>
<p>And that's where real success begins.</p>
<p>People who take responsibility have an advantage: they don't waste time complaining. Instead of saying, <em>“Why is this happening to me?”</em> they ask, <em>“What can I do about it?”</em> And then they do it.</p>
<p>Every challenge you face is an opportunity to step up, learn, and become stronger. Every mistake is a lesson that can help you make better decisions in the future. Every setback is a chance to prove - to yourself more than anyone else - that you have what it takes to keep going.</p>
<h2>Owning your story</h2>
<p>Taking full responsibility also means owning your story. You are not just a character in someone else's narrative - you are the author of your own.</p>
<p>If you don't like how your story is unfolding, write a new chapter. If you're in a situation that's making you unhappy, change it. If you're feeling stuck, take one step forward-any step. The smallest shift in action can lead to the biggest transformation over time.</p>
<p>People will disappoint you. Plans will fall apart. Unexpected things will happen. But at the end of the day, your life is in your hands. You get to decide what happens next.</p>
<h2>Final thought</h2>
<p>Next time you find yourself complaining about a situation, pause and ask: <em>What can I do to change this?</em> The answer may not be easy, but it will always be empowering.</p>
<p>Own it. Solve it. Move forward.</p>
<p>Because it's your fault. And that's exactly why you have the power to fix it.</p>]]></content:encoded>
      <category><![CDATA[lessons]]></category>
    </item>
    <item>
      <title>Get Rich Slow</title>
      <link>https://aroussi.com/post/get-rich-slow</link>
      <pubDate>Tue, 11 Mar 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/get-rich-slow</guid>
      <description><![CDATA[<p>The financial playbook I wish I had followed sooner</p>]]></description>
      <content:encoded><![CDATA[<p>Everyone wants to get rich fast. And yeah, it <em>can</em> happen. Some people sell a startup at the perfect moment, make a once-in-a-lifetime trade, or even hit the lottery. But let’s be real – most of that comes down to luck.</p>
<p>You know what’s <em>almost guaranteed</em>? Getting rich <em>slow</em>. And here’s the crazy part: that’s exactly how most wealthy people do it. They follow a simple but powerful formula: <strong>earn, invest, and let time do the heavy lifting.</strong></p>
<p>The goal isn’t to <em>look</em> rich. Forget yachts, designer watches, and blowing money to impress people. True wealth is about something much simpler: <strong>not having to worry about money.</strong></p>
<p>And the best part? Anyone can do this – if they’re willing to play the long game. Or as Charlie Munger famously put it: <strong>"The big money is not in the buying and the selling but in the waiting."</strong></p>
<h2>The younger you are - the more it matters</h2>
<p>If you’re in your 20s or early 30s, this is <em>especially</em> relevant for you. Why? Because your biggest advantage isn’t money – it’s <em>time.</em></p>
<p>It’s much easier to save and take smart risks before things like a mortgage, kids, or other major responsibilities start stacking up. But even if you’re in your 40s, 50s, or beyond, the same principles apply. <strong>The earlier you start, the easier it gets.</strong></p>
<p>Compound interest is either your best friend or your worst enemy. The sooner you get it working <em>for</em> you instead of <em>against</em> you, the less effort it takes to build real wealth.</p>
<p>So let’s break down exactly how to <strong>get rich slow.</strong></p>
<h2>1. Get a job. Yes, really.</h2>
<p>There’s a lot of noise online about quitting your 9-to-5 to become an entrepreneur, but here’s the truth: <strong>you need income first.</strong></p>
<p>A job isn’t just a paycheck – it’s a <strong>launchpad</strong>. It teaches you how to manage money, develop skills, and build a network. Even if you dream of working for yourself (which I highly recommend), starting with a stable income makes everything easier.</p>
<p><strong>Key takeaway:</strong>  Your job is your first investor. Treat it as a stepping stone, not a life sentence.</p>
<h2>2. Invest 50% of your income</h2>
<p>If you’re young and don’t have major expenses, saving and investing 50% of your income <em>can</em> set you up for life. But let’s be honest - that’s not always doable.</p>
<p>The key is to be as aggressive as you <em>reasonably</em> can. Take advantage of your flexibility before mortgages, kids, and other obligations kick in. <strong>And no matter what, never let your savings rate drop below 10%.</strong></p>
<h3><strong>Where should you invest?</strong></h3>
<p>Keep it simple. Set up automatic investments into:</p>
<ul>
<li><strong>Index funds</strong> (S&amp;P 500, world funds, etc.)</li>
<li><strong>Entire-sector ETFs</strong> (technology, healthcare, energy, etc.)</li>
<li><strong>Real estate</strong> (directly or via REITs)</li>
</ul>
<p>Don’t try to time the market. <strong>Just be in the market.</strong></p>
<p><strong>Key takeaway:</strong>  Save as much as you <em>realistically</em> can, but don’t stress. Just never go below 10%.</p>
<h2>3. Be frugal – without being cheap</h2>
<p>Frugality doesn’t mean depriving yourself. It just means <strong>spending intentionally.</strong></p>
<p>Many people who <em>look</em> rich are drowning in debt. Meanwhile, genuinely wealthy people focus on:</p>
<ul>
<li>Buying high-quality things that last</li>
<li>Avoiding lifestyle inflation</li>
<li>Prioritizing investments over status symbols</li>
</ul>
<p><strong>Key takeaway:</strong>  Spend on things that genuinely add value to your life. Ignore the rest.</p>
<h2>4. Follow the 3-hobby rule</h2>
<p>You should always have three hobbies:</p>
<ol>
<li><strong>One that keeps you creative</strong> (writing, music, coding, art)</li>
<li><strong>One that keeps you in shape</strong> (gym, running, hiking, sports)</li>
<li><strong>One that makes you money</strong> (side hustle, investing, business)</li>
</ol>
<p>That last one? It might just turn into your full-time income one day.</p>
<p><strong>Key takeaway:</strong>  Hobbies aren’t just for fun – they can be your biggest wealth-building tool.</p>
<h2>5. Life insurance is not just for death</h2>
<p>Most people think of life insurance as something that only matters when you die. But smart people know it can be <strong>way</strong> more than that.</p>
<p>With the right policy, you can:</p>
<ul>
<li>Borrow against it while it keeps growing</li>
<li>Access tax-free money later in life</li>
<li>Use it as a safety net while keeping investments intact</li>
</ul>
<p>It’s not <em>death</em> insurance – it’s <em>life</em> insurance.</p>
<p><strong>Key takeaway:</strong>  Life insurance isn’t just about protection – it’s a financial tool.</p>
<p>Great catch! I’ll add the Buy, Borrow, Die strategy as section #6 in both the blog post and the newsletter. Here’s the updated version:</p>
<h2>6. borrow against your assets, don't sell them</h2>
<p>Keeping on the theme as the life insurance, the truly rich don’t sell their assets - they borrow against them. Here’s why:</p>
<ul>
<li>Loans aren’t taxable</li>
<li>Your assets keep growing</li>
<li>You never trigger capital gains taxes</li>
</ul>
<p>This method, also known as "Buy, Borrow, Die", gives rich people cash to live on while their investments keep growing. Then, when they pass away, their heirs inherit everything with a step-up in cost basis - meaning the original capital gains tax bill disappears.</p>
<p><strong>Key takeaway:</strong> Never sell appreciating assets. Borrow, invest, and repeat.</p>
<h2>7. Get a skill you can always monetize</h2>
<p>This might be <em>the</em> most important advice here.</p>
<p>I don’t consider myself rich, but I <em>never</em> worry about money. Why? Because I’ve followed many of these principles (some of which I wish I had learned earlier), and I have a skill that people <em>pay</em> for.</p>
<p>No matter what happens in the economy, you'll always have options if you have a valuable skill. Learn to code, market, write, sell, or analyze data – something that businesses and people <em>need.</em></p>
<p><strong>Key takeaway:</strong>  Your best investment is in yourself.</p>
<h2>8. Learn the difference between good debt and bad debt</h2>
<p>Not all debt is bad. There’s <strong>good debt</strong> and <strong>bad debt</strong>:</p>
<ul>
<li><strong>Good debt:</strong> Anything that <em>grows</em> in value (real estate, business loans, skills that increase income).</li>
<li><strong>Bad debt:</strong> High-interest consumer debt (credit cards, car loans for luxury vehicles, financing gadgets you don’t need).</li>
</ul>
<p><strong>Key takeaway:</strong>  Debt is a tool. Use it wisely.</p>
<h2>Final thought: Play the long game</h2>
<p>The path to wealth is simple, but it’s <em>not</em> easy. It takes patience, discipline, and a long-term mindset.</p>
<p>The best part? <strong>Anyone</strong> can do this.</p>
<p>Start early, stay consistent, and remember:</p>
<blockquote>
<p>"The big money is not in the buying and the selling but in the waiting."<br>
– Charlie Munger</p>
</blockquote>
<p>So why not start today?</p>]]></content:encoded>
      <category><![CDATA[lessons]]></category>
    </item>
    <item>
      <title>VIBE: Visual Interactive Build Experience</title>
      <link>https://aroussi.com/post/vibe-white-paper</link>
      <pubDate>Sun, 09 Mar 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/vibe-white-paper</guid>
      <description><![CDATA[<p>A white paper on a proposed methodology for software development that prioritizes architectural design and leverages AI-driven automation.</p>]]></description>
      <content:encoded><![CDATA[<p>I was down with the flu over the weekend so while in bed I got pensive about the future of AI and software development and I came up with the following white paper.</p>
<p>It is a proposed methodology for software development that prioritizes architectural design and leverages AI-driven automation.</p>
<p>I've also shared it on my GitHub page for feedback and discussion.
<a href="https://github.com/ranaroussi/vibe-white-paper">https://github.com/ranaroussi/vibe-white-paper</a></p>
<hr />
<h1>VIBE: Visual Interactive Build Experience</h1>
<h2>Introduction</h2>
<p>VIBE (Visual Interactive Build Experience) is a <strong>proposal</strong> aimed at the software development community, suggesting a novel methodology that prioritizes architectural design and leverages AI-driven automation. Traditional coding methods often require deep programming expertise, significant manual effort, and iterative testing, leading to inefficiencies and a high risk of errors.</p>
<p>VIBE endeavors to shift this paradigm by employing advanced AI techniques to transform detailed flowcharts and design assets into fully functional, platform-specific code. The overarching purpose is to enable architects, non-coders, and stakeholders to concentrate on high-level design and logic rather than boilerplate coding tasks.</p>
<h3>Who Is the Target Audience?</h3>
<ul>
<li><strong>Software Architects and Engineers:</strong> Professionals seeking to streamline the progression from conceptual architecture to executable code.</li>
<li><strong>Technical Project Managers:</strong> Individuals requiring a strategic overview of the system without delving into low-level implementation details.</li>
<li><strong>Non-Coders and Stakeholders:</strong> Business analysts or domain experts who aspire to shape software design decisions without extensive programming knowledge.</li>
<li><strong>Educators and Researchers:</strong> Institutions or individuals exploring innovative strategies to teach or investigate software engineering.</li>
<li><strong>Open-Source Community:</strong> Developers eager to experiment with a local, AI-assisted methodology to foster collaborative improvements.</li>
</ul>
<p>This white paper outlines the core ideas behind VIBE, including AI-assisted brainstorming, flowchart creation, backend service compilation, and frontend integration. It also details the role of open-source, locally deployable language models, underscores a fully output-agnostic compilation process, and provides structural guidelines for the flowchart format.</p>
<hr />
<h2>Problem Statement</h2>
<p>Software development frequently necessitates translating conceptual designs and business logic into source code through a labor-intensive, error-prone method. This workflow often limits the contributions of individuals outside traditional developer roles, such as business analysts or UX designers.</p>
<p>VIBE aspires to mitigate these issues by advocating a more architectural, visual approach, where code generation is driven by robust flowchart documentation. Furthermore, existing AI-based solutions commonly depend on proprietary, cloud-hosted language models, which may entail limitations around privacy, financial costs, and control over the operating environment. VIBE suggests adopting locally deployable open-source models, thereby maintaining data sovereignty and supporting development settings that demand stringent security or offline capabilities.</p>
<hr />
<h2>Methodology</h2>
<p>This proposal lays out a step-by-step strategy for harnessing AI-powered, flowchart-driven software creation. Below is an overarching summary of the methodology before diving into the intricacies:</p>
<ol>
<li><strong>AI-Assisted Brainstorming</strong> – Collaborate with an AI to specify the application’s features, user interactions, and logic.</li>
<li><strong>Flowchart-Driven Architecture</strong> – Produce a machine-readable flowchart that operates as the foundational project blueprint.</li>
<li><strong>Backend Compilation</strong> – Convert the flowchart into backend services, compiling them into WebAssembly or native libraries.</li>
<li><strong>Frontend Integration</strong> – Construct a baseline user interface (when necessary) with essential functionality, deferring all styling or UI enhancements to developers.</li>
<li><strong>Local Development &amp; Open-Source LLMs</strong> – Emphasize the use of fine-tuned, open-source AI models running on local infrastructure.</li>
<li><strong>Output-Agnostic Compilation</strong> – Retain full freedom to target any platform or framework without vendor constraints.</li>
</ol>
<h3>1. AI-Assisted Brainstorming</h3>
<p>VIBE’s approach begins with a collaborative brainstorming phase, where an AI tool assists architects in cataloging the system’s features, pathways, and business logic. The AI functions as a knowledgeable guide, prompting deeper consideration of overlooked complexities and proposing best-practice alternatives for issues like user authentication, inventory handling, or payment processing.</p>
<h4>Example Scenario: E-Commerce Application</h4>
<ul>
<li><strong>Architect Input:</strong> "I need an online store with product listings, a shopping cart, and a checkout process."</li>
<li><strong>AI Prompts:</strong><ul>
<li>"How will you handle out-of-stock items?"</li>
<li>"What is your approach for user authentication during checkout?"</li>
<li>"Would you like to integrate automated order confirmation emails?"</li>
<li>"Which payment gateways are required?"</li>
</ul>
</li>
</ul>
<pre><code class="language-mermaid mermaid">---
config:
  theme: base
  themeVariables:
    fontFamily: 'PT Serif'
    fontSize: 13px
    lineColor: '#BB2528'
  flowchart:
    layout: fixed
---
flowchart TD
    Start --&gt; DefineFeatures
    DefineFeatures --&gt; AIQuestions
    AIQuestions --&gt; RefineRequirements
    RefineRequirements --&gt; GenerateInitialFlowchart
    GenerateInitialFlowchart --&gt; ReviewWithArchitect
    ReviewWithArchitect --&gt; FinalizeBlueprint</code></pre>
<hr />
<h3>2. Flowchart-Driven Architecture</h3>
<p>Once the brainstorming is complete, VIBE employs the AI to generate an exhaustive flowchart that captures the entire scope of the application. Unlike typical diagramming approaches, these flowcharts are machine-readable (e.g., JSON or XML) and intricately connected to code generation.</p>
<ul>
<li><strong>Logical Nodes:</strong> Represent data flows and decision structures.</li>
<li><strong>UI Nodes:</strong> Provide placeholders for user-interface components, allowing design flexibility.</li>
<li><strong>Integration Nodes:</strong> Manage communication with external APIs, databases, or libraries.</li>
<li><strong>Conditional Nodes:</strong> Capture complex branching logic, states, and concurrency controls.</li>
</ul>
<h4>Widely Used Flowchart Schema</h4>
<p>To guarantee compatibility with existing tools, VIBE encourages adopting recognized frameworks like BPMN (Business Process Model and Notation) or UML Activity Diagrams. Such schemas enjoy wide support across numerous visual editors and offer:</p>
<ul>
<li><strong>Consistency:</strong> Standardized symbols to represent processes and data flows.</li>
<li><strong>Accessibility:</strong> An extensive ecosystem of editors and plugins for collaborative development.</li>
<li><strong>Scalability:</strong> The capacity to scale from simple sequences to elaborate, enterprise-level workflows.</li>
</ul>
<pre><code class="language-mermaid mermaid">---
config:
  theme: base
  themeVariables:
    fontFamily: 'PT Serif'
    fontSize: 13px
    lineColor: '#BB2528'
  flowchart:
    layout: fixed
---
flowchart TD
    Start --&gt; FetchData[Fetch Data from API]
    FetchData --&gt; DisplayUI[Display User Interface]
    DisplayUI --&gt; UserAction[User Action Detected]
    UserAction --&gt; APIRequest[Send API Request]
    APIRequest --&gt; UpdateUI[Update UI with Data]
    UpdateUI --&gt; End[Process Complete]</code></pre>
<hr />
<h3>3. Backend Compilation</h3>
<p>The AI compiler’s next step is to interpret the flowchart data and compile backend services. These services can be delivered as WebAssembly modules for browser contexts or packaged as native libraries for mobile and desktop environments.</p>
<p>Specific attributes of this phase include:</p>
<ul>
<li><strong>API Endpoint Generation:</strong> The compiler automatically constructs endpoints derived from logical nodes in the flowchart.</li>
<li><strong>Event-Driven Logic:</strong> System behaviors are triggered by <code>vibe-action</code> directives that drive server-side operations.</li>
<li><strong>Data Management:</strong> VIBE’s backend approach centralizes caching, transaction handling, and synchronization.</li>
<li><strong>Service Variety:</strong> RESTful APIs, GraphQL, microservices, or serverless architectures are all viable outputs.</li>
<li><strong>SDK Integration:</strong> Flowchart nodes can outline how third-party tools (e.g., analytics, payment gateways) integrate.</li>
</ul>
<pre><code class="language-mermaid mermaid">---
config:
  theme: base
  themeVariables:
    fontFamily: 'PT Serif'
    fontSize: 13px
    lineColor: '#BB2528'
  flowchart:
    layout: fixed
---
flowchart LR
    Frontend --&gt; |vibe-action| Backend
    Backend --&gt; |API Response| Frontend
    Frontend --&gt; |Data Binding| UIUpdate
    UIUpdate --&gt; UserInteraction
    UserInteraction --&gt; |vibe-action| Backend</code></pre>
<hr />
<h3>4. Frontend Integration (For Applications with a UI)</h3>
<p>Some applications do not require a graphical user interface—perhaps they are command-line tools or automated backend workflows. However, for those that do, VIBE assembles a rudimentary UI containing minimal elements and functional placeholders.</p>
<p>This bare-bones structure ensures the frontend can still operate end-to-end without imposing stylistic or design constraints. Developers are free to refine or replace these elements with any framework or design library.</p>
<h4>Bare-Bones Output and Non-Destructive Updates</h4>
<p>To empower developers, the compiler generates a baseline UI with event handlers and placeholders that reflect the flowchart’s logic. No styling, advanced interaction patterns, or visual flourishes are included. In iterative builds, VIBE updates only these AI-generated segments, leaving any developer-added code or stylistic changes intact.</p>
<pre><code class="language-html html">&lt;ul vibe-for="task in tasks"&gt;
    &lt;li vibe-bind:key="task.id"&gt;
        &lt;span&gt;{{task.name}}&lt;/span&gt;
        &lt;button vibe-action="removeTask" vibe-bind:value="task.id"&gt;Remove&lt;/button&gt;
    &lt;/li&gt;
&lt;/ul&gt;</code></pre>
<hr />
<h3>5. Local Development &amp; Open-Source LLMs</h3>
<p>VIBE <strong>should</strong> prioritize local development by utilizing fine-tuned open-source Large Language Models (LLMs)—for example, Mistral or LLaMA—running on a user’s machine or within a confidential network. By advocating this setup:</p>
<ul>
<li><strong>Data Privacy:</strong> Proprietary code, sensitive logic, and intellectual property remain entirely in-house.</li>
<li><strong>Cost Control:</strong> Teams avoid perpetual licensing or usage fees linked to cloud-based AI platforms.</li>
<li><strong>Customization Potential:</strong> Developers can adapt the LLM to project-specific domain knowledge or coding guidelines.</li>
<li><strong>Offline Capability:</strong> This approach suits locked-down or bandwidth-constrained environments where cloud access is restricted.</li>
</ul>
<p>By suggesting the use of local, open-source AI, VIBE aims to address the diverse needs of industries where security, budget, or legal compliance demands an offline or fully private setup.</p>
<hr />
<h3>6. Output-Agnostic Compilation</h3>
<p>A major pillar of VIBE is <strong>output agnosticism</strong>. The compiler is designed to target multiple runtime environments, ensuring developers can choose the best fit for each project. These options include:</p>
<ul>
<li><strong>WebAssembly Modules:</strong> Deployed in modern browsers for near-native performance.</li>
<li><strong>Native Libraries:</strong> Integrated into mobile apps (iOS, Android) or traditional desktop systems.</li>
<li><strong>Intermediate Code:</strong> Allowing developers to add manual optimizations or incorporate specialized SDKs.</li>
</ul>
<p>This flexibility means teams can select any technology stack—be it React Native, Swift, Kotlin, .NET, or frameworks like Next.js or Astro—without refactoring the fundamental architecture.</p>
<hr />
<h2>Key Benefits</h2>
<ol>
<li><strong>Democratizing Software Development:</strong> By shifting emphasis to architectural design, VIBE creates opportunities for non-developers to engage meaningfully.</li>
<li><strong>Cross-Platform Flexibility:</strong> Generated services are readily adaptable to web, mobile, or desktop platforms, giving developers broad freedom in picking frontend frameworks.</li>
<li><strong>Enhanced Efficiency:</strong> Visual flowcharts and AI-driven code generation reduce overall development time and lessen the chance of manual errors.</li>
<li><strong>Optimized Performance:</strong> Build-time strategies like code splitting, lazy loading, and minification can be automatically applied.</li>
<li><strong>Scalability and Maintainability:</strong> Flowchart-driven logic offers a clear blueprint that remains comprehensible and modifiable as projects expand.</li>
<li><strong>Local Development Focus:</strong> Emphasizing offline-capable, open-source AI models helps maintain security and lowers operational expenses.</li>
</ol>
<hr />
<h2>Use Cases</h2>
<ul>
<li><strong>Enterprise Software:</strong> Larger companies with stringent data handling policies can adopt local LLMs for robust, scalable applications.</li>
<li><strong>Startup and MVP Development:</strong> Rapid prototyping and reduced coding overhead support accelerated go-to-market strategies.</li>
<li><strong>Educational Tools:</strong> Classroom or research environments benefit from a visual-first, architectural approach.</li>
<li><strong>Automation and Integration:</strong> Workflows and pipelines that require hooking into numerous external services can be orchestrated via explicit integration nodes.</li>
<li><strong>Privacy-Sensitive Industries:</strong> Hospitals, banks, and government agencies can operate fully offline with no external data exposure.</li>
</ul>
<hr />
<h2>Challenges and Solutions</h2>
<ul>
<li><strong>Third-Party Integrations:</strong> Intermediate compilation layers accommodate custom code inserts or SDK usage without structural disturbance.</li>
<li><strong>UI Customizations:</strong> The compiler deliberately restricts re-generation to the AI-authored code, preserving user-defined components.</li>
<li><strong>Preventing UI Reset:</strong> A built-in diffing mechanism ensures new builds do not overwrite existing developer enhancements.</li>
<li><strong>Model Fine-Tuning Overhead:</strong> Training large language models locally can be hardware-intensive. VIBE suggests solutions like quantization or partial model loading to mitigate high resource demands.</li>
</ul>
<hr />
<h2>Summary</h2>
<p>VIBE represents a forward-looking <strong>proposal</strong> that envisions an AI-driven, flowchart-oriented approach to software development. By focusing on open-source, locally hosted LLMs, it addresses concerns regarding data privacy, cost management, and regulatory compliance.</p>
<p>Its commitment to output-agnostic compilation ensures developers retain complete freedom over their technology stacks. Through bare-bones frontend generation, VIBE encourages seamless integration of custom designs while minimizing the risk of code conflicts.</p>
<p>Ultimately, the objective is to democratize the development lifecycle by converting architectural insight—expressed via widely recognized flowchart standards—into functional, maintainable applications. If embraced by the broader software community, VIBE could catalyze a shift in how development processes are orchestrated, granting architects and stakeholders a clearer path from conceptual flowcharts to operational systems.</p>
<p>By uniting local AI models, standard flowchart schemas, and non-destructive compilation practices, this proposal aspires to reduce complexity while opening new avenues for collaboration and innovation.</p>]]></content:encoded>
      <category><![CDATA[ideas]]></category>
    </item>
    <item>
      <title>5 Niche business ideas you can start with zero money</title>
      <link>https://aroussi.com/post/5-niche-business-ideas-you-can-start-with-zero-money</link>
      <pubDate>Tue, 04 Mar 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/5-niche-business-ideas-you-can-start-with-zero-money</guid>
      <description><![CDATA[<p>I'll even be your first customer.</p>]]></description>
      <content:encoded><![CDATA[<h1>5 Niche business ideas you can start with zero money (I'll be your first customer)</h1>
<p>Starting a business doesn't have to mean taking out a loan, hiring a team, or spending months building a product. Sometimes, the best businesses start with a problem, an idea, and zero budget. If you're a tech-savvy person looking to build something on your own, here are five business ideas you can start today with minimal investment—and they're ideas I'd personally love to see come to life.</p>
<p>These aren't just pie-in-the-sky concepts. They're practical, actionable, and designed to be launched quickly. Whether you want to start a side hustle, build a sustainable solo business, or just get your feet wet with entrepreneurship, each of these ideas offers a low-risk, high-potential path forward.</p>
<h3>1. Curated newsletter with a specific focus</h3>
<p>Imagine a newsletter around a niche topic—coding tips, productivity hacks, or a weekly roundup of indie maker projects. Personally, I'd sign up for a newsletter like this in a heartbeat. The best part? You can automate the entire process using tools that pull in content, format it, and distribute it through platforms like Substack or Mailchimp.</p>
<p><strong>Real-world example:</strong> Check out <a href="https://premarketbell.com">PremarketBell.com</a>, which curates pre-market stock news completely on autopilot. The setup is straightforward—define your content sources, set up automation to collect and curate, and let the system run while you focus on growth.</p>
<p><strong>Monetization ideas:</strong> You can start with sponsorships, paid subscriptions, or affiliate marketing. As your audience grows, you could explore premium content or partnerships. A newsletter like this could build a tight-knit community of engaged readers—and if that's not a dream scenario, I don't know what is.</p>
<h3>2. Bedtime story podcast for kids</h3>
<p>I love this idea. Imagine a podcast that shares bedtime stories for children, all generated automatically. Your role would be to provide simple story outlines—something like “A bunny who learns to share” or “An adventure in a magical forest.” Then, let AI tools like ElevenLabs take over, generating the story and producing audio with different voices.</p>
<p><strong>Why it works:</strong> You get to create something magical for kids and parents while leveraging automation to handle the heavy lifting. I'd probably listen to these stories myself—there's just something so soothing about a good bedtime story, right?</p>
<p><strong>Monetization Ideas:</strong> You could offer a premium version with extra stories or themed story packs as a paid option. There's also the potential to build an audience for a related product or service.</p>
<h3>3. Selling "boring" templates for important tasks</h3>
<p>I'm a huge fan of templates. They save time, bring order to chaos, and make life just a bit easier. Whether it's budgeting, project management, or meal planning, templates can be lifesavers. Focus on those “boring” tasks that people struggle with—like creating a family budget or organizing freelance projects. You could create these templates in Excel or Google Sheets and sell them on Gumroad, Etsy, or even your own website.</p>
<p><strong>Why it works:</strong> Digital products like templates require upfront effort but can generate passive income over time. And honestly, who doesn't love a good template? I'd buy one of these in a second.</p>
<p><strong>Pro tip:</strong> Hang out in online communities to see where people are struggling, then create templates that solve real problems. Offer a free version of a simpler template to build an audience and then introduce paid offerings when the time is right.</p>
<h3>4. A simple media kit web app</h3>
<p>Here's an idea I'd love to see in the wild—a lightweight web app that helps startups create professional media kits with custom domains and branding. Many small businesses struggle to present their brand to potential partners, and a media kit app could fill that gap beautifully.</p>
<p><strong>How to start:</strong> You could use no-code tools or a simple tech stack to build an MVP over a weekend. No need for anything overly complex—just a clean design, an easy-to-use interface, and a few customizable options to get started.</p>
<p><strong>Monetization strategy:</strong> I could see this working well with a freemium model—offering a free tier and charging for premium features like custom domains or advanced analytics. It's the kind of tool I'd genuinely consider paying for if it made my life easier.</p>
<h3>5. "Read It Later" with a twist</h3>
<p>I'm all about efficiency, and a browser extension that lets users save articles to read later would be amazing. The twist? Use AI to summarize the content and automatically generate a personalized “weekend reading” newsletter. I'd use this in a heartbeat, especially on those weeks when my reading list feels endless.</p>
<p><strong>Revenue opportunities:</strong> You could monetize through a freemium model, ads, or affiliate links. The automation potential here is fantastic—it frees you up to focus on refining and promoting the product while the extension does the work.</p>
<h3>Final thoughts</h3>
<p>These are not just ideas—they're starting points for real businesses you can build quickly, with minimal investment, and as a one-person operation. Whether you're automating a newsletter, launching a podcast, or building a simple web app, the barriers to entry have never been lower.</p>
<p>If I had the time, I'd be tempted to start one of these myself. And if you do, please let me know — I'd love to be your first customer!</p>]]></content:encoded>
      <category><![CDATA[business]]></category>
    </item>
    <item>
      <title>What would you do with 10x more agency?</title>
      <link>https://aroussi.com/post/what-would-you-do-if-you-had-10x-more-agency</link>
      <pubDate>Tue, 25 Feb 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/what-would-you-do-if-you-had-10x-more-agency</guid>
      <description><![CDATA[<p>With great power come great opportunities</p>]]></description>
      <content:encoded><![CDATA[<p>I recently came across a tweet that asked one simple question I couldn't stop thinking about...</p>
<p><strong>What would you do if you had 10x more agency?</strong></p>
<h3>What is “Agency”?</h3>
<p>Agency is the capacity to act.</p>
<p>Readiness meets ability.</p>
<p>It’s the power to control your destiny and influence the world around you.</p>
<p>Not just being a player in the game but setting the rules.</p>
<p>Not just reacting to events but creating reality.</p>
<p>If you had 10x more agency, what would your life look like?</p>
<p>How would you approach decisions differently? What goals would suddenly feel achievable? What obstacles that once seemed insurmountable would now feel like mere stepping stones?</p>
<h3>The Time is Now</h3>
<p>We live in a world where it often feels like we have no control over our lives. We wake up, follow routines, respond to external pressures, and adapt to the circumstances around us.</p>
<p>But what if we could flip the script?</p>
<p>Two days after seeing this tweet, I found out that Reid Hoffman (LinkedIn’s founder) just released a new book called <em>Super Agency</em>, all about this exact idea.</p>
<p>Looks like <strong>“agency” is about to be the word of 2025.</strong></p>
<h3>The Age of AI</h3>
<p>We’re living in a time where AI is giving each of us <strong>10x more power to shape the world</strong> around us.</p>
<p>From automating tasks that once took hours to generating insights at a scale no human could process alone, AI is fundamentally shifting our relationship with productivity, creativity, and decision-making. The rise of AI-driven tools has already changed how we work, think, and even create.</p>
<p>And in a few years, AGI—super-intelligent AI agents—will be here, working for us. These agents will be able to handle complex problem-solving, make autonomous decisions, and even execute strategies in ways that were once the exclusive domain of highly trained professionals.</p>
<p>If you’ve been playing the game of life with regular tools, it’s like suddenly getting <strong>three queens on a chessboard</strong>. The game has changed—have you adjusted your strategy?</p>
<p>But Here’s the Kicker…</p>
<p>10x more agency isn’t just some theoretical question.</p>
<p>We <strong>already have</strong> more agency.</p>
<p>The technology exists. The knowledge is out there. The resources are available. The only thing left is deciding what to do with it.</p>
<h3>With Great Power Comes Time Pressure</h3>
<p>When superheroes discover they have superpowers, they don’t usually keep spending their lives sitting in traffic and going to work every day, do they?</p>
<p>Yet, so many of us still operate as if nothing has changed. We hesitate. We second-guess ourselves. We wait for permission that no one is going to give us.</p>
<p>So the question I ask myself now is: <strong>What am I going to use it for?</strong></p>
<p>What am I willing to bet on? What risks am I willing to take? What bold moves am I finally ready to make?</p>
<p>Suddenly, this tiny question turns into a <strong>question about purpose</strong>.</p>
<h3>The Window is Closing</h3>
<p>Here’s the thing: <strong>time is not on your side</strong>.</p>
<p>The ones who figure this out early will win <strong>big</strong>.</p>
<p>The advantage won’t last forever. Right now, we’re at an inflection point. A moment when those who recognize the opportunity can leap ahead, while others remain stuck in the status quo.</p>
<p>But in three years? <strong>Everyone</strong> will have these abilities. And if everyone is 10x more powerful, then <strong>no one</strong> really is.</p>
<p>This is the nature of progress. It moves in waves, and those who ride the early waves gain the most momentum. But once the wave reaches the shore, it’s just another part of the landscape.</p>
<p>I don’t remember the last time I felt like this. Maybe back when the internet was just starting. Back when having a website was a competitive advantage, before it became an expectation. Back when social media was an opportunity, before it became a requirement.</p>
<p>We are at a <strong>historic turning point</strong> for humanity.</p>
<p>This kind of stuff excites me. This is where my curiosity and creativity go into overdrive.</p>
<h3>But Why Should I Be the Only One Dealing with This Mental Hurricane?</h3>
<p>So now I’m passing it to you…</p>
<p><strong>What would you do if you had 10x more agency?</strong></p>
<p>Would you start the business you’ve been dreaming about? Finally write the book that’s been sitting in your mind for years? Change careers? Move cities? Solve a problem no one else is tackling?</p>
<p>Or would you let the moment pass and realize, too late, that you had more power than you ever imagined—if only you had chosen to use it?</p>
<p>The choice is yours. The clock is ticking.</p>
<p>I've made mine.</p>]]></content:encoded>
      <category><![CDATA[agency]]></category>
    </item>
    <item>
      <title>The world's laziest trading strategy: Six years later</title>
      <link>https://aroussi.com/post/the-worlds-laziest-trading-strategy-six-years-later</link>
      <pubDate>Tue, 18 Feb 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/the-worlds-laziest-trading-strategy-six-years-later</guid>
      <description><![CDATA[<p>Do simplicity still wins? Plus, how a small change made a big impact</p>]]></description>
      <content:encoded><![CDATA[<p>Back in 2019, I introduced what I called <em><a href="/post/worlds-best-strategy">“The World’s Best (and Laziest) Trading Strategy”</a></em>. It was simple: four trades a year. The idea? Use seasonal trends to make gains with minimal effort.</p>
<p>The plan was easy to follow: buy and hold at specific times, then sit back and let the seasons do the work.</p>
<h3>The original strategy: Simple and straightforward</h3>
<p>Here are the rules for the original strategy:</p>
<ol>
<li>Hold <strong>GLD</strong> (SPDR Gold Trust ETF) from December 20 of every year through February 20 of the following year, and during August.</li>
<li>The rest of the time hold <strong>SPLV</strong> (Invesco S&amp;P 500 Low Volatility ETF)</li>
</ol>
<p>Before checking the latest results, let’s review how the strategy performed historically.</p>
<p><img src="/assets/img/lazy1.svg" alt="" /></p>
<p>As you can see, over the years, it showed promising results by balancing gold’s seasonal strength with the market’s general upward trend.</p>
<h3>Do simplicity still wins?</h3>
<p>I wanted to see if these patterns would hold up over time, so I ran the numbers.</p>
<p>Here’s what I found:</p>
<h5><strong>Starategy Performace: 2011 to 2024</strong></h5>
<ul>
<li><strong>Total Return:</strong> 381.6% (<em>SPY: 459.64%</em>)</li>
<li><strong>Average Annual Return:</strong> 8.27% (<em>SPY: 9.1%</em>)</li>
<li><strong>Sharpe Ratio:</strong> 0.85 (<em>SPY: 0.82</em>)</li>
<li><strong>Max Drawdown:</strong> -35.88% (<em>SPY: -33.72%</em>)</li>
</ul>
<blockquote>
<p>The Sharpe ratio measures risk-adjusted returns—higher is better.<br>Max drawdown shows the largest drop from peak to bottom—a key risk measure.</p>
</blockquote>
<p><img src="/assets/img/lazy24-1.webp" alt="" /></p>
<p>The numbers tell a story. The strategy worked but lagged behind SPY. What caused this underperformance?</p>
<h5><strong>Possible Reasons for Underperformance</strong></h5>
<p>Several factors may have hurt the strategy after 2020:</p>
<ul>
<li><strong>The COVID-19 Crash:</strong> Market chaos disrupted typical patterns.</li>
<li><strong>Post-Pandemic Bull Run:</strong> The rapid rise in stocks broke the seasonal trends.</li>
<li><strong>Shifting Market Behavior:</strong> Patterns that worked for years started to weaken.</li>
</ul>
<p>Even though the strategy recovered, it couldn’t match SPY’s fast growth. So, how could we adjust it for changing markets?</p>
<h3><strong>Tweaking the Strategy: Adding a VIX-Based Rule</strong></h3>
<p>Rather than abandon the strategy, I refined it. I added a simple rule using the <strong>VIX</strong> (volatility index)—a measure of market fear.</p>
<p><strong>How it works:</strong></p>
<ul>
<li><strong>Keep GOLD</strong> during the usual seasonal periods.</li>
<li><strong>Switch between SPLV and SPY</strong> based on the VIX average from the past month:<ul>
<li><strong>VIX above 21</strong> (suggests high volatility): Hold SPLV.</li>
<li><strong>VIX below 21</strong> (suggests low volatility): Hold SPY.</li>
</ul>
</li>
</ul>
<p><strong>[Suggested Image: Decision tree showing the VIX rule.]</strong></p>
<p>This rule helps the strategy adapt to the market’s mood. But did this adjustment improve performance?</p>
<h3><strong>How Did the VIX-Adjusted Strategy Perform? (2011–2024)</strong></h3>
<p>The results?</p>
<ul>
<li><strong>Total Return:</strong> 496.87% (<em>SPY: 461.81%</em>)</li>
<li><strong>Average Annual Return:</strong> 9.45% (<em>SPY: 9.11%</em>)</li>
<li><strong>Sharpe Ratio:</strong> 0.87 (<em>SPY: 0.83</em>)</li>
<li><strong>Max Drawdown:</strong> -34.16% (<em>SPY: -33.72%</em>)</li>
<li><strong>Longest Drawdown:</strong> 618 days (<em>Original: 842 days</em>)</li>
</ul>
<p><img src="/assets/img/lazy24-2.webp" alt="" /></p>
<p>This version showed stronger returns and shorter slumps. What lessons can we draw from this experiment?</p>
<h3><strong>What Can We Learn?</strong></h3>
<ul>
<li><strong>Markets change.</strong> No strategy lasts forever.</li>
<li><strong>Small adjustments matter.</strong> One extra rule improved results.</li>
<li><strong>Risk management counts.</strong> Reducing drawdowns can help you stay in the market longer.</li>
</ul>
<p><strong> Notable Metrics:</strong></p>
<pre><code class="language-text text">Metric               Strategy    S&amp;P 500
-------------------  --------   --------
Cumulative Return   461.81%      496.87%
Yearly (ann.)          9.11%       9.45%
Sharpe                  0.83        0.87
Max Drawdown         -33.72%     -34.16%
Longest DD Days          708         618</code></pre>
<h3><strong>Final Thoughts</strong></h3>
<p>This isn’t a trading recommendation. Instead, it’s an example of how to build and test strategies using data. Tools like Python let you explore ideas, test them, and improve them.</p>
<p>The lesson is clear: Simple ideas can work—if you test, tweak, and adapt them.</p>
<p>Want the Python code? Here you go:</p>
<pre><code class="language-python python">"""
Implements a seasonal trading strategy combining GLD, SPLV and SPY based on VIX levels.

The strategy:
1. Holds GLD during seasonal periods (Dec 20-Feb 20 and August)
2. Otherwise switches between SPLV and SPY based on VIX levels
"""

import pandas as pd
import numpy as np
import yfinance as yf
import quantstats as qs

# Define ETFs to trade
tickers = ["GLD", "SPLV", "SPY"]

# Download historical data and calculate returns
assets = yf.download(tickers)["Adj Close"].pct_change().dropna()
assets.columns = tickers

# Calculate VIX indicator
vix = yf.download("^VIX")["Adj Close"]
vix = vix.resample('ME').mean()  # Get monthly average VIX
vix.index = vix.index + pd.DateOffset(days=1)  # Align index with trading days
vix = vix.resample('D').ffill()  # Fill missing days with last value
vix = vix.reindex(assets.index)["^VIX"]  # Match VIX index to asset data

# Initialize strategy column
assets["Strategy"] = np.where(vix &gt; 21, "SPLV", "SPY")  # Base allocation on VIX
assets["Strategy"] = np.where(vix &gt; 21, "SPLV", "SPY")  # Repeated for validation

# Implement final strategy rules:
# 1. Hold GLD during seasonal periods (Dec 20-Feb 20 and August)
# 2. Otherwise hold SPY when VIX &lt; 13, SPLV when VIX &gt; 13
assets["Strategy"] = assets["GLD"].where(
    ((assets.index.month == 12) &amp; (assets.index.day &gt;= 20)) |  # December 20 onwards
    ((assets.index.month == 2) &amp; (assets.index.day &lt;= 20))  |  # Until February 20
    (assets.index.month == 8),  # All of August
    np.where(vix &gt; 13, assets["SPY"], assets["SPLV"])  # Non-seasonal allocation
)

# Calculate strategy metrics through 2024
qs.reports.metrics(assets["Strategy"], "SPY")</code></pre>]]></content:encoded>
      <category><![CDATA[trading]]></category>
    </item>
    <item>
      <title>How I get things done: My productivity framework</title>
      <link>https://aroussi.com/post/my-productivity-framework</link>
      <pubDate>Tue, 11 Feb 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/my-productivity-framework</guid>
      <description><![CDATA[<p>Master your tasks and focus with my flexible, streamlined approach to productivity.</p>]]></description>
      <content:encoded><![CDATA[<div class="attribution">Photo by <a href="https://unsplash.com/@carlheyerdahl?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Carl Heyerdahl</a> on <a href="https://unsplash.com/photos/silver-imac-with-keyboard-and-trackpad-inside-room-KE0nC8-58MQ?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Unsplash</a></div>
<p>Between running <a href="https://automaze.io">Automaze</a> (a full-scale CTO-as-a-service and development agency) and managing day-to-day tasks, it can often feel like I have too many things on my plate.</p>
<p>If you're anything like me, you, too, juggle countless responsibilities every day. With so much happening, it's easy for tasks to slip through the cracks. A reliable system is crutial to ensure nothing gets lost or forgotten.</p>
<p>Over the years, I've tried various productivity methods, but most felt too rigid or complicated. They didn't adapt well to my workflow, so I struggled to stick with them.</p>
<p>After much trial and error, I found a system that works for me. It's heavily inspired by David Allen's <em>Getting Things Done (GTD)</em> method, but it's simplified and much less rigid.</p>
<p>I use this framework to stay on top of work, ideas, and commitments without feeling overwhelmed.</p>
<center><img src="/assets/img/aroussi-productivity-framework.webp" alt="my productivity framework" style="max-width:420px"><br><br><a href="/assets/files/ran-aroussi-productivity-framework.pdf">Download a PDF version</a></center>
<hr />
<h2>What Is GTD?</h2>
<p>David Allen's <em>Getting Things Done (GTD)</em> method is a productivity system designed to free up mental space by capturing tasks in a trusted place. The goal is simple: store tasks and ideas so your brain doesn't have to, then process them systematically.</p>
<p>While I appreciated the GTD method, I needed something more flexible. So, I created my own version—one that adapts to my workflow while keeping me organized and focused.</p>
<hr />
<h3>Step 1: Capture everything</h3>
<p>Throughout the day, I collect tasks, ideas, and reminders however I can. At this stage, I don't worry about organizing them — I just focus on getting them out of my head and into a system.</p>
<p>I use multiple tools to do this:</p>
<ul>
<li><strong>Apple Reminders</strong> for quick to-dos (especially with “Siri, remind me to…”)</li>
<li><strong>Emails to myself</strong> for longer thoughts</li>
<li><strong>WhatsApp messages to myself</strong> for ideas on the go</li>
<li><strong>A physical notebook</strong> for brainstorming sessions</li>
<li><strong>Voice memos</strong> for when I'm driving or away from a screen</li>
</ul>
<p>If something crosses my mind, I capture it. No exceptions. This habit ensures that nothing important slips through the cracks.</p>
<hr />
<h3>Step 2: Clarify and organize</h3>
<p>Once a day, I review everything I've collected. This step is about making sense of my notes. Often, they are incomplete or messy. Some items are duplicates. Others lack detail.</p>
<p>Here's what I do:</p>
<ul>
<li><strong>Clean up messy notes</strong> by rewriting them clearly.</li>
<li><strong>Remove duplicates</strong> and combine similar tasks.</li>
<li><strong>Add missing details</strong> so future me knows exactly what to do.</li>
<li><strong>Move tasks into my task manager (I use <a href="https://usemotion.com">Motion</a>)</strong> for better tracking.</li>
<li><strong>Categorize tasks</strong> so I can group related ones together.</li>
</ul>
<p>I also ask myself: <em>Is this actionable?</em></p>
<ul>
<li>If the answer is yes, I determine the next steps and assign a priority.</li>
<li>If no, I save it for later, archive it, or delete it.</li>
</ul>
<p>This daily review keeps my system from becoming cluttered and helps me stay clear on what needs to happen next.</p>
<hr />
<h3>Step 3: Process and take action</h3>
<p>Once my tasks are clear, I process them using this flow:</p>
<ul>
<li>If it takes less than 5 minutes, I <strong>do it immediately.</strong></li>
<li>If it's part of a bigger project, I <strong>break it down into steps.</strong></li>
<li>If someone else should do it, I <strong>delegate it.</strong></li>
<li>If it takes longer, I <strong>schedule it.</strong></li>
<li>If it requires deep focus, I <strong>block time for it on my calendar.</strong></li>
</ul>
<p>I also set reminders to follow up on delegated tasks. This ensures nothing gets stuck in limbo.</p>
<hr />
<h3>Additional rules</h3>
<p>Beyond these core steps, I've added a few tweaks that help me work more effectively:</p>
<ul>
<li><strong>The 5-Minute rule:</strong> If a task takes less than five minutes and will clear mental space, I still do it immediately.</li>
<li><strong>Daily Review &amp; Weekly Planning:</strong> At the end of each day, I check what I accomplished and what still needs attention. Once a week, I plan ahead to avoid last-minute stress.</li>
<li><strong>Task Batching:</strong> I group similar tasks together (like emails or errands) so I can complete them more efficiently.</li>
</ul>
<hr />
<h3>Why this works for me</h3>
<p>This system works because it keeps things simple.</p>
<ul>
<li>I never forget tasks because I capture them immediately.</li>
<li>I don't waste time organizing during the day.</li>
<li>I clarify my to-dos daily, so I always know what's next.</li>
<li>I take quick action on small tasks and plan ahead for big ones.</li>
<li>I avoid decision fatigue by following a structured approach.</li>
</ul>
<p>By sticking to this system, I keep my mind clear and my workload manageable. If you struggle with staying organized, give it a try! Start by capturing everything, then refine your process over time to fit your workflow.</p>
<p><a href="/assets/files/ran-aroussi-productivity-framework.pdf">Download a PDF version of my productivity framework ›</a></p>]]></content:encoded>
      <category><![CDATA[productivity]]></category>
    </item>
    <item>
      <title>AI agents and the end of websites as we know them</title>
      <link>https://aroussi.com/post/ai-agents-are-changing-everything</link>
      <pubDate>Tue, 04 Feb 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/ai-agents-are-changing-everything</guid>
      <description><![CDATA[<p>As AI-powered assistants become the primary users of the web, traditional websites may soon be obsolete. Here’s why businesses, developers, and UX designers need to rethink everything.</p>]]></description>
      <content:encoded><![CDATA[<div class="attribution">Photo by <a href="https://unsplash.com/@coopery?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Mohamed Nohassi</a> on <a href="https://unsplash.com/photos/a-group-of-white-robots-sitting-on-top-of-laptops-2iUrK025cec?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Unsplash</a></div>
<p>For decades, websites have been designed for human users—carefully structured layouts, sleek user interfaces, and intuitive navigation. But what happens when the primary visitors are no longer human?</p>
<p>With the rise of <strong>AI agents</strong> — smart tools capable of browsing, clicking, and completing tasks independently—the way we interact with the internet is changing dramatically. Instead of users manually visiting websites, AI will do the heavy lifting, returning only the final results. This shift challenges the very purpose of traditional websites.</p>
<h2>AI Agents Are Changing How We Use the Internet</h2>
<p>Imagine asking:
<em>"Where should I go today with my two kids?"</em></p>
<p>An AI assistant could:</p>
<ol>
<li>Check the weather on one site</li>
<li>Look up open attractions from another</li>
<li>Find travel times elsewhere</li>
<li>Cross-check recommended kid-friendly activities</li>
</ol>
<p>And then provide <strong>one final, well-researched answer</strong>—without you ever visiting a single site.</p>
<p>Clearly, this is far more convenient than manually browsing multiple websites to gather the same information.</p>
<h2>Do Websites Even Matter Anymore?</h2>
<p>If AI agents are handling most online interactions, <strong>why should businesses invest in UX and design?</strong></p>
<p>Why would a national park’s website focus on user experience, navigation, and animations—when the majority of its "visitors" are AI bots simply extracting data?</p>
<p>In fact, <strong>human-friendly design</strong> might actually hinder AI agents. They don’t need visually appealing layouts, pagination, or interactive menus. All they want is <strong>raw, structured data</strong>.</p>
<p>We've already seen hints of this shift:</p>
<ul>
<li>People ordering food via <strong>DoorDash</strong> don’t care about restaurant websites.</li>
<li>Travelers booking through <strong>Expedia</strong> may never visit individual airline sites.</li>
<li>A decade ago, RSS users consumed blog content without ever seeing the original pages.</li>
</ul>
<h2>AI Will Replace Even Complex Apps</h2>
<p>The impact goes beyond simple purchases. Imagine skipping a <strong>ClickUp</strong> dashboard entirely and just asking:
<em>"What’s the status of my team?"</em></p>
<p>Instead of logging into ClickUp, an AI could compile data from multiple platforms—HR software, time trackers, and project management tools—and present <strong>a single, clear response</strong>.</p>
<p>Or take <strong>Notion</strong>:
Why manually check tasks when you could say, <em>"I have two free hours. Show me my highest-priority assignments."</em> Then later just type, <em>"Mark task complete and update everything."</em></p>
<h2>The Big Shift: From UX to AI Optimization</h2>
<p>For years, companies have invested <strong>millions of developer hours</strong> in perfecting human-friendly UI—tweaking fonts, button placements, animations, and color schemes.</p>
<p>But if <strong>AI agents</strong> are the ones interacting with sites, all of that effort becomes unnecessary—or even counterproductive.</p>
<p>This marks a <strong>huge turning point</strong> in digital development.</p>
<ol>
<li><strong>Websites and apps will need AI-accessible endpoints.</strong>
Beyond traditional interfaces, they’ll have to expose structured data in a way that AI can easily retrieve and modify—without worrying about human usability.</li>
<li><strong>Eventually, human UIs may become redundant.</strong>
If AI is doing most of the work, companies like <strong>Asana</strong> may deprioritize UI development, focusing instead on <strong>backend data management</strong>.</li>
<li><strong>The role of web developers and UX designers will evolve.</strong>
For decades, web developers have studied <strong>human psychology</strong> to create intuitive designs. But if AI agents are the new "users," human-centric UI might become a niche skill rather than the industry standard.</li>
</ol>
<h2>Final Thoughts</h2>
<p>Back in <strong>1997</strong>, a tech magazine described the "futuristic internet" where a dad checks:</p>
<ul>
<li>The <strong>weather</strong> on one site</li>
<li>Movie listings on another</li>
<li>Restaurant options elsewhere</li>
</ul>
<p>At the time, this vision felt revolutionary. But today, the idea of manually visiting <strong>dozens of sites</strong> to plan an evening seems outdated.</p>
<p>Fast forward 30 years—will <strong>using a website yourself</strong> feel just as obsolete?</p>
<p>We’re on the brink of <strong>a massive transformation</strong> in web development. The next generation of "users" won’t be humans — <strong>they’ll be AI agents.</strong></p>]]></content:encoded>
      <category><![CDATA[opinion]]></category><category><![CDATA[ai]]></category>
    </item>
    <item>
      <title>Breaking the silence</title>
      <link>https://aroussi.com/post/breaking-the-silence</link>
      <pubDate>Thu, 30 Jan 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/breaking-the-silence</guid>
      <description><![CDATA[<p>Life has been a whirlwind. Here’s what I’ve been up to, why I haven’t been blogging, and what’s coming next.</p>]]></description>
      <content:encoded><![CDATA[<p>If you’ve visited this site recently, you’ve probably noticed that I haven’t written much here over the past four years. It wasn’t intentional — I’ve just been busy building, moving, and diving deep into new projects. So, I figured it was time for an update.</p>
<h2>A New Chapter: London and Automaze</h2>
<p>One of the biggest changes in my life recently has been relocating to <strong>London, UK</strong> with my wife and kids. Moving across the world is always a challenge, but doing it while juggling multiple projects and a growing family? That’s next level.</p>
<p>Shortly after settling in, we also welcomed our <strong>fourth child</strong> into the family — a huge milestone and an exciting (and sleep-depriving) addition to this new chapter.</p>
<p>On the work side, <strong>I started <a href="https://automaze.io?utm_source=aroussi.com">Automaze</a> in 2023</strong>, offering <strong>CTO-as-a-service</strong> to businesses looking to scale their tech operations efficiently. After years of building products and companies, I realized that many businesses — especially startups — struggle to get their tech stack right. Automaze is my way of helping them navigate that challenge without needing a full-time, in-house CTO.</p>
<h2>What Happened to Tradologics?</h2>
<p>For those wondering about <strong>Tradologics</strong>, the cloud platform I built for programmatic traders, it’s currently in <strong>hibernation mode</strong>. It was an ambitious project that required significant resources, and while I still believe in the vision, I’ve had to put it on pause for now.</p>
<h2>Why I Haven’t Been Writing Much</h2>
<p>Between the move, launching Automaze, and working on various projects, I haven’t had much time to sit down and write long-form content. But if you’ve been looking for updates from me, <strong>I’ve been active on Twitter this whole time</strong> — sharing thoughts on tech, trading, and whatever else is on my mind.</p>
<p>📌 <strong>Follow me on X/Twitter:</strong> <a href="https://x.com/intent/follow?screen_name=aroussi">@aroussi</a></p>
<p>I also plan to start writing more regularly again, so if you’d rather get updates in your inbox, <strong>subscribe to my newsletter</strong> to stay in the loop.</p>
<p>📩 <strong>Join my newsletter:</strong> <a href="#subscribe">Subscribe here</a></p>
<h2>What’s Next?</h2>
<p>For now, my focus is on growing Automaze, helping companies streamline their tech, and settling into life in London. But I also plan to get back to blogging — so stay tuned.</p>
<p>If you made it this far, thanks for reading! Let’s see where the next four years take us. 🚀</p>]]></content:encoded>
      <category><![CDATA[personal]]></category>
    </item>
    <item>
      <title>How to optimize for luck</title>
      <link>https://aroussi.com/post/how-to-optimize-for-luck</link>
      <pubDate>Thu, 16 Jan 2025 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/how-to-optimize-for-luck</guid>
      <description><![CDATA[<p>How I teach my kids to tilt the odds in their favor.</p>]]></description>
      <content:encoded><![CDATA[<p>People often overlook the powerful role luck plays in shaping their lives.</p>
<p>Sure, hard work and grit count, but luck is the real game-changer.</p>
<p>The good news are that, like poker, you can optimize for luck and tilt the odds in your favor.</p>
<p>Here's how to optimize for Luck 🎲👇</p>
<h3>Learn probability</h3>
<p>To win with luck, you need to know when the odds are in your favor.</p>
<ol>
<li>Compare opportunities based on expected value.</li>
<li>Operate under uncertainty with asymmetric strategies</li>
<li>Improve at predicting future outcomes.</li>
<li>The better you understand this, the smarter your bets.</li>
<li>Have something to bet with</li>
</ol>
<p>Even if you spot an amazing opportunity, it’s useless if you have nothing to wager. This doesn’t just mean money. It means time and availability.</p>
<p>Keep parts of your life open to change so you can seize big opportunities when they come.</p>
<h3>Get used to making small bets with incomplete information</h3>
<p>Great opportunities often come with incomplete information. The longer you take to makde a decision, the more likely they’ll disappear.</p>
<p>Experiment daily with low-stakes decisions like picking a restaurant without overthinking) to build this habit.</p>
<h3>Play the long game</h3>
<p>The results are never linear. Sometimes nothing happens for a while. But when your “overnight success” moment comes, you’ll know it was no accident.</p>]]></content:encoded>
      <category><![CDATA[life-hacks]]></category>
    </item>
    <item>
      <title>Fighting racism starts with a single baby step</title>
      <link>https://aroussi.com/post/fighting-racism-starts-with-a-baby-step</link>
      <pubDate>Sat, 20 Jun 2020 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/fighting-racism-starts-with-a-baby-step</guid>
      <description><![CDATA[<p>While most people agree that black lives matter (why shouldn't they?), many also feel that the "PC Police" has gone too far with demands to ban movies like "Gone with the Wind", removing statues of historical figures, or renaming words like "blacklist".</p>]]></description>
      <content:encoded><![CDATA[<p>While most people agree that black lives matter (why shouldn't they?), many also feel that the "PC Police" has gone too far with demands to ban movies like "Gone with the Wind", removing statues of historical figures, or renaming words like "blacklist".</p>
<p>Here are my two cents...</p>
<center><img src="/assets/img/blm.png" alt="blm"></center>
<p>I firmly believe that <strong><em>racism is, always was, and always will be, both evil and unbelievably stupid</em></strong>, but I also think that we should learn from history instead of rewriting it and pretending it didn't happen.</p>
<p>That's why I think that HBO's decision to add a disclaimer before showing "Gone with the Wind" is a good compromise - although I personally think that it's an over-hyped movie and couldn't care less if it was never shown again. But I digress...</p>
<p>A similar solution could be applied to Churchill's and other historical statues that some see as racists. Most of these figures were "normal" for their time and place in history and some, like Churchill, saved the world from much worse. That's why they should be moved into museums, where they can be preserved, protected, and presented with the entire context.</p>
<p><strong>But when it comes to terms like white/blacklist, blackmail, database master/slave, etc.  &mdash;  I'm all for it!</strong></p>
<p>This may sound like the least important thing on the list, but words do have power, and poisonous words can have damaging effects when heard enough times.
If you need proof, watch this 1971 interview of Muhammad Ali, where he describes winning the Olympic medal during segregation and how words like that offended him since childhood.</p>
<div class="oembed-wrapper"><div style="position:relative;height:0;padding-bottom:56.25%"><iframe  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen  style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;overflow:hidden" src="https://www.youtube.com/embed/7eXdt1eGgCA?feature=oembed"></iframe></div></div>
<p>Let's face it - the world is racist. But most racism is due to fear of "others," and the easiest way to detect "others" is using colors.</p>
<p>Don't believe people who "<em>don't see color</em>". That's a hard thing not to see.</p>
<p><strong>The point is not to associate color (or sexual preference, gender, religion, or ethnicity for that matter) with good, bad, or anything other than "person".</strong> Some will be great, some will be assholes, and most will be something in between  &mdash;  just like the rest of us.</p>
<p>That's why I've decided that, in the upcoming weeks, we're going to change our <code>git</code> repository's "master" branch to "main", use "source/replica" database architecture instead of "master/slave", and use "allow" and "ban" lists instead of whitelist and blacklist.</p>
<p>I know it's a baby step, and that it won't change much in the short-term. But as more and more children grow up in a world where color isn't associated with good and bad - the more chance they'll have to "<em>not see color</em>".</p>]]></content:encoded>
      <category><![CDATA[opinion]]></category>
    </item>
    <item>
      <title>Tradologics &amp; The Future of Trading</title>
      <link>https://aroussi.com/post/tradologics-the-future-of-trading</link>
      <pubDate>Sun, 15 Mar 2020 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/tradologics-the-future-of-trading</guid>
      <description><![CDATA[<p>An introduction to the Trading revolution: How to deploy a trading strategy with Tradologics - using Tradelets, Tradehooks, Pipelines, and the Universal API.</p>]]></description>
      <content:encoded><![CDATA[<h3>An introduction to the Trading revolution: How to deploy a trading strategy with Tradologics.</h3>
<div style="padding:1rem 0">
<p><img src="/assets/img/tradologics-laptop.png" alt="" /></p>
</div>
<p>Ever since I announced <strong><a href="https://tradologics.com/">Tradologics</a></strong> last week, it’s been getting a lot of interest from traders, and even from some brokers 🤩.</p>
<p><strong>Over 1,700 people have already signed up for the waitlist, which is both exciting and humbling! 🎉</strong></p>
<p>Alas — along with that interest, I received a lot of questions from people wanting to know more about the services and trading scope</p>
<blockquote>
<p>While Tradologics has many services to address every phase in the trading strategy business lifecycle, in this article, I’m going to go over the 4 core components of Tradologics, which are <strong>Tradelets</strong>, <strong>Tradehooks</strong>, <strong>Pipelines</strong>, and the <strong>Universal API</strong>.</p>
</blockquote>
<p>Furthermore, this article will focus on the strategy deployment stage (I will address research and backtesting in a future post).</p>
<h2>Traditional Trading</h2>
<p>You’ve conducted your research and came up with a brilliant trading strategy.</p>
<p><strong>Good for you!</strong></p>
<p>Now you just need to:</p>
<ol>
<li>Write a program to download real-time market data, store it, and feed it to your algorithm.</li>
<li>Filter out candidates that don’t match your universe criteria.</li>
<li>Have your algorithm work its magic and come up with trading signals.</li>
<li>Decide on your order size, based on your account balance, margin, and open positions.</li>
<li>Submit your orders to your broker, and monitor their status.</li>
<li>Manage your positions and scale or exit them based on the strategy’s goals and market conditions.</li>
<li>Get a server, configure it for maximum security, and put your code on it.</li>
<li>Monitor your trading server for errors and make sure it’s running without a glitch.</li>
</ol>
<h3>It’s as simple as that!</h3>
<p><img src="https://cdn-images-1.medium.com/max/2000/0*dDu5Pcy1G7aaH-xz.jpg" alt="" /></p>
<h2>Trading with Tradologics</h2>
<p>As stated earlier, the 3 core components of Tradologics, aside from the Universal API, are <strong>Tradehooks</strong>, <strong>Tradelets</strong>, and <strong>Pipelines</strong>.</p>
<h2>1. Tradehooks</h2>
<p>At the heart of your Tradologics’ trading setup are <strong>Tradehooks</strong>. These are <strong><a href="https://en.wikipedia.org/wiki/Webhook">webhook-style</a></strong> calls that push relevant data to your trading server.</p>
<p>Tradehooks eliminate the need to proactively connect to your broker or market data feed provider and request for information.</p>
<p>Tradehooks can push several types of data to your server, including market data, account information, positions status, and order status.</p>
<p>You can have Tradehooks push data to a trading server you own and manage, or, if you love life, use <strong>Tradelets</strong>.</p>
<h2>2. Tradelets</h2>
<p><strong>Tradelets</strong> are encrypted, <strong><a href="https://en.wikipedia.org/wiki/Serverless_computing">serverless functions</a></strong> that run your trading code — saving you from obtaining, configuring, and monitoring a trading server.</p>
<p>One of Tradologics’ core principles is that trades know what works best for them. We won’t tell you what language to write your algo in, which framework to use, or which broker to trade with.</p>
<p>Based on this philosophy, Tradelets can run code written in Python, Node.js, C#, Go, Ruby, Java, PHP, or Shell script (with R, Matlab, and EasyLanguage in the roadmap).</p>
<h2>3. Pipelines</h2>
<p>Another cool component of Tradologics is <strong>Pipelines</strong>. Pipelines act like stock screeners that filter out unwanted stocks from your trading algorithm, so you only get data for assets that match your universe criteria.</p>
<h2>Putting it all together</h2>
<p>The data flows like this:</p>
<p>A scheduler invokes a <strong>Tradehook</strong>, which fetches market data and passes is to a <strong>Pipeline </strong>for filtration. The filtered universe is then being sent back to the Tradehook.</p>
<p>Then, the data is pushed to your <strong>Tradelet</strong>, which parses it and passes it over to your <strong>Strategy</strong>. Depending on your strategy’s logic, you submit orders to any of the supported brokers using the <strong>Universal API</strong>.</p>
<hr />
<p><img src="/assets/img/tradologics-flowchart.png" alt="Tradologics — Strategy Flowchart" /></p>
<h3>The only part of this flowchart you need to take care of is the green box representing your strategy logic. Tradologics will handle everything else.</h3>
<hr />
<h2>Here’s an example strategy:</h2>
<p>You have an algorithm, written in Python, that buys stocks when the <strong>10-day moving average is above the 50-day moving average</strong>, and vice-versa (amazing strategy, I know — send me the check later).</p>
<h3>We only want to run this strategy on stocks that are:</h3>
<ol>
<li>members of the S&amp;P500 index</li>
<li>released an earnings report on the previous trading day after market close, or today before the market opened</li>
<li>gapped up or down from the previous close</li>
</ol>
<p>Now that we know <strong><em>what</em></strong> we want to do, let’s see <strong><em>how</em></strong> to do it…</p>
<h3>To get this algo rolling we’ll need to:</h3>
<ol>
<li>Spin up a Python-enabled <strong>Tradelet</strong>, and add our code to it</li>
<li>Write our strategy logic (obviously)</li>
<li>Create a <strong>Pipeline</strong> to find stocks matching the above criteria</li>
<li>Setup a <strong>Tradehook</strong> to push market-data for filtered stocks every day, 5 minutes before the market opens, and select the broker accounts associated with it.</li>
</ol>
<p>What would happen next, is that the <strong>Tradehook</strong> will send a JSON payload to our <strong>Tradelet</strong>, for the following events:</p>
<ul>
<li>Market data (daily, 5 minutes before market open)</li>
<li>Account events (margin change, etc)</li>
<li>Position updates (P&amp;L, etc)</li>
<li>Order status (for pending orders)</li>
</ul>
<p><strong>Here’s an example of the payload structure:</strong></p>
<pre><code class="language-javascript javascript">{
  /*
  event can be:
  - account, for account status events
  - position, position updates
  - order, order updates (filled, rejected, etc)
  - data, for market data
  */
  "event": "data",

  /* always sent, based on associated broker accounts */
  "accounts": [],

  /* always sent, based on associated broker accounts */
  "positions": [],

  /* pricing/pipeline data; sent when event == data */
  "data": {
    "AssetA": {...},
    "AssetB": {...},
    ...
  },

  /* order data; sent when event == order */
  "order": {...}
}</code></pre>
<h2>Let’s get started…</h2>
<p>The first step would be to spin up a Python-enabled Tradelet. Here’s how to do it using our command-line tool, <code>tctl</code> (the <strong>T</strong>radologics <strong>C</strong>on<strong>t</strong>ro<strong>l</strong>ler).</p>
<p><strong>Create a Tradelet named myalgo:</strong></p>
<pre><code class="language-text text">$ tctl tradelet create --name myalgo --lang python
Tradelet "myalgo" created with (req id: cb945f2d-103d-4092-95d4-a1024c9045dd)</code></pre>
<p>Next, we’ll set up the <strong>Pipeline</strong>, this time using the dashboard:</p>
<p><img src="https://cdn-images-1.medium.com/max/2440/1*G_weFgfhAt42d1leFkfGuA.png" alt="Tradologics — Pipeline Setup Page" /><em>Tradologics — Pipeline Setup Page</em></p>
<p>The next step is to configure our <strong>Tradehook</strong>:</p>
<p><img src="https://cdn-images-1.medium.com/max/2440/1*i9eC9rjzjp5RDPRN3RZCRg.png" alt="Tradologics — Tradehook Setup Page" /><em>Tradologics — Tradehook Setup Page</em></p>
<p>Finally, we’ll write the algorithm to handle the Tradehook’s payloads.</p>
<p>For example:</p>
<pre><code class="language-python python"># mycode.py
import tradologics

def tradehook(payload):
  payload = tradologics.parse(payload)

  # is this a "data" payload?
  if payload.event == "data":

    for asset in payload.data:
      sma10 = asset.close.rolling(10).mean()
      sma50 = asset.close.rolling(50).mean()

      # buy signal ?
      if sma10 &gt; sma50 and  # algo rule
         asset.last &gt; asset.prev_close and  #  gap up
         data.positions[asset.id] &lt;= 0:  # not in short position already
        tradologics.submit_order(
          asset=asset.id,
          qty=100,
          kind="market",
          side="buy",
          time_in_force="opg",
          accountId="my-ib-account",
          strategy="my amazing strategy"
        )

      # sell signal ?
      if sma10 &lt; sma50 and  # algo rule
         asset.last &lt; asset.prev_close and  # gap down
         data.positions[asset.id] &gt;= 0:  # not in short position already
        tradologics.submit_order(
          asset=asset.id,
          qty=100,
          kind="market",
          side="buy",
          time_in_force="opg",
          accountId="my-ib-account",
          strategy="my amazing strategy"
        )
</code></pre>
<p>Notice how we didn’t have to fetch the data from anywhere or filter out any assets. It is all being taken care of by our <strong>Tradehook</strong> and <strong>Pipeline</strong>.</p>
<p><strong>How cool is that? 😎</strong></p>
<p>The final step is to push our code to the Tradelet. Again, we’ll use the <code>tctl</code> tool to do this:</p>
<pre><code class="language-text text">$ tctl tradelet deploy myalgo --file mycode.py
File "mycode.py" was deployed to Tradelet "myalgo" (req id: 9d3e632e-7197-40d4-8d37-d0a34bf82171)</code></pre>
<h3>That’s it!</h3>
<p>Your strategy is now live and you’ll be able to monitor its performance via the Tradologics dashboard or the <code>tctl</code> tool.</p>
<p>I’m really excited about all the innovations that Tradologics introduces and feel that it has the potential to help many traders who are "lost in the plumbing". But what’s more important is what do <strong><em>you</em></strong> think…</p>
<p>I'd love to get your feedback, questions, and ideas as we're getting ready to launch the platform. <strong>Also, please share this post to help us get the word out!</strong> 🙏</p>
<h3>👨🏻‍💻 Finally, if you haven’t already, go to <strong><a href="http://tradologics.com">Tradologics.com</a></strong> and add yourself to the waitlist to be notified as soon as you can start using Tradologics.</h3>
<p>Until then,</p>
<p>Happy trading 💪</p>
<p><strong>- Ran</strong></p>
<p>*<em> Please note that actual syntax and UI may, and probably will, change a little by the time we launch.</em></p>]]></content:encoded>
      <category><![CDATA[tradologics]]></category>
    </item>
    <item>
      <title>Algo Trading in the Cloud</title>
      <link>https://aroussi.com/post/algo-trading-in-the-cloud</link>
      <pubDate>Mon, 02 Mar 2020 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/algo-trading-in-the-cloud</guid>
      <description><![CDATA[<p>What if there was a way for traders to <strong>focus <em>only</em> on the trading logic</strong> – without worrying about stuff like broker connectivity, data management, or infrastructure? Now there is...</p>]]></description>
      <content:encoded><![CDATA[<p>The last few months got me busy like a bee...</p>
<p>It all started in 2016 with the release of <a href="https://github.com/ranaroussi/qtpylib">QTPyLib</a>. I was trying to shorten the time it takes to go from an idea to live trading by abstracting all the techie stuff as much as possible (while still allowing flexibility for developers).</p>
<p>Last year I shared my vision for the next version of <a href="https://aroussi.com/post/the-future-of-qtpylib">QTPyLib</a> in hopes of making the lives of programmatic traders ever easier. That vision led me to the idea of an <a href="https://aroussi.com/post/its-time-for-a-modern-standardized-trading-interface-suitable-for-the-web-age">open trading standard</a>.</p>
<p>But the more I tried to simplify things, the more I realized that the programmatic trading landscape is a mess.</p>
<p>Think about this:</p>
<p><strong>Being a programmatic trader requires skills that are <em>entirely unrelated to trading!</em></strong></p>
<p>Ridiculous.</p>
<p>Aside from generating trading signals, traders need to know how to work with streaming data, process “big data” in real-time, manage server infrastructure, parsing logs, etc.</p>
<center><img src="/assets/img/programmer.png" alt="programmer.png"></center>
<p>Traders need to be transformed into a trading powerhouse with the skills of a Quant Researcher, a Quant Developer, a Programmer, DevOps Engineer, and a Database Administrator, to name a few.</p>
<p>Even if someone were to hold all those skills, they would still need to deal with the <strong>fragmented nature of the industry</strong> and familiarize themself with each broker’s API implementation, SDKs, and software.</p>
<p>This whole situation got me thinking...</p>
<blockquote>
<p>What if there was a way for traders to <strong>focus <em>only</em> on the trading logic</strong> – without worrying about stuff like broker connectivity, data management, or infrastructure?</p>
</blockquote>
<p>So, early this year, I’ve gathered a small team of ninjas and started working on <strong><a href="https://tradologics.com">Tradologics</a></strong>.</p>
<p>What is Tradologics?</p>
<h3><a href="https://tradologics.com">Tradologics</a> is the fastest way to go from idea to live-trading – bypassing all those infrastructure headaches.</h3>
<div style="max-width:calc(100% - 2rem);margin:auto"><img src="/assets/img/tradologics.png" alt="tradologics"></div>
<p>Tradologics is the <strong>first cloud platform</strong> built with the specific needs of programmatic traders in mind. It lets traders research, test, deploy, monitor, and scale their trading strategies - allowing them to focus on the important things, like trading logic.</p>
<p>Tradologics’ goal is to make sure that <strong>the future of trading is frictionless</strong> by offering a myriad of tools and services aimed to solve every part of the trader’s business cycle, allowing them to focus on trading, while we take care of everything else.</p>
<p>We’ve just started a private beta phase with a small userbase. As we gradually grow, we’re going to allow more and more traders to use the platform.</p>
<p>Head over to <strong><a href="https://tradologics.com">Tradologics.com</a></strong> to learn more about the future of trading, and, if you want to be one of the first to try out the platform, join the waitlist using the form on Tradologics’ website.</p>
<p>Until then - Happy trading! 💪</p>
<p>Ran</p>]]></content:encoded>
      <category><![CDATA[tradologics]]></category>
    </item>
    <item>
      <title>It's time for a modern, standardized trading interface, suitable for the web-age</title>
      <link>https://aroussi.com/post/its-time-for-a-modern-standardized-trading-interface-suitable-for-the-web-age</link>
      <pubDate>Thu, 21 Nov 2019 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/its-time-for-a-modern-standardized-trading-interface-suitable-for-the-web-age</guid>
      <description><![CDATA[<p>In this post, I share my vision for an Open Trading standard for communicating with online brokers using modern technologies.</p>]]></description>
      <content:encoded><![CDATA[<p>In this post, I share my vision for an Open Trading standard for communicating with online brokers using modern technologies.</p>
<p><img src="https://cdn-images-1.medium.com/max/2000/1*ZAwcQRtquilwUfCGrEKSkw.jpeg" alt="" /></p>
<p>While looking for a way to add support for multiple brokers and data vendors to my open-source <a href="https://github.com/ranaroussi/pytrade">Python trading library</a>, I discovered that there's currently no way to communicate with various brokers without re-writing most of the code responsible for getting market data, sending orders, and do everything aside from generating trading signals.</p>
<p>Sure, financial institutions have had the <a href="https://en.wikipedia.org/wiki/Financial_Information_eXchange">FIX protocol</a> since the '90s. It's a communications protocol designed to streamline communications in the financial services industry.</p>
<p>The problems with FIX is that, aside from being overly complicated, very few retail and online brokers support it, and the few who do are charging quite a bit for the privilege to use it — making it inaccessible (and frankly irrelevant) for most retail traders.</p>
<p>This led me to the idea of designing a new standard for communicating with online brokers by providing a modern trading interface using technologies like a REST API for polling data, HTTP/2 Server-Sent Events (SSE) for event notifications, and WebSockets for streaming live market data.</p>
<p>I've named this idea the <strong>Open Trading Initiative</strong> :)</p>
<p><img src="https://cdn-images-1.medium.com/max/2400/1*-xiLkTCNjAVbG5BkEB5lcg.png" alt="" /></p>
<p>Below is my (very rudimentary) vision for the Open Trading standard. It's far from complete, and it's basically in a “brain dump” status.</p>
<hr />
<h2>Naming Conventions</h2>
<p>A crucial part of the <strong>Open Trading Standard</strong> is to have brokers use the same naming convention for tickers and symbols. One way of achieving this for all of them to support the <a href="https://en.wikipedia.org/wiki/Financial_Instrument_Global_Identifier">Financial Instrument Global Identifier</a> (FIGI) when referring to tradable instruments.</p>
<p>For example, the FIGI or the SPY is <a href="https://www.openfigi.com/id/BBG000BDTG10">BBG000BDTG10</a>, while Apple's is <a href="https://www.openfigi.com/id/BBG000B9Y2J5">BBG000B9Y2J5</a>.</p>
<p>In 2016, Bloomberg launched <a href="https://openfigi.com/">OpenFIGI.com</a> to provide exchanges, data providers, custodians, and other organizations search for existing FIGIs, request identifiers for new securities and cross-reference, or map, FIGIs to other third-party identifiers.</p>
<h2>Server Responses</h2>
<p>Responses to API calls will be in JSON format and <em>must</em> use the same data structure and field names for compatibility with the Open Trading standard.</p>
<p>As an example, an account status response may look something like this:</p>
<pre><code class="language-json json">{
    "account_number": "12345ABCD",
    "buying_power": 262113.32,
    "cash": -23140.20,
    "created_at": "2019-06-12T22:47:07.99658Z",
    "currency": "USD",
    "daytrade_count": 2,
    "daytrading_buying_power": 262113.32,
    "equity": 103820.56,
    "id": "e6fe16f364a44921-8928cadf02f92f98",
    "initial_margin": 63480.38,
    "last_equity": 103529.24,
    "last_maintenance_margin": 38000.832,
    "long_market_value": 126960.76,
    "maintenance_margin": 38088.228,
    "multiplier": 4,
    "pattern_day_trader": false,
    "portfolio_value": 103820.56,
    "regt_buying_power": 80680.36,
    "short_market_value": 0,
    "shorting_enabled": true,
    "sma": 0,
    "status": "ACTIVE"
}</code></pre>
<h2>SDKs / Libraries</h2>
<p>SDKs and libraries will need to be available for multiple programming platforms and languages like Python, Node.js, Go, Java, .NET, etc.</p>
<p>These libraries will implement the standardized REST, SSE, and WS architecture, as described later in this post.</p>
<blockquote>
<p>As a first step, these libraries will offer their own implementation of the Open Trading standard, served via localhost, while “translating” the trader-broker messages behind the scenes.</p>
</blockquote>
<p>This obfuscation will help get people comfortable with the Open Trading standard and help gain traction.</p>
<hr />
<h2>REST API — for data polling:</h2>
<p>The REST API will allow traders to request information from the broker, submit orders, download historical prices, and subscribe to SSE event notifications.</p>
<h4>Connection:</h4>
<ul>
<li><code>POST /connect</code> — Authenticate using API credentials or connect to a locally running service (like IB's TWS). Query supports mode (live or paper/demo).</li>
<li><code>POST /disconnect</code> — Disconnect from a locally running service (unsubscribes from server events, and disconnects from socket if applicable — see below)</li>
</ul>
<h4>Account:</h4>
<ul>
<li><code>GET /account</code> — Get account information (balance, margin, etc..</li>
<li><code>GET /positions</code> — Get current positions</li>
<li><code>GET /positions/{FIGI}</code> — Get positions for instrument</li>
</ul>
<h4>Orders:</h4>
<ul>
<li><code>GET /orders</code> — List all orders (query supports status, date_range, etc)</li>
<li><code>GET /orders/{FIGI}</code> — List all orders for instrument</li>
<li><code>DELETE /orders</code> — Cancel all pending orders</li>
<li><code>DELETE /orders/{FIGI}</code> — Cancel all pending orders for instrument</li>
<li><code>POST /orders</code> — Submit new order(s). JSON body includes FIGI, qty, side (buy/sell), type (market/limit/stop/stop_limit), time in force (day/gtc/opg/moc/...), exchange, price (required if type is limit, stop, or stop_limit), rth (Regular Trading Hours — defaults to true)</li>
<li><code>GET/orders/{orderId}</code> — Get information for specific order</li>
<li><code>PUT /orders/{orderId}</code> — Modify an existing, pending order</li>
<li><code>DELETE /orders/{orderId}</code> — Delete an existing, pending order</li>
</ul>
<h4>Trades:</h4>
<ul>
<li><code>GET /trades</code> — List trades (query supports status, date_range, etc.)</li>
<li><code>GET /trades/{FIGI}</code> — List trades for instrument</li>
</ul>
<h4>Pricing:</h4>
<ul>
<li><code>GET /prices/{FIGI}</code> — Get OHLC(V) data bars for instrument (query supports resolution and lookback)</li>
<li><code>GET /price/{FIGI}</code> — Get latest price (inc. bid/ask info) for instrument</li>
</ul>
<h2>SSE — for event handling:</h2>
<p>Server-Sent Events (<a href="https://en.wikipedia.org/wiki/Server-sent_events">SSE</a>) is a server push technology enabling a client to receive automatic updates from a server via HTTP(S) connection. The SSE EventSource API is standardized as part of HTML5 by the W3C.</p>
<p>To subscribe to events, the protocol will listen for events on <code>/events</code>.</p>
<p>The suggested events are:</p>
<ul>
<li><code>account</code> — receive account updates (balance, margin, etc.)</li>
<li><code>positions</code> — receive positions updates</li>
<li><code>order</code> — receive order updates (fills, rejections, cancellations, etc.)</li>
</ul>
<p>Here's an example (using Javascript code):</p>
<pre><code class="language-javascript javascript">const endpoint = new EventSource("/events");

endpoint.addEventListener('account', (event) =&gt; {
    const data = JSON.parse(event.data);
    console.log('Account:', data);
    // do stuff with the data
}, false);

endpoint.addEventListener('positions', (event) =&gt; {
    const data = JSON.parse(event.data);
    console.log('Positions:', data);
    // do stuff with the data
}, false);

endpoint.addEventListener('order', (event) =&gt; {
    const data = JSON.parse(event.data);
    console.log('Order:', data);
    // do stuff with the data
}, false);
</code></pre>
<h2><strong>WebSockets — for streaming data:</strong></h2>
<p>For streaming live tick, bid-ask, or order book data, the Open Trading standard will use WebSockets to subscribe to the <code>ticks</code> and/or the <code>book</code> channels.</p>
<p>Here's an example (using Javascript and SocketIO):</p>
<pre><code class="language-javascript javascript">const socket = io.connect('//broker.com');

socket.on('connect', () =&gt; {
    socket.emit('subscribe', {
        "token": "AUTH_TOKEN",
        "events": ["ticks", "book"],
        "instruments": ["FIGI1", "FIGI2", ...]
    });
});

socket.on('tick', (event) =&gt; {
    const data = JSON.parse(event.data);
    console.log('Tick:', data);
    // do stuff with tick data
});

socket.on('book', (event) =&gt; {
    const data = JSON.parse(event.data);
    console.log('Book:', data);
    // do stuff with boot data
});</code></pre>
<hr />
<h2>What now?</h2>
<p>I'm looking for programmers and traders to establish the Open Trading initiative's consortium, bounce ideas off each other, and decide on the Open Trading standards, methods and, implementation.</p>
<p>If you're interested in joining me on this (unpaid and open-sourced) project, please <a href="https://opentrading.io">subscribe here</a> and join the <a href="https://discord.gg/228abg">Discord server</a> to share your thoughts with me.</p>
<p>Thanks for reading!</p>]]></content:encoded>
      <category><![CDATA[trading]]></category><category><![CDATA[programming]]></category>
    </item>
    <item>
      <title>Is this the world's best (and laziest) trading strategy?</title>
      <link>https://aroussi.com/post/worlds-best-strategy</link>
      <pubDate>Wed, 02 Oct 2019 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/worlds-best-strategy</guid>
      <description><![CDATA[<p>Can you regularly beat the market, cut volatility by 40% and max drawdown by 70% with only four trades a year, or is this too good to be true?</p>]]></description>
      <content:encoded><![CDATA[<h3>Can you regularly beat the market, cut volatility by 40% and max drawdown by 70% with only four trades a year, or is this too good to be true?</h3>
<p>⚠️ Read an updated version of this post (covers up to 2025) <a href="/post/the-worlds-laziest-trading-strategy-six-years-later">here</a></p>
<hr />
<p>Active trading certainly isn't for everyone. Between spending time with family, going to work, running errands, paying bills, and not having the time or financial knowledge to invest wisely - it's easy to see why most people use the "Buy &amp; Hold (Hope)" approach or choose not to invest at all.</p>
<p>But what if there's a way for you to beat the market, earn an average of 20%/year, reduce volatility by 40% and max drawdown by 70% using only four trades a year? Surely trading this kind of strategy should be attractive for anyone.</p>
<p>Here's a strategy that does just that.</p>
<p><em><strong>Note</strong>: Past performance does not guarantee future results. I simply share my findings here not as a recommendation, but rather as back-tested results of a theoretical trading strategy, net of any commissions and fees.</em></p>
<hr />
<h2>The Lazy Strategy</h2>
<p>The premise of this strategy is that <strong>(A)</strong> the market tends to go up over time, and <strong>(B)</strong> precious metals tend to display a seasonal up-trend during December-February, and around August (see the below GLD chart, adjusted for seasonality).</p>
<p><img src="https://aroussi.local//assets/img/gld-seasonal.png" alt="" /></p>
<p>Legendary investor Warren Buffett once said (and then repeated) that "The trick is not to pick the right company, but rather to buy all the big companies through the S&amp;P 500 and to do it consistently". Sound advice for 90% of people, indeed.</p>
<p>That advice takes care of item <strong>A</strong> (the market tends to go up over time). But combining that advice with a bit of hedging and two seasonality trades/year can yield more attractive results.</p>
<p>So, are you ready for this brilliant strategy? Ok, here it is:</p>
<ol>
<li>Hold <strong>GLD</strong> (SPDR Gold Trust ETF) from December 20 of every year through February 20 of the following year, and during August.</li>
<li>The rest of the time hold <strong>SPLV</strong> (Invesco S&amp;P 500 Low Volatility ETF)</li>
</ol>
<p>That's it! (I told you it was simple)</p>
<p><strong><em>I should point out that I haven't optimized this strategy at all. I simply "bought" Gold during its seasonal up-trend, and a low volatility "market" ETF the rest of the time.</em></strong></p>
<p>So how a strategy like this performed over time? Here are the results from May 5, 2011 (date of SPLV inception) through today (October 3, 2019):</p>
<pre><code class="language-text text">Metric               Strategy    S&amp;P 500
-------------------  --------   --------
Cumulative Return    429.44%     117.45%
Yearly (ann.)          21.9%       9.67%
Sharpe                  1.73        0.71
Sortino                 2.65        0.99
Max Drawdown         -10.61%     -19.78%
Longest DD Days          258         416
Avg. Drawdown         -1.45%      -1.67%
Avg. Drawdown Days        15          20
Volatility (ann.)      11.9%      14.58%
Best Day               4.02%       4.96%
Worst Day             -3.75%      -6.66%
Best Month            12.27%      10.77%
Worst Month           -6.16%      -9.18%
Best Year             30.99%       29.6%
Worst Year             1.53%      -6.24%</code></pre>
<p><img src="https://aroussi.local//assets/img/lazy1.svg" alt="" /></p>
<p>To test how well this strategy would have performed before 2011, I've tested it using <strong>JKD</strong> (iShares Morningstar Large Core Idx) at 25% holdings, to (sort of) match the volatility of <strong>SPLV</strong>.</p>
<p>Here are the results from Jan 2, 2004 through today (Oct 3, 2019):</p>
<pre><code class="language-text text">Metric               Strategy    S&amp;P 500
-------------------  --------   --------
Cumulative Return     818.56%    161.09%
Yearly (ann.)          15.11%      6.28%
Sharpe                   1.33       0.43
Sortino                  2.02        0.6
Max Drawdown          -20.43%    -56.78%
Longest DD Days           349      1,996
Avg. Drawdown          -1.37%     -1.93%
Avg. Drawdown Days         18         33
Volatility (ann.)      11.03%     18.13%
Best Day                4.67%     11.58%
Worst Day              -3.98%     -9.03%
Best Month             12.27%     10.77%
Worst Month            -9.29%    -16.94%
Best Year              30.99%      29.6%
Worst Year             -2.56%    -38.49%</code></pre>
<p><img src="https://aroussi.local//assets/img/lazy2.svg" alt="" /></p>
<p>Note that aside from a ~20% drawdown in the peak of 2008's market crash, the maximum drawdown is around -10%, which fits most people's risk tolerance.</p>
<p>Check out the <strong><a target="_blank" href="https://aroussi.local//assets/tearsheets/lazy.html">complete tearsheet</a></strong> for this strategy, generated by <a href="https://github.com/ranaroussi/quantstats">QuantStats</a>, of course :-)</p>]]></content:encoded>
      <category><![CDATA[trading]]></category>
    </item>
    <item>
      <title>Downloading option chain and fundamental using Python</title>
      <link>https://aroussi.com/post/download-options-data</link>
      <pubDate>Fri, 31 May 2019 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/download-options-data</guid>
      <description><![CDATA[<p>The recently updated <a href="https://github.com/ranaroussi/yfinance">yfinance</a> added a lot more capabilities to this already popular library. You can now <strong>download fundamental data</strong>, including company financials, balance sheet and cashflow, as well as <strong>option chain data</strong>. Here's how...</p>]]></description>
      <content:encoded><![CDATA[<p>The recently updated <a href="https://github.com/ranaroussi/yfinance">yfinance</a> added a lot more capabilities to this already popular library. You can now <strong>download fundamental data</strong>, including company financials, balance sheet and cashflow, as well as <strong>option chain data</strong>. Here's how...</p>
<p>First, import <code>yfinance</code> and create a ticker object:</p>
<pre><code class="language-python python">import yfinance as yf
aapl = yf.Ticker("AAPL")</code></pre>
<p>Next, let's get information about the stock</p>
<pre><code class="language-python python">aapl.info</code></pre>
<p>Output:</p>
<pre><code class="language-text text">{'language': 'en-US',
 'region': 'US',
 'quoteType': 'EQUITY',
 'quoteSourceName': 'Nasdaq Real Time Price',
 'currency': 'USD',
 'sharesOutstanding': 4601079808,
 ...
 ...
 'marketCap': 814805221376,
 'marketState': 'REGULAR',
 'priceHint': 2,
 'exchange': 'NMS',
 'exchangeDataDelayedBy': 0,
 'symbol': 'AAPL'}</code></pre>
<hr />
<h3>Getting historical market data</h3>
<pre><code class="language-python python">hist = aapl.history(period="max")
hist.head()</code></pre>
<p>Output:</p>
<pre><code class="language-text text">            Open  High   Low  Close     Volume  Dividends  Stock Splits
Date
1980-12-12  0.02  0.02  0.02   0.02  117258400        0.0           0.0
1980-12-15  0.02  0.02  0.02   0.02   43971200        0.0           0.0
1980-12-16  0.02  0.02  0.02   0.02   26432000        0.0           0.0
1980-12-17  0.02  0.02  0.02   0.02   21610400        0.0           0.0
1980-12-18  0.02  0.02  0.02   0.02   18362400        0.0           0.0</code></pre>
<p>Show only actions (dividends + splits):</p>
<pre><code class="language-python python">aapl.actions</code></pre>
<p>Output:</p>
<pre><code class="language-text text">            Dividends  Stock Splits
Date
1987-05-11       0.12           0.0
1987-06-16       0.00           2.0
...
2019-02-08       0.73           0.0
2019-05-10       0.77           0.0</code></pre>
<p>Show only dividents:</p>
<pre><code class="language-python python">aapl.dividends</code></pre>
<p>Output:</p>
<pre><code class="language-text text">1987-05-11    0.12
1987-08-10    0.06
...
2019-02-08    0.73
2019-05-10    0.77</code></pre>
<p>...or only splits:</p>
<pre><code class="language-python python">aapl.splits</code></pre>
<p>Output:</p>
<pre><code class="language-text text">1987-06-16    2.0
2000-06-21    2.0
2005-02-28    2.0
2014-06-09    7.0</code></pre>
<hr />
<h3>Dowloading fundamental data</h3>
<p>Let's download Apple's financials:</p>
<pre><code class="language-python python">aapl.financials</code></pre>
<p>Output:</p>
<pre><code class="language-text text">                                 9/29/2018  9/30/2017  9/24/2016  9/26/2015
Total Revenue                    265595000  229234000  215639000  233715000
...
Gross Profit                     101839000   88186000   84263000   93626000</code></pre>
<p>Downloading the balance sheet is as easy as...</p>
<pre><code class="language-python python">aapl.balance_sheet</code></pre>
<p>Output:</p>
<pre><code class="language-text text">                                  9/29/2018  9/30/2017  9/24/2016  9/26/2015
Cash And Cash Equivalents          25913000   20289000   20484000   21120000
...
Net Tangible Assets               107147000  134047000  119629000  110346000</code></pre>
<p>Same goes for the cashflow:</p>
<pre><code class="language-python python">aapl.cashflow</code></pre>
<pre><code class="language-text text">                                  9/29/2018  9/30/2017  9/24/2016  9/26/2015
Net Income                         59531000   48351000   45687000   53394000
...
Change In Cash / Cash Equivalents   5624000    -195000    -636000    7276000</code></pre>
<hr />
<h3>Dowloading options data</h3>
<p>To download option chains, let's first get the list of expirations:</p>
<pre><code class="language-python python">aapl.options</code></pre>
<pre><code class="language-text text">('2019-05-31',
 '2019-06-07',
 ...
 '2021-01-15',
 '2021-06-18')</code></pre>
<p>Now, we can download the option chain for a specific expiration date:</p>
<pre><code class="language-python python">opt = aapl.option_chain('2019-06-07')</code></pre>
<p>Let's look at the call options:</p>
<pre><code class="language-python python">opt.calls</code></pre>
<p>Output:</p>
<pre><code class="language-text text">         contractSymbol  lastTradeDate  strike  lastPrice   ...  currency
0   AAPL190607C00150000     1559318324   150.0      27.05   ...       USD
1   AAPL190607C00152500     1558710976   152.5      27.80   ...       USD
2   AAPL190607C00155000     1559321089   155.0      22.06   ...       USD
...
34  AAPL190607C00242500     1557513401   242.5       0.04   ...       USD
35  AAPL190607C00245000     1557846185   245.0       0.01   ...       USD</code></pre>
<p>Same goes for put options, of course:</p>
<pre><code class="language-python python">opt.puts</code></pre>
<p>Output:</p>
<pre><code class="language-text text">         contractSymbol  lastTradeDate  strike  lastPrice   ...  currency
0   AAPL190607P00145000     1559320134   145.0       0.05   ...       USD
1   AAPL190607P00146000     1559243891   146.0       0.06   ...       USD
2   AAPL190607P00150000     1559322559   150.0       0.09   ...       USD
...
30  AAPL190607P00235000     1557415866   235.0      38.40   ...       USD
31  AAPL190607P00240000     1556642527   240.0      40.30   ...       USD</code></pre>
<hr />
<p>To install/upgrade <strong>yfinance</strong> using pip, run:</p>
<pre><code class="language-bash bash">$ pip install yfinance --upgrade --no-cache-dir</code></pre>
<hr />
<p>The <a href="https://github.com/ranaroussi/yfinance">Github repository</a> has more information and issue tracking.</p>
<p>Enjoy!</p>]]></content:encoded>
      <category><![CDATA[python]]></category><category><![CDATA[yfinance]]></category>
    </item>
    <item>
      <title>The Future of QTPyLib</title>
      <link>https://aroussi.com/post/the-future-of-qtpylib</link>
      <pubDate>Thu, 16 May 2019 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/the-future-of-qtpylib</guid>
      <description><![CDATA[<p>I released the first version of <a href="https://github.com/ranaroussi/qtpylib">QTPyLib</a>, my Python library for algo traders, in 2016. If you had told me then that I would still be working on it three years later, I probably wouldn't have believed you. But guess what? That's precisely where I'm doing :)</p>]]></description>
      <content:encoded><![CDATA[<p>I released the first version of <a href="https://github.com/ranaroussi/qtpylib">QTPyLib</a>, my Python library for algo traders, in 2016. If you had told me then that I would still be working on it three years later, I probably wouldn't have believed you. But guess what? That's precisely where I'm doing :)</p>
<p>The first release of QTPyLib was a basic engine for <strong>live trading</strong> using Interactive Brokers. That's it. Nothing more. Nothing less. I have developed it for my own personal use and decided to release the code on Github for whoever finds it useful.</p>
<p>Over time the library had more features added and it even gained a decent amount of users, but, through it all, the development lifecycle remained pretty much the same: I was adding features that were specific to my own needs and releasing them to the public.</p>
<p>Using this approach, I've also released several other libraries, including <a href="https://github.com/ranaroussi/fix-yahoo-finance">fix-yahoo-finance</a>, <a href="https://github.com/ranaroussi/ezibpy">ezIBpy</a>, <a href="https://github.com/ranaroussi/pystore">PyStore</a>, <a href="https://github.com/ranaroussi/quantstats">QuantStats</a>, and a few others, which became the building blocks in my algo research &amp; trading ecosystem.</p>
<p>My vision for QTPyLib moving forward is to have it combine all of these tools, among others, into a single, cohesive tool that lets you backtest, analyze, and trade anything. This is no small task, and it will going to take some time to complete.</p>
<p>So... here's what's in store for the next major release of QTPyLib:</p>
<p><img src="https://aroussi.local//assets/img/qtpylib-ui.png" alt="qtpylib dashboard ui" /></p>
<h3>1. Brokers &amp; Data Vendors</h3>
<p>The most significant change in the next major version of QTPyLib is the ability to <strong>work with any broker and any market data source</strong>. This is going to be achieved by converting both the <code>blotter</code> and the <code>broker</code> submodules to using a standardized extension/plug-in model.</p>
<p>While I initially only plan to release QTPyLib with support for Interactive Brokers as a broker, I will be providing a template for anyone who wants to add support for any broker or market data source.</p>
<p>For those without a real-time market data subscription, I will be adding the option to use EOD data from Yahoo! finance or EOD/intraday data from <a href="http://AlphaVantage.co">AlphaVantage</a> out of the box.</p>
<p>This feature alone will allow QTPyLib users to trade Stocks, ETFs, Futures, Forex and Crypto on any broker they choose (as long as they have an API).</p>
<h3>2. Backtester</h3>
<p>Given the fact that QTPyLib was originally developed as a tool for <strong>live trading</strong>, I've never given the "backtesting-mode" the full attention it deserved. That's about to change.</p>
<p>The new QTPyLib's backtester will have a web-based progress visualizer, that, upon completion, will generate a detailed tearsheet and trade analysis - thanks to deep integration with <a href="https://github.com/ranaroussi/quantstats">QuantStats</a>.</p>
<p>Lastly, I plan on introducing slippage and commission models to produce more realistic results.</p>
<h3>2. Data Storage</h3>
<p>QTPyLib will switch to use <strong><a href="https://github.com/ranaroussi/pystore">PyStore</a> as the default storage engine</strong>. This will allow for enhanced portability and performance - especially on a single machine setup - by leveraging the power <a href="https://dask.org">Dask</a> and the <a href="http://parquet.apache.org">Parquet</a> file format.</p>
<p>Those wishing to use SQL databases will be able to use either MySQL or PostgreSQL, as the database access will be abstracted by using SQLAlchemy as the driver.</p>
<h3>4. Other Changes</h3>
<ul>
<li>New dashboard UI</li>
<li>Scheduler module (inspired by <a href="https://www.quantopian.com/help#api-schedulefunction">Quantopian's</a>)</li>
<li>Rebalance module for easy portfolio rebalancing</li>
<li>Option to submit orders as a faction of account value instead of quantity</li>
<li>Support for IB sub-accounts (useful for Financial Advisors)</li>
<li>Single <code>on_bar()</code> event when using multi-instrument algos</li>
<li>Code speedup by converting core modules to Cython</li>
<li>Various other minor code improvements</li>
<li>Release of video guides and tutorials</li>
</ul>
<p>That it for now :)</p>
<p>If you think of anything else that might benefit others, please
<a href="https://github.com/ranaroussi/qtpylib/issues/new?assignees=&amp;labels=feature+request&amp;template=feature-request.md&amp;title=%5BV2+Feature+Request%5D">submit a feature request</a> on Github, and I try to include it.</p>
<h3>Release Schedule:</h3>
<p>Adding this many new features will take time. My goal is to release the next version <strong>by the end of the year</strong>. This means that the beta version will probably be released around October-November, and will be released on <a href="https://github.com/ranaroussi/qtpylib">Github</a>.</p>
<h3>Help Wanted!</h3>
<p>More than anything I need help writing unit tests and converting code to Cython, but I would appreciate any help. If you're a Python developer who also trades and want to help, I would be more than happy to get you on board.</p>
<p>Wish me luck! :)</p>]]></content:encoded>
      <category><![CDATA[python]]></category><category><![CDATA[qtpylib]]></category>
    </item>
    <item>
      <title>Reliably download historical market data from with Python</title>
      <link>https://aroussi.com/post/python-yahoo-finance</link>
      <pubDate>Wed, 17 Apr 2019 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/python-yahoo-finance</guid>
      <description><![CDATA[<p>Ever since Yahoo decommissioned their historical data API, Python developers looked for a reliable workaround. As a result, my library, <a href="https://github.com/ranaroussi/yfinance">yfinance</a>, gained momentum and gets 300k+ 3M+ installs per month, acording to PyPi!</p>]]></description>
      <content:encoded><![CDATA[<p>Ever since Yahoo decommissioned their historical data API, Python developers looked for a reliable workaround. As a result, my library, <a href="https://github.com/ranaroussi/yfinance">yfinance</a>, gained momentum and gets <strike>300k+</strike> 3M+ installs per month, acording to PyPi!</p>
<hr />
<h3>Legal note:</h3>
<p><strong>Yahoo!, Y!Finance, and Yahoo! finance are registered trademarks of Yahoo, Inc.</strong></p>
<p>yfinance is not affiliated, endorsed, or vetted by Yahoo, Inc. It's an open-source tool that uses Yahoo's publicly available APIs, and is intended for research and educational purposes.</p>
<p><strong>You should refer to Yahoo!'s terms of use (<a href="https://policies.yahoo.com/us/en/yahoo/terms/product-atos/apiforydn/index.htm">here</a>,
<a href="https://legal.yahoo.com/us/en/yahoo/terms/otos/index.html">here</a>, and
<a href="https://policies.yahoo.com/us/en/yahoo/terms/index.htm">here</a>) for details on your rights to use the actual data downloaded. Remember - the Yahoo! finance API is intended for personal use only.</strong></p>
<hr />
<p><br></p>
<p><code>fix-yahoo-finance</code> <a href="https://aroussi.com/post/fix-yahoo-finance">aimed to offer a temporary fix</a> to the problem by getting data from Yahoo! Finance and returning it in the same format as <strong>pandas_datareader's</strong> <code>get_data_yahoo()</code>, thus keeping the code changes in exisiting software to minimum.</p>
<p>The problem was, that this hack was a bit unreliable, causing data to not being downloaded and required developers to force session re-initialization and re-fetching of cookies, by calling <code>yf.get_yahoo_crumb(force=True)</code>.</p>
<p><strong>yfinance</strong> is a complete re-write of the libray, offering a reliable method of downloading historical market data from Yahoo! Finance's API, up to 1 minute granularity, in a more Pythonic way.</p>
<h3>Introducing the <code>Ticker()</code> module:</h3>
<p>The <code>Ticker()</code> module allows you get market and meta data for a security, using a Pythonic way:</p>
<pre><code class="language-python python">import yfinance as yf

msft = yf.Ticker("MSFT")
print(msft)
"""
returns
&lt;yfinance.Ticker object at 0x1a1715e898&gt;
"""

# get stock info
msft.info

"""
returns:
{
 'quoteType': 'EQUITY',
 'quoteSourceName': 'Nasdaq Real Time Price',
 'currency': 'USD',
 'shortName': 'Microsoft Corporation',
 'exchangeTimezoneName': 'America/New_York',
  ...
 'symbol': 'MSFT'
}
"""

# get historical market data
msft.history(period="max")
"""
returns:
              Open    High    Low    Close      Volume  Dividends  Splits
Date
1986-03-13    0.06    0.07    0.06    0.07  1031788800        0.0     0.0
1986-03-14    0.07    0.07    0.07    0.07   308160000        0.0     0.0
...
2019-04-15  120.94  121.58  120.57  121.05    15792600        0.0     0.0
2019-04-16  121.64  121.65  120.10  120.77    14059700        0.0     0.0
"""

# show actions (dividends, splits)
msft.actions
"""
returns:
            Dividends  Splits
Date
1987-09-21       0.00     2.0
1990-04-16       0.00     2.0
...
2018-11-14       0.46     0.0
2019-02-20       0.46     0.0
"""

# show dividends
msft.dividends
"""
returns:
Date
2003-02-19    0.08
2003-10-15    0.16
...
2018-11-14    0.46
2019-02-20    0.46
"""

# show splits
msft.splits
"""
returns:
Date
1987-09-21    2.0
1990-04-16    2.0
...
1999-03-29    2.0
2003-02-18    2.0
"""</code></pre>
<p>Available paramaters for the <code>history()</code> method are:</p>
<ul>
<li><strong>period</strong>: data period to download (Either Use period parameter or use start and end)
Valid periods are: 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max</li>
<li><strong>interval</strong>: data interval (intraday data cannot extend last 60 days)
Valid intervals are: 1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 1d, 5d, 1wk, 1mo, 3mo</li>
<li><strong>start</strong>: If not using period - Download start date string (YYYY-MM-DD) or datetime.</li>
<li><strong>end</strong>: If not using period - Download end date string (YYYY-MM-DD) or datetime.</li>
<li><strong>prepost</strong>: Include Pre and Post market data in results? (Default is <code>False</code>)</li>
<li><strong>auto_adjust</strong>: Adjust all OHLC automatically? (Default is <code>True</code>)</li>
<li><strong>actions</strong>: Download stock dividends and stock splits events? (Default is <code>True</code>)</li>
</ul>
<h3>Mass download of market data:</h3>
<p>You can also download data for multiple tickers at once, like before.</p>
<pre><code class="language-python python">import yfinance as yf
data = yf.download("SPY AAPL", start="2017-01-01", end="2017-04-30")</code></pre>
<p>To access the closing price data for <strong>SPY</strong>, you should use: <code>data['Close']['SPY']</code>.</p>
<p>If, however, you want to group data by Symbol, use:</p>
<pre><code class="language-python python">import yfinance as yf
data = yf.download("SPY AAPL", start="2017-01-01", end="2017-04-30",
                   group_by="ticker")</code></pre>
<p>To access the closing price data for <strong>SPY</strong>, you should use: <code>data['SPY']['Close']</code>.</p>
<p>The <code>download()</code> method accepts an additional parameter - <code>threads</code> for faster completion when downloading a lot of symbols at once.</p>
<p><strong>* NOTE:</strong> To keep compatibility with older versions, <strong>auto_adjust</strong> defaults to <code>False</code> when using mass-download.</p>
<h3>Using pandas_datareader:</h3>
<p>If your legacy code is using <code>pandas_datareader</code> and you wand to keep the code changes to minimum, you can simply call the override method and keep your code as it was:</p>
<pre><code class="language-python python">from pandas_datareader import data as pdr

import yfinance as yf
yf.pdr_override() # &lt;== that's all it takes :-)

# download dataframe using pandas_datareader
data = pdr.get_data_yahoo("SPY", start="2017-01-01", end="2017-04-30")</code></pre>
<hr />
<p>To install/upgrade <strong>yfinance</strong> using pip, run:</p>
<pre><code class="language-bash bash">$ pip install yfinance --upgrade --no-cache-dir</code></pre>
<hr />
<p>The <a href="https://github.com/ranaroussi/yfinance">Github repository</a> has more information and issue tracking.</p>
<p>Enjoy!</p>]]></content:encoded>
      <category><![CDATA[python]]></category><category><![CDATA[yfinance]]></category>
    </item>
    <item>
      <title>Machine Learning for Trading (with Python): Webinar Recording, Slides and Notebook (IV)</title>
      <link>https://aroussi.com/post/machine-learning-for-trading-webinar</link>
      <pubDate>Sat, 22 Sep 2018 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/machine-learning-for-trading-webinar</guid>
      <description><![CDATA[<p>I had a great time presenting yesterday's webinar about <strong>Live Trading with Python</strong>... This was the fourth and the final part of my webinar series on <strong>Treading With Python</strong> for <em>futures.io</em>'s members.</p>]]></description>
      <content:encoded><![CDATA[<p>I had a great time presenting yesterday's webinar about <strong>Live Trading with Python</strong>... This was the fourth and the final part of my webinar series on <strong>Treading With Python</strong> for <em>futures.io</em>'s members.</p>
<p>In this webinar, I went over the basics of machine learning, and walked through an example of a trading strategy that leverages machine learning to achieve alpha.</p>
<p>Here's the webinar's recording, slides, and Jupyter notebook.</p>
<p>You can jump directly to the
<a href="https://github.com/ranaroussi/futuresio-webinars/blob/master/04-machine-learning.ipynb">Jupyter notebook</a>
that's stored on this <a href="https://github.com/ranaroussi/futuresio-webinars">GitHub repository</a>,
along with a Python file which contains functions I've used during the webinars.</p>
<h4>Webinar recording:</h4>
<div class="oembed-wrapper"><div style="position:relative;height:0;padding-bottom:56.25%"><iframe  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen  style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;overflow:hidden" src="https://www.youtube.com/embed/V3qhnns4zV8?feature=oembed"></iframe></div></div>
<h4>Webinar slides:</h4>
<div class="slides-wrapper">
    <div style="">
        <iframe allowFullScreen="true" style="" scrolling="no" seamless="seamless" src="https://aroussi.com/futuresio/04-ml.html"></iframe>
    </div>
    Machine Learning for Trading (w/ Python)
</div>
<p><a href="https://aroussi.com/futuresio/04-ml.html" target="_blank">Open slides in a new window</a></p>]]></content:encoded>
      <category><![CDATA[finance]]></category><category><![CDATA[trading]]></category><category><![CDATA[webinar]]></category><category><![CDATA[python]]></category><category><![CDATA[recording]]></category>
    </item>
    <item>
      <title>Fast Data Store for Pandas Time-Series Data using PyStore</title>
      <link>https://aroussi.com/post/fast-datastore-for-pandas-time-series-data</link>
      <pubDate>Tue, 05 Jun 2018 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/fast-datastore-for-pandas-time-series-data</guid>
      <description><![CDATA[<p>As algorithmic traders, we need a lot of data to test and optimize our strategy ideas. Over time, the amount of data adds up and the search for a reliable, efficient and easy-to-use storage solution begins.</p>]]></description>
      <content:encoded><![CDATA[<p>As algorithmic traders, we need a lot of data to test and optimize our strategy ideas. Over time, the amount of data adds up and the search for a reliable, efficient and easy-to-use storage solution begins.</p>
<p>When I first confronted this issue, my immediate go-to solution was to use a database like MySQL or PostgreSQL. But as a Python developer and a heavy Pandas user, I was hoping for a more "Pythonic" solution. I was looking for a solution that will allow me to store Pandas dataframes fast and fetch them even faster -- all while keeping the data itself as <em>portable</em> as possible.</p>
<p>The closest solution I found was the very impressive <a href="https://github.com/manahl/arctic">Arctic library</a> by <a href="http://www.ahl.com/">Man AHL</a>, but it required me to run a MongoDB server, and the data wasn't very easily portable.</p>
<p>I finally ended up with a solution that may raise some eyebrows, but I feel that it works far better in the context of small to mid-sized trading operation.</p>
<p>The solution I chose was <strong><em>not using a database at all</em></strong>. 😲</p>
<p>You see, databases are designed to do a wide variety of things with data, many of which require checks and safety mechanisms to be implemented to do these things effectively and safely. This actually hurt the performance of what you are trying to do.</p>
<p>On the other hand, market timeseries data is unique, both in how it is used and how it is stored. The user <strong>drobertson</strong> explained it best in this <a href="https://quant.stackexchange.com/questions/29572/building-financial-data-time-series-database-from-scratch">Stack Overflow comment</a>:</p>
<blockquote>
<p>Market time series data is stored in a completely different way. In fact, I would say it is prepared rather than stored. Each data item only needs to be written once and after that never needs to be modified or changed. Data items can be written sequentially, there is no need to insert anything in the middle. It needs no ACID functionality at all. They have little to no references out to any other data. The time series is effectively its own thing.</p>
</blockquote>
<p>So... the solution was to use a flat-file database, using a binary file format where I can store Pandas dataframes, and that supports compression to save on disk space and make portability easier. Luckily, the <a href="http://parquet.apache.org/">Parquet file format</a> seemed to fit the bill just right :)</p>
<p>The next thing was to write a tool that will allow me to read and write such files in a "pythonic" way.</p>
<h3>Enters PyStore...</h3>
<p>I created <a href="https://github.com/ranaroussi/pystore">PyStore</a> to help me store and retrieve Pandas dataframes, and while it can store any Pandas object, it was designed with storing timeseries data in mind.</p>
<p>It's built on top of <a href="http://pandas.pydata.org/">Pandas</a>, <a href="http://numpy.pydata.org/">Numpy</a> and <a href="http://dask.pydata.org/">Dask</a> and stores the data in the <a href="http://parquet.apache.org/">Parquet file format</a> (via <a href="https://github.com/dask/fastparquet">Fastparquet</a>) in a hierarchical directory structure. Files are compressed using <a href="http://google.github.io/snappy/">Snappy</a>, a fast and efficient compression/decompression library from Google.</p>
<p>The end result?</p>
<p>A powerful, pythonic datastore for Pandas dataframes that can <strong>easily query millions of rows in sub-second speed</strong>.</p>
<p>PyStore provides namespaced collections of data. These collections allow bucketing data by source, user or some other metric (for example frequency: End-Of-Day; Minute Bars; etc.). Each collection (or namespace) maps to a directory containing partitioned parquet files for each item (e.g. symbol).</p>
<hr />
<h2>Getting started with PyStore</h2>
<p>Let's get started with PyStore by first installing it using <code>pip</code>:</p>
<pre><code class="language-bash bash">$ pip install PyStore</code></pre>
<p><strong>INSTALLATION NOTE:</strong> If installation fails, you probably need to install Snappy first (compression/decompression library). You can install Snappy C library with following commands:</p>
<ul>
<li>APT: <code>sudo apt-get install libsnappy-dev</code></li>
<li>RPM: <code>sudo yum install libsnappy-devel</code></li>
<li>Brew: <code>brew install snappy</code></li>
</ul>
<p>* Windows users should checkout <a href="https://snappy.machinezoo.com">Snappy for Windows</a> and <a href="https://stackoverflow.com/a/43756412/1783569">this Stackoverflow post</a> for help on installing Snappy and python-snappy.</p>
<hr />
<p>Next, let's get some market data to work with. We'll use Quandl's API to download 37+ years worth of historical data for Apple's stock.</p>
<pre><code class="language-python python">import quandl

aapl = quandl.get("WIKI/AAPL", authtoken="your token here")
aapl.head()</code></pre>
<p>Output should look something like this:</p>
<pre><code class="language-text text">             Open   High    Low  ...  Adj. Close  Adj. Volume
Date
1980-12-12  28.75  28.87  28.75  ...    0.422706    117258400
1980-12-15  27.38  27.38  27.25  ...    0.400652     43971200
1980-12-16  25.37  25.37  25.25  ...    0.371246     26432000
1980-12-17  25.87  26.00  25.87  ...    0.380362     21610400
1980-12-18  26.63  26.75  26.63  ...    0.391536     18362400</code></pre>
<p>Next, let's explore the <code>PyStore</code> library...
We'll start by importing it to our code.</p>
<pre><code class="language-python python">import pystore</code></pre>
<p>Next, we'll tell <strong>PyStore</strong> where to save our datastore.
This step is optional, and unless specified, the default path is set to <code>~/.pystore</code>).</p>
<pre><code class="language-python python"># Set storage path
pystore.set_path('/usr/share/pystore')</code></pre>
<p>We can get a list of datastores found this location. Since we're just getting started, all we'll get is an empty list.</p>
<pre><code class="language-python python"># List stores
pystore.list_stores()
# returns: []</code></pre>
<p>Now it's time to create our first datastore.</p>
<pre><code class="language-python python"># Connect to datastore (create it if not exist)
store = pystore.store('mydatastore')</code></pre>
<p>Now when we call <code>pystore.list_stores()</code> we'll get a list with our new datastore listed.</p>
<pre><code class="language-python python">pystore.list_stores()
# returns: ['mydatastore']</code></pre>
<p>Before we can save our APPL timeseries data, we need ao create a <strong>Collection</strong>.
As mentioned earlier, each collection (or namespace) maps to a directory containing partitioned parquet files for each item (e.g. symbol).</p>
<pre><code class="language-python python"># Access a collection (create it if not exist)
collection = store.collection('NASDAQ.EOD')

# List all collections in the datastore
store.list_collections()

# returns ['NASDAQ.EOD']</code></pre>
<p>Now we're ready to store our data. For demo purposes, we won't be storing the last row, which will be appended later. We'll also attach some metadata indicateing the data source.</p>
<pre><code class="language-python python"># Store the data in the collection under "AAPL"
%time collection.write('AAPL', aapl[:-1], metadata={'source': 'Quandl'})</code></pre>
<p>On my laptop (2015 Macbook Pro), saving 37+ worth of historical data took less than 16 milliseconds. Not too shabby.</p>
<pre><code class="language-text text">CPU times: user 14.5 ms, sys: 2.75 ms, total: 17.2 ms
Wall time: 15.8 ms</code></pre>
<p>To see all available items (symbols) in the collection, we'll use:</p>
<pre><code class="language-python python"># List all items in the collection
collection.list_items()

# returns: ['AAPL']</code></pre>
<p>Now let's see how long does it take to read the data:</p>
<pre><code class="language-python python"># Reading the item's data
%time item = collection.item('AAPL')
</code></pre>
<pre><code class="language-text text">CPU times: user 4.38 ms, sys: 1.11 ms, total: 5.49 ms
Wall time: 4.5 ms</code></pre>
<p><strong>4.5 milliseconds</strong>. NICE!</p>
<p>Let's take a closer look at the returned <code>item</code> object, specifically
the <code>data</code> property, which returns a <a href="http://dask.pydata.org/en/latest/dataframe.html">Dask dataframe</a> and the <code>metadata</code> property, which returns, well, the metadata.</p>
<pre><code class="language-python python"># Load AAPL Dask dataframe (see dask.pydata.org)
item.data</code></pre>
<p>(<strong>TL;DR;</strong> A Dask DataFrame is a large parallel dataframe composed of many smaller Pandas dataframes, split along the index. These pandas dataframes may live on disk for larger-than-memory computing on a single machine, or on many different machines in a cluster. One Dask dataframe operation triggers many operations on the constituent Pandas dataframes.)</p>
<pre><code class="language-python python"># Load AAPL metadata
item.metadata</code></pre>
<pre><code class="language-text text">{'source': 'Quandl', '_updated': '2018-06-05 16:04:56.203825'}</code></pre>
<p>To get the entire data as a Pandas dataframe, we call:</p>
<pre><code class="language-python python"># load data as Pandas dataframe
df = item.to_pandas()
df.tail()</code></pre>
<p>We should get something like this:</p>
<pre><code class="language-text text">              Open    High     Low  ...  Adj. Close  Adj. Volume
Date
2018-03-20  175.24  176.80  174.94  ...     175.240     19314039
2018-03-21  175.04  175.09  171.26  ...     171.270     35247358
2018-03-22  170.00  172.68  168.60  ...     168.845     41051076
2018-03-23  168.39  169.92  164.94  ...     164.940     40248954
2018-03-26  168.07  173.10  166.44  ...     172.770     36272617</code></pre>
<p>To check how fast we can read the data as a Pandas dataframe, we can run this code:</p>
<pre><code class="language-python python">%time collection.item('AAPL').to_pandas()</code></pre>
<pre><code class="language-text text">CPU times: user 7.28 ms, sys: 1.26 ms, total: 8.54 ms
Wall time: 7.57 ms</code></pre>
<p>It took <strong>7.57 milliseconds</strong> to read the data <em>and</em> convert it back into Pandas dataframe format on a 2015 Macbook Pro. Not too bad at all...</p>
<p>Let's append the last day (row) to our item:</p>
<pre><code class="language-python python"># Append a row to AAPL
collection.append('AAPL', aapl[-1:])
collection.item('AAPL').to_pandas().tail()</code></pre>
<p>We should see our new row added:</p>
<pre><code class="language-text text">              Open    High     Low  ...  Adj. Close  Adj. Volume
Date
2018-03-21  175.04  175.09  171.26  ...     171.270     35247358
2018-03-22  170.00  172.68  168.60  ...     168.845     41051076
2018-03-23  168.39  169.92  164.94  ...     164.940     40248954
2018-03-26  168.07  173.10  166.44  ...     172.770     36272617
2018-03-27  173.68  175.15  166.92  ...     168.340     38962839</code></pre>
<p>That's the basic stuff which should allow you get started using PyStore in no time.</p>
<p><strong>But there's more...</strong></p>
<p>After a while, you'll have many items stored, and you may want to look some of them up by metadata. To do this, simple add your metadata key to the <code>list_items</code> method:</p>
<pre><code class="language-python python"># Query avaialable symbols based on metadata
collection.list_items(source='Quandl')

# returns: ['AAPL']</code></pre>
<h3>Snapshot functionality</h3>
<p>When working with data, there will be times when you'll accidentally mess up the data, making it unusable. For that reason, PyStore allows you to create <em>snapshots</em> - a point-in-time, <em>named</em> reference for all current items in a collection.</p>
<p>Creating a snapshot is done using the <code>create_snapshot</code> method:</p>
<pre><code class="language-python python"># Snapshot a collection
collection.create_snapshot('snapshot_name')

# List available snapshots
collection.list_snapshots()

# returns ['snapshot_name']</code></pre>
<p>To see how snapshots work, let's change our original AAPL
to only include the <code>Close</code> and <code>Volume</code> columns.</p>
<pre><code class="language-python python"># Change the current dataset
collection.write('AAPL', aapl[['Close', 'Volume']],
                 metadata={'source': 'Quandl'},
                 overwrite=True)

# Load the "new" item
collection.item('AAPL').to_pandas().tail()</code></pre>
<p>As we can see, we've lost all data except for the <code>Close</code> and <code>Volume</code> columns.</p>
<pre><code class="language-text text">              Close    Volume
Date
2018-03-21  171.270  35247358
2018-03-22  168.845  41051076
2018-03-23  164.940  40248954
2018-03-26  172.770  36272617
2018-03-27  168.340  38962839</code></pre>
<p>However, we can load our snapshot data at any time using:</p>
<pre><code class="language-python python"># Get a version of a symbol given a snapshot name
snap_df = collection.item('AAPL', snapshot='snapshot_name')

snap_df.to_pandas().tail()</code></pre>
<p>And, Voilà, we can see our data again.</p>
<pre><code class="language-text text">              Open    High     Low  ...  Adj. Close  Adj. Volume
Date
2018-03-21  175.04  175.09  171.26  ...     171.270     35247358
2018-03-22  170.00  172.68  168.60  ...     168.845     41051076
2018-03-23  168.39  169.92  164.94  ...     164.940     40248954
2018-03-26  168.07  173.10  166.44  ...     172.770     36272617
2018-03-27  173.68  175.15  166.92  ...     168.340     38962839</code></pre>
<p>We can, of course, restore our data from the snapshot:</p>
<pre><code class="language-python python">collection.write('AAPL', snap_df.to_pandas(),
                 metadata={'source': 'Quandl'},
                 overwrite=True)</code></pre>
<p>Lastly, we'll delete the snapshot:</p>
<pre><code class="language-python python"># Delete a collection snapshot
collection.delete_snapshot('snapshot_name')

# To delete all snapshots, use:
# collection.delete_snapshots()</code></pre>
<p>To delete the collection and the datastore, run:</p>
<pre><code class="language-python python"># Delete the item from the current version
collection.delete_item('AAPL')

# Delete the collection
store.delete_collection('NASDAQ.EOD')</code></pre>
<p>That concludes this quick tutorial of <strong>PyStore</strong>.
I hope you'll find it useful as I do.</p>
<hr />
<h2>Speed test</h2>
<p>In the above example, we've used EOD data (9,400 rows). As you recall, the write time was 15.8 ms and the read time (to Pandas) was 7.57 ms.</p>
<p>Let's try writing and reading 5 years worth of <strong>minute level</strong> data for the VIX Futures continuous contract (2,319,867 rows).</p>
<pre><code class="language-python python"># Test write speed
%time collection.write('VX', vixdf)</code></pre>
<pre><code class="language-text text">CPU times: user 491 ms, sys: 148 ms, total: 639 ms
Wall time: 419 ms</code></pre>
<p>Writing obviuosly takes longer here, as we're dealing with 246 times more data.
But, still, 419 ms is not bad.</p>
<p>Let's see how long it takes us to read that amount of data.</p>
<pre><code class="language-python python"># Test read speed
%time collection.item('VIX')</code></pre>
<pre><code class="language-text text">CPU times: user 4.19 ms, sys: 2.24 ms, total: 6.42 ms
Wall time: 5.32 ms</code></pre>
<p>It took me <strong>5.32 milliseconds to reading 2,319,867 records</strong> on my Laptop.
But the big question, is how long will it take to read the data <em>and</em> convert it to Pandas dataframe?</p>
<p>Let's see:</p>
<pre><code class="language-python python"># Test read speed
%time collection.item('VIX').to_pandas()</code></pre>
<pre><code class="language-text text">CPU times: user 170 ms, sys: 79 ms, total: 249 ms
Wall time: 179 ms</code></pre>
<p>So... it takes PyStore <strong>179 milliseconds to read and parse 2,319,867 records</strong> . Now this is Impressive!</p>
<hr />
<p>Remember I mentioned portability earlier? Well, moving your datastore can't be easier. Simply copy your datastore directory (default is <code>~/.pystore/&lt;DATASTORE&gt;</code>) to an external drive to move it to a new machine.</p>
<p>For peaking inside your Parquet files, I recommend <a href="https://parquetviewer.com">Chip</a>, a lightweight parquet viewer.</p>
<hr />
<p><a href="https://pypi.org/pypi/pystore/">PyStore</a> is now available via <code>pip</code> or directly from <a href="https://github.com/ranaroussi/pystore">Github page</a>.</p>
<p>It currently works with local filesystem, and I plan on adding support for Amazon S3, Google Cloud Storage and Hadoop Distributed File System in the future.</p>
<p>Please let me know what you think!</p>]]></content:encoded>
      <category><![CDATA[trading]]></category><category><![CDATA[python]]></category><category><![CDATA[pandas]]></category><category><![CDATA[timesetries]]></category><category><![CDATA[code]]></category>
    </item>
    <item>
      <title>Volatility Index for Crypto Currency</title>
      <link>https://aroussi.com/post/bitcoin-vix</link>
      <pubDate>Sun, 24 Dec 2017 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/bitcoin-vix</guid>
      <description><![CDATA[<p>The <a href="http://www.cboe.com/products/vix-index-volatility/vix-options-and-futures/vix-index">CBOE Volatility Index</a> (Ticker: <a href="https://finance.yahoo.com/quote/%5EVIX?p=^VIX">VIX</a>) is a well known  measure of the stock market's expectation of volatility implied by S&amp;P 500 index options.</p>]]></description>
      <content:encoded><![CDATA[<p>The <a href="http://www.cboe.com/products/vix-index-volatility/vix-options-and-futures/vix-index">CBOE Volatility Index</a> (Ticker: <a href="https://finance.yahoo.com/quote/%5EVIX?p=^VIX">VIX</a>) is a well known  measure of the stock market's expectation of volatility implied by S&amp;P 500 index options.</p>
<p>The problem with the VIX is that its available for a very limited number of indicies. There are a few <em>Synthetic VIX</em> indicators out there, invluding <a href="https://www.ireallytrade.com/newsletters/VIXFix.pdf">Larry William's VIX Fix</a>
(which probably is the most famous attempt) and <a href="https://blog.sutherlandresearch.com/index.php/2017/05/27/engineering-a-synthetic-volatility-index/">this by PJ Sutherland</a>.</p>
<p>I've beem using my own version of the Synthetic VIX for a while (based of the work of the above links)
for Crypto Currencies (read Bitcoin) trading which great success, and I tought others can benefit from my work.</p>
<p>So over the weekend I've put up together a small website called <a href="http://ccvix.com"><strong>CCVIX</strong></a> (Crypto Currencies Volatility Index)
that shows the "VIX" for leading crypto-currencies, which I hope people will find useful.</p>
<p>The <strong>CCVIX</strong>  calculates the expectation of volatility implied by daily price changes on an hourly basis, and is used as a measure of market risk.</p>
<p><strong>Visit <a href="http://ccvix.com">CCVIX.com</a> &raquo;</strong></p>
<p>PS. Merry Christmas and Happy Holidays to all :)</p>]]></content:encoded>
      <category><![CDATA[trading]]></category><category><![CDATA[bitcoin]]></category><category><![CDATA[vix]]></category>
    </item>
    <item>
      <title>My Bitcoin Scalping Strategy</title>
      <link>https://aroussi.com/post/scalping-bitcoin</link>
      <pubDate>Wed, 01 Nov 2017 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/scalping-bitcoin</guid>
      <description><![CDATA[<p>Bitcoin has seen a tremendous growth in both price an trading volume this year. Noticing that, I’ve backtested a scalping strategy I normally use to trade interest rate futures on Bitcoin, and... it worked great with very minor modifications.</p>]]></description>
      <content:encoded><![CDATA[<p>Bitcoin has seen a tremendous growth in both price an trading volume this year. Noticing that, I’ve backtested a scalping strategy I normally use to trade interest rate futures on Bitcoin, and... it worked great with very minor modifications.</p>
<p><strong>UPDATE (NOV 27, 2017):</strong> I've decided to remove this post, and won't be making the strategy's
performance public anymore.</p>
<p><img src="https://aroussi.local//assets/img/btcusd.png" alt="Bitcoin Scalping Performance" /></p>
<h3>Q. Why did you stop publishing the stats?</h3>
<p><strong>A.</strong> My long/short Bitcoin startegy is performing very well (56% in October, 71% in November),
and I'm now trading it on a larger scale for a few large investors.</p>
<h3>Q. How can I invest in this strategy?</h3>
<!-- If you're interested in trading this strategy, please [contact me](mailto:ran@aroussi.com)
and I will be happy to provide more information, as well as an up-to-date performance report.
-->
<p><strong>A.</strong> If you're interested in trading this strategy, please verify your qualified investor status
by visiting <a href="http://btcqualify.me/?email=ran@aroussi.com&amp;addr=38EJbP8Skrq5cZHZ3YwS1sHitAX6kY87VZ&amp;min=5">BTCQualify.me</a>
and following the instructions. Once verified, I will be happy to provide more information,
as well as an up-to-date performance report. Performance fee is 20% of month-end returns.</p>]]></content:encoded>
      <category><![CDATA[trading]]></category><category><![CDATA[bitcoin]]></category>
    </item>
    <item>
      <title>Live Trading with Python: Webinar Recording, Slides and Notebook (III)</title>
      <link>https://aroussi.com/post/live-trading-with-python</link>
      <pubDate>Fri, 25 Aug 2017 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/live-trading-with-python</guid>
      <description><![CDATA[<p>I had a great time presenting yesterday's webinar about <strong>Live Trading with Python</strong>... This was the third out of a four-part webinar series on <strong>Treading With Python</strong> for <em>futures.io</em>'s members.</p>]]></description>
      <content:encoded><![CDATA[<p>I had a great time presenting yesterday's webinar about <strong>Live Trading with Python</strong>... This was the third out of a four-part webinar series on <strong>Treading With Python</strong> for <em>futures.io</em>'s members.</p>
<p>I showed how to scrape historical data for daily strategies, work with streaming data, and execute and monitor trades in real-time, and
it was full of examples using Interactive Brokers and Oanda FX.</p>
<p>Here's the webinar's recording, slides, and Jupyter notebook.</p>
<p>You can jump directly to the
<a href="https://github.com/ranaroussi/futuresio-webinars/blob/master/03-live-trading.ipynb">Jupyter notebook</a>
that's stored on this <a href="https://github.com/ranaroussi/futuresio-webinars">GitHub repository</a>,
along with a Python file which contains functions I've used during the webinars.</p>
<h4>Webinar recording:</h4>
<div class="oembed-wrapper"><div style="position:relative;height:0;padding-bottom:56.25%"><iframe  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen  style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;overflow:hidden" src="https://www.youtube.com/embed/fE1Op4Egi34?feature=oembed"></iframe></div></div>
<h4>Webinar slides:</h4>
<div class="slides-wrapper">
    <div style="">
        <iframe allowFullScreen="true" style="" scrolling="no" seamless="seamless" src="http://aroussi.com/futuresio/03-trading.html"></iframe>
    </div>
    Live Trading with Python
</div>
<p><a href="http://aroussi.com/futuresio/03-trading.html" target="_blank">Open slides in a new window</a></p>]]></content:encoded>
      <category><![CDATA[finance]]></category><category><![CDATA[trading]]></category><category><![CDATA[webinar]]></category><category><![CDATA[python]]></category><category><![CDATA[recording]]></category>
    </item>
    <item>
      <title>Backtesting Trading Strategies with (pure) Python: Webinar Recording, Slides and Notebook (II)</title>
      <link>https://aroussi.com/post/backtesting-trading-strategies-with-python</link>
      <pubDate>Fri, 26 May 2017 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/backtesting-trading-strategies-with-python</guid>
      <description><![CDATA[<p>On wednsday, I gave the second out of a four-part webinar series on <strong>Treading With Python</strong> for <em>futures.io</em>'s members. Here's the webinar's recording, slides, and Jupyter notebook.</p>]]></description>
      <content:encoded><![CDATA[<p>On wednsday, I gave the second out of a four-part webinar series on <strong>Treading With Python</strong> for <em>futures.io</em>'s members. Here's the webinar's recording, slides, and Jupyter notebook.</p>
<p>You can jump directly to the
<a href="https://github.com/ranaroussi/futuresio-webinars/blob/master/02-backtesting-and-optimization.ipynb">Jupyter notebook</a>
that's stored on this <a href="https://github.com/ranaroussi/futuresio-webinars">GitHub repository</a>,
along with a Python file which contains functions I've used during the webinars.</p>
<h4>Webinar recording:</h4>
<div class="oembed-wrapper"><div style="position:relative;height:0;padding-bottom:56.25%"><iframe  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen  style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;overflow:hidden" src="https://www.youtube.com/embed/uD4nokfTnAs?feature=oembed"></iframe></div></div>
<h4>Webinar slides:</h4>
<div class="slides-wrapper">
    <div style="">
        <iframe allowFullScreen="true" style="" scrolling="no" seamless="seamless" src="https://aroussi.com/futuresio/02-backtesting.html"></iframe>
    </div>
    Backtesting Trading Strategies with Python
</div>
<p><a href="https://aroussi.com/futuresio/02-backtesting.html" target="_blank">Open slides in a new window</a></p>]]></content:encoded>
      <category><![CDATA[finance]]></category><category><![CDATA[trading]]></category><category><![CDATA[webinar]]></category><category><![CDATA[python]]></category><category><![CDATA[recording]]></category>
    </item>
    <item>
      <title>You can still download data using Pandas Datareader using this quick hack</title>
      <link>https://aroussi.com/post/fix-yahoo-finance</link>
      <pubDate>Sun, 21 May 2017 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/fix-yahoo-finance</guid>
      <description><![CDATA[<p>As you may have heard, <a href="https://ichart.finance.yahoo.com/">Yahoo! finance</a> has decommissioned its historical data API, causing many programs that relied on it to stop working. However...</p>]]></description>
      <content:encoded><![CDATA[<p>As you may have heard, <a href="https://ichart.finance.yahoo.com/">Yahoo! finance</a> has decommissioned its historical data API, causing many programs that relied on it to stop working. However...</p>
<p>Today I've releases a small Python library called <code>fix-yahoo-finance</code> that aims to
offer a <strong><em>temporary fix</em></strong> to the problem by scraping the data from Yahoo! finance and
returning a Pandas DataFrame/Panel in the same format as <strong>pandas_datareader's</strong> <code>get_data_yahoo()</code> method.</p>
<h3>Here's how to use it</h3>
<pre><code class="language-python python">from pandas_datareader import data as pdr
import fix_yahoo_finance  # &lt;== that's all it takes :-)

# download dataframe
data = pdr.get_data_yahoo("SPY",
                          start="2017-01-01", end="2017-04-30")

# download Panel
data = pdr.get_data_yahoo(["SPY", "IWM"],
                          start="2017-01-01", end="2017-04-30")
</code></pre>
<p>I've also added some options to make life easier,
like groupping by ticker instead of OHLC and auto-adjustment of data
and option to return a Pandas Panel or a MultiIndex DataFrame.</p>
<p><strong>=></strong> Visit the <a href="https://github.com/ranaroussi/fix-yahoo-finance">Github repository</a>
for more info and installation instructions.</p>
<p><strong>*</strong> Note that this library in intented to be a <strong><em>temporary fix</em></strong> until the good fellas of
<a href="https://github.com/pydata/pandas-datareader">pandas-datareader</a> find a solution, or while
you update your code to work with a different data provider.</p>
<p>Enjoy!</p>
<hr />
<h3>Legal note:</h3>
<p><strong>Yahoo!, Y!Finance, and Yahoo! finance are registered trademarks of Yahoo, Inc.</strong></p>
<p>yfinance is not affiliated, endorsed, or vetted by Yahoo, Inc. It's an open-source tool that uses Yahoo's publicly available APIs, and is intended for research and educational purposes.</p>
<p><strong>You should refer to Yahoo!'s terms of use (<a href="https://policies.yahoo.com/us/en/yahoo/terms/product-atos/apiforydn/index.htm">here</a>,
<a href="https://legal.yahoo.com/us/en/yahoo/terms/otos/index.html">here</a>, and
<a href="https://policies.yahoo.com/us/en/yahoo/terms/index.htm">here</a>) for details on your rights to use the actual data downloaded. Remember - the Yahoo! finance API is intended for personal use only.</strong></p>
<hr />]]></content:encoded>
      <category><![CDATA[python]]></category>
    </item>
    <item>
      <title>Live Plotting in Python using Matplotlib and ZeroMQ</title>
      <link>https://aroussi.com/post/live-plotting-with-matplotlib-and-python</link>
      <pubDate>Tue, 04 Apr 2017 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/live-plotting-with-matplotlib-and-python</guid>
      <description><![CDATA[<p>While working on a new dashboard for <a href="https://github.com/ranaroussi/qtpylib">QTPyLib</a> I needed to get a <a href="http://matplotlib.org">Matplotlib</a> plot to refresh and update based on data coming from a <a href="http://zeromq.org">ZeroMQ</a> stream.</p>]]></description>
      <content:encoded><![CDATA[<p>While working on a new dashboard for <a href="https://github.com/ranaroussi/qtpylib">QTPyLib</a> I needed to get a <a href="http://matplotlib.org">Matplotlib</a> plot to refresh and update based on data coming from a <a href="http://zeromq.org">ZeroMQ</a> stream.</p>
<p>After going over the documentation and <a href="https://stackoverflow.com/questions/tagged/python">Stack Overflow</a>
I was finally able to get this working. To save others from the headache, I decided to post a working demo here as a public service.</p>
<p><strong>First, here's a quick example:</strong></p>
<video controls loop style="max-width:100%;" src="/assets/av/liveplot-teaser.mp4" type="video/mp4" poster="/assets/av/liveplot-teaser.jpg">
  Your browser does not support the video tag.
</video>
<p><strong>Peaked your interest? Good! Let's get started...</strong></p>
<p>We'll start with a simpler example than shown above.</p>
<p>In our example, we'll use <a href="http://zeromq.org">ZeroMQ</a>'s pub-sub architecture using 2 files:</p>
<ol>
<li><code>server.py</code> will download <a href="http://finance.yahoo.com/quote/SPY">SPY</a> daily market data from Yahoo! finance and then will "publish" using a socket</li>
<li><code>client.py</code> will listen on our server's port and will plot every new data point</li>
</ol>
<p><strong>Here's the code:</strong></p>
<p>The server (streamer)</p>
<pre><code class="language-python python">#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
server.py
download SPY data from Yahoo finance and stream it using ZeroMQ
"""

# import libraries
import zmq
import time
from pandas_datareader import data

# create the zmq context and socket and bind the socket to port 1234
socket = zmq.Context(zmq.REP).socket(zmq.PUB)
socket.bind("tcp://*:1234")

# get market data from yahoo
data = data.get_data_yahoo("SPY", start="2017-01-01")

# iterate over rows
for ix, _ in data.iterrows():
    # get row as dataframe
    row = data[data.index==ix]['Adj Close']

    # stream row as python object
    socket.send_pyobj(row)

    # wait 1 second
    time.sleep(1)
</code></pre>
<p>The Client (plotter)</p>
<pre><code class="language-python python">#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
client.py
listens on ZeroMQ's port and plot every new data point
"""

# import libraries
import zmq
import time
import matplotlib.pyplot as plt
import pandas as pd

# create the zmq client and listen on port 1234
socket = zmq.Context(zmq.REP).socket(zmq.SUB)
socket.setsockopt_string(zmq.SUBSCRIBE, '')
socket.connect('tcp://127.0.0.1:1234')

# create an empty dataframe that will store streaming data
df = pd.DataFrame()

# create plot
plt.ion() # &lt;-- work in "interactive mode"
fig, ax = plt.subplots()
fig.canvas.set_window_title('Live Chart')
ax.set_title("SPY, 2017")

# act on new data coming from streamer
while True:
    # receive python object
    row = socket.recv_pyobj()

    # append new row to dataframe
    df = pd.concat([df, row])

    # plot all data
    ax.plot(df, color='r')

    # show the plot
    plt.show()
    plt.pause(0.0001) # &lt;-- sets the current plot until refreshed

    # be nice to the cpu :)
    time.sleep(.1)</code></pre>
<p>Once you run both scripts you should see somehting like this:</p>
<video controls style="max-width:100%;" src="/assets/av/liveplot-code.mp4" type="video/mp4" poster="/assets/av/liveplot-code.jpg">
  Your browser does not support the video tag.
</video>
<p>* I recommend you run <code>client.py</code> first, so you won't miss plotting any data points :)</p>
<p>You can, of course, use any of the formatting options available in <a href="http://matplotlib.org">Matplotlib</a>, so let your imagination run wild.</p>]]></content:encoded>
      <category><![CDATA[python]]></category>
    </item>
    <item>
      <title>Prototyping Trading Strategies with Python - Slides, Notebook and Webinar Recording (I)</title>
      <link>https://aroussi.com/post/prototyping-trading-strategies</link>
      <pubDate>Tue, 28 Feb 2017 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/prototyping-trading-strategies</guid>
      <description><![CDATA[<p>Last week I had my first out of four webinars with <em>futures.io</em> about <em>Prototyping Trading Strategies with Python</em> and people seem to enjoy it :) I thought I'd share the webinar's slides, notebook and webinar recording here.</p>]]></description>
      <content:encoded><![CDATA[<p>Last week I had my first out of four webinars with <a href="http://futures.io">futures.io</a>
about <strong>Prototyping Trading Strategies with Python</strong> and people seem to enjoy it :)</p>
<p>I've created a new <a href="https://github.com/ranaroussi/futuresio-webinars">GitHub repository</a>
to store the Jupyter notebooks for this and future webinars in this series, or
<a href="https://github.com/ranaroussi/futuresio-webinars/blob/master/01-prototyping-trading-strategies-with.ipynb">jump directly to first webinar's notebook</a>.</p>
<h4>Webinar recording:</h4>
<div class="oembed-wrapper"><div style="position:relative;height:0;padding-bottom:56.25%"><iframe  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen  style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;overflow:hidden" src="https://www.youtube.com/embed/amV0G11symc?feature=oembed"></iframe></div></div>
<h4>Webinar slides:</h4>
<div class="slides-wrapper">
    <div style="">
        <iframe allowFullScreen="true" style="" scrolling="no" seamless="seamless" src="https://aroussi.com/futuresio/01-prototyping.html"></iframe>
    </div>
    <button><em class="icon-resize-full"></em></button>
    Prototyping Trading Strategies with Python
</div>
<p><a href="https://aroussi.com/futuresio/01-prototyping.html" target="_blank">Open slides in a new window</a></p>]]></content:encoded>
      <category><![CDATA[finance]]></category><category><![CDATA[trading]]></category><category><![CDATA[webinar]]></category><category><![CDATA[python]]></category><category><![CDATA[recording]]></category>
    </item>
    <item>
      <title>Analyzing Twitter Sentiment with Python</title>
      <link>https://aroussi.com/post/analyzing-twitter-sentiment-with-python</link>
      <pubDate>Sat, 18 Feb 2017 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/analyzing-twitter-sentiment-with-python</guid>
      <description><![CDATA[<p>I've recently launched a Twitter bot that posts a daily sentiment analysis for the S&amp;P500 Stock Market Index, and thought I'd share the gist of the code here.</p>]]></description>
      <content:encoded><![CDATA[<p>I've recently launched one of my weekend projects -
a Twitter bot that posts a daily sentiment analysis, along with some stats, for the <a href="https://www.google.com/finance?q=INDEXSP%3A.INX">S&amp;P500</a> Index (<a href="https://twitter.com/search?q=%24SPX&amp;src=ctag">$SPX</a> on Twitter).</p>
<p>The bot's Twitter account <del>is</del> was @spxfeelslike and, before I continue to explain what I did there, here's one of its actual tweets:</p>
<p>twitter.com/spxfeelslike/status/832907537188057090 <oembed src="https://twitter.com/spxfeelslike/status/832907537188057090"><a href="https://twitter.com/spxfeelslike/status/832907537188057090">https://twitter.com/spxfeelslike/status/832907537188057090</a></oembed></p>
<p>While my bot queries <a href="https://twitter.com">Twitter</a> and <a href="http://money.cnn.com/data/fear-and-greed/">CNN's Fear &amp; Greed Index</a>,
<strong>the heart of the code is the part that analyzes the sentiment of recent tweets</strong>. As it turns out - it's a very small piece of code :-)</p>
<p>The two main libraries used here are:</p>
<ol>
<li><a href="https://github.com/tweepy/tweepy">TweetPy</a> - for querying / posting to Twitter</li>
<li><a href="https://github.com/sloria/TextBlob/">TextBlob</a> - for text processing</li>
</ol>
<p>I won't go into too much details on the Twitter querying part of the code as it is pretty self-explanatory.</p>
<p>Rather, I'll focus on the sentiment part, which is basically 1 line of code (not counting the import section):</p>
<pre><code class="language-python python">from textblob import TextBlob
sentiment = TextBlob("Gotta love Python").sentiment</code></pre>
<p>Once ran, <code>sentiment</code> will have 2 properties:</p>
<ol>
<li><code>subjectivity</code> - indicates whether a sentiment was even detected a sentiment in the provided text</li>
<li><code>polarity</code> - ranks the positive sentiment of the text, and ranges from -1 (extremely netagive) to 1 (extremely positive)</li>
</ol>
<p>As you can see, once we have a list of tweets, all that's left to do is to
count the total number of tweets with determined sentiment and the total number of <em>positive tweets</em>,
and then simply calculate the <em>ratio</em> of positive tweets to total valid tweets.</p>
<p>Here's a full working code:</p>
<pre><code class="language-python python">#!/usr/bin/env python
# -*- coding: utf-8 -*-

import tweepy
from textblob import TextBlob

# your Twitter app credentials
_CONSUMER_KEY = "..."
_CONSUMER_SECRET = "..."
_ACCESS_TOKEN = "..."
_ACCESS_TOKEN_SECRET = "..."

# keyword to query
keyword = "$SPX"

# -----------------------------------
if __name__ == "__main__":

    # twitter authentication
    oauth = tweepy.OAuthHandler(_CONSUMER_KEY, _CONSUMER_SECRET)
    oauth.set_access_token(_ACCESS_TOKEN, _ACCESS_TOKEN_SECRET)
    twitter_api = tweepy.API(oauth)

    # get latest 100 tweets containing the phrase $SPX
    tweets = twitter_api.search(keyword, count=1000)

    # parse sentiment
    valid = 0 # counter for tweets with a determined sentiment
    positive = 0 # counter for positive tweets

    for tweet in tweets:
        text = TextBlob(tweet.text).sentiment
        if text.subjectivity != 0:
            valid += 1
            positive += (text.polarity &gt; 0)

    # sentiment ratio
    sentiment = positive / valid

    # construct tweet
    tweet = "Sentiment for %s is %.2f%%" % (keyword, (sentiment * 100))

    # to actually tweet, uncomment this line:
    # twitter_api.update_status(status=tweet)

    # for now, just print out the tweet
    print(tweet)</code></pre>
<p>Output would look something like this:</p>
<pre><code class="language-text text">Sentiment for $SPX is 52.12%</code></pre>
<p>* Use the above code with caution and enjoy...</p>]]></content:encoded>
      <category><![CDATA[python]]></category>
    </item>
    <item>
      <title>Hello World?</title>
      <link>https://aroussi.com/post/hello-world</link>
      <pubDate>Thu, 16 Feb 2017 00:00:00 +0000</pubDate>
      <dc:creator>Ran Aroussi</dc:creator>
      <guid isPermaLink="false">https://aroussi.com/post/hello-world</guid>
      <description><![CDATA[<p>I was thinking going back to blogging for a while, but...</p>]]></description>
      <content:encoded><![CDATA[<p>I was thinking going back to blogging for a while, but...</p>
<p>On one hand, I occasionaly feel the need to write something longer than a <a href="https://twitter.com/aroussi">tweet</a>,
but on the other hand I didn't want to commit to blogging, and the last thing I want is another wasteland of a website.</p>
<p>So, I made a compromise... I'll try writing every 1-2 weeks and, if I can't hack it, I'll just shut the whole thing down.</p>
<p>Best of luck to me!</p>]]></content:encoded>
      
    </item>
  </channel>
</rss>