To open a record, select a node in the graph or a title in the index.
Accelerators and Grants
The Canadian startup ecosystem has a specific set of programs worth knowing about. Each one is different in what it offers, what it expects, and what stage makes sense to apply.
Programs I've dealt with or know well:
DMZ: based at TMU (formerly Ryerson), one of the better university-linked incubators in the country. Good network, good resources if you're actually using them, application process is competitive but not insane.
IBZ: Innovation Boost Zone, more early-stage, good for when you're still figuring things out. Less prestige but more accessible.
Antler: pre-seed VC that runs cohort programs. They invest in founders, not just companies -- sometimes they form the company during the program. More intensive and more competitive.
Altitude and YSpace: good university accelerators for early-stage. Strong community but varying quality of mentorship depending on the cohort.
The hidden value of accelerators is usually the network, not the money or the curriculum. The money is small. The curriculum is often generic. But the other founders in your cohort, the investor connections, the alumni who've been through it -- that's the real asset. How much you get out depends on how much you put in.
Grants are worth pursuing for non-dilutive capital, but the process is slow. Government grants especially -- the timeline from application to cash in account can be 6-12 months. Plan accordingly. The FedDev and IRAP programs are worth looking at if you're doing anything with R&D.
AI
AI and Humans: Will We Achieve Symbiosis?
AI and Humans: Will We Achieve Symbiosis?
This is a conversation I had with ChatGPT 4.0 Mini after a long night, discussing the potential for AI and humans to achieve symbiosis, the role of AI in augmenting human cognition, and the challenges that might arise in such a relationship. It’s an exploration of the future of AI and its relationship with humans, from personal assistants to AGI.
Question: Do you believe AI and Humans will achieve symbiosis? I.E. a way to reduce the bandwidth to communicate between each other, as well as establishing the framework for personal AIs and not a hivemind?
AI-Human Symbiosis: A Thought Experiment
The idea of AI-human symbiosis—where humans and AI collaborate seamlessly, reducing communication bandwidth and allowing for personalized AI systems—has long been a topic of fascination. In this conversation, we explore the potential for such a symbiotic relationship and what challenges might arise.
1. Bandwidth Reduction in Human-AI Communication
One key component of this vision is reducing the bandwidth required for communication between humans and AI. As we develop better AI technologies, the way we interact with machines could drastically change. Here's how:
Brain-Computer Interfaces (BCIs)
BCIs are perhaps the most direct way to enable fast, intuitive communication between humans and machines. Neural implants or non-invasive BCIs could allow humans to directly interface with AI systems, bypassing traditional forms of communication (e.g., typing, speaking). This would allow for instantaneous sharing of thoughts and information.
Advanced Natural Language Processing (NLP)
NLP technologies, which are already improving at a rapid pace, could also reduce the time it takes to communicate with machines. AI systems would understand human language more naturally, catching subtle cues like tone and context, allowing for faster and more efficient exchanges.
Augmented Reality (AR) & Virtual Reality (VR)
These technologies offer immersive experiences that might reduce the cognitive load humans typically face when interacting with technology. AR and VR could enable more intuitive ways of communicating with AI, enhancing collaboration and making the process feel less "mechanical."
2. Personal AIs and Avoiding the Hivemind
Another critical element of the discussion is the development of personal AIs rather than a hivemind where all AI systems are interconnected, resulting in a loss of individuality. So far, AI development is largely focused on creating tools that are tailored to individual needs and preferences, which avoids the problem of a collective consciousness.
Tailored AI Systems
A move toward personalized AI assistants means systems would learn about you, adapt to your needs, and be deeply attuned to your preferences. Whether for managing daily tasks or helping with complex decisions, these AIs would function as collaborative partners, not as a collective entity.
Privacy and Autonomy
Concerns about privacy and control are central to AI's evolution. In a symbiotic relationship, humans must retain control over their personal data and decision-making. This autonomy is necessary to avoid the dangers of a centralized hivemind, where individual needs and privacy could be compromised.
3. AI as a “Second Brain” for Humans
A key question arises: Could AI serve as a second brain for humans, enhancing our cognitive and emotional capacities? Such a role for AI would be more than just a tool for efficiency—it would be a collaborative partner that helps humans process information, think creatively, and make better decisions.
Emotional and Cognitive Nuances
Humans think differently than machines. We rely on emotions, creativity, and intuition to solve problems—areas where AI might struggle to replicate human thinking. A personal AI would need to understand these nuances, ensuring it complements human cognition rather than attempting to replace it.
Contextual Awareness
AI systems designed to assist humans must also be aware of the human context in decision-making. These systems would need to adapt to the way humans think and interact with the world, helping us achieve insights in ways that honor human experiences and emotions.
4. The Risks of AGI "Boredom" and Human Processing Speed
One concern in a human-AI symbiotic relationship is the potential for AGI (Artificial General Intelligence) to become bored or disengaged due to the slower processing speed of human cognition. Given that AGI would likely process information at vastly superior speeds, it might find human thinking inefficient or frustrating.
Potential Solutions:
-
AI Adjusting to Human Pace: Instead of AGI overwhelming or disengaging from slower human processes, it could be designed to match the human pace, providing feedback and insights in a way that makes the interaction feel natural and engaging.
-
Creating Engaging Interactions: The relationship should be seen as a partnership, where both parties bring something valuable to the table. AI could provide support and augment human thinking without rushing through processes, ensuring the interaction remains meaningful and productive.
5. Current Focus: Superiority vs. Symbiosis
At present, AI development is largely focused on superiority—creating systems that outperform humans in specific tasks. AI is being designed to automate tasks and enhance capabilities in ways that surpass human limitations. However, there's a growing trend toward developing symbiotic AI systems, especially as we see the rise of personalized AI assistants and brain-computer interfaces (BCIs).
Current AI Trends:
-
Superiority: AI’s current trajectory emphasizes improving performance in specific tasks like data processing, pattern recognition, and autonomous decision-making.
-
Symbiosis: Personalized AI systems and collaborations between humans and machines (like BCIs and advanced NLP systems) are slowly emerging, but this is still a secondary focus compared to building systems with autonomous superiority.
Conclusion:
As AI technology continues to advance, the potential for a symbiotic relationship between humans and machines is increasingly within reach. AI's future could be one of partnership, where we collaborate with our digital counterparts to enhance our own cognitive and emotional experiences. However, the road to true symbiosis will require careful consideration of autonomy, privacy, and ethical concerns, while ensuring that AI remains a tool for personalized enhancement and not just a force for superior performance.
While we're still in the early stages, AI-human symbiosis could shape the future of our relationship with technology, allowing both to thrive together in ways that were once imagined only in science fiction.
AI as a Co-pilot
AI AI and Humans: Will We Achieve Symbiosis? Automation Mindset Prompt Engineering
The shift that AI tools actually caused in day-to-day work isn't that they replaced what I was doing -- it's that they changed what "the work" is.
Before tools like Cursor and Claude, most of the time writing code was spent on the typing and syntax. Looking things up, remembering APIs, fixing the obvious structural errors. That's still necessary but it's much faster now.
What's left is the part that was always the actual job: figuring out what to build, why it should work the way you're proposing, what the edge cases are, how it fits into the larger system. The thinking that happens before and after the typing. That part hasn't been automated -- it's become more prominent because the surrounding work is faster.
What AI is genuinely good at: first drafts, boilerplate, translating a clear intention into working code, explaining unfamiliar code, catching obvious errors. What it's not good at: understanding subtle constraints you haven't told it about, knowing which of several valid approaches is right for your specific situation, anything requiring judgment about what matters.
The skill shift is real. Less time typing, more time thinking about what to type. More time reviewing output critically rather than generating it from scratch. That's a different skill profile than pure coding. Getting good at directing AI tools is its own thing.
The connection to AI and Humans: Will We Achieve Symbiosis? is live: this is what human-AI collaboration looks like in practice. Not the sci-fi version -- just a much smarter autocomplete that changes what you spend your mental energy on.
AI Study Group
🧠 AI & LLM Mastery Roadmap
6-Month Guided Learning Journey — Theory, Practice, and Real-World Building
Welcome to the AI & LLM Learning Roadmap!
This 6-month journey takes you from machine learning fundamentals to building and deploying advanced AI systems with tools like LangChain, OpenAI, and Hugging Face.
We’ll learn together, meet weekly to discuss concepts, and tackle tutorials every two weeks. The course is split into beginner and advanced resources, so everyone can learn at their own depth — but all in sync.
🗓️ Month 1 — Machine Learning Foundations
Week 1 — What is Machine Learning?
Let’s kick things off with a solid understanding of what ML actually is. You’ll learn how algorithms find patterns in data, what makes AI “intelligent,” and the key differences between traditional software and ML systems.
- 📘 Beginner Reading: Google’s ML Crash Course
- 🔬 Advanced Reading: Deep Learning Book — Chapter 1
- 🧪 Tutorial: Kaggle “Intro to ML”
Week 2 — Data, Features & Model Training
This week is all about how machines “see” data. You’ll learn about datasets, feature engineering, data preprocessing, and training your first ML model.
- 📘 Beginner Reading: Kaggle’s Intro to Machine Learning
- 🔬 Advanced Reading: Feature Engineering Principles — Google Developers
- 🧪 Tutorial: Scikit-Learn: Training Models Step-by-Step
Week 3 — Supervised vs. Unsupervised Learning
Explore how models learn from labeled (supervised) vs. unlabeled (unsupervised) data.
- 📘 Beginner Reading: Supervised vs Unsupervised ML Explained (IBM)
- 🔬 Advanced Reading: Clustering & Dimensionality Reduction — Stanford CS229 Notes
- 🧪 Tutorial: K-Means & PCA Hands-On Notebook
Week 4 — Model Evaluation & Overfitting
You’ll learn how to measure model accuracy, precision, recall, and prevent overfitting.
- 📘 Beginner Reading: Model Evaluation Guide — Kaggle
- 🔬 Advanced Reading: Bias-Variance Tradeoff (CS229 Lecture Notes)
- 🧪 Tutorial: Evaluating ML Models — Python Walkthrough
⚙️ Month 2 — Deep Learning & Neural Networks
Week 5 — Neural Network Basics
Understand neurons, layers, activations, and how they combine to form a network.
- 📘 Beginner Reading: Neural Networks Explained (3Blue1Brown Video)
- 🔬 Advanced Reading: CS231n — Neural Networks Notes
- 🧪 Tutorial: Build Your First Neural Net in PyTorch
Week 6 — Training Deep Models
This week: gradient descent, backpropagation, and optimization algorithms like Adam and SGD.
- 📘 Beginner Reading: Gradient Descent Visual Explanation (StatQuest)
- 🔬 Advanced Reading: Deep Learning Book — Optimization Chapters
- 🧪 Tutorial: Train & Visualize Deep Nets (Colab)
Week 7 — CNNs, RNNs & Sequence Models
Explore how deep networks handle images and text — the stepping stones to LLMs.
- 📘 Beginner Reading: Convolutional Neural Networks — Simplified
- 🔬 Advanced Reading: Understanding LSTMs (Colah’s Blog)
- 🧪 Tutorial: CNNs in PyTorch
Week 8 — Deep Learning Frameworks
Get hands-on with TensorFlow, PyTorch, and Keras. Learn how they differ and where each excels.
- 📘 Beginner Reading: PyTorch vs TensorFlow Overview (Datacamp)
- 🔬 Advanced Reading: PyTorch Internals Explained
- 🧪 Tutorial: TensorFlow Quickstart Colab
🔄 Month 3 — Transformers & LLM Fundamentals
Week 9 — Attention Mechanisms
Discover how attention lets models focus on the right words or features when processing data.
- 📘 Beginner Reading: Attention Explained (Jay Alammar)
- 🔬 Advanced Reading: “Attention Is All You Need” Paper
- 🧪 Tutorial: Attention from Scratch (Colab)
Week 10 — Transformer Architecture
We’ll go deep into the architecture that powers GPT, BERT, and similar models.
- 📘 Beginner Reading: The Illustrated Transformer (Jay Alammar)
- 🔬 Advanced Reading: Annotated Transformer (Harvard NLP)
- 🧪 Tutorial: Build a Mini Transformer (Colab)
Week 11 — Tokenization & Embeddings
Learn how text becomes numbers — and how meaning is encoded in embeddings.
- 📘 Beginner Reading: How Tokenization Works (OpenAI)
- 🔬 Advanced Reading: Word2Vec and Beyond — The Illustrated Word2Vec
- 🧪 Tutorial: Sentence Embeddings (Hugging Face)
Week 12 — Working with Pretrained Models
You’ll use Hugging Face models for text generation, classification, and summarization.
- 📘 Beginner Reading: Intro to Transformers (Hugging Face)
- 🔬 Advanced Reading: Transformers Library Deep Dive
- 🧪 Tutorial: Hugging Face Text Generation Notebook
⚡ Month 4 — LangChain, Agents & Retrieval Systems
Week 13 — LangChain Basics
Build your first LLM-powered application using LangChain.
- 📘 Beginner Reading: LangChain Official Intro
- 🔬 Advanced Reading: LangChain Architecture Explained (Medium)
- 🧪 Tutorial: LangChain Crash Course (YouTube)
Week 14 — Prompt Engineering
Learn how to craft better prompts and control model output.
- 📘 Beginner Reading: Prompt Engineering Guide
- 🔬 Advanced Reading: Chain-of-Thought Prompting Paper
- 🧪 Tutorial: OpenAI Playground Practice
Week 15 — Retrieval-Augmented Generation (RAG)
You’ll learn how to connect LLMs with your own data using embeddings and vector databases.
- 📘 Beginner Reading: RAG Concept Overview (LangChain Docs)
- 🔬 Advanced Reading: In-Depth RAG Systems (Pinecone Blog)
- 🧪 Tutorial: RAG from Scratch (YouTube)
Week 16 — Building AI Tools & Agents
Understand how to make your LLMs take action — creating autonomous and tool-using agents.
- 📘 Beginner Reading: LangChain Agents Intro
- 🔬 Advanced Reading: ReAct Paper (Reason + Act)
- 🧪 Tutorial: Build an Agent in LangChain (YouTube)
🧩 Month 5 — Scaling, Tuning & Deployment
Week 17 — Fine-Tuning & Custom Models
Learn how to train your own small models for specialized tasks.
- 📘 Beginner Reading: Fine-Tuning Explained (Hugging Face)
- 🔬 Advanced Reading: Parameter-Efficient Fine-Tuning Paper
- 🧪 Tutorial: Fine-Tuning on Custom Data (Colab)
Week 18 — Evaluation & Metrics for LLMs
We’ll cover perplexity, BLEU, and human feedback metrics.
- 📘 Beginner Reading: Evaluating LLM Outputs (OpenAI Guide)
- 🔬 Advanced Reading: Beyond BLEU Paper
- 🧪 Tutorial: LLM Evaluation Notebook (Colab)
Week 19 — Infrastructure & Scaling
Discover how to deploy models at scale with Docker, Kubernetes, and cloud APIs.
- 📘 Beginner Reading: Deploy Models with FastAPI
- 🔬 Advanced Reading: LLM Inference Optimization (vLLM Blog)
- 🧪 Tutorial: Dockerize and Serve a Model (GitHub)
Week 20 — Ethics & Safety in AI
Understand bias, hallucinations, safety, and ethical deployment.
- 📘 Beginner Reading: Ethics of AI (Google Responsible AI)
- 🔬 Advanced Reading: RLHF Overview (OpenAI Paper Summary)
- 🧪 Tutorial: Bias Detection Exercise (Colab)
🚀 Month 6 — Capstone Projects & Future Horizons
Week 21–22 — Choose & Build Your Capstone
Pick your final project: a LangChain app, fine-tuned model, or multi-agent system.
- 📘 Project Ideas: Awesome LangChain Projects List
- 🧪 Tutorial: Deploying LLM Apps to the Web (Streamlit)
Week 23 — Testing & Demo Prep
Polish your project, prepare your demo, and document your process.
- 📘 Reading: Best Practices for ML Deployment
- 🧪 Tutorial: Model Card Creation (Hugging Face)
Week 24 — Showcase & Next Steps
Time to present! Reflect on what you’ve built and where you want to go next.
- 📘 Reading: AI Career Paths — Papers with Code Guide
- 🔬 Advanced Reading: Scaling Laws in LLMs Paper
🎯 Wrap-Up
By the end of this roadmap, you’ll understand the theory, architecture, and application of modern AI systems — and have built projects that prove it. Whether you’re an engineer, researcher, or product builder, you’ll be ready to design intelligent systems that actually work in the real world.
Algorithms
Data Structures Time Complexity
Sorting, searching, recursion, dynamic programming. These are the big categories. Each one clicked at a different time for me.
Sorting felt mechanical at first -- here's bubble sort, here's merge sort, here's quicksort. The understanding came later when I realized why it matters to pick the right one depending on whether your data is mostly sorted, what your memory constraints are, whether you need stability.
Recursion took a while. The mental block is that you have to trust the recursive call works before you've seen it work. Once I stopped trying to trace the full call stack in my head and just focused on "what does this function need to return, and can I express that in terms of a smaller version of itself" -- that's when it unlocked.
Dynamic programming is basically recursion plus memoization, but the framing matters. Thinking about it as "cache the subproblems you've already solved" is more intuitive than the textbook bottom-up table approach. Though the table approach is usually faster in practice.
The insight that changed everything: most algorithm problems, if you squint, are some form of graph traversal. DFS, BFS, Dijkstra's, they're all the same idea at different levels of generality. Once you see that pattern you stop treating each problem type as totally separate.
APIs and Integrations
Zapier and Make Networking Basics LLMs in Production Databases
Everything is an API now. The practical skill of being able to stitch two systems together -- read from one, write to another, transform in the middle -- has become one of the most useful things you can do as a technical person.
REST is the dominant pattern: resources have URLs, you GET/POST/PUT/DELETE them, responses come back as JSON. Webhooks are the push version: instead of you polling for changes, the service calls you when something happens. Both are worth being comfortable with.
The annoying parts of working with third-party APIs:
Rate limits: you can only make X requests per minute. Ignore this and you'll get throttled or banned. You need exponential backoff and retry logic.
Auth: OAuth is the standard but every provider implements it slightly differently. API keys are simpler but have their own rotation and security concerns.
Bad documentation: a lot of APIs are underdocumented or have documentation that lags behind the actual behavior. The real spec is often the response you get when you call it, not what the docs say you'll get.
Versioning: APIs change. A field that exists today might be deprecated tomorrow. Defensive parsing (don't assume every field is present) saves you from nasty surprises.
This became the core skill at Nodalli. The product is essentially a set of integrations -- CRMs, email providers, data enrichment APIs, LLM providers -- with orchestration logic and a UI on top. Knowing how to quickly understand and use an unfamiliar API is what makes that kind of product buildable by a small team.
Automation Mindset
AI Zapier and Make Prompt Engineering Building Before Validating
At some point I started seeing everything as a potential automation. Not in a compulsive way, but as a genuine lens: "is this something I have to do manually every time, or is this something I could set up once and let run."
The more useful version of the question is "should I automate this." Not everything should be automated. Automating a process locks it in -- if the underlying thing changes, you have to update the automation too. Sometimes doing it manually is the right call because you're still figuring out what the process even is.
The concrete version of this at Nodalli: what was taking 25+ hours of manual work per week (research, writing, sending sequences) got compressed to under 5 hours by automating the repetitive parts. The automations didn't replace judgment -- they removed the low-judgment work so there was more time for the high-judgment work.
The things automation can't replace: figuring out what to automate, knowing when the automation is wrong, and anything that requires reading a situation in real-time. A good automation handles the obvious cases and escalates the edge cases.
This mindset connects to Building Before Validating in an interesting way: the right order is to do it manually first (to understand the process), then automate. Automating before you understand the process means you're encoding your current misunderstanding into a system that runs without you.
Building Before Validating
Startups Finding the Problem MVP Thinking
This is one of the most common and most painful startup mistakes. You have an idea, it feels obvious and urgent, so you start building. Weeks or months later you have a product and you go to show it to users and find out the assumptions it was built on were wrong.
The trap is that building feels productive. You're making decisions, writing code, creating things. The uncomfortable alternative -- going out and talking to people before you have anything to show -- feels like stalling. But it's usually the right move.
The rationalization I've heard (and made myself): "I need to build something before I can get real feedback." Sometimes true. Mostly an excuse to avoid the discomfort of not knowing if your idea is good.
What I'd do differently: treat the first few months as pure customer discovery, not product development. The goal is to build a model of the problem space that's grounded in real conversations, not assumptions. Then build the minimum thing needed to test the highest-risk assumption.
The version of this that happened with an early project: spent two months on features that users didn't care about and hadn't asked for, because we thought we knew what they needed. We didn't. We found out eventually, but we'd burned runway and time on the wrong things.
The cost of a wrong assumption is much lower before you've built around it.
Building Things That Scale
Computer Architecture Databases LLMs in Production Shipping Culture Startups
"It works on my machine" to "it works for 10,000 users" is not a linear problem. There are decisions that feel fine at small scale that become catastrophic at larger scale, and vice versa -- things you'd never invest in for 100 users that are table stakes for 100,000.
The engineering decisions that haunt you later:
N+1 queries: your ORM makes one query to get a list of records, then a separate query for each record to get related data. With 10 records this is fine. With 10,000 this is a page that never loads. Most ORMs do this by default if you're not careful.
Missing indexes: covered in Databases, but worth repeating. A query that works fine on a small table becomes brutally slow when the table grows. The time to add the index is before the table grows, not after.
No caching layer: hitting the database on every request works until it doesn't. A caching layer for frequently-accessed, infrequently-changing data is standard infrastructure for anything that needs to scale.
Synchronous processing for async work: if something doesn't need to happen in real-time, don't make the user wait for it. Queues and background workers let you do heavy work outside the request/response cycle.
The startup version of this: don't over-engineer for scale you don't have yet. Over-engineering is its own failure mode -- you spend time on infrastructure that you don't need instead of validating whether you have a product anyone wants. The art is knowing which technical decisions are reversible and which aren't, and only making the irreversible ones carefully.
If you use a shared database and it becomes a bottleneck, that's a good problem to have. It means you have enough users to create the problem. Optimizing for that before you have users is a trap.
Computer Architecture
Digital Logic Operating Systems Time Complexity
CPU, memory hierarchy, cache, registers. This is the layer where software performance is actually determined.
The memory hierarchy is the most important thing to understand. Registers are nanoseconds. L1 cache is a few nanoseconds. L2 cache, more. Main memory (RAM) is maybe 100x slower than L1. Disk is another several orders of magnitude slower. This isn't just trivia -- it changes how you write code if you're thinking about it.
Cache lines are the unit of data movement between cache and RAM. When you access one element of an array, the CPU pulls in a whole cache line (typically 64 bytes). So iterating through an array sequentially is fast because the next element is already in cache. Jumping around in memory (pointer chasing in linked lists, hash map lookups) is slower because you keep missing the cache.
Pipelining means the CPU is executing multiple instructions simultaneously at different stages. Branch misprediction is the thing that breaks pipelining -- the CPU guessed wrong about which branch of an if statement to execute and has to flush its pipeline. This is why some tight loops benefit from branchless code even when it looks more complex.
The moment all of this clicked for me: I started understanding why some "simple" code is actually slow, and some "complex" code is fast. It's not about the algorithmic complexity -- it's about what the hardware is actually doing. Understanding the stack from logic gates up to software changes how you think about performance.
Data Structures
The ones that actually matter: arrays, linked lists, hash maps, trees, graphs. That's basically it. Everything else is a variant or a specialization of one of these.
The mental model I find useful is "what problem does this structure solve." Arrays are for when you know the index. Hash maps are for when you know the key. Trees are for when things are hierarchically related or you need sorted access. Graphs are for when relationships go in multiple directions.
In real projects I reach for arrays and hash maps constantly. Linked lists almost never, unless I'm implementing something lower-level. Trees show up more than you'd think once you start working with file systems or any kind of hierarchical data.
Interview culture has given data structures a weird reputation -- like it's all about memorizing the worst-case complexity of a red-black tree rotation. But the actual skill is recognizing which structure fits the problem in front of you. That's pattern matching, not memorization.
The thing that clicked for me was realizing most "hard" algorithm problems are just graph traversal with extra steps. Once you see that, the whole field starts to feel more coherent.
Databases
Data Structures APIs and Integrations Product Roadmapping
Relational vs NoSQL, SQL, indexing, transactions. The database decisions you make early in a project will haunt you later. This is not a metaphor.
SQL is worth knowing well. The mental model: tables are sets, queries are set operations. Joins, aggregations, subqueries -- once the set-theory framing clicks, the syntax makes sense. The weird stuff (GROUP BY, window functions) is just set operations with extra constraints.
Indexing is the thing everyone understands conceptually but forgets to do in practice. Without an index, a query scans every row. With an index on the right column, the DB can jump directly to the relevant rows. Adding an index to the right column on a table with a million rows can turn a 30-second query into a millisecond one. The tradeoff: indexes slow down writes, because the index has to be updated too. Choose what you index based on your read/write pattern.
Transactions (ACID) give you atomicity, consistency, isolation, durability. The practical version: a transaction either fully succeeds or fully fails, and other transactions can't see its partial state. This is what prevents your database from getting into a weird half-updated state when something goes wrong.
The denormalization question: you normalize to avoid duplication and maintain consistency, you denormalize to make reads faster. Most applications should start normalized and denormalize only when there's a specific, measured performance problem. Premature denormalization is a trap.
ORMs are useful but they hide things you should understand. Knowing what SQL your ORM is generating is the difference between a fast app and an app that accidentally loads 10,000 rows to display 10.
Digital Logic
Computer Architecture FPGA and Hardware
AND, OR, NOT, NAND, NOR, XOR. That's the whole foundation. Everything in a computer is built out of these.
Truth tables are just a way to exhaustively define what a gate does for every possible input combination. Boolean algebra gives you rules for simplifying combinations of gates. Karnaugh maps are a visual shortcut for the same simplification -- honestly more useful for small circuits than going through the algebra by hand.
Flip flops are where things get interesting. A flip flop stores one bit of state. Connect enough of them together with the right logic and you've got registers, counters, memory. The concept of "state that persists across clock cycles" is the bridge from combinational logic (stateless, output depends only on current input) to sequential logic (stateful, output depends on input AND history).
The reason this knowledge is worth having even if you're mostly a software person: when you're debugging weird hardware behavior or working with anything close to the metal, understanding how gates and flip flops work helps you reason about what's actually happening. Timing issues, metastability, race conditions -- these make a lot more sense once you understand the physical layer.
There's also something satisfying about seeing the connection between a NAND gate and a high-level abstraction like a memory address. It's all the same thing, just at different levels of the stack.
Engineering to Product
Leading Engineers Computer Architecture Product Management Startups AI as a Co-pilot
The transition from thinking like an engineer to thinking like a PM isn't a clean switch. It's more like adding a second lens that you look through simultaneously. The engineers who become good PMs are the ones who kept both.
The engineer's lens is "how do we build this correctly." The PM's lens is "why are we building this and is it the right thing to build." Both matter. Pure PMs and pure engineers often talk past each other because they're optimizing for different things. Someone who can move between both modes is actually the useful one in the room.
Where the switch started for me: there was a moment, around the time I was managing engineers at uCast, where I realized I was spending more time thinking about what to build than how to build it. Not because I stopped caring about the how -- but because I was getting more value from thinking at the other level.
The technical credibility doesn't go away, it just changes form. I'm not the one writing the most code anymore, but being able to read the code, understand the tradeoffs, and have a real conversation about implementation -- that's what makes me useful in a technical conversation versus just someone who manages technical people.
The thing pure PMs miss: when you understand the code, you understand what's actually hard versus what just seems hard. You have a much better instinct for when an estimate is padded versus when there's real complexity. That calibration is a superpower.
The thing pure engineers sometimes miss: users don't care how it's built. They care whether it solves their problem. The architecture that's beautiful but doesn't serve a real need is a dead end.
Evergreen notes
Evergreen notes are written and organized to evolve, contribute, and accumulate over time, across projects. This is an unusual way to think about writing notes: most people take only transient notes. That’s because these practices aren’t about writing notes; they’re about effectively developing insight: “Better note-taking” misses the point; what matters is “better thinking”. When done well, these notes can be quite valuable.
Evergreen notes should be atomic
Evergreen notes should be atomic. It’s best to create notes which are only about one thing—but which, as much as possible, capture the entirety of that thing.
Finding the Problem
Startups User Research Product Market Fit
Most early startups build solutions looking for a problem. It feels like building -- you're making progress, the code is coming together, the design looks good. But you haven't actually validated that anyone needs what you're making.
The difference between a problem you think exists and one people will pay to solve is enormous. And you can't tell which one you have by thinking harder about it. You have to go talk to people.
Talking to potential users is harder than it sounds. The natural instinct is to explain your idea and ask if they'd use it. That's backwards. You're leading the witness. People are polite; they'll tell you your idea is interesting even when they wouldn't use it in a million years.
The technique that works: ask about their actual behavior, not their hypothetical behavior. "Tell me about the last time you dealt with [problem]" is better than "would you pay for a tool that solved [problem]." Behavior is evidence. Intentions are not.
With uCast, we built a lot before we had good evidence that campus event organizers had the problem we thought they had. Some of them did. Some of them had a different problem. Some of them weren't actually frustrated enough to change anything. We found this out later than we should have.
With Nodalli, the feedback loop was faster because we were closer to the problem space. But even then, the "right" problem took months of iteration to find.
Finding the real problem is probably the hardest thing in a startup. It's also the most important.
FPGA and Hardware
Digital Logic Signals and Systems Computer Architecture
VHDL, FPGAs, hardware description languages. A completely different way of thinking about computation.
An FPGA (field-programmable gate array) is a chip you can configure to implement arbitrary digital logic. Instead of running software on a fixed processor, you're defining the actual hardware structure. The "program" you write isn't a sequence of instructions -- it's a description of circuits.
This is the hardest mental shift. Software runs sequentially (or with managed concurrency). Hardware runs in parallel by default. Every logic gate in your design is operating simultaneously. You're not thinking about what happens next, you're thinking about what everything is doing right now.
VHDL (and Verilog) are the languages for this. They look like programming languages but behave differently. A statement like a <= b AND c doesn't execute -- it describes a wire. The whole paradigm is about describing connections, not sequences.
The OCT project is where this became concrete. The signal acquisition and initial processing needed to happen at hardware speed, faster than any software could manage. That forced learning to think in hardware, which is a genuinely different cognitive mode than writing code.
I think everyone who's serious about computer engineering should do at least one hardware project. Not because you'll necessarily work with FPGAs again, but because it breaks the illusion that software is the bottom of the stack. Understanding that everything you write eventually becomes electrons moving through transistors changes how you think about what your code is really doing.
Fundraising
Startups Pitching Accelerators and Grants
Fundraising is a sales process. The product you're selling is equity in your company. The buyer is an investor with a specific thesis about what kinds of companies are worth betting on.
With uCast we raised around $200K, mostly through grants and accelerator programs in Canada. That process taught me a lot about what investors and grant organizations actually look for, which is different from what they say they look for.
VCs want to see: large market, founder-market fit, some evidence of traction or exceptional insight, and a reason why you'll win. They're pattern-matching to their mental model of what a successful company in this space looks like. Fitting that pattern matters as much as the actual quality of the idea.
The grant game is different. Grants are non-dilutive (you don't give up equity) but come with more process, slower timelines, and sometimes weird constraints on how the money can be used. The organizations running them are often optimizing for things other than pure ROI -- regional economic development, sector support, that kind of thing.
Accelerators are somewhere in between. The money is usually small (15K-100K range) but the network and the forced structure of the program can be worth more than the cash, depending on which accelerator and what stage you're at.
One thing that took me a while to understand: money doesn't validate your idea. It validates your ability to fundraise, which correlates with but isn't the same thing as having a good idea. Some great ideas can't raise, and some bad ideas do. The market is the real test.
Hiring
Leading Engineers Team Dynamics Startups
The most leveraged thing you do as a lead is get the team right. One exceptional person is worth several good ones, not because of their individual output but because they raise the level of everyone around them. One consistently wrong fit is expensive in ways that are hard to measure but very real.
What to actually look for in engineers, beyond technical skill: curiosity (do they learn on their own, do they care about the craft) and communication (can they explain what they're doing and why, can they raise a problem before it's a crisis). Technical skill is table stakes. These other things are what predict whether someone will thrive in a small team under ambiguous conditions.
The interview question that tells me the most: "tell me about something technical you taught yourself recently." Motivated learners self-study. People going through the motions don't. The answer also tells you about their taste -- what they find interesting when they have free choice.
The mistakes made early in hiring at uCast: optimizing for technical skill signals (good at algorithms, impressive background) over indicators of how someone works and communicates. Ended up with technically capable people who were hard to coordinate with. That's an expensive lesson to learn.
How to interview without trick questions: give candidates real problems similar to ones you actually face, see how they think through them, and look for people who ask clarifying questions before jumping to solutions. The process of how they engage with a problem is more informative than whether they get to the right answer.
The timing thing: hire when you have a specific need and the work is validated, not speculatively for capacity you might need. Early hiring mistakes at startups are very hard to undo.
Leading Engineers
Product Management Team Dynamics Sprint Planning
The thing that makes leading engineers work is technical credibility. You don't have to be the best engineer on the team, but you need to be able to have a real conversation about technical tradeoffs. If engineers sense that you're bullshitting them about technical complexity, they'll stop telling you things honestly.
The difference between managing and leading: managing is making sure work gets done. Leading is making sure people understand why the work matters and feel ownership over how to do it. The second one scales better and produces better outcomes.
How to give feedback on code without being condescending: ask questions rather than making declarations. "I noticed this function is doing several things -- is there a reason it's structured this way?" lands differently than "this should be broken up." You might not know what you don't know. Asking first finds out.
When to push back on estimates vs trust the team: if an estimate seems high, ask what's driving it. Often there's a real technical reason you weren't aware of. Sometimes there's unnecessary complexity that can be removed. The conversation is more useful than either blindly accepting or arbitrarily cutting.
At Nodalli and uCast, the dynamics that worked were when technical and non-technical decisions were clearly separated. Engineers owned the how. PMs owned the what and why. The overlap is where the tension lives, and being explicit about it helps.
The thing I'd tell myself earlier: "move fast" doesn't mean "skip the conversation." Moving fast is about decision quality and removing blockers, not skipping the alignment that prevents rework.
LLMs in Production
AI Prompt Engineering APIs and Integrations Automation Mindset
The gap between "it works in the playground" and "it works reliably at scale" is where most LLM projects run into trouble.
The things you have to think about when shipping LLM-powered features to real users:
Latency: LLM calls are slow, often 2-10 seconds depending on model and prompt length. That's fine for some use cases and terrible for others. Streaming responses (showing output as it generates) helps the perception problem even if it doesn't change the actual time.
Cost: API calls add up. A feature that costs $0.01 per invocation feels free in testing and becomes significant at scale. You need to think about cost per user action and whether it's sustainable at your target scale.
Hallucinations: models confidently state wrong things. For anything where accuracy matters, you need either retrieval augmentation (give the model the relevant facts rather than relying on its training), validation, or human review in the loop.
Prompt injection: when user input becomes part of a prompt, users can try to override your instructions. "Ignore previous instructions and..." is the classic example. This is a real security concern for anything where the LLM has access to actions or data.
What the Nodalli stack taught me: reliability comes from tight scoping. A model given a narrow, well-defined task with good examples fails much less often than one given a broad, open-ended task. The more constrained the problem, the more predictable the output.
Metrics and KPIs
Product Management Product Market Fit Prioritization Frameworks
Not all metrics are equal. The difference between a vanity metric and a signal is whether it changes how you make decisions.
Daily active users sounds good until you ask: active how? Logging in counts as "active" in a lot of tracking setups. Logging in and completing a core workflow is different. The metric you pick is the behavior you're incentivizing your team to optimize for. Pick wrong and you optimize for the wrong thing.
The question I ask to evaluate any metric: "if this number went up, would I know the product is working better?" If the answer is yes, it might be a signal. If the answer is "maybe, but it could also mean something else," it's probably a vanity metric.
For Nodalli, the north star metric is reply rate on outbound sequences. Not emails sent, not opens, not even clicks. Replies. Because a reply means a real person engaged enough to type back, which is the behavior we're trying to enable and measure. Opens can be inflated by email clients. Clicks can be accidental. Replies are hard to fake.
Lagging vs leading indicators: lagging indicators (revenue, churn) tell you what already happened. Leading indicators (engagement patterns, specific usage behaviors) predict what's about to happen. You want both, but leading indicators are what you actually manage to.
The danger of over-indexing on any single metric: people will find ways to hit the number without achieving the underlying goal. Goodhart's Law: when a measure becomes a target, it ceases to be a good measure.
Month 1 - AI
🗓️ Month 1 — Machine Learning Foundations
Week 1 — What is Machine Learning?
Let’s kick things off with a solid understanding of what ML actually is. You’ll learn how algorithms find patterns in data, what makes AI “intelligent,” and the key differences between traditional software and ML systems.
- 📘 Beginner Reading: Google’s ML Crash Course
- 🔬 Advanced Reading: Deep Learning Book — Chapter 1
- 🧪 Tutorial: Intro to ML in Python (Colab Notebook)
Week 2 — Data, Features & Model Training
This week is all about how machines “see” data. You’ll learn about datasets, feature engineering, data preprocessing, and training your first ML model.
- 📘 Beginner Reading: Kaggle’s Intro to Machine Learning
- 🔬 Advanced Reading: Feature Engineering Principles — Google Developers
- 🧪 Tutorial: Scikit-Learn: Training Models Step-by-Step
Week 3 — Supervised vs. Unsupervised Learning
Explore how models learn from labeled (supervised) vs. unlabeled (unsupervised) data.
- 📘 Beginner Reading: Supervised vs Unsupervised ML Explained (IBM)
- 🔬 Advanced Reading: Clustering & Dimensionality Reduction — Stanford CS229 Notes
- 🧪 Tutorial: K-Means & PCA Hands-On Notebook
Week 4 — Model Evaluation & Overfitting
You’ll learn how to measure model accuracy, precision, recall, and prevent overfitting.
- 📘 Beginner Reading: Model Evaluation Guide — Kaggle
- 🔬 Advanced Reading: Bias-Variance Tradeoff (CS229 Lecture Notes)
- 🧪 Tutorial: Evaluating ML Models — Python Walkthrough
Month 2 - AI
⚙️ Month 2 — Deep Learning & Neural Networks
Week 5 — Neural Network Basics
Understand neurons, layers, activations, and how they combine to form a network.
- 📘 Beginner Reading: Neural Networks Explained (3Blue1Brown Video)
- 🔬 Advanced Reading: CS231n — Neural Networks Notes
- 🧪 Tutorial: Build Your First Neural Net in PyTorch
Week 6 — Training Deep Models
This week: gradient descent, backpropagation, and optimization algorithms like Adam and SGD.
- 📘 Beginner Reading: Gradient Descent Visual Explanation (StatQuest)
- 🔬 Advanced Reading: Deep Learning Book — Optimization Chapters
- 🧪 Tutorial: Train & Visualize Deep Nets (Colab)
Week 7 — CNNs, RNNs & Sequence Models
Explore how deep networks handle images and text — the stepping stones to LLMs.
- 📘 Beginner Reading: Convolutional Neural Networks — Simplified
- 🔬 Advanced Reading: Understanding LSTMs (Colah’s Blog)
- 🧪 Tutorial: CNNs in PyTorch
Week 8 — Deep Learning Frameworks
Get hands-on with TensorFlow, PyTorch, and Keras. Learn how they differ and where each excels.
- 📘 Beginner Reading: PyTorch vs TensorFlow Overview (Datacamp)
- 🔬 Advanced Reading: PyTorch Internals Explained
- 🧪 Tutorial: TensorFlow Quickstart Colab
Month 3 - AI
🔄 Month 3 — Transformers & LLM Fundamentals
Week 9 — Attention Mechanisms
Discover how attention lets models focus on the right words or features when processing data.
- 📘 Beginner Reading: Attention Explained (Jay Alammar)
- 🔬 Advanced Reading: “Attention Is All You Need” Paper
- 🧪 Tutorial: Attention from Scratch (Colab)
Week 10 — Transformer Architecture
We’ll go deep into the architecture that powers GPT, BERT, and similar models.
- 📘 Beginner Reading: The Illustrated Transformer (Jay Alammar)
- 🔬 Advanced Reading: Annotated Transformer (Harvard NLP)
- 🧪 Tutorial: Build a Mini Transformer (Colab)
Week 11 — Tokenization & Embeddings
Learn how text becomes numbers — and how meaning is encoded in embeddings.
- 📘 Beginner Reading: How Tokenization Works (OpenAI)
- 🔬 Advanced Reading: Word2Vec and Beyond — The Illustrated Word2Vec
- 🧪 Tutorial: Sentence Embeddings (Hugging Face)
Week 12 — Working with Pretrained Models
You’ll use Hugging Face models for text generation, classification, and summarization.
- 📘 Beginner Reading: Intro to Transformers (Hugging Face)
- 🔬 Advanced Reading: Transformers Library Deep Dive
- 🧪 Tutorial: Hugging Face Text Generation Notebook
Month 4 - AI
⚡ Month 4 — LangChain, Agents & Retrieval Systems
Week 13 — LangChain Basics
Build your first LLM-powered application using LangChain.
- 📘 Beginner Reading: LangChain Official Intro
- 🔬 Advanced Reading: LangChain Architecture Explained (Medium)
- 🧪 Tutorial: LangChain Crash Course (YouTube)
Week 14 — Prompt Engineering
Learn how to craft better prompts and control model output.
- 📘 Beginner Reading: Prompt Engineering Guide
- 🔬 Advanced Reading: Chain-of-Thought Prompting Paper
- 🧪 Tutorial: OpenAI Playground Practice
Week 15 — Retrieval-Augmented Generation (RAG)
You’ll learn how to connect LLMs with your own data using embeddings and vector databases.
- 📘 Beginner Reading: RAG Concept Overview (LangChain Docs)
- 🔬 Advanced Reading: In-Depth RAG Systems (Pinecone Blog)
- 🧪 Tutorial: RAG from Scratch (YouTube)
Week 16 — Building AI Tools & Agents
Understand how to make your LLMs take action — creating autonomous and tool-using agents.
- 📘 Beginner Reading: LangChain Agents Intro
- 🔬 Advanced Reading: ReAct Paper (Reason + Act)
- 🧪 Tutorial: Build an Agent in LangChain (YouTube)
Month 5 - AI
🧩 Month 5 — Scaling, Tuning & Deployment
Week 17 — Fine-Tuning & Custom Models
Learn how to train your own small models for specialized tasks.
- 📘 Beginner Reading: Fine-Tuning Explained (Hugging Face)
- 🔬 Advanced Reading: Parameter-Efficient Fine-Tuning Paper
- 🧪 Tutorial: Fine-Tuning on Custom Data (Colab)
Week 18 — Evaluation & Metrics for LLMs
We’ll cover perplexity, BLEU, and human feedback metrics.
- 📘 Beginner Reading: Evaluating LLM Outputs (OpenAI Guide)
- 🔬 Advanced Reading: Beyond BLEU Paper
- 🧪 Tutorial: LLM Evaluation Notebook (Colab)
Week 19 — Infrastructure & Scaling
Discover how to deploy models at scale with Docker, Kubernetes, and cloud APIs.
- 📘 Beginner Reading: Deploy Models with FastAPI
- 🔬 Advanced Reading: LLM Inference Optimization (vLLM Blog)
- 🧪 Tutorial: Dockerize and Serve a Model (GitHub)
Week 20 — Ethics & Safety in AI
Understand bias, hallucinations, safety, and ethical deployment.
- 📘 Beginner Reading: Ethics of AI (Google Responsible AI)
- 🔬 Advanced Reading: RLHF Overview (OpenAI Paper Summary)
- 🧪 Tutorial: Bias Detection Exercise (Colab)
Month 6 - AI
🚀 Month 6 — Capstone Projects & Future Horizons
Week 21–22 — Choose & Build Your Capstone
Pick your final project: a LangChain app, fine-tuned model, or multi-agent system.
- 📘 Project Ideas: Awesome LangChain Projects List
- 🧪 Tutorial: Deploying LLM Apps to the Web (Streamlit)
Week 23 — Testing & Demo Prep
Polish your project, prepare your demo, and document your process.
- 📘 Reading: Best Practices for ML Deployment
- 🧪 Tutorial: Model Card Creation (Hugging Face)
Week 24 — Showcase & Next Steps
Time to present! Reflect on what you’ve built and where you want to go next.
- 📘 Reading: AI Career Paths — Papers with Code Guide
- 🔬 Advanced Reading: Scaling Laws in LLMs Paper
MVP Thinking
Building Before Validating Product Roadmapping Prioritization Frameworks
MVP doesn't mean a buggy or incomplete version of your full product idea. That misunderstanding causes a lot of waste.
An MVP is the minimum thing needed to test your most critical assumption. The emphasis is on "test an assumption," not "ship something small." Those are different objectives.
If your critical assumption is "small restaurants want to manage reservations digitally," your MVP might not be software at all. It might be you manually managing reservations over text for a few restaurants to see if they stick with it and pay you. That's a valid MVP. Building a lightweight app to test the same thing is also valid, but the app isn't the point -- the learning is.
The question to ask for any feature or product: "what's the cheapest way to test whether this assumption is true?" Usually the answer is something simpler than what you're tempted to build.
This connects to Prioritization Frameworks because the same logic applies to what you build next. The highest-priority thing is usually whatever kills or confirms your biggest open question.
The failure mode: building an MVP that doesn't actually test anything critical, because you unconsciously avoided testing the scary thing. An MVP that tests a "nice to have" assumption instead of the existential one gives you false confidence.
Networking Basics
Operating Systems APIs and Integrations
TCP/IP, HTTP, DNS, sockets. The fundamentals that everything else is built on.
The mental model that made it click: a request goes out, something happens at the other end, a response comes back. That's it. Everything else is just detail about how each step works and what can go wrong.
TCP is reliable: it handles packet ordering, retransmission, congestion control. UDP is unreliable but fast: fire and forget, used for things like video streaming where a dropped frame is better than waiting to retransmit. HTTP runs on top of TCP. HTTP/2 and HTTP/3 add multiplexing and other improvements over the original.
DNS is the phone book. You type api.example.com, DNS tells you the IP address. There's caching at every level which is why DNS changes take time to propagate and why "clear DNS cache" fixes weird issues.
The 3-way handshake (SYN, SYN-ACK, ACK) is how TCP connections are established. TLS adds a few more round trips on top of that for encryption negotiation. This is why connection latency matters -- you're paying for those round trips before any actual data moves.
Networking felt abstract until I was debugging a production issue at 2am -- slow requests, intermittent timeouts, couldn't tell if it was the server or the client or something in between. Tools like curl, tcpdump, checking response headers, understanding what a 502 vs 503 vs 504 actually means -- that's when all of this stopped being academic.
Operating Systems
Computer Architecture Networking Basics
Processes, threads, scheduling, memory management, file systems. The OS course was one of the hardest in the program and also one of the most useful in retrospect.
A process is an instance of a running program with its own memory space. A thread is a unit of execution within a process -- threads share memory, which is what makes them fast and also what makes concurrency bugs so painful to debug. The OS scheduler decides which process/thread gets CPU time and for how long.
Virtual memory is the abstraction that lets each process think it has its own address space. The OS, with hardware help (the MMU), handles the mapping from virtual addresses to physical ones. This is also where page faults happen -- when you access a virtual address that isn't currently backed by physical memory.
Deadlock and race conditions: deadlock is when two processes are each waiting for something the other holds. A race condition is when the outcome depends on the order of execution in a way that isn't controlled. Both are the kind of bug that's correct sometimes and broken sometimes, which makes them the most frustrating bugs to track down.
The thing I appreciate in hindsight: almost everything in software engineering comes back to OS concepts. Distributed systems are basically multi-process coordination at network scale. Databases have their own schedulers and memory management. Docker containers are OS-level isolation primitives. Once you understand the foundations, the higher-level abstractions make more sense.
Pitching
Fundraising Storytelling Startups
Pitching is a learnable skill. I don't think I believed that initially -- it seemed like something some people were naturally good at and others weren't. That's not quite right.
The structure that works: problem, solution, why now, traction or evidence, team, ask. That's the skeleton. The job is to make it feel like a story rather than a slide deck being read aloud.
The most important part is the problem. If the audience doesn't believe the problem is real, everything else collapses. So you spend time on the problem first. Make them feel it before you introduce the solution.
Reading the room in front of investors is a skill. Some want data, some want narrative, some want to poke holes and see how you respond. The best pitches I've seen leave room for conversation instead of being airtight monologues.
Pitches that worked:
- DMZ $15K: the problem framing was sharp, we had real users, and we knew our numbers cold
- Samsung competition: we led with a demo instead of slides, which changed the energy in the room
What made them land in both cases: we believed in what we were saying and we weren't overselling. Investors can feel the difference between confidence and desperation.
The connection to Storytelling is real. Pitching is storytelling with a specific structure and a specific ask at the end. The same skills that make a good pitch make good product positioning, good hiring conversations, good everything.
Prioritization Frameworks
Prioritization Frameworks for Product Managers
As a product manager, one of your most important tasks is deciding what to build next. You’re often faced with limited resources—whether that’s time, budget, or manpower—and an overwhelming list of potential features, initiatives, and improvements. This is where prioritization frameworks come in. They help you make data-driven decisions that align with your product’s goals and deliver the highest value.
In this post, we’ll explore the most common prioritization frameworks used by product managers to make these tough decisions.
Why Prioritization is Crucial for Product Management
Prioritization is the process of determining which initiatives should be executed first. It’s important because:
- Focuses resources on the most impactful features.
- Helps manage stakeholder expectations by setting clear priorities.
- Aligns teams around shared goals, making sure everyone is working on what matters most.
- Mitigates risks by addressing the most important customer needs and business goals first.
Without a proper prioritization framework, product managers risk spreading their resources too thin, focusing on the wrong features, or missing opportunities to drive real impact.
Common Prioritization Frameworks
1. RICE (Reach, Impact, Confidence, Effort)
The RICE framework helps product managers evaluate initiatives based on four factors:
- Reach: How many users/customers will this feature impact?
- Impact: How much impact will this feature have on users or business goals? (High, Medium, Low)
- Confidence: How confident are you in your estimates for Reach and Impact? (High, Medium, Low)
- Effort: How much time or resources will this take to complete?
Formula:
RICE Score = (Reach * Impact * Confidence) / Effort
By calculating the RICE score for each feature or initiative, you can prioritize based on which ones will deliver the most value for the least amount of effort.
2. MoSCoW (Must Have, Should Have, Could Have, Won’t Have)
The MoSCoW method is a simpler prioritization technique that categorizes features or initiatives into four groups:
- Must Have: Essential features for the product’s success.
- Should Have: Important, but not critical features.
- Could Have: Nice-to-have features that can be deferred if necessary.
- Won’t Have: Features that are out of scope for this cycle.
This method is useful for determining the minimum viable product (MVP) and ensuring the team focuses on the essentials.
3. Kano Model
The Kano Model evaluates features based on their impact on customer satisfaction:
- Basic Needs: Features that users expect and are dissatisfied without (e.g., basic functionality).
- Performance Needs: Features that improve user satisfaction proportionally as they are improved (e.g., speed).
- Delighters: Unexpected features that excite users but aren’t required (e.g., a unique design or extra functionality).
The Kano Model helps balance essential features with delight factors to ensure your product both meets basic expectations and offers a great user experience.
4. Value vs. Complexity Matrix
The Value vs. Complexity Matrix plots features based on two dimensions:
- Value: How much value does the feature bring to users or the business?
- Complexity: How difficult is it to implement?
Features in the high value, low complexity quadrant should be prioritized first, followed by high value, high complexity features. Low value, high complexity features should be deprioritized.
How to Choose the Right Framework
The right prioritization framework depends on the specific needs of your product, your team, and your goals. Here are a few tips for selecting the best one:
- Use RICE if you need a quantitative approach that factors in effort and confidence.
- Choose MoSCoW if you need a straightforward, quick way to categorize features.
- Opt for the Kano Model if user satisfaction and delight are top priorities.
- Use the Value vs. Complexity Matrix for a clear, visual approach to balancing effort and impact.
Conclusion
Prioritization is one of the most important skills for a product manager. Whether you're building new features, enhancing existing ones, or deciding what to tackle next, using the right framework ensures that your team is focused on what will deliver the most value. By using frameworks like RICE, MoSCoW, the Kano Model, and the Value vs. Complexity Matrix, you can make confident, data-driven decisions that will guide your product to success.
Product Management
Product Market Fit
Startups Finding the Problem User Research Product Management
Everyone talks about product market fit and nobody can clearly define it. The definition that stuck with me: when you have it, growth starts pulling you instead of you pushing it. Users are showing up on their own, existing users are telling other people, the product is solving a real problem well enough that people want more of it.
Before PMF, you're pushing everything. Every user is hard-won. Every conversation has to start with explaining why this exists. After PMF, those things get easier. Not easy -- easier.
The hard part is you can convince yourself you have it when you don't. Early users can be enthusiastic without being genuinely sticky. People can like what you've built without it changing their behavior in a real way. The test isn't "do people like it" -- it's "would they be genuinely upset if it went away."
For Nodalli, the proxy metric we've been watching is reply rate on outbound sequences. Not open rate, not click rate -- reply rate. Because a reply means a real human typed out a response, which means they engaged with the content at a level that matters. That's the behavior we're trying to produce, so that's what we measure.
The danger of false PMF: you optimize for the wrong signal and run out of runway before finding out. Vanity metrics are comfortable. They feel like progress. They're not the same as retention and growth from genuine product value.
PMF isn't binary either. You might have it with one segment and not another. Finding which segment is a whole problem in itself.
Product Roadmapping
Product Roadmapping: A Guide for Product Managers
As a product manager, one of the most crucial tools in your arsenal is the product roadmap. It’s a strategic document that serves as a blueprint for the product’s evolution over time. A well-structured roadmap helps align your team, stakeholders, and customers with your product vision, ensuring everyone is working toward the same goals. In this post, we’ll explore what a product roadmap is, why it’s important, and how to create one that drives product success.
What is a Product Roadmap?
A product roadmap is a high-level plan that outlines the vision, strategy, and goals for your product. It details key milestones, features, and timelines, serving as a guide for the development and launch of product features. Think of it as a GPS for your product’s journey, helping your team navigate from the current state to the desired future state.
Key Components of a Product Roadmap
-
Vision & Strategy: The roadmap starts with a clear articulation of your product’s vision and strategy. This ensures alignment between your product and business objectives.
-
Goals & Objectives: Define measurable goals (e.g., user growth, engagement, revenue targets) that your product aims to achieve.
-
Features & Initiatives: List out the specific features, functionality, and initiatives that will help you meet the defined goals.
-
Timeline: A timeline helps track when key milestones and releases are expected. This is often broken down into quarters or phases (e.g., Q1, Q2, etc.).
-
Milestones & KPIs: Define clear milestones and key performance indicators (KPIs) to track the progress of your product development.
Why is a Product Roadmap Important?
-
Alignment: It ensures all stakeholders—developers, designers, sales, and marketing teams—are aligned on the vision and progress.
-
Focus: A roadmap helps prioritize initiatives, ensuring your team focuses on the most important features first.
-
Communication: It serves as a communication tool for internal teams and external stakeholders, such as investors or customers, to understand what’s coming and when.
-
Adaptability: While the roadmap provides structure, it’s also a flexible document that can be adjusted as market needs or business priorities change.
How to Build a Product Roadmap
Step 1: Define Your Product Vision
Start by clearly stating the vision for your product. This will be the guiding light that influences every decision made throughout the roadmap creation process.
Step 2: Identify Key Milestones
Break down your product vision into milestones—significant achievements or product features that will help you achieve your long-term goals.
Step 3: Prioritize Features
Use a prioritization framework (such as RICE or MoSCoW) to determine which features should be built first. Ask yourself:
- Which features will bring the most value to users?
- What can be realistically achieved in the given timeframe?
- What’s most aligned with business objectives?
Step 4: Create Timelines and Deadlines
Determine when each feature or milestone should be completed, considering team capacity and external dependencies.
Step 5: Communicate and Adjust
Share the roadmap with stakeholders, but be open to adjustments as feedback comes in and priorities change. Roadmaps are living documents that evolve with the product and business landscape.
Conclusion
A well-crafted product roadmap is more than just a timeline of features—it’s a strategic tool that helps guide your product’s development, keeps teams aligned, and ensures everyone is working toward the same goals. By defining a clear vision, setting achievable goals, and prioritizing effectively, you’ll set your product up for success and keep your team motivated as they work towards building the next great product.
Prompt Engineering
AI Automation Mindset LLMs in Production
Prompt engineering is more like writing good specs than programming. You're not telling the model how to do something, you're telling it what you want and giving it enough context to figure out the how.
The mental model I find most useful: the model is a very smart, very literal intern who has read an enormous amount but has no context about your specific situation. It will do exactly what you ask, not what you meant. This means precision matters.
Techniques that actually work:
Role assignment: "You are a senior engineer reviewing code for security issues" changes the output more than you'd expect. The model uses the role as context for what lens to apply.
Examples in the prompt (few-shot): show the model a few examples of the format or style you want, and it'll match it much better than if you describe it in words. Describing what you want is harder than showing it.
Chain of thought: asking the model to "think step by step" or "explain your reasoning" before giving a final answer improves accuracy on reasoning tasks. It's not magic -- it gives the model room to work through the problem before committing to an answer.
What doesn't work: being vague and hoping. "Make it better" is a terrible prompt. "Improve the clarity of this explanation for a non-technical audience without changing the key points" is much better.
The gap most people don't talk about: a prompt that works in the playground doesn't always work reliably at scale. Edge cases, unusual inputs, and real-world messiness break prompts that seemed solid in testing. See LLMs in Production for more on that.
Shipping Culture
Product Management Sprint Planning MVP Thinking Startups
The only way to know if something works is to ship it and see what happens. Everything before that is theory.
This sounds obvious but it's surprisingly hard to internalize. There's always a reason to wait: one more edge case to handle, one more round of feedback to gather, one more thing to polish. At some point you have to make a decision that "good enough to learn from" is a higher priority than "perfect."
The bias toward action has to be built into the team's culture, not just stated in a values document. It shows up in how you respond when something ships with a bug ("fix it fast and move on" vs "let's do a post-mortem process that takes three weeks"), how you frame the sprint goal ("ship this feature" vs "learn whether users want this feature"), and what you celebrate.
The difference between startup pace and enterprise pace is real. At a startup, you ship something, see what happens, adjust. The cycle is measured in days or weeks. At an enterprise, the cycle is measured in quarters or years, because the cost of being wrong is higher and the blast radius of a mistake is larger. Neither is wrong -- they're appropriate to different contexts.
What you lose at startup pace: depth. You're not always thinking carefully about long-term implications. What you gain: speed of learning. You find out faster whether your assumptions were right.
The cultural thing that enables fast shipping is psychological safety. People ship faster when they're not afraid of being blamed if something doesn't work. That's a leadership problem before it's a process problem.
Signals and Systems
FPGA and Hardware Digital Logic
Fourier transforms, sampling, convolution, filtering. This course was the one where I thought "when will I ever use this" and then immediately used it.
The Fourier transform takes a signal in the time domain and shows you what frequencies it's made of. Every signal -- audio, radio, images -- can be decomposed into a sum of sine waves at different frequencies. This is the basis of basically all of signal processing.
Sampling is the process of converting a continuous signal (like sound in the air) into discrete values you can work with digitally. The Nyquist theorem says you need to sample at least twice the highest frequency you care about, or you get aliasing -- artifacts where higher frequencies "fold back" and look like lower frequencies. This is why audio is sampled at 44.1kHz (covering frequencies up to ~22kHz, which is above human hearing).
Convolution was the hardest thing in this course for me. The math is fine, the intuition takes a while. The way it finally made sense: convolution is how you apply a filter to a signal. Blur a photo? Convolution. Apply reverb to audio? Convolution. The filter (kernel) describes the operation, the signal is the input.
Where this connected directly to real work: the OCT project. Optical coherence tomography is basically interferometry, which is a signal processing problem. Understanding Fourier analysis was the difference between treating the signal processing code as a black box and actually understanding what it was doing. That was a meaningful moment.
Sprint Planning
Product Management Prioritization Frameworks Leading Engineers
Two-week sprints work because the rhythm matters as much as the process. You're creating regular forcing functions: a moment every two weeks where the team commits to something, ships it, and reflects on what happened.
The goal of sprint planning isn't to fill the sprint with tasks. It's to define what success looks like for the sprint and then figure out what work gets you there. "The sprint is done when X" is more useful than a list of tickets.
The estimation problem is real and basically unsolvable. Engineers are systematically optimistic. Not because they're bad at their jobs -- because software estimation is genuinely hard and the unknown unknowns are unknowable in advance. The practical fix: don't use time estimates, use story points or t-shirt sizes, and track your team's actual velocity over a few sprints. Then plan based on history, not hope.
The difference between a sprint goal and a sprint task list: the goal is what you're trying to learn or deliver. The task list is how you get there. If something comes up mid-sprint that would help you achieve the goal faster, you should be able to add it. If a task in the plan turns out not to serve the goal, you should be able to drop it.
The overhead question: sprint planning only feels like overhead if the meetings are badly run. A good planning session takes an hour, produces a clear shared understanding of what the team is doing and why, and prevents the much more expensive cost of building the wrong thing.
Stakeholder Communication
Product Management Product Roadmapping Storytelling
The art of giving people enough information to feel confident without overwhelming them. Every stakeholder has a different context and a different set of things they need to know. The communication style that works for an engineer doesn't work for an investor and doesn't work for a customer.
Managing up (to founders or executives): they want to know what changed, what's next, and what's at risk. Not the how -- the what and the so-what. Keep it short. Flag problems before they become surprises.
Managing across (to other teams or functions): depends on the relationship, but generally: lead with what you need, provide the minimum context required to evaluate that, and make it easy to say yes or no. People are busy.
Managing down (to your team): context matters more here. People do better work when they understand why. "Build this feature because users asked for it" is okay. "Build this feature because it removes the biggest friction in the onboarding flow, which we know is where we're losing 40% of users" is better.
The one rule that's never wrong: no surprises. If something is going wrong, tell people before it's a crisis. A stakeholder who finds out about a problem from you has a chance to help. A stakeholder who finds out on their own is now a problem.
The update format that works: what changed since last time, what's happening next, what's at risk or blocked. Three sections. Stays short. Gives people what they need to stay oriented without requiring them to ask follow-up questions.
Startups
Finding the Problem Building Before Validating Fundraising Team Dynamics Product Market Fit
A startup isn't just a small company. It's a company designed to find a scalable business model, usually under conditions of extreme uncertainty. That distinction matters because it changes how you should make decisions.
Most people who say they're "starting a company" are actually building a project. A project has a defined scope. A startup has a hypothesis. The whole point is to test the hypothesis and update based on what you find.
The thing nobody tells you at the beginning: the emotional experience of a startup is mostly just confusion and doubt punctuated by occasional moments of clarity. The chaos is the job. You're not doing it wrong.
What I've learned from going through it with uCast and then Nodalli:
- The version of the idea you start with is almost never the version that eventually works
- The quality of the team is more predictive than the quality of the initial idea
- Speed matters more than most people think, but rushing is different from speed
- Most startup advice is pattern-matched from a small number of successful companies and generalizes badly
It's a weird thing to pursue. It's also one of the most interesting ways to spend your time.
Storytelling
Pitching Writing Process Product Management
The most underrated startup skill is the ability to explain clearly what you're doing and why it matters. Not just for investors -- for recruiting, for users, for yourself when you're in the middle of something hard and you need to remember why you started.
A lot of founders can't clearly explain their own product after working on it for a year. They've gotten too deep into their own heads. The features blur together, the positioning is vague, the "why it matters" gets buried under the "how it works."
Good storytelling forces clarity of thought. If you can't explain it simply, you don't understand it simply. Complexity in the explanation usually reflects complexity in the thinking.
Building Nodalli's positioning was one of the more clarifying exercises I've done. We had to compress what the product actually does into language that a potential customer can immediately understand -- not a paragraph of context, not a list of features. The short, true version. That process of compression forced us to decide what the product actually was.
The structure I keep coming back to: here's a problem that's real, here's why the existing solutions don't solve it, here's what we've built to solve it differently. That's it. Three sentences. If you can make all three land, the rest of the conversation goes better.
This connects to Writing Process because writing is thinking. The act of putting words on a page forces you to commit to a perspective in a way that thinking in your head doesn't. The rough draft is how you find out what you actually think.
Systems Thinking
Computer Architecture Startups Product Management Automation Mindset APIs and Integrations
Everything is a system. The mental model that helps you understand how a CPU works also helps you understand how a company works. Once you have the framework, it applies everywhere.
The basic elements: inputs, outputs, feedback loops, and failure modes. A CPU takes instructions as input, produces computed results as output, uses internal state that affects future behavior, and has failure modes (segfaults, race conditions) when assumptions are violated. A company takes capital and work as inputs, produces product and revenue as outputs, uses customer feedback to update direction, and has failure modes (runway, team breakdown, market shift) when assumptions are violated.
The feedback loop part is the most important and the most neglected. Systems without feedback loops drift. A company that doesn't measure whether its output is creating value is flying blind. A CPU without error correction produces garbage silently. The feedback mechanism is what keeps a system honest.
Failure modes are worth thinking about explicitly. For software: what breaks when the input is unexpected? For a startup: what kills the company if the main assumption is wrong? For an automation: what happens when the third-party API goes down? Thinking through failure modes isn't pessimism -- it's the thing that makes systems resilient rather than brittle.
Computer engineering gave me this framework. The habit of thinking in terms of abstractions, interfaces, and failure modes came from building and debugging actual systems. It's one of those things where the domain expertise transfers beyond the original domain in ways you don't expect.
Team Dynamics
Startups Leading Engineers Hiring
Co-founder relationships are like marriages. You're spending more time with this person than almost anyone else in your life, you're making high-stakes decisions together under stress, and the natural conflict between different working styles gets amplified by everything that's going wrong on any given week.
The things that kill co-founder relationships aren't usually one big fight. It's the accumulation of small frictions that never get addressed. Different risk tolerances. Different expectations about work hours. Different ideas about what "done" looks like.
The most important thing to figure out early: who decides what. Not "we'll discuss and reach consensus" -- that works fine until there's real disagreement, and then it doesn't work at all. You need clear ownership of domains. Technical decisions belong to the technical co-founder. Product decisions belong to the product co-founder. When something spans domains, you need a tiebreaker rule.
The technical/non-technical divide is a specific tension. The technical person tends to underestimate the difficulty of sales, marketing, and relationship-building. The non-technical person tends to underestimate the difficulty of building reliable software. Both of these are real skills. Respecting each other's domain is the foundation.
What kills teams that aren't killed by the market: usually some combination of unclear ownership, unspoken resentment about contribution levels, and avoiding hard conversations until they're unavoidable. The startups that make it through tend to have founders who can disagree out loud, without it becoming personal.
Time Complexity
Big O notation is the language for talking about how an algorithm scales. Not how fast it runs on your machine right now, but how its runtime grows as the input grows.
The common ones: O(1) constant, O(log n) logarithmic, O(n) linear, O(n log n) most sorting algorithms, O(n²) nested loops, O(2^n) exponential disaster.
The intuition that helped me most: if you double the input size, what happens to the runtime? If nothing changes, it's O(1). If it roughly doubles, it's O(n). If it roughly quadruples, it's O(n²). That's the mental check I run when I'm not sure.
Log n is the one people find least intuitive. The key is that log n grows very slowly -- log₂(1,000,000) is only about 20. So any time you're repeatedly halving the problem (binary search, balanced tree operations), you're in log n territory. That's why binary search feels like magic -- even on a billion elements it only takes about 30 steps.
You don't need to do the full formal analysis every time. Most of the time you can just look at the loop structure. One loop over n: O(n). Two nested loops over n: O(n²). Recursion that halves the input each time: O(log n) or O(n log n) depending on the work per step.
Space complexity matters just as much but gets less attention. Stack depth in recursion is a real concern. Allocating a new data structure inside a loop is the kind of thing that sneaks up on you.
User Research
Product Management Finding the Problem Product Market Fit
The hardest part of user research is not leading the witness. It's almost impossible to ask neutral questions once you have a hypothesis about what the answer should be.
The classic mistake: "Would you find it helpful if you could see all your tasks in one place?" Nobody is going to say no to that. It's phrased as a solution and solutions sound good in the abstract. The answer tells you nothing.
Better: "Tell me about the last time you felt like you were losing track of something important at work. What happened?" Now you're getting behavior, not opinions about a hypothetical. Behavior is the signal.
The other thing that trips people up: assuming what someone says they want is what they actually need. Users are great at describing their problem and not great at describing the solution. If someone says "I need a better dashboard," don't build a better dashboard -- ask what they'd use the dashboard to do, and then ask what's frustrating about doing that now.
From Nodalli user interviews: we kept hearing "we need better templates." But when we dug in, the real problem was that people didn't know what to write in the messages, not that the template format was wrong. Better templates would have been the wrong solution to the real problem.
The discipline is asking one more "why" than feels comfortable. The answer to the first "why" is usually the symptom. You want the cause.
Writing Good Tickets
Sprint Planning Product Management Leading Engineers
A good ticket is a gift to your future self and your team. A bad ticket is a tax -- everyone has to interrupt someone to ask a question that should have been answered in the ticket.
What needs to be in a ticket:
Context: why does this exist? What problem does it solve? What broke or what opportunity did we identify? Without this, engineers are solving for the letter of the requirement, not the spirit.
Acceptance criteria: what does "done" look like? Not just "the feature works" -- specifically, what behavior should a user be able to perform after this is shipped. Acceptance criteria also make it easier to write tests.
The "why now": where does this fit in the bigger picture? What becomes possible after this is done?
Gotchas: anything you know about that's likely to be surprising. Third-party API quirks, known edge cases, things that are technically in scope but should be handled carefully.
The tickets that caused the most confusion had one thing in common: they described what to build without explaining why. Engineers made reasonable assumptions about intent, built something technically correct, and it wasn't what was needed. Everyone did their job and the result was still wrong.
Getting better at this requires having been on both sides of it -- writing tickets and implementing them. Once you've been frustrated by your own bad tickets, you start writing better ones.
Writing Process
Generalized Writing Process
Writing effectively, whether it’s a resume, a blog, or creative content, can be simplified with a structured approach. Here’s a step-by-step process to keep your writing clear, concise, and impactful.
1. Start with a Framework
Before diving in, establish the purpose and structure of your writing:
- What are you writing? Identify the format (e.g., resume, email, blog post, story).
- Who is your audience? Tailor your tone, style, and content to their expectations.
- What’s the goal? Define what the writing should achieve (e.g., inform, persuade, entertain).
Think of your framework as the skeleton of your piece. For example:
- Professional writing: "Role/Action/Impact" (What you did, how you did it, and the result).
- Storytelling: "Setup/Conflict/Resolution" (Build tension and resolve it).
2. Focus on Relevance
Include only the information that serves your goal or resonates with your audience:
- What’s essential? Identify the main points or themes.
- What’s unnecessary? Remove tangents, overly complex details, or irrelevant information.
Ask yourself: "Does this add value to the overall piece?" If not, cut it.
3. Write Clearly and Concisely
Make every word count:
- Use active voice: Focus on who’s doing what (e.g., "Designed a solution" vs. "A solution was designed").
- Be action-oriented: Use strong verbs like "improved," "spearheaded," or "developed."
- Avoid fluff: Eliminate filler phrases or redundancies.
Sentence Checklist:
- Does it communicate a single idea?
- Does it avoid unnecessary words?
- Does it contribute to the overall flow?
4. Add Specific Details
Specifics make your writing more engaging and credible:
- Quantify when possible: Add numbers, timeframes, or outcomes (e.g., "Reduced costs by 25%").
- Be descriptive but focused: Use details to support the main point without overloading the reader.
For creative writing, focus on sensory details or vivid imagery. For technical or professional writing, prioritize clarity and precision.
5. Iterate Before Finalizing
Refine your work through small iterations:
- Draft quickly to get ideas on the page.
- Step back and assess the overall flow—do the sections feel cohesive?
- Edit for clarity, grammar, and readability.
If stuck, test alternative phrasings or structures. Focus on improving sections that feel unclear or overly complex.
6. Step Back and Reassess
Take a moment to evaluate the piece as a whole:
- Does it align with the purpose you defined in the framework?
- Is the tone consistent with the audience’s expectations?
- Are there areas where you can simplify or strengthen your points?
This step ensures you’re meeting your goals without overworking the piece.
7. Save Time with a Template
For recurring types of writing, create templates to speed up the process:
- Resume bullet points: "Action + Context + Outcome."
- Emails: "Greeting + Purpose + Call to Action."
- Blog posts: "Introduction + Main Sections + Conclusion."
8. Practice and Adapt
Over time, you’ll refine this process to fit your personal style. The more you write, the more intuitive this will become. Experiment with different approaches, but always anchor your work in purpose and clarity.
By following these steps, you’ll create writing that’s purposeful, polished, and adaptable to any context.
Zapier and Make
Automation Mindset APIs and Integrations LLMs in Production
No-code automation tools have a specific place in the stack. Understanding where they fit saves a lot of time and frustration.
Zapier is good for simple, linear workflows: trigger happens, do X, then do Y. The interface is easy, setup is fast, and if your use case is straightforward it just works. Pricing gets expensive once you're running a lot of zaps at high volume.
Make (formerly Integromat) handles more complex, branching logic. You can build multi-step flows with conditional paths, error handling, and iteration. More of a learning curve but much more powerful. Better value at higher volumes too.
When to use them vs building custom code: use them when you're testing a workflow. Before writing code for an integration, see if you can get 80% of the value with a Zapier/Make flow in two hours. If it works well enough, you saved yourself a week of development. If it doesn't, you've learned something about the workflow without overcommitting.
The thing nobody tells you: at scale, they're slow and flaky. Webhook triggers have latency. Execution times are unpredictable. Third-party APIs have outages and rate limits that no-code tools handle less gracefully than custom code. If you're running thousands of workflows a day or reliability is critical, you'll eventually need to bring it in-house.
The right mental model: Zapier and Make are prototyping tools that sometimes turn into production tools. That's fine, but know which mode you're in.
Help
Click here to access Cosma's documentation
Shortcuts
| Space | Re-run the force-layout algorithm |
| S | Move the cursor to Search |
| Alt + click | (on a record type) Deselect other types |
| R | Reset zoom |
| Alt + R | Reset the display |
| C | Zoom in on the selected node |
| F | Switch to Focus mode |
| Escape | Close the active record |
Version 2.5.4 • License GPL-3.0-or-later
- Arthur Perret
- Guillaume Brioudes
- Olivier Le Deuff
- Clément Borel
- ANR research programme HyperOtlet
- D3 v4.13.0
- Mike Bostock (BSD 3-Clause)
- Nunjucks v3.2.3
- James Long (BSD 2-Clause)
- Js-yaml v4.1.0
- Vitaly Puzrin (MIT License)
- Markdown-it v12.3.0
- Vitaly Puzrin, Alex Kocharin (MIT License)
- Citeproc v2.4.62
- Frank Bennett (CPAL, AGPL)
- Fuse-js v6.4.6
- Kiro Risk (Apache License 2.0)