● Home
Knowledge
Action Journal
Homework
Labs
Study
Try
Case
Make
Training
Misc
Encode Cards
Study History
Free Recall
Quizzes
Digests
Tasks
Conjectures
Belief Gym
Audio Timeline
Knowledge Items
People
Templates
Outcomes
DMXs
Situation Analysis
Council Debate
Parable
Branch Learning
Story Engine
Content Engine
Explainer
Rehearsal
Bench
Import Kindle Notes
--Catchfile
$1 tasks and $4 tasks
01 isn't a chat model
1,000 Simultaneous Experiments: The Next Mental State for Founders
10 DFS Secrets From Top Pros
10 Marketing Lessons from Steve Jobs
10 Traits of Massively Successful People
1000 Ways to Make $1000
100M Leads
100M Money Models
100M Offers
106 Response Winning Headlines
10X is Easier than 2X
10X: Metrics for Early Stage Startups
12 Principles of Manufacturing Excellence
12 Winning Strategies For Executives With ADHD
13 Habits of Smart Risk Takers
20 Rules of Knowledge Formulation
2020 Shareholder Letter
2023 RUFF Planning
2024 Life Handbook
2025 Fantasy Football Impact: New Coaches
2026 Fantasy Prep
2026 Fantasy Prep: Fantasy Points
2026 Fantasy Prep: Late Round Sleepers
2026 Product Strategy Vision & Initiatives
2026 Productivity Stack: Sleep, Hormones, & Supplements - Dr Andrew Huberman
2026 Reading List
2x2 Matrix
33 Strategies of War
48 Laws of Power
4P Copywriting formula
50 Things I Know
500 Ways To Deliver Value
51 questions you can ask in any meeting when you are "not getting it"
55 Business Model Pattern
7 Habits of Highly Effective People
7 Key Metrics Every Business Should Track
7 Powers
7 Rules of Power: Surprising--but True--Advice on How to Get Things Done and Advance Your Career
76ers
78 (Unwritten) Rules Of Life
80/20 Principle
9 Rules of Debugging
92 Tricks: How To Talk To Anyone
97 Things Every Data Engineer Should Know
A Career Cold Start Algorithm
A Dozen Things I’ve Learned from Charlie Munger about Moats
A Good Explanation for Long Term Behavior
A LIFETIME OF SYSTEMS THINKING
A Mind for Sales
A Portfolio of Small Bets
A Practical Guide to Building an Event Streaming Platform
A Practical Guide to Executive Presence
a16z
a16z Reading Lists
a16z Sales
Aaron Levie
Accelerated Expertise
Acceptance and Commitment Therapy
Account Executives
ACG: Confluent Certified Developer for Apache Kafka
Achieving a World-Class Standard
Acquisition Reports
Actioning Towards PQOs
Active Inference
Activity Heuristic
Adam Townsend
Adding is favored over subtracting in problem solving
ADHD
ADHD 2.0: New Science and Essential Strategies for Thriving with Distraction
Adjacent Possible Theory
Adora Cheung
Advanced Arithmetic
Advisors
Aesthetic Digital Taste
Afghanistan
Agent Command Centers: Scaling Human Attention
Agent of Influence
Agent Skills API Doc
Agentic Systems, Deployment, and Enterprise Integration
Aggelos Mouzakitis
Aggregation Theory
Agile
Agile Strategy
AI Agents
AI agents and problem prioritization
AI and the Future of Coding
AI Model Inference Economics
AI Native Constraint Training
AI Native Platitudes
AI/ML Use Cases
AIP: Services Estate
Air Fryer Recipes
AirBnb
Akira Kurosawa
Alan Carr's Easyway Method
Alan Watts
Alasdair MacIntyre
Albert Einstein
Alchemy
Alex Hormozi
Algorithms of Thought
Algorithms To Live By
Allocation As a Theory
Alpine.js
Alternatives to OKRs
altMBA Prompts
Always Day One
Amanda Robson
Amazon Leadership Principles
Amazon Q and Amazon Quick
Ambient Agents
Amp it Up
Amplifying Contextual, Analogical, Temporal, and Counterfactual Intelligence
Amy Dunford
Amy Hoy
AMZN Shareholder Letters
An MBA for Business Operators
Analysis + Capital + Execution
Analytics
Analytics and Shift-Left
Anatomy of a League Winner
andrej karpathy on learning
Andrew Chen
Andrew Huberman
Andrew Wilkson
Andy Grove
Annie Duke
Anticipatory Affect
Antifragile
Antonio Damasio
Apache Avro
Apache Iceberg
Apache Kafka
Apache Kafka and API Management / API Gateway – Friends, Enemies or Frenemies?
Apache Kafka Background
Apache Kafka Definitive Guide
Apache Kafka Docs
Apache Kafka Fundamentals Course
Apache Kafka on Confluent Cloud Best Practices
Apache Kafka Survival Guide
Apache Kafka Use Cases
Apache Kafka vs. Enterprise Service Bus
Apache Pinot
Apache Samza
API Gateways
Apify
Application Integration
Applying Power Laws to Execution
Are there any good principles/formulas to follow when selecting a new business name?
Are there any good principles/formulas to follow when selecting a new business name?
Are You Solving The Right Problem
Are you stuck in movie logic?
Arguments
Aristotle
Aristotle's Three Appeals
Art of Nonfiction
Artificial Intelligence
Ashish CCDAK Notes
Asimov and Emotion
Ask More
Ask Your Developer
Async/Await
ATG Knees Over Toes
Atomic Habits
Augmented Intelligence
Austin
Automation
Automation Theory
Autopoiesis
Awaken The Giant Within
AWS
AWS Analytics
AWS Certified Generative AI Developer - Professional
AWS Databases
AWS Generative AI By Layer
AWS Generative AI By Service
AWS Generative AI By Service: Application Integration
AWS Generative AI By Service: Machine Learning
AWS Generative AI By Service: Management and Governance
AWS Generative AI By Service: Security, Identity, and Compliance
AWS in One Line
AWS Lambda Sink Connector
AWS Networking
AWS Professional Architect Study Guide
AWS Storage
Ayesha Selden
Balanced Scorecard
Barbara Minto
Basic Economics
Basketball
Batch and Stream Processing in Confluent Cloud for Apache Flink
Bayes Theorem
Be Odysseus
Be Slightly Evil
Be Your Future Self Now
Becoming a better writer
Becoming Data Driven in Business: A Series
Behavior Change Management
Behavioral Game Theory
Being That Guy
Benzodiazephine
Best Practices for Driving Projects to Completion
Best Ways to Build Better Habits & Break Bad Habits
Better Harness: A Recipe for Harness Hill-Climbing with Evals
Better Problem Selection
Beyond the Sales Process
Biased Competition Theory
Big Bet Leadership
Big Data is Dead Long Live Easy Data
Binstack: Making a maximal multi-dimensional decision
Biofabrification
Biology
Bipul Sinha
Bird By Bird: Some Instructions On Writing And Life
Bitcoin
Black Box Machine Learning
Blake Emal
Blitzscaling
Blockchain
Body Language
Book of Hooks
Books
Bootstrap Grid System
Bootstrap Spacing Utilities
Bottlenecks vs. Bandpass
Boz
Brag Book
Brainstorming New Startup Ideas
Brainstorms / Action Journals
Branding Pays
Brandolini's Law (The Bullshit Asymmetry Principle)
Breakthrough Advertising
Brian Johnson
Brian Kehm
Brian Roemmele
Buffett & Munger – A Study in Simplicity and Uncommon, Common Sense
Build
Build a Prompt Learning Loop
Building Agents That Automate Knowledge Work
Building agents with the Claude Agent SDK
Building Event-Driven Microservices
Building LLM applications for production
Building Microservices
Building New Intelligence Agents
Business Engineering Blogs
Business of Blockchain
Businesses considered essential
Butter
Byrne Hobart
Cache Layer Architecture
Calixa
Calvin Rosser
Capital Allocation
Capital Allocation Guide
Careers
Careers in Sales
Carmen Medina
Cate Hall
Category Errors
Category Errors of AI/Agents
CCEL (Confluent Customer Engagement Lifecycle)
CeCe Moore
Certain to Win
CFLT Work Journal H2
Chamath Palihapitiya
Change Data Capture
Change Management
Change Management & Governance
Charisma University
Charles Blog Notes
Charlie Munger
Charlie Munger
ChatGPT
Checklist Manifesto notes
Chess
Chicken Recipes
China
Chip Wilson
Chris Orlob
CLA Constraints-Led Approach for Learning
Claude Code
Claude Skills
Clickhouse Connector
Clickstream Analysis
Cloud Consumption Playbook
Cloud KPIs
Cloud Migrations
Cloud Native Transformation
Cloud SDR Management Projects
Cloudflare
Clusterr Framework
Co-Intelligence
Co-opetition
Coffee v. Kale JTBD
Cognitive Appraisal
Cognitive Behavioral Therapy
Cognitive Biases
Cognitive Flexibility
Cognitive Reappraisal
Cold Calls
Color Combinations for Glyvian
Comedy
Common Tasks
CommonCog
Communicating with Agency
Communication
Communication is The Job
Communication Scripts
Communication Swipe File
Company
Company Proprietary Prompts
Comparing Apache Flink with Confluent Cloud for Apache Flink
Competitive Intelligence Toolkit:
Completion as a Crucial Dimension of Stepping Stones
Compound/Robust Engineering
Compressed Skill List
Compute and Containers
Compute Pools in Confluent Cloud for Apache Flink
Computer Programming
Computing
Confluent
Confluent 2024 Evolving Customer Growth GTM
Confluent 2024 Strategy
Confluent 2026
Confluent Big Bets
Confluent Cloud
Confluent Cloud Case Studies
Confluent Cloud Client/Service Quotas
Confluent Cloud Customer Success Engineering
Confluent Cloud Demo
Confluent Cloud Docs
Confluent Cloud Flink Autopilot
Confluent Cloud Onboarding Checklist
Confluent Cloud Pricing
Confluent Cloud Support Guide
Confluent Connectors
Confluent Customer Success and Expansion Strategies
Confluent Event Driven Microservices Whitepaper
Confluent FY24 Sales Comp
Confluent Intelligence 2026 Strategy
Confluent Land Motions
Confluent Mastery
Confluent MEDDPICC Guidebook
Confluent PAO LTV 2021
Confluent PG Metrics
Confluent Platform
Confluent Product Roadmap
Confluent Replicator
Confluent Salesforce Connectors
Confluent Solutions
Confluent Tools (K8s + Ansible)
Confluent Win Wires
Connect
Connect and CDC
Consilience
Context Engineering for AI Agents: Lessons from Building Manus
Context Graphs
Context Management of Big 3 Model Providers
Conversation Code
Conversation Code Revised Notes
Conversation-Driven Development
Conversational Kumite
Conversationalist
Cooking
Cooking Lasagna
Copywriting
Core Ideas of the Progress Principle
Cost & Capacity
Cost Optimization, Performance, and Observability
Costly Signaling Theory
Courage Equals Freedom w/ Claude
Courage To Be Disliked
COVID19
COVID19 Pandemic
Creating a Wraith
Creating Good Process
Creating great SAAS Landing Pages
Creating Sales Urgency
Creating Scaffolds with Laravel
Creating the Accountable Organization
Creating the Accountable Organization Guidance
Creating The Ultimate Odysseus System
Creative
Creative Selection
Criminal Profiling
Critical Chain Project Management
Critical Realism
Critical Thinking
Crucial Conversations
cSDR Cheatsheet
cSDR Demos
cSDR Discovery Playbook
cSDR Experiment
CSFLE
Culture Hacker
Culture Virusees
Cupid Investing
Curie Medical Demo Script
Curie Medical Presentation Script
Curves
Customer Experience Job Maps
Customer Job Deep Dive
Customer Retention
Cut your fantasy football drafts into quarters
Cybernetics
Cycle Time
Dad Jokes
Daily Intention Review
Dailys
Dakota Robertson
Damn the Org Chart
Dan Koe
Daniel Dennett
Daniel Disney
Daniel Gross
Danny Postma
Dashboards, Custom Reports, Intelligence Alerts
Data Driven Management
Data Driven Organizations
Data Driven Startups
Data Integration
Data Locality
Data Management at Scale
Data Mesh
Data Visualization
Data-Driven Businesses
Databricks
Databricks and Premier Inc
Databricks for Executives
Databricks for HLS
Databricks for Retail
Databricks Presentation Round Prep
Databricks Solutions Architect Interview
Databricks Solutions Design Interview Prep
Databricks Solutions Design: Consultative Layer
Databricks Solutions Design: Governance & Security
Databricks Solutions Design: Integration
Databricks Solutions Design: Serving & Consumption
Databricks Solutions Design: Sources & Ingestion
Databricks Solutions Design: Storage
Databricks Solutions Design: Transformation & Processing
Databricks Solutions Design: Whiteboard Tips
Databricks Vibe Coding Interview Prep
Databricks: Build, Pitch, Demo! - Curie Medical
Date Night Ideas
Dave Kline
David Goggins
David Ogilvy
David Senra
David Shippins
David Skok
Death is the Default
Decide To Play Great Poker
Decision Elimination: The Largest Hidden Lever on Transaction Cost
Decisions as Bets
Deep Agents
Deep Dive Into Marketing Channels for Indiehackers/Micropreneurs
Deep Learning
Deep Learning Basics
Deep Thinker
Deep Thinkers
Deep Thinking Books
Deglazing
Delivery Guarantees and Latency in Confluent Cloud for Apache Flink
Demand Based Marketing
Demand Curve
Demand Side Problems
Demand-Side Sales
Denise Shull
Descartes' Error
Design Principles: Feedback
Designing Data-Intensive Applications
Designing Event Driven Systems
Designing for Buying: How to Break Through the Ceiling in Product-Led Growth
Designing the Ideal Bootstrapped Business
Detailed Daily Manifestation Practice
Determinism in Continuous Queries on Confluent Cloud for Apache Flink
Developer Advocacy
Developer Productivity Startups
Developer Tools, Migration, and Customer Engagement
Devin Reed
DFS
Dickie Bush
Digital Business Solutions
Digital Ocean
Dinesh Raju
Directed Acyclic Graphs
Disarm, Elicit, Influence, Ask
Discipline Equals Freedom
Disciplined Risks
Discovery Calls
DiSSS Method
Distributed Systems
Ditch Your To-Do List. Use these Docs To Make More Impact
Docker
Doing Time Right
Domain Driven Design
Domains that are difficult for AI
Don't Create Chaos
Don't Flinch Manual
Don't Think of An Elephant
Don’t Build Multi-Agents
Donald Polkinghorne and Narrative Knowing
Dopamine Reward Prediction Error Visualization
Double-Loop Learning
Doublespeak
Douglas Engelbart's NLS/Augment System
Draftkings
Drift
Drift Script
Driven by Compression Progress
Drugs/Supplements
DSP 2 Year Plan
Dynamic Verbal Confirmation Prefixes
E-commerce
E-Myth Revisited
Easy Way To Stop Smoking
Eat That Frog
Economics
Economists Numbers Guide
Ed Thorpe
Effective Kafka
Effectual Entrepreneurship
Efficiency: Optimizing Thought and Action
Efficient Model Validation and Calibration Strategies
Electrical Engineering
Elements of a Story
Elena Verna
Elon Musk
Elon's Algorithm
Eloquent Query Scopes
Eloquent Relationships
Emotional Memories
Emulsion
Ender's Game
Endure
Engineering Teams
Epistemology
Eric Thomas
Escaping the Build Trap
ETL
ETL v ELT
Eurie Kim
Evaluation & Feedback
Evaluation, Quality Assurance, and Troubleshooting
Event and Data Modeling
Event Driven Microservices
Event Tracking
Every time I have a startup idea a few days or weeks later someone else is doing it. Are there any ideas left?
Everyone talks about Clawdbot, but here's how it works
Evolutionary Psychology
EX-Livewire
EX-Tailwind
Example Script
Excuse Log
Execution as StarCraft
Execution as StarCraft w/ Claude
Executive Functioning
Executive Functions: What They Are, How They Work, and Why They Evolved
Exercises with most muscle activation
Expected Value
Experimentation / Testing
Explaining Creativity
Exposure Therapy
Expressing Ideas Through Code: A Working Guide
Extraction, Sanitization & Normalization
Extreme Asking
Extreme Giving
Extreme Integrity
Extreme Networking
Extreme Ownership
Extreme questions to trigger new, better ideas
Extreme Urgency
Extremely High Agency
Fanatical Prospecting
Fantasy Football
Fantasy Football 2021
Fantasy Football 2024
Fat
fathersabrina
Favorite Reframes
FB Libra
Feel The Fear and Do It Anyway
Feel The Fear Notes
Feeling and Knowing
Fela Kuti
Fermi Estimation Problem Solving
Fermi Estimations
Figma's Dylan Field on the Future of Design
Financial Intelligence for Entreprenuers
Finish
Finish What You Start
Finite and Infinite Games
Fintech Tools and APIs
First Principles: Why Assistance Expands Effectiveness
First Round Articles
FiveThingsYouDidToday
Fix Your Broken Team: 8 Turnaround Tips for Sustained Success
Fixed-point futurism
Fixing the ROI rubric
Flink Overview
Flink SQL Statements in Confluent Cloud for Apache Flink
Flip The Script
FlockJay
Flow
Fluid Intelligence
Focus
Focus on Impact
Focused Work Sessions
Focusing: The Essence of Change
Football Practice Structure and Organization Principles
Foreign Keys
Forget The Funnel
Formal definitions of Pills (Red, White, Blue, Black)
Foundation Model Integration, Data Management, and Compliance
Foundation Model Integration, Data Management, and Compliance: Services
Foundation Training: From Pain To Performance
Four Disciplines of Execution
Four Disciplines of Execution Summary
Four Thousand Weeks
Frameworks
Framing
Frank Slootman
Frankfurt's Theory of Higher-Order Desires
Friedrich Hayek
From Impossible To Inevitable
Full Catastrophe Living
Function to get a url query value
Functional Programming
Fundamentals of Data Engineering: Plan and Build Robust Data Systems
Funny Worldstar
Future Me
Future Me Future Statement List
Future Me Present Statement List
Future Me v2
Future Me v3
Future Me v4
Future Me: Conditional Rules
FY2026 SE Accounts
FY26 Faire
Fyodor
Fyodor v2
Gadamer's Hermeneutic Circle
Game Theory
Games People Play
Gap Selling
Gartner's 13 Sales Plays for Account-Based Everything
Gary Becker's Human Capital Framework
Gary Klein
Gary V
Gena Gorlin
General Marketing
General Planning Dilemma
General Principles of Resistance Training
Generative AI
George Soros
Gestalt Psychology
Get It Done
Get The Truth
Getting Shit Done
Getting the most out of superintelligent ai models
Git
Global Economy and Politics
Gnosis
Gnosis
Goals and Ecommerce
Goals, Methods, Habits (GMH)
Going slow to go fast
Goldratt's Rules of Flow
Good Players Are Still Good: The Most Undervalued Wide Receiver Metric
Good Publications
Good Reasons for Bad Feelings
Good relationship questions
Good Strategy, Bad Strategy
Good To Great
Google Analytics Breakthrough
Google Fonts I like
Google Tag Manager
GPT 4.1 Prompting Guide
GPT-3
Graham Weaver
Graph Theory
Great Founder Theory
Great Writing Examples
Greatness Cannot Be Planned
Greg Brockman
Grooming
Growth and Stock Prices
Growth Engineering
Growth Is Now a Trust Problem
Growth Mindset
GTD
GTM Engineering School
GTM Tactics for Sales Acceleration
GTM Tactics for Sales Acceleration x ChatGPT
GTM Tactics for Sales Acceleration x Claude
GTM Tactics for Sales Acceleration x Grok
Guidelines to Problem Solving and Decision Making
Gwen Shapira
Hacking Growth
Hacking Sales
Hammock Driven Development
Handbook of Emotion Regulation
Handling and Manipulating Dates and Time in PHP
Hardball
Hardcore Claude Code (Reddit Post)
Harold Adams Innis
Harry Dry
Haruki Murakami
Harvard Business Review
HBM Industry Michael Porter
Heidegger's Concept of Disclosure
Helpful Tips
Henrik Wærdin on Agents and Portfolio Entrepreneurship
Hero's Journey
Heroes
Heuristics
Hey Whipple, Squeeze This: The Classic Guide to Creating Great Advertising
High Contact Work
High Growth Handbook
High Output Management
High Performance Habits
High Quality Investing Content Sources
High Scalability Blog
Home Ownership
Horizontal Scaling With Docker
Hosts file Block list
How Big Things Get Done
How Brands Grow
How Brands Grow: What Marketers Don't Know
How Builders Think
How can I accelerate my personal growth efficiently?
How can I come up with a marvelous idea (in technology or finance)?
How Claude Code Works
How Computer Programs Work
How email verification works
How Finance Works
How Is the ADHD Brain Different
How Kafka and Flink Can Support AI Agents
How NFL Offenses Are Adjusting in 2025
How Not To Be Wrong: The Power of Mathematical Thinking
How Note Taking Can Help You Become an Expert
How to Ace an Internal Interview
How to analyze the elements of a game
How To Ask Questions The Smart Way
How to attend an event/meetup
How to automate, delegate, or defer
How to avoid hubris
How to be a high-value man
How To Be a Power Connector
How to be a tech evangelist
How to be an effective human
How to Be Great? Just Be Good, Repeatably
How to be more agentic
How To Be The Funniest Person In Any Room
How to Become Data Driven
How to boil life's hardest questions down to just 12 rules
How to Build an Agent
How to Build an Effective Developer-Focused Product-Led Growth Team
How to build great products
How to Build Relationship with Sales Leads
How to center content vertically using bootstrap
How to classify games
How to clean teeth effectively
How to clean the kitchen
How to clear DNS cache on Mac
HOW TO COMMUNICATE WHEN TRUST IS LOW (WITHOUT DIGGING YOURSELF INTO A DEEPER HOLE)
How to complete a work break stretch
How to configure a domain from Godaddy to Netlify site
How to connect a domain to server
How to Convert Trials into Customers
How to create a game theory matrix
How to create a laravel request
How to create a new FailMachine Site
How to create a product vision
How to create a simple Select2 select input
How to create an alias in bash profile
How to create better outcomes
How to create OKRs
How to Create Successful Sales Plays and Playbooks
How to create your own Jquery plugin
How to debug a PHP script
How to debug slow queries
How To Decide
How to decide whether or not to quit something
How to design a automation solution
How to do a jobs map
How to do an ajax request using Vue
How to do customer development
How to do JTBD prototyping
How To Evaluate AI Tools
How to Figure Out What You Really Want
How To Find A $1 Million Idea — What Product To Build
How to find a single item using Eloquent
How to find an item in a javascript array by a value
How to get a nutty flavor
How to get cheap flight tickets
How to get just column names from MySQL table
How to get random elements using Eloquent
How to get startup ideas
How to get the current window location
How to get time between two dates PHP
How to Get Whatever You Want
How to get your ida.rsa.pub
How to Get Your Organization to Appreciate Apache Kafka
How to handle conditional rendering in Vue
How to handle events with your Vue component
How To Have a Good Day
How to have a robust database
How to horizontally align content using bootstrap
How to identify frame traps
How to identify the elements of a game
How to implement a Vue component
How to implement an AJAX form submission using Vue
How To Impress Someone You Admire
How to influence people to behave how you want them to
How to influence yourself
How to instantly be better at things
How to kill crab grass and clover
How to kill slow and stuck queries
How To Know Everything
How to make a sidebar with Bootstrap
How to make a sound design decision
How to make decisions
How to Make it to President's Club in 2025
How to manipulate JSON in Javascript
How to market effectively
How To Measure Anything
How To Meet New People Guidebook
How To Operate
How to operate effectively in this world
How To Pick The Right Tools
How to protect yourself from analytics hacking
How to purposefully read a book
How To Queue Work For Greatness
How to quickly launch software projects
How to react when you see someone has built something that you had an idea of building
How to resolve to the correct directory Path
How to Rise from Newbie to General Manager in Seven Years
How to run a masterful product company
How to run PHP Unit via Docker-compose containers
How to run SQL queries in Laravel
How to select high leverage activities to work on
How to sell to a problem
How to sell to developers
How to serve a server with php artisan
How to Set 2025 Goals That Are Impossible to Fail
How to Set up Time Synchronization on Linux Ubuntu
How to share a blog post after writing it
How to sharpen a knife
How to ssh into laravel forge
How to start a Jigsaw project from a repo locally
How to start a new FailMachine project locally
How to start a new Laravel Spark project
How to start a work session
How To Style a Page
How to think and be contrarian
How to think from first principles
How to track user behavior using Javascript
How to Train a Wild Elephant
How to troubleshoot bootstrap grid system
How to troubleshoot common Vue problems
How to troubleshoot SASS errors
How to troubleshoot solving riddles
How to troubleshoot the design process
How to turn a PHP object into an array
How to turn an idea into a working UI
How to understand the natural world
How to use a seeder and seed data in Laravel
How to Use AI to Create Role-Play Scenarios for Your Students
How To Use Docker Swarm for Horizontal Scaling
How to use Eloquent mutators
How to use Quilljs editor
How to use the Intrigue frame
How to use the javascript fetch API
How to use the Prize frame
How to use timezones with mysql
How to use webpack to implement Vue Modules
How to version control effectively with Git
How to wake up in the morning
How to Win in a Winner-Take-All World
How To Win Violently
How to win, constantly and consistently
How To Work Better With AI, Through AI
How to work hard
How to write
How to write a bash script
How To Write Clean and Effective Code
How To Write Funny
How to Write Nurture Emails
How volatility affect the price of options
Howard Marks
HTTP Headers
HTTP Methods
HTTP Status Codes
Hubspot
Hubspot Sales Email Subject Lines
Human-Computer Interaction (HCI) Principles
Human-LLM Collaborative Reasoning Techniques
Humble Modifiers
Husserl's Concept of Bracketing (Epoché)
HV Action
HVAC
IBM
IBM WatsonX
Identifying a niche between Information/AI/Data/Automation
Identifying Your Most Important Outputs
Identity & Entitlement
Identity Economics
If Only We Knew What We Know: The Transfer of Internal Knowledge and Best Practices
If you over salt your food
Igbo
Images of an Organization
Impatience
Implementing CRMs
Important Info
Important Information
Impossible To Inevitable
Impro
Improv Wisdom
Improving ChatGPT Prompts
Improving Predictive Processing Systems
In Defense of Radical Self-Betterment
Inadequate Equilibria
Inbox Ten
Incentives and the Cobra Effect
Increateable
India
Individuals as Magnitudes and Teams as Vector Sums
Inertia.js
Inference is the New Sales & Marketing Spend
Infinite Games
Influenza
Information and the Modern Corporation
Information Processing Models
Information Rules
Information Rules: A Strategic Guide to the Network Economy
Information Theory
Inner Game of Work
Inside OpenAI’s in-house data agent
Inspirations
Installing QuillJs
Instapage
Intellectual Humility Is a Cop-out
Intellectual Tapestry
Intellectual Truths
Intelligence Products
Intelligence tradecraft and Humint
Intercom Creating Best Practices
Intercom Customer Support Best Practices
Interesting Deep Learning Projects
Interesting GA segments for SAAS
Internal Training
Internet Pipes
Interviewing
Introduction to the Sales and Marketing Machine
Introductory Sales Questions
Intuition Pumps and Other Tools for Thinking
Inverse, Converse, Contrapositive
Investing
Irrational Fears
Is Covid19 a Synthetic Virus?
Itamar Turner-Tauring
J.L Austin Speech Act Theory
Jack Butcher
Jacob O'Bryant
James Gross's Process Model of Emotion Regulation
James O'Shaughnessy
Japan
Jason Capital
Jason Cohen
Jason Liu
Jasper Polak
Javascript
Javascript Array Manipulation
Javascript Tricks
Jay Kreps
Jean-Paul Sartre
Jeff Bezos
Jerry Seinfeld
Jess Chan
Jev
Jia Jiang
Jim Dethmer
Jim Rogers
Jim Rohn
Joanna Wiebe
Job Hunt
Job Stories
Jobs To Be Done Theory
John Anthony
John Cutler
John McMahon
Jordan Belfort
Jordan Peterson
Jordan Peterson
Josh Braun
Josh Brindley
Josh Waitzkin
Josh x Keenan
Journal
Journey to Event Driven
Jquery
JTBD Insight Framework
Julian Shapiro
Julie Gurner
Just Demo
Justin Skycak
Justin Welsh
Kafka Connect
Kafka Consistency and Availability
Kafka Integrations
Kafka Internals
Kafka Streams
Kafka Streams DSL
Kafka Topic Design
Kafka Value Props
Kafka, CDC, ML/AI, Agents
Kafka, CDC, ML/AI, Agents: Source
KafkaJs
Kage Bunshin
Kai Waehner
Karisma King
Katherine Boyle
Kathy Sierra
Keith Rabois
Keith Stanovich and Rational Thinking
Kelly Criterion
Keras
Kevin Samuels
Key Takeaways from Elite Athlete Mental Research
Kieran Klaasen on Agentic Workflows
Kieran Majury
Knoster Model
Knowledge Management
Knowledge through Syllogistic Reasoning
Kolb's Experiential Learning Cycle
KSQL / ksqlDB
ksqlDB Concepts
ksqlDB Tutorials
Kubernetes
Kubernetes Docs
Kubernetes Tutorials
Kumar Thangudu
Kunal Shah
Labor Productivity
LangChain
Laravel
Laravel Collections
Laravel Factories
Laravel Forge
Laravel Installation
Laravel Queues
Laravel Request Instance
Laravel Tinker
Laravel Web Push Notifications
Larry Long Jr.
Latent Expertise: Everyone is in R&D
Laws of Fun
Laws of Thermodynamics
Lead Review Memo
Leaders as Decision Architects
Leadership Handbook
Lean Canvas
Lean Customer Development
Lean Customer Development
Lean Startups
Learning from Quant Traders
LearnUI
Lessons from Building AI Agents for Financial Services
Lessons from the 2022 RUFF League
Letters to a Young Poet
Levels of an Idea
Levels of Done
Lex Freidman
Life Coaching Handbook
Life Satisfaction
Limits of Service Leadership
Lincoln Tunnel
LinkedIn Playbook
Linux
Linux Certification Training
Linux Certifications
Linux Commands
List of CFJ in business
Listening Is The Job
Lived Experiences
Livewire
Living with Complexity
LLM Codegen Workflow
LLM Prompts
Load Balancers
Loading QuillJs Data into a form
Local Deployment Concepts for LLMs
Logic
Logic [Fixed]
Logic of Failure Compressed Notes
Logical Fallacies
Long Story Short
Longform Lite
Loose Podcast Ideas
Loserthink
LSAT Reading Comprehension
Ludwig
Lux Capital
Mac and Cheese
Machine Learning
Machine Learning Algorithms
Machines of Loving Grace
Mailchimp
Make
Make a Name For Yourself
Make it Clear
Make Time
Making Work Visible
Manage your Day to Day
Manage Your Manager
Managed Databases
Management
Management and Governance
Management Consultancy
Management Levels and Types
Manager Superpower Series #2: Optimism
Managing Your Manager
Mapping Semantical Certainties to Kelly Criterion Edge Percentages
Maps of Meaning
Marc Adler
Marc Andreessen
Marcus, Friedrich, Fyodor
Mark Manson
Market Mind Games: A Radical Psychology of Investing, Trading and Risk (DIGITAL AUDIO)
Marketing
Marketing Segmentation
Marketing to Developers
Martin Kleppmann
Marty Lobdell
Master Data Management
Master Shi Heng Yi
Mastering Confluent Kafka from Failure Cases
Mastering Fun as a Skill
Mastering Kafka from First Principles
Mastering Kafka from First Principles: API-First/Digital Native
Mastering Kafka from First Principles: Fintech
Mastering Product Experience in SaaS
Mastering Technical Sales
Math
Mathematics
Matrix
Matt Abrahams
Matt MacInnis
Matt Mochary
Matt Pocock on Speaking
Matthew Confer
Max Levchin
Maxims For Thinking Analytically
Maybe you’re not Actually Trying
McKinsey
Measuring Deal Momentum, the Formula for Enterprise Sales
Mechanism Design
Meditation
Meditations
Meditations Guidance
Melvin Conway
Memory as Reasoning
Memos
Mental Action Tricks
Mental Models of Analytics
Meta-Lessons from Creating with Claude
Metabolism
Metadata
Metaphors We Live By
Method Acting
Michael Mauboussin
Microservices
Microservices with Apache Kafka
Microservices with Confluent
Microsoft on Microservices
Mid-funnel (MOFU)
Midwit
Migration
Milestones, Learnings, Confidence, the inner triangle to Outcomes, Knowledge, Actions
Million Dollar Weekend
Millionaire Fastlane
Mimetic Theory
Mind Magic
Mindfulness and Rationalization
Mindsets on being Relentless by Tim S. Grover
Minimalist Web Design
Minto Communication Guide
Minto Pyramid
Mircea Eliade's Eternal Return
Mission, Strategy, and Tactics
Model Customization
Model Evaluation Fundamentals
Model Invocation
Model Serving
Model Thinkers
Models of Misalignment, Information, and Coordination
Module 0: The Agent Platform Landscape
Module 1: The Token Economy
Module 1: Agent Fundamentals: Loops, Reasoning, Memory, and State
Module 1: Evaluation Foundations
Module 1: The GenAI Threat Model
Module 2: Evaluation Datasets and Ground Truth
Module 2: Input Safety and Adversarial Defense
Module 2: Requirements elicitation for generative AI
Module 2: Token Efficiency and Context Optimization
Module 2: Tools, Function Calling, and MCP
Module 3: Automated Evaluation and Model Comparison
Module 3: Data Validation and Processing Pipelines
Module 3: Model Selection, Tiering, and Distillation
Module 3: Multi-Agent Systems and Model Coordination
Module 3: Output Safety and Deterministic Transformation
Module 4: Grounding, Verification, and Hallucination Control
Module 4: Agent Safety, Control, and Human-in-the-Loop
Module 4: Caching
Module 4: RAG and Retrieval Evaluation
Module 4: Vector Store Design
Module 5: Agent Evaluation
Module 5: Data Security and Network Isolation
Module 5: Model Deployment and Serving
Module 5: Retrieval Mechanisms
Module 5: Throughput, Capacity, and Scaling
Module 6: FM API Integration and Real-Time Delivery
Module 6: Human Feedback and Annotation
Module 6: Latency Optimization and Inference Tuning
Module 6: Privacy and PII Handling
Module 6: Prompt Engineering and Governance
Module 7: Continuous Evaluation, Quality Gates, and Reporting
Module 7: Enterprise Integration, Security, and Compliance
Module 7: Governance, Lineage, and Auditability
Module 7: Resilience, Customization, and Lifecycle
Module 7: Retrieval and Vector Store Performance
Module 8: Developer Experience, Observability, and Troubleshooting
Module 8: Observability, Monitoring, and Troubleshooting
Module 8: Responsible AI: Transparency, Fairness, and Policy
Module 8: Systematic Troubleshooting: Content and Integration
Module 9: Prompt and Retrieval Troubleshooting
Mogul
Mogul: Books
Molly Mielke McCarthy on finding special people, agency, and playing your own game
Mom's Stew
Money Skills Review
Monthly Content Plan
MoonShots mission statement
Moral Reasoning
Morgan Housel
Morgan J. Ingram
Move First Think Later
MrBeast
Multi-tenacy Laravel
Multi-tenancy Software Architecture
My Big 5 Personality Test
My Personal Archtype
My Personal Jungian Analysis
My Philosophy
MySQL
MySQL Antipatterns
MySQL Design Patterns
MySQL How to get the difference between two dates
Mythical Man Month
n8n
Narrative Psychology
Narrative Writing Structure for Internet Content
Narratives, Commitments, Tasks (NCTs)
Naruto
Nat Friedman
Naval Ravikant
Navan Q1 FY27 Earnings Transcript
Navigator
Negative Feedback
Negotiate Vested Options Severance
Neo Sub Factors (Big 5 Personality Test)
Neo4J
Neurobiology of Social Behavior
Neuroscience
Neuroscience of pain and discomfort
Never Eat Alone
Never Finished
Never Split The Difference
New York City
Nick Huber
Nick J Sheriff
Nicolas Cole
Nicotine
Nigeria
Nikita Bier
Nine Things Successful People Do
No Vibes Allowed: Solving Hard Problems in Complex Codebases
Non Linear Dynamics
Non-Negotiable as a personal decision making strategy
Note on the Relationship Between Artificial Intelligence and Human Intelligence
Notes on Managing ADHD
Notes on Managing ADHD
Nothing Fucking Matters
NPS
Nuclear Energy
Number Quest
Numbness To Loss
Oatmeal Raisin Bar Cookies
Oatmeal Recipes
Object Design Style Guide
Objection Handling
Observability
Obviously Awesome
Ogilvy on Advertising
Ole Peters
Olive Oil
On becoming competitive when joining a new company
On Being an Executive
On Being Contrarian
On Culture
On First Principles Thinking
On Humility
On Reviews
On Sarcasm
On the Shortness of Life
On the viability of PQOs Memo
On Writing Well
One-shot Rapid Application Development
Ontology
OODA Ontology
OpenAI
OpenAI API
Operating Efficiently at Scale
Operational Troubleshooting
Operations
Operations Research
Operator
Operator: Books
Opportunity Cost
Optimal Scaling Path for a PHP CRUD Application
Optimizing Eye Health
Orchestration & Control
OSINT
OSS Migrate
Outbox Pattern
Outcome Orientation as a Cure for Information Overload
Outcomes
Overcoming The Time Sink of Getting Blocked
Overfitting
Ownership and Entitlement
Parakeet
Pareto Efficiency
Parmita Mishra
Pat Grady
Path Dependency
Patrice O'Neal
Patrick Mckenzie
Patrick O'Shaugnessy
Patrick Winston
Pattern Breakers
Pattern Recognition for Intelligence Products
Paul Graham
Pavel Training Methods
Paying attention to complete a task/goal
PayPal
Percent Increase Forumla
Perceptual Control Theory
Personal Anki Categories
Personal Office Communication Guide
Personal Reframes
Personal Shadow Work
Personality
Personality Plus at Work
Personality: A User's Guide
Persuasion
Peter Attia
Peter Thiel
pgVector
PHP isset vs empty vs is_null
PHP: How to search for the array key that has the value OR has the array with the value
Physics
Picking Problems to Marry
Pieter Levels
PIPE Program 2025
Pipeline Cures All
Pitch Anything
Pixar's 22 Rules of Storytelling
Planning v. Feedback
Playing Long Term Games
Playing To Win
PM Communication Scorecard
Podcast loose ideas
Poor Charlie's Almanack
Pork
Portfolio Management
Post Ideas
Post-Click User Experience
Practical Change Data Streaming Use Cases with Apache Kafka & Debezium
Practical Use Cases for Read-Only Iceberg Tables
Pragmatics
Pragmatism
Precious Metals
Precommitment: A Way around Temptation
Primal Intelligence: You Are Smarter Than You Know
Principal-agent problem
Private Networking with Confluent Cloud for Apache Flink
Problem Solving
Problem Solving Techniques
Process Data with Flink
Process Groups
Process Improvement is Trickier Than You Think
Product Development
Product Market Fit
Product-Driven versus Customer-Driven by Ribbon Farm
Product-Led Growth
Product: Delivery Systems at Scale
Products
Profile: Agents as the Medium
Profile: LLMs as the Medium
Profit First
Program management vs. project management
Progress through Storytelling
Project Management
Project Management Unraveled
Project Management Unraveled Expanded
Project Portfolio Strategy
Prompt Engineering
Proof of Concepts
Protein Recipes
Prototype Theory
Psycho-Cybernetics
Psycho-Cybernetics Condensed Notes
Psychology of Intelligence Analysis
Pull Work That Pays
Python
Quantum Computing
Quarterly strategic planning using the fairytale structure
Question Based Selling
Question Tome
Questions That Sell
Questions to Analyze a Business
Queueing
QuillJs Events
Rackspace
Radical Focus
Raise or Fold
Random Notes
Rationality: From AI to Zombies
Ravi Gupta
Ray Dalio
Ray Dialo's Principles
Real Estate
Recon-ng
RecordRTC.js
Redfin
Redis
Reducing
Reforge
Reforge Artifacts
Reforge: Growth Series
Reforge: Retention and Engagement
Reframe Your Brain
Reframe Your Brain: The User Interface for Happiness and Success (The Scott Adams Success Series)
Reid Hoffman
Relationship and Rapport Mastery
Rendering
Repeatability
Resonate
REST best practices
Retrieval & Grounding
Reverse ETL
Reverse Proxy
Rice Recipes
Rich Hickey
Richard Feynman
Richard Odysseus
RichNwan Blog
Risk Savvy: How to Make Good Decisions
Roasted Potatoes Recipe
Rob Henderson
Robert Cialdini
Robert J. Sternberg and Practical Intelligence
Robert Moses
Robert Spolsky
Roberto Blake
Rohan Gilkes
ROIT: Return on Invested Token
Roles and RAS
Root Cause Analysis
Rotoviz
RSDTyler
Rubrics
RUFF 2025
RUFF Fantasy League
RUFF Final 2023 Plan
Rule Reviews
Rulebook
Rules of the Game
Runaway Selection
Running Effective Prospecting Days in B2B SaaS (with Remote Best Practices)
Ruth Chang
Ryan Singer
Saas Metrics -- A Guide to Measuring and Improving what Matters
SaaS Terminal Value under Scrutiny
Safety & Policy
Safety, Security, Privacy, Governance, and Responsible AI
Sales
Sales Acceleration Formula
Sales Compensation in a Consumption Pricing World
Sales Engineering
Sales Happen When Buyers Fear Missing Out
Sales Pipeline
Sales Pitch: How to Craft a Story To Stand Out and Win
Sales Process
Salesforce
SalesLoft
Salt
Salt, Fat, Acid, Heat
Sam Altman
Sam Hinkie
Same as Ever: A Guide to What Never Changes
Sandler Method
SBA
Scaling People
Scaling The Things That Don't Scale
Schema and Statement Evolution with Confluent Cloud for Apache Flink
Schema Registry
Scientific Method
Scientist
Scientist: Books
Scott Alexander
Scott Barrett
Scott Bessent
Scrapinghub x Confluent Cloud
Search for knowledge/information to complete a specific task/goal
SECI Model of Knowledge Management
Second Machine Age
Secrets to Winning Office Politics
Security and Governance
Security, Identity, and Compliance
Seeing Like a State
Segment
Segmentation
Segmentation In-Depth
Segmentation, Vectorization & Index Maintenance
Seibel on Startups
Select2
Self-Directed Behavior
Selfish Writing by Morgan Housel
Selling Confluent Cloud
Selling To Big Companies
Selling to Carol: Why targeting an ICP brings 10x more customers than you expected
Sense of Urgency
Sensemaking Sales
Server Architecture
Server-Fetched Partials
Serverless
Servers
Seven and a Half Lessons About the Brain
Sex
Sexual Tension
Shaan Puri
Shadow Work
Shape up
Shifting Left: Rearchitecting the Operational–Analytical Divide to Produce Trustworthy, AI-Ready Data atthe Source
Shyam Sankar
Sign-up Onboarding Flows
Signals for a successful venture
Simon Sinek
Simple Heuristics That Make Us Smart
Simple Made Easy
Simply Complexity
Sizing, Performance and Cost
Skill
Skill Prioritization and Ideas
Skin in The Game
SKOOL Games
Slack
Slava Akhmechet
Smallpox
Smart Brevity
Smash Bros
Snapshot Queries in Confluent Cloud for Apache Flink
Snowflake
So You Think You Can Prompt
Soft Skills for Managers
Software
Software Architecture
Software Engineer's Guide to Freelance Consulting
Software Tool Solutions
Solving Present Bias: Governance across time.
Somatotypes
Soros' Fallibility and Reflexivity
Source & Ingestion
Sources of Power
Sovereign Individual
SparkToro
Speak in Stories
Speak Like Churchill, Stand Like Lincoln
Speak with Impact
Spellbinding Sentences
Spin Selling
Sports
Spy Secrets That Can Save Your Life
Standard Operating Procedures
Stanley Druckenmiller
Star Wars
Start From Demand
Start Small, Stay Small
Startup Analytics/Marketing Stack
Startup Ideas
State & Memory
Statement CFU Metrics in Confluent Cloud for Apache Flink
StaySassy Blog
Steal the Show
Steph Smith
Stephen Covey
Steve Jobs
Steven Pressfield
Stocks
Store Knowledge to later complete a specific task/goal
Stratechery
Strategies of Genius
Strategy to Manage User's Timezones across application
Strategy v. Execution
Stream Processing
Stream Processing
Stream Relational Processing Platforms
Streaming and Generative AI
Streaming Audio
Streaming Projects
Strengths Dictate Weaknesses
StrengthsFinder
Strong Phrases and Sayings
Studying Ads
Submitting a form that is using QuillJs
Subscribe Highlights from the Claude 4 system prompt
Sudden death in FIFA athletes
Suhail Doshi
Superapps
SuperPrompts
Surrounded by Idiots
Sweller's Cognitive Load Theory
Synthesis
System Fonts
System Thinking Tools
Systems Bible
Systems Institute Courses
Systems Thinking
TableFlow Technical Study Guide - First Principles
Tables and Topics in Confluent Cloud for Apache Flink
Tacit vs. Explicit Knowledge
Taiichi Ohno
Tailwind
Take Back Your Power
Talk Tracks and Definitions
Taylor Pearson's notes
TCAD Internal Prep Strategy
Teaching instead of Selling
Team of Teams
Technical Advisor Guidelines
Technical Advisor Guidelines: Data Engineering T-Shirt Sizing
Techniques of Visual Persuasion
Technology
Ted Talks: The Official Guide to Public Speaking
Teleology
Template for Critical Analysis of Arguments
Tempo
Temporal Landmarks
Temporal.io
Tenancy, Quotas & Metering
Text-Heavy Design Presentation
TGSiTW: Condensed
TGSiTW: Condensed JBP
TGSiTW: Condensed Simple
TGSiTW: Condensed Simple II
That's Interesting
That's Not What I Meant
The 1-Page Marketing Plan
The 5 Part Process to Networking Effectively
The 6 AI Engineering Patterns
The 7 Primal Pains
The A-Z guide to Startup Metrics
The Agent Development Life Cycle
The architecture of today's LLM applications (2023)
The Art of Action
The Art of Extreme Commit
The Art of Impossible
The Art of Profitability
The Art of Strategy
The Art of Strategy
The Art of Strategy: A Game Theorist's Guide to Success in Business and Life
The Art of Winning
The As If Principle
The Bedrock Family
The Beginning of Infinity
The Beginning of Infinity w/ Claude
The Bid/Ask Spread of Top Talent
The Book of Elon: A Guide to Purpose and Success
The Book of Why
The Challenger Sale
The Checklist Manifesto
The Chimp Paradox
The cognitive categories of knowledge work
The Complete Guide to Command of the Message, Challenger & Great Demo!
The Complete Guide to Planning Your Day
The Complete Guide to Sales Force Incentive Compensation
The Compound Effect
The Comprehensive Architecture of Shaping: Technical and Tactical Methods
The concept of a Unit
The Constant Questions
The Constitution of Knowledge
The Conversation Code
The Creative Act
The Creative Act: Organized Notes
The Creed of Future Me
The Crumbling Workflow Moat: Aggregation Theory's Final Chapter
The current state of AEO
The Dark Triad Playbook
The Deep Dive Into the Needs of Indiehackers and Micropreneurs
The Design of Everyday Things
The Design of Future Things w/ Claude
The Dictator's Handbook
The Economic Rationalist
The Effective Executive
The Elements of Execution
The Embedded Entrepreneur
The Existential Questions to Answer For Any Endeavour
The Extended Mind
The Factory and The Lab Thesis
The Fear That Steals Your Life's Work
The Fifth Discipline
The Five Dysfunctions of a Team
The Five Patterns That Separate Elite Revenue Teams From the Rest
The Flinch
The Folly of Fools
The Folly of Fools Insights
The Founder's Mentality
The Four Horsemen of the Tech Recession
The Four Steps to the Epiphany
The Full Stack Startup
The Gifts of Imperfection
The Gifts of Imperfection Notes
The Glyvian Think Tank
The Go-Giver
The Go-Giver
The Goal
The Golden Workflow
The Great CEO Within
The Greatest Businessman in The World
The Greatest Salesman in The World
The Growth Marketer's Playbook
The Habituation of Excellence
The Hawthorne Effect
The Heart of Innovation: A Field Guide for Navigating to Authentic Demand
The Information
The Inner Game of Tennis
The Inner Game of Work
The Intangible Skills You Can't Interview For
The Internet
The Joy of Game Theory
The Key Skill We Rarely Learn: How to Feel Your Feelings
The Knowing-Doing Gap
The Knowledge Economy Is Over. Welcome to the Allocation Economy
The Ladder of Success
The Language of Uncertainty
The Last Bus Problem
The Laws of Human Nature
The Lifecycle of a Webpage
The Logic of Failure
The Lost Art of Listening
The Magic of Big Thinking
The Math Behind Deep Learning
The Meaning of Ownership
The Meta on Learning 2026
The Midwit Trap: Why Sophistication Defeats Itself
The Mindfulness Game
The Molecule of More
The Mom Test
The Moral Case for Making Money
The MoSCoW Method
The most profitable skill of the 21st century (not AI)
The Nature of Value
The Neuroscience of Risk Taking
The One Question That Accelerates Every Ambitious Goal
The One Thing
THE OPERATOR'S MANUAL ON WINNING ANY RELATIONSHIP
The Order of Time
The Outsiders
The P Rules
The Pain is the Rehab
The Pain We Can't Outrun
The Philosophy of Progressive Refinement
The Phoenix Project
The Pipeline Delusion
The Potential of Integrating Intelligence and Intuition
The Power of Mathematical Thinking
The Power of Myth
The practical application of "Rocks, Pebbles, Sand"
The Presentation Architecture Framework
The Price We Must Pay
The Principles of Product Development Flow
The Principles of Scientific Management
The Process
The Prompt Report: A Systematic Survey of Prompting Techniques
The Psychological Needs of the Extremely Ambitious
The Psychology of Action: Linking Cognition and Motivation to Behavior
The Psychology of Strategy
The Psychology of Time Perception
The Psychology on How We Interact With Things
The Psychopathology of Beliefs
The Purpose-Built AI Services
The Pursuit of Wow!
The Qualified Sales Leader
The Ratchet Effect
The Rebel Allocator
The Reframing Matrix
The relationship between Mindfulness and Executive Functioning
The Remarkable Effect
The Revenue Takes Care of Itself
The RevOps Playbook: Owner.com CRO’s Secrets to Scaling
The Righteous Mind: Why Good People Are Divided by Politics and Religion
The rise of product-led sales
The Roomates
The SAAS Sales Method: Sales as a Science
The SageMaker Family
The Sales Development Playbook
The Science of Storytelling
The scientific literature of visualization
The Score Takes Care of Itself
The Scout Mindset
The Self as a Center of Narrative Gravity
The Short Case for Nvidia Stock
The Six Fundamental Principles of Design
The Spiderweb Strategy
The Star Principle
The Status Game
The Status Game Insights
The Stepping Stones You're Not Building
The Strange Order of Things
The Strategy-Focused Organization
The Subtle Art of Not Giving a Fuck
The Talent Factory: How To Identify and Develop A-Players for Your Team
The Ten Principles Behind Great Customer Experiences
The Three Greatest Survey Questions Ever
The Toyota Way
The Transaction Costs of Work
THE TROUBLE WITH INCENTIVES: THEY WORK
The Trusted Advisor
The Trusted Advisor Revised Notes (Claude)
The Ultimate Hack: How To Meet Anyone and Make Success Inevitable
The Ultimate Sales Machine
The Undercurrent Skills Maturity Matrix
The unprofitable SaaS business model trap
The Upside of Your Dark Side: Why Being Your Whole Self--Not Just Your "Good" Self--Drives Success and Fulfillment
The value of an activity log
The Virus of The Mind
The War of Art
The Way of The Superior Man
The Way Richard Works
The White Pill Manifesto
theHarvester
Theory of Constraints
Theory of Mind
Things 10X People Do
Things I know at 40 I wish I knew at 20 by Mark Manson
Things That Make Us Smart
Things That Make Us Smart w/ Claude
Think Twice
Thinking and Deciding
Thinking Fast and Slow
Thought Experiments
Three ways to get the most from your Confluence personal space
Through the Language Glass
Tiago Forte
Tim Denning
Tim Ferris
Tim O'Reilly
Time and Watermarks in Confluent Cloud for Apache Flink
Time Asymmetry
Time Management
Time Management Advice for Sales Reps
Tinkertoys
To learn anything well
Tony Robbins
Tool Use v. RAG
Tools
Top 10 Connectors Cheatsheet
Top 7 Leadership Styles
Top Interpersonal Speaking Skills
Top Two Reasons for Churn
Topics to discuss with Life Coach
Traits I Value
Transactional Analysis Frames
Transferring Tacit Knowledge
Transparency is the Key to Accountability
Transport & Client
Triangulating Market Sentiment
Tricks for Introverts
Trigger List
Troubleshooting Issues in MySQL
Troubleshooting Laravel Environment Variables
Trueridge
Trueridge Dossiers
Trueridge: 10X Leverage
Trueridge: Accelerated Influence
Trueridge: Products
Turbolinks vs JS Framework
Turning Desire Into Dollars
Turning Pro
Tutorial Introduction to Streaming Application Development
Tutorials
Twilio
Twint
Twitter Hack of July 2020
Tycoons
Uber
UiPath
Ultimate Business Discovery Questions
Ultimate Organizational Skill List
Ultimate Question Vault
Ultimate Writing Handbook for Nonfiction
Umwelt
Uncapped Podcast
Understanding a forecast call
Understanding Composer
Understanding CORS
Understanding DNS
Understanding Docker-Compose
Understanding EC2
Understanding Environment Variables
Understanding Flexbox
Understanding How People Use The Web
Understanding HTTP
Understanding HTTP caching
Understanding Javascript Environment and Execution
Understanding Javascript Window Object and It's Descendants
Understanding Laravel Service Container
Understanding Laravel Spark
Understanding Media: The Extensions of Man
Understanding Michael Porter
Understanding Michael Porter: The Essential Guide to Competition and Strategy
Understanding Motivations > Marketing Hacks
Understanding MySQL Indexes
Understanding MySQL Statements
Understanding Networking Ports
Understanding OAuth2
Understanding PHP
Understanding Social Network
Understanding Try, Catch, Finally statements in PHP
Unearned Wisdom Notes
Unit
Unit Economics
Unit of Work
Unit of Work with ChatGPT
University of Chicago Writers Lab
Unreasonable Success and How to Achieve It
Use Case Based Sales Pipeline
Useful Array Functions in PHP
Useful Complexity of Thought Management Tools
Useful HTTP Codes
Useful php date tokens
Useful PHP file functions
Useful PHP Unit commands
Useful Prompts
Useful Terms
User Stories
User-defined Functions in Confluent Cloud for Apache Flink
Using Autonomous Agents with Nat Elliason
Using Faker PHP package
Using Jigsaw from Tighten
Using Laravel Eloquent Effectively
Using Nano in terminal
Using Tailwind UI
Using the ideas of Donald Reinersten to Intuit the Triangle (More, Faster, Better)
Using The Trust Equation
Valuation Mastery
Value Add Disease
Value Investing
Values in Therapy
Vaughn Tan
Venkatesh Rao
Virology
Visions, Strategy, Tactics, Execution
Visualization Techniques for High Output
Vivid Visions
Voice of the Customer
Vox Day
Vue
Vyv App
Wanting
Warren Buffet
Way of The Wolf
Ways to present website information
Web 2.0 Framework
Web Analytics 2.0
Web Application Architecture
Website Information Architecture
Weekly/Monthly/Quarterly Knowledge Review
Wenger's communities of practice theory
Wes Kao
What Are AI SuperPrompts And Why They Are Important.
What are some techniques startups can use to initially draw attention to their product?
What are some things about India that foreigners don't believe until they come to India?
What are some top automation tools that entrepreneurs use, things used for organizing life, contacts, deals, finding information, networking, and getting things accomplished?
What are the best landing page builders?
What are ways in which poor children can outperform rich privileged children?
What can cause a great startup to fail?
What drives great entrepreneurs
What great AI Teams do
What is a CDN
What is a Mindset
What is the best detailed advice you'd give to a software or mobile app start-up company?
What is Value
What is your main advice for those starting their own business?
What makes a good rule
What qualities are shared by most successful startup home pages?
What should every aspiring writer know about writing?
What the CEO Wants You To Know
What Theory is Not, Theorizing Is
What to do when your client doesn't know they have a problem
What We Learned from a Year of Building with LLMs
What will be true about data 10 years from now
When trying to decipher information from influence
Which channels should B2B company use to reach potential customers and effectively promote its product?
Which Self
Why Acceptance Works In Behavior Change
Why Buddhism is True: The Science and Philosophy of Meditation and Enlightenment
Why Deadlines Matter
Why Ideas First Approach To Innovation is Misguided
Why Input Goals Matter w/ Claude
Why Search Before Generate
Why you would need your own servers vs Cloud Vendors
Wide Receiver Stats That Matter for Fantasy Football
Will To Power
William Beteet III
William Edwards Deming
Willpower Doesn't Work
Wired for Story
Wisdom by Intellectual Belief
Wisdom of Crowds
Wooden's Leadership Game Plan
Words
Work Principles 2026
Working Backwards
Working The System
Working with Evolo landing page
Working with Laravel Eloquent and dates
Working with Laravel HTTP Responses
Working with Math and Numbers in Javascript
Worst To First
Wrestle Your Devils
Write-Ahead Log
Writing & Communication Theories
Writing Handbook
YNAB
You Aren't Learning If You Don't Close the Loops
You Need More Volume
You Need to Ship Faster
You Should Write An Agent
Your Discomfort Tolerance is a Muscle—And It's Probably Atrophied
Your job is to solve problems, not look smart
Zachary Perret
Zain Kahn
Zero To One
Zinc
Duplicate Records in Tableflow
🧠 Free Recall
❓ Quiz
🔍 Cues
🔮 Simulation
🥷 ShadowBox
📐 Encode Cards
🎙️ Generate Documentary
How Tableflow works Tableflow is a Confluent Cloud service that materializes a Kafka topic as an open table (Iceberg or Delta) without you running a sink connector or ETL job. It handles the work you'd otherwise do by hand: cleaning, schema management, materializing CDC streams, transformation, compaction, and writing Parquet/Iceberg files. Mechanically: Confluent You enable it per topic. Tableflow reads the topic and its Schema Registry schema, and writes Parquet data files plus Iceberg metadata/manifests into either Confluent-managed storage or your own bucket. Tables are exposed through Confluent's embedded Iceberg REST catalog, or synced to AWS Glue, Snowflake Open Catalog, or Databricks Unity Catalog, so Spark/Trino/Athena/Snowflake/DuckDB query them as normal tables. ConfluentConfluent It also manages schema evolution, file compaction, and catalog registration on an ongoing basis. Snowflake There are two write modes. Append treats every Kafka record as a new row — good for event streams. Upsert is the one you're asking about: the Kafka message key and partition number form the composite primary key of the table, and Tableflow retains the most recent version of data for each key. This is the same behavior as a Flink table in upsert mode. Tableflow maintains an additional index table to make this perform at scale, and if your key exceeds 256 bytes it uses a hash of the key for the uniqueness check. Updates and deletes are written as separate delete files (merge-on-read), which Tableflow merges and compacts automatically; compatible engines reconcile the upserts at query time. Deletes require tombstones — a record with a key and an empty value. Confluent + 2 One consequence worth internalizing: Tableflow doesn't own a re-partitioning step. It dedupes within what Kafka already gave it, using Kafka's key bytes and Kafka's partition assignment as ground truth. Why duplicates still show up 1. The primary key includes the partition number. This is the single biggest source. If the same logical entity lands in two different partitions, you get two rows, both "correct" from Tableflow's point of view. Confluent calls this out explicitly for partition-count increases: raising the partition count on a compacted topic used with upsert mode can produce duplicate rows, because producers may route keys that previously went to one partition to a different one. Other paths to the same outcome: Confluent Different producers using different partitioners (Java client default vs. librdkafka vs. a custom one), or a client that assigns partitions explicitly. A backfill or migration job writing the same keys with a different distribution than the live producer. Cluster linking / Replicator / a Flink job that repartitions with a different bucketing scheme. 2. The key bytes aren't stable. Tableflow compares serialized keys. "1001" as a string key and 1001 as an Avro int are different keys. So are keys that differ in whitespace, case, field order in a composite string, or that switched serializers mid-life. Also note the gotcha that if the key fields exist in both the Kafka key and the value, the values from the record value are used, not the key — so key/value drift can produce surprising row identity. Confluent 3. The Kafka key isn't the business key. If the producer keys on event_id, order_id + version, or a per-attempt UUID, then a retried or re-emitted logical record arrives under a new key. Upsert mode dedupes perfectly and you still get two rows, because they genuinely are two keys. 4. CDC configuration gaps. With Debezium sources in upsert mode you should have tombstones.on.delete set to true, or deleted source rows are never removed from the table. Debezium snapshot-plus-streaming overlap, or an un-unwrapped Debezium envelope, can also change effective key semantics versus what you expect. And if the topic is actually in append mode, every CDC event is a row by design. Confluent 5. Reader-side false duplicates. Because upsert tables are merge-on-read, an engine that doesn't apply Iceberg v2 equality delete files (or that reads the Parquet files directly, bypassing Iceberg metadata) will show both the old and new versions. Same if it's pinned to a stale snapshot. Before checking your pipeline, confirm the engine reconciles deletes. 6. Ordering, not duplication. Worth separating out: with multiple producers or out-of-order arrival, "most recent" means last-written, not latest event time. That yields a wrong surviving version rather than an extra row — a different bug with a similar smell. A quick diagnostic to tell case 1 apart from cases 2/3: group by your business key and count distinct Kafka partition values. If duplicates span multiple partitions, it's partition drift. If they sit in one partition with different key bytes, it's a keying problem. Deduplication options Prevent it at the producer. Cheapest by far. Key on the true business primary key with one canonical serialization, standardize the partitioner across every producer, enable idempotent producers, never assign partitions manually, and treat partition-count changes on upsert-backed topics as a breaking change. If duplicates already exist from a partition increase, Confluent's own remedy is to send tombstones for the affected keys to their original partitions — both log compaction and Tableflow then drop the stale rows, leaving only the record from the new partition. Confluent Normalize in Kafka before Tableflow. The most robust structural fix: run a Flink SQL statement that re-keys onto the business key into a new topic with changelog.mode = 'upsert', then enable Tableflow upsert on that topic. The primary key becomes an explicit contract, and key→partition mapping is consistent because Flink hash-distributes on the primary key. If you also need to collapse genuine duplicates with different keys, the standard Flink pattern is ROW_NUMBER() OVER (PARTITION BY business_key ORDER BY ts DESC) filtered to rank 1 — budget for state size and set a TTL. This costs a compute pool and a second topic, but it moves dedup upstream of everything, not just Iceberg. Deduplicate at read time with a view. Non-destructive, zero pipeline change, and it works today: define a view over the Tableflow table with ROW_NUMBER() OVER (PARTITION BY business_key ORDER BY <tiebreaker> DESC) = 1, and point consumers at the view. For the tiebreaker, prefer a source-system ordering column (CDC LSN/SCN, updated_at) over Kafka timestamp, and use Kafka offset only as a last resort since it isn't comparable across partitions. Downside: the dedup cost is paid on every query. Materialize a curated downstream table. Treat the Tableflow table as bronze and maintain your own silver table keyed on the business key via MERGE INTO (Spark, Trino, Athena engine v3, Snowflake) or dbt incremental with a merge strategy, reading incrementally from Iceberg snapshots. This gives you copy-on-write files that every engine reads cleanly, plus a place to enforce ordering rules. Important caveat: Tableflow-managed tables are owned by Tableflow — don't run DML against them; write to a separate table you control. Monitor for it. Regardless of which fix you pick, a scheduled check of count(*) vs. count(distinct business_key), plus a check for business keys appearing under more than one partition, will catch regressions when someone scales partitions or ships a new producer. If you tell me which situation you're in — CDC vs. application-produced, and which engine is querying — I can narrow this to a specific recommendation and sketch the actual SQL. Situation A: CDC-produced topics (Debezium / Oracle XStream / etc.) Where duplicates come from Delete events that aren't tombstones. This is the most common CDC-specific one. A Debezium delete arrives as a record with a real value (op='d', after=null), not an empty value. Tableflow only removes a row on a true tombstone, so the row survives as a ghost — and if the source later reinserts that PK, you now have a stale row plus a live row that look like duplicates. This is why the docs say that with Tableflow upsert mode you should set tombstones.on.delete to true, otherwise rows won't be deleted from the table when they're deleted from the source (and conversely, for append mode you want it false or you'll get null-value rows landing in the table). Confluent Soft deletes. If your source marks is_deleted = true rather than deleting, no tombstone is ever produced. That's not a bug, but it means "current state" queries must filter, and analysts read it as duplication. The envelope. If you don't unwrap, the table has before/after/op/source nested structs. Row identity still works (key is unchanged), but every dedup query has to reach into after.*, and a WHERE on business columns silently misses rows. The documented options are either to decode with Flink — copy the source table DDL, set changelog.mode to upsert and value.format to avro-registry, then INSERT INTO <new-topic> SELECT * FROM <source-topic> — or to set after.state.only to true on the Debezium connector so it emits messages resembling the source table schema directly. Confluent Key definition changes. Debezium keys on the source table's primary key. Change message.key.columns, add a column to a composite PK, switch the key converter (Avro → String), or re-snapshot a table after a PK change, and the same logical row arrives under different key bytes. Old rows are orphaned, never overwritten. Partition scaling. CDC topics usually start at 1–6 partitions and get scaled when throughput grows. This is exactly the documented duplicate-row scenario, and the documented remedy is to send tombstones for the affected keys to their original partitions, after which both log compaction and Tableflow drop the outdated records, leaving only the record from the new partition. Confluent Multi-table routing. Outbox pattern or EventRouter funnelling several tables into one topic risks key collisions across entity types unless you namespace the key. Prevention checklist tombstones.on.delete = true after.state.only = true, or unwrap with Flink upsert mode before Tableflow Freeze partition count on any CDC topic backing an upsert table Treat PK/key-converter changes as a new topic + re-materialize, not an in-place edit Snapshot before enabling Tableflow, so the initial snapshot collapses in Kafka rather than in Iceberg Read-time dedup for CDC The important part is the tiebreaker. Use source-database ordering, not Kafka ordering: sql CREATE OR REPLACE VIEW customers_current AS SELECT * FROM ( SELECT c.*, ROW_NUMBER() OVER ( PARTITION BY customer_id ORDER BY source_lsn DESC, -- Postgres LSN / Oracle SCN / MySQL binlog pos source_ts_ms DESC -- fallback ) AS rn FROM tableflow.cdc.customers c ) WHERE rn = 1 AND op <> 'd'; -- if envelope retained If you kept the envelope, project after.* and carry source.lsn / source.ts_ms up as top-level columns in the view so downstream consumers never see the envelope. Run DESCRIBE on the table first — the exact naming of the Kafka key and record-metadata fields Tableflow adds varies by mode and format, and you'll want the partition column available for diagnostics. Ordering caveat: source.ts_ms has millisecond granularity, so two updates inside the same millisecond tie. LSN/SCN is monotonic and is the right choice when available. Situation B: Application-produced topics Where duplicates come from The key isn't the entity. Applications very often key on event_id, a UUID, or entity_id + version. Upsert mode then dedupes perfectly and you still get one row per event, because every event genuinely is a distinct key. This is the single most common cause here, and it's a modelling problem, not a Tableflow problem. Retries that regenerate the key. Mobile client or API gateway retries where the UUID is minted per attempt rather than once at the edge. Two records, two keys, identical payload. No key-based mechanism can catch this — you need a deterministic idempotency key generated once upstream, or content-hash dedup. Producer retries without idempotence. enable.idempotence = false plus a retry produces the same key twice in the same partition. Notably this is the benign case: upsert collapses it. Worth knowing so you don't chase it. Heterogeneous producers. A Java service and a Python service writing the same topic hash keys differently in some configurations; a service that calls send(topic, partition, key, value) explicitly bypasses hashing entirely. Same key, two partitions, two rows. Mutable natural keys. Keying on email, username, or slug. The user changes it, the app produces under the new key, and the old row sits there forever as a phantom duplicate. Fix requires a tombstone to the old key — which means the app has to remember it. Migrations and replays. Dual-write during a service cutover, or replaying an archive topic into the live topic with different keying. Also relevant: Flink's upsert-kafka sink is at-least-once by default with checkpointing, so it may write duplicate records with the same key — but since the last record per key wins on read, this is idempotent in practice. Benign again. Apache No key at all. If records are unkeyed, upsert mode has nothing to identify rows with. Don't rely on inferred behaviour here — either set a key or use append mode. Prevention checklist Key on the stable entity identifier (order_id, device_id), never on the event Generate any idempotency key once, at the system edge, and propagate it enable.idempotence = true and a single agreed partitioner across all producer languages Never pass an explicit partition Freeze partition count; if you must change it, re-key into a new topic via Flink and re-materialize Emit a tombstone to the old key whenever a natural key changes Read-time dedup for app-produced data Two different queries depending on what you want: Latest state per entity (when the topic is a change stream keyed on the event): sql SELECT * FROM ( SELECT o.*, ROW_NUMBER() OVER ( PARTITION BY order_id ORDER BY updated_at DESC, event_id DESC -- event_id breaks ties deterministically ) AS rn FROM tableflow.app.orders o ) WHERE rn = 1; Collapsing true retry duplicates (different keys, same payload) — dedup on business content rather than key: sql SELECT * FROM ( SELECT p.*, ROW_NUMBER() OVER ( PARTITION BY idempotency_key -- preferred -- or: md5(concat_ws('|', account_id, amount, cast(occurred_at as varchar))) ORDER BY ingest_ts ASC -- keep the first occurrence ) AS rn FROM tableflow.app.payments p ) WHERE rn = 1; Note the flip: for state you keep the last row; for retry-dedup on immutable events you keep the first. Getting that backwards is a real and easy bug. The structural difference between the two For CDC, the entity key is given to you by the source database and is trustworthy — your problems are almost entirely delete semantics and configuration. For application-produced data, delete semantics rarely matter but the key itself is a design choice your producers got to make, so your problems are almost entirely key modelling. That leads to different default recommendations. CDC: fix the connector config and unwrap upstream, then a thin view is usually enough. Application-produced: re-key in Flink into a purpose-built upsert topic, because you're not going to get every producer team to agree, and the re-key also normalises partitioning for free. Diagnostic worth running once on either sql -- Which failure mode am I in? SELECT entity_key, COUNT(*) AS rows_, COUNT(DISTINCT kafka_partition) AS partitions_, COUNT(DISTINCT kafka_key) AS distinct_keys FROM tableflow.<db>.<table> GROUP BY entity_key HAVING COUNT(*) > 1 ORDER BY rows_ DESC LIMIT 50; partitions_ > 1 means partition drift. distinct_keys > 1 within one partition means a keying or serialization problem. Both equal to 1 with rows_ > 1 means your reader isn't applying the equality delete files — check the engine, not the pipeline. ────────────────────── Q: What are techniques to send tombstone records at scale in the case of 500M rows? Sending Tombstone Records at Scale (500M Rows) This is a genuinely hard operational problem. Sending 500M tombstones isn't just a "write a script" task — you have to think about Kafka broker load, log compaction behavior, Tableflow's merge/compaction pipeline, and whether you can afford to do this incrementally or need it done in a bounded window. Let me walk through the full landscape. First: Clarify What You Actually Need to Tombstone Before producing 500M records, ask whether you need all of them: Are all 500M rows genuinely deleted at the source? If this is a sync/repair operation (e.g., after a partition count increase), you may only need tombstones for the orphaned partition-drift duplicates, not every row. Is this a full table wipe? If so, deleting the topic and re-materializing from scratch is almost always better than sending 500M tombstones. Can you scope it by time range or key range? Even reducing the problem to 50M targeted tombstones is a 10x improvement. If you genuinely need all 500M, read on. Core Mechanics to Understand First A tombstone is just a Kafka produce call with: The exact same key bytes as the record you want to delete (serialization must match) A null value (not an empty string, not {} — literally null) Ideally sent to the same partition the original record lives in Tableflow's upsert mode uses (key bytes, partition) as the composite primary key. So if you're cleaning up partition-drift duplicates, you need to send the tombstone to the old partition explicitly — not let the partitioner route it naturally. This is critical and easy to get wrong at scale. Technique 1: Kafka Streams or Flink — Streaming Tombstone Generator Best for: targeted deletes where you have a source of truth for "what should be deleted" Write a Flink or Kafka Streams job that: Reads from a "deletion manifest" topic or table (your list of keys to delete) Produces tombstone records to the target topic with explicit partition assignment -- Flink: read a deletion manifest and produce tombstones INSERT INTO target_topic_upsert SELECT business_key, CAST(NULL AS ROW<...>) AS value -- null value = tombstone FROM deletion_manifest WHERE needs_tombstone = true; Advantages: Naturally rate-limited by Flink's parallelism settings Checkpointed, so restartable — critical for 500M records Can be targeted precisely Flink's upsert-kafka sink handles the null value correctly Gotcha: Make sure your Flink job is configured to send to the correct partition when dealing with partition-drift cleanup. You may need a custom partitioner or explicit partition routing. Technique 2: Kafka Producer Application with Explicit Partition Routing Best for: partition-drift cleanup where you know the old partition assignments This is the scenario the document mentions: after a partition count increase, you need to send tombstones to the original partitions. You can't let the partitioner route freely because it'll send to the new partition (which already has the correct record). from confluent_kafka import Producer import concurrent.futures producer = Producer({ 'bootstrap.servers': '...', 'enable.idempotence': True, # critical for reliability 'acks': 'all', 'compression.type': 'lz4', 'batch.size': 1048576, # 1MB batches 'linger.ms': 50, # allow batching 'queue.buffering.max.messages': 500000, }) def send_tombstone(key_bytes, partition): producer.produce( topic='your-topic', key=key_bytes, value=None, # true null = tombstone partition=partition, # explicit routing for drift cleanup ) # Process in parallel batches with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor: for batch in read_keys_in_batches(batch_size=10_000): executor.submit(process_batch, batch) Throughput considerations: A well-tuned producer can do ~500K-1M small messages/sec 500M tombstones at 500K/sec = ~17 minutes of pure produce time But broker-side compaction and Tableflow processing lag behind — see below Technique 3: Spark Job Reading from Iceberg Snapshot Best for: when your source of truth for "what to delete" is the Tableflow Iceberg table itself If you need to tombstone everything currently in the table (e.g., a full re-sync): from pyspark.sql import SparkSession from confluent_kafka import Producer, KafkaException import json spark = SparkSession.builder.getOrCreate() # Read keys directly from the Iceberg table # This gives you the exact key bytes and partitions Tableflow knows about keys_df = spark.read.format("iceberg") \ .load("your_catalog.db.table") \ .select("_kafka_key", "_kafka_partition") \ .distinct() # Repartition for parallelism keys_df.repartition(200).foreachPartition(send_tombstones_for_partition) The key insight here: reading from the Iceberg table gives you the exact key bytes and partition assignments that Tableflow used — no guessing about serialization format. Important: Don't run DML against Tableflow-managed tables (the document warns about this). You're only reading here, which is fine. Technique 4: Compacted Topic Reset (Nuclear Option) Best for: full wipe where you want to start fresh If you want to delete all 500M rows: Delete and recreate the topic (if you control the pipeline end-to-end) Re-enable Tableflow on the new topic Re-produce current state from your source of truth This avoids sending 500M tombstones entirely. Log compaction still has to process those records; Tableflow still has to process them. A clean topic is dramatically cheaper. Alternatively, if you can't delete the topic: Produce all current "live" state as fresh records (not tombstones) to a new topic Enable Tableflow upsert on the new topic Deprecate the old topic Technique 5: Tiered / Incremental Approach Best for: when you can't afford a big-bang operation Rather than sending 500M tombstones in one shot: Identify and tombstone the highest-impact duplicates first — run the diagnostic query from the document, find keys appearing in multiple partitions, tombstone those specifically Batch by key range or time range — e.g., tombstone keys A-M this week, N-Z next week Use a Flink job with a rate limiter to avoid overwhelming the broker -- Flink: rate-controlled tombstone emission -- Process in windows to avoid broker saturation INSERT INTO target_topic SELECT key, CAST(NULL AS ...) as value FROM deletion_manifest WHERE key_range BETWEEN :start AND :end AND batch_id = :current_batch; Critical Operational Concerns at This Scale 1. Broker-Side Log Compaction Lag Sending 500M tombstones doesn't immediately free space or remove rows from Tableflow's perspective. Log compaction runs asynchronously. Key settings to tune: log.cleaner.min.compaction.lag.ms — how long before a segment is eligible for compaction log.cleaner.threads — increase this temporarily log.cleaner.io.max.bytes.per.second — throttle to avoid I/O saturation Tombstones themselves are only removed after compaction runs twice (once to compact them in, once to clean the tombstone itself after delete.retention.ms). 2. Tableflow Compaction Lag Tableflow will see the tombstones as delete files (merge-on-read). It processes and compacts these asynchronously. At 500M ────────────────────── Q: Why is key "bytes" specifically used here. What does this refer to? Why "Key Bytes" Specifically The term "key bytes" is precise and deliberate — it's pointing at something that trips people up constantly. Kafka Keys Are Raw Binary At the Kafka protocol level, a message key is not a string, not an integer, not an Avro record — it is just a sequence of bytes. Kafka itself is completely agnostic about what those bytes mean. It doesn't know if they represent a customer ID, a UUID, or a JSON object. It just stores and compares them as opaque binary data. When Tableflow needs to determine "is this message an update to an existing row, or a new row?", it can only do what Kafka does: compare the raw byte sequences. It has no semantic understanding of what the key means — only whether the bytes match. Why This Matters Enormously This is where the subtlety lies. Two keys that are logically identical to a human can be bytewise different to Kafka and Tableflow: | Scenario | Key 1 bytes | Key 2 bytes | Same? | |---|---|---|---| | Integer 1001 as Avro vs. string "1001" | 0x00 0x00 ... (Avro encoded) | 31 30 30 31 (ASCII) | ❌ No | | "ACME Corp" vs "acme corp" | different casing | different casing | ❌ No | | JSON {"id":1,"type":"order"} vs {"type":"order","id":1} | field order differs | field order differs | ❌ No | | Avro schema v1 encoding vs v2 encoding | schema ID bytes differ | schema ID bytes differ | ❌ No | In every case above, a human (or your database) would say "same entity." Tableflow says "different key → different row" and you get a duplicate. The Serializer Is the Key This is why the document emphasizes canonical serialization as a prevention strategy. The serializer your producer uses is what determines the byte sequence. If: One producer uses the Java Kafka client with Avro serialization Another uses librdkafka with string serialization A third uses a custom JSON serializer ...they can all be writing what they think is customer_id = 1001, but they're writing three different byte sequences, producing three separate rows in Tableflow's upsert table. The Partitioner Connection This is also why key bytes are mentioned in the context of partitioning. Kafka's default partitioner uses a hash of the key bytes to decide which partition a message goes to. If the byte representation of a key changes (e.g., you switch serializers), the hash changes, the partition changes, and now Tableflow sees what it considers a new key in a new partition — a double duplicate problem. The 256-byte Hash Note The document also mentions that if your key exceeds 256 bytes, Tableflow uses a hash of the key bytes for the uniqueness check. This is another place where "bytes" matters — it's the length in bytes of the serialized key, not the logical length of your key string. An Avro-encoded composite key with several fields can easily exceed 256 bytes even if the logical values are short. In Short "Key bytes" is used rather than just "key" to remind you that Tableflow operates one abstraction layer below your mental model. You think in terms of customer IDs and order numbers; Tableflow thinks in terms of byte arrays. The gap between those two levels of abstraction is exactly where duplicate rows are born. ────────────────────── Q: How should one intuit this amongst the different types of guarantees when using Kafka (exactly once, at least once, etc.) on why this happens Why Partition-Count Changes Cause Duplicates Despite Kafka's Delivery Guarantees This is a genuinely important conceptual distinction, and the confusion is understandable because people often conflate delivery guarantees with identity guarantees. They're different axes entirely. The Delivery Guarantee Axis (What Kafka Actually Promises) Kafka's exactly-once semantics (EOS), at-least-once, and at-most-once are all about whether a message gets written to the log, and how many times. Specifically: At-most-once: A message might be lost, never duplicated. At-least-once: A message will definitely land, but might be written more than once (due to producer retries). Exactly-once: With idempotent producers + transactional APIs, a message is written exactly once to a given partition, even across retries. The critical thing to internalize: all of these guarantees are scoped to a single partition. Exactly-once means "this message appears exactly once in partition 3." It says absolutely nothing about which partition the message goes to, or whether the same logical entity has ever appeared in a different partition before. The Identity Guarantee Axis (What Tableflow Needs) Tableflow's upsert mode needs something different: it needs to answer the question "have I seen this entity before?" Its answer is: "yes, if I've seen the same (key bytes, partition number) combination before." The composite primary key being (key_bytes, partition) is the crux of everything. So when you increase partition count: A producer using the default partitioner computes partition = hash(key) % partition_count Before the increase: hash("order-123") % 6 = partition 2 After the increase: hash("order-123") % 12 = partition 7 Tableflow sees ("order-123", partition 2) and ("order-123", partition 7) as two distinct primary keys Exactly-once semantics did their job perfectly — the message was written exactly once to partition 7. But Tableflow has no way to know that partition 7's record is the "same entity" as partition 2's record. From its perspective, they're genuinely different rows. The Intuition: Kafka Is a Log, Not a Database Here's the mental model shift that makes this click: Kafka's guarantees are about the integrity of the log as a log. They ensure durable, ordered, non-duplicated writes within a stream. Kafka does not have a concept of "this message supersedes a previous message about the same entity." That's not what it's for. Exactly-once in Kafka is analogous to a transaction in a write-ahead log — it guarantees the write happened cleanly. But it doesn't give you the semantics of a MERGE INTO or UPSERT statement in a database, which requires a stable identity lookup across all prior writes. Tableflow is trying to synthesize database upsert semantics on top of a log. To do that, it needs a stable, consistent identity signal. It uses (key_bytes, partition) as that signal. The moment partition assignment becomes inconsistent across time — which partition scaling directly causes — that identity signal breaks, and no delivery guarantee in Kafka can fix it, because delivery guarantees were never about identity. Why Log Compaction Doesn't Save You Either You might think: "But I'm using a compacted topic — doesn't Kafka's log compaction deduplicate by key?" Yes, but only within a partition. Kafka's compaction runs independently per partition. It will happily retain one record for "order-123" in partition 2 and one record for "order-123" in partition 7, because from Kafka's perspective those are records in two different partitions — compaction has no cross-partition identity concept either. This is exactly why the document notes the problem is specifically acute for compacted topics with upsert mode: you have two systems (Kafka compaction and Tableflow upsert) that both deduplicate, but both do so within a partition boundary, so cross-partition duplicates fall through both nets. The Hierarchy of What Each Guarantee Covers | Concern | Covered by | |---|---| | "Did the message make it to the broker?" | Delivery guarantee (EOS/ALO/AMO) | | "Is this message written exactly once to its partition?" | Idempotent producer + EOS | | "Will this message always go to the same partition?" | Nothing in Kafka — this is a producer-side contract | | "Is this the latest version of this entity?" | Tableflow upsert — but only within a stable (key, partition) identity | | "Is this the same entity as a record in another partition?" | Nothing in Kafka or Tableflow — requires external re-keying | The gap is in row 3. Kafka's guarantees are silent on partition stability across the lifetime of a topic. That's a producer-side contract you have to enforce yourself — which is why the document's advice is to treat partition-count changes on upsert-backed topics as a breaking change, not a routine operational action. The Deeper Principle Exactly-once semantics solve a reliability problem (will the write happen cleanly?). The duplicate-row problem here is an identity problem (what makes two records refer to the same entity?). These are orthogonal. You can have perfect exactly-once delivery and still have unbounded identity duplicates, because EOS never claimed to know anything about entity identity. The fix lives upstream of Kafka's delivery layer — in how producers assign keys and partitions — or downstream in a Flink re-keying step that establishes a stable, partition-independent identity before Tableflow ever sees the data. ────────────────────── Q: These are three themes on why the same key can exist on different partitions. How common are these themes in the wild and are there ways to mitigate them? In what use cases may this incidence (same key existing on multiple partitions) be harmful? How Common Are These Themes in Practice? Theme 1: Heterogeneous Producers with Different Partitioners Very common. This is probably the most frequently encountered issue in organizations that have grown beyond a single team or a single language runtime. Here's why it bites so often: The Java client's default partitioner changed behavior in Kafka 2.4 (from pure murmur2 hash to the "sticky partitioner") and changed again in 3.3 (back toward round-robin for unkeyed messages). So even two Java producers on different versions of the client can route the same key differently. librdkafka (used by Python's confluent-kafka, Go, .NET, etc.) uses murmur2 but historically had subtle differences in how it handled null bytes in keys and composite key serialization. Explicit partition assignment (send(topic, partition, key, value)) is shockingly common in legacy code where a developer "optimized" something years ago and nobody remembers why. The partition is hardcoded, and the key becomes decorative. Microservice sprawl makes this worse: the orders service (Java), the reconciliation job (Python), and the data backfill script (Go) may all write to the same topic with no coordination on partitioning strategy. Mitigation: Establish a canonical partitioner contract at the topic level and document it as part of the topic's schema contract (alongside the Schema Registry schema). Treat partitioner choice as infrastructure, not a per-team decision. Use a Kafka proxy or producer SDK wrapper that enforces the partitioner — internal platform teams often build this. All producers call the wrapper, not the raw client. If you're using Confluent Schema Registry, you can enforce serialization format, but there's no equivalent enforcement for partitioning — that discipline has to be organizational. For upsert-backed Tableflow topics specifically, consider routing all writes through a single authoritative Flink job that re-keys and re-partitions, so no producer ever writes directly to the Tableflow-backing topic. This is the "normalize in Kafka before Tableflow" pattern — it converts a social/organizational problem into a technical boundary. Theme 2: Backfill and Migration Jobs Extremely common, and disproportionately dangerous. Almost every data team eventually needs to: Replay historical data after a bug fix Backfill a new field by re-emitting old records Migrate from one system to another with a dual-write period Re-seed a topic after a retention-related data loss The problem is that these jobs are usually written quickly, under time pressure, by someone who isn't the original author of the live producer. They often: Use a different language/client than the live producer Assign partitions explicitly for "efficiency" (parallelizing by partition) Use a different key serialization (the live producer uses Avro, the backfill script uses a plain string) Run concurrently with the live producer, creating a window where the same logical key exists in two partitions simultaneously This is particularly insidious because the problem may not be visible immediately. The backfill finishes, everything looks fine, and then a query three weeks later returns duplicates that nobody can explain. Mitigation: Treat backfill jobs as first-class producer code, not scripts. They should use the same SDK wrapper, the same serializer, the same partitioner. Before running a large backfill, tombstone the existing records first (for upsert topics), then re-emit. This ensures the old partition assignment is cleared before the new one lands. Run backfills into a staging topic first, verify the partition distribution matches the live topic's distribution, then promote. For Tableflow upsert topics specifically, consider pausing Tableflow during the backfill window or running the backfill into a separate topic and merging downstream — the document's "bronze/silver" pattern is exactly right here. Theme 3: Cluster Linking / Replicator / Flink Repartitioning Common in larger, more sophisticated architectures, but often underestimated. The specific failure modes: Cluster Linking preserves partition assignment by design, so it's actually the safest of the replication tools for this problem — but it only works if the source and destination topic have the same partition count. If they differ, Cluster Linking can't be used and you fall back to MirrorMaker or Replicator, which rehash keys. MirrorMaker 2 / Replicator rehash keys using the destination topic's partition count. If source has 6 partitions and destination has 12, keys will land in different partitions than they did at the source. This is well-documented but frequently forgotten. Flink jobs are the sneakiest. A Flink INSERT INTO kafkasink SELECT * FROM kafkasource will repartition based on Flink's internal key distribution, which uses a different hashing scheme than Kafka's murmur2. Even if you set the same parallelism as the partition count, the mapping isn't guaranteed to match. The document's recommendation to use changelog.mode = 'upsert' on a Flink-produced topic is correct precisely because then Flink owns the key→partition mapping consistently. Mitigation: When replicating topics that back upsert Tableflow tables, use Cluster Linking with matching partition counts where possible. If you must use MirrorMaker/Replicator, treat the destination topic as a new topic with a new lineage — re-materialize the Tableflow table from scratch rather than assuming continuity. For Flink pipelines, always use upsert-kafka as the sink connector format (not kafka with manual key setting), and let Flink's upsert semantics own the deduplication contract. When Is Same-Key-on-Multiple-Partitions Actually Harmful? Not every use case cares equally. Here's a breakdown: High harm: 1. Upsert-mode Tableflow tables (the core case here) This is the document's central concern. The composite primary key includes the partition number, so two partitions = two rows = data quality corruption in any downstream system that treats the table as a source of truth. 2. CDC pipelines feeding operational systems If a customer record exists in two partitions, a downstream MERGE INTO a data warehouse will either fail (PK violation) or silently pick one version, potentially the stale one. For regulated industries (finance, healthcare), this is a compliance issue, not just a data quality issue. 3. Aggregation and analytics on mutable entities If you're computing SUM(revenue) GROUP BY customerid and customerid 1001 has two rows from two partitions, your revenue figure is doubled for that customer. These bugs are particularly hard to catch because the error is proportional to the duplicate rate, which may be small enough to evade casual inspection. 4. Event-driven downstream consumers doing their own state management If a downstream Flink job or KStream app consumes the topic and maintains its own state keyed on the business key, it will see two separate state entries for the same entity, leading to split-brain state. Moderate harm: 5. Append-mode topics used for auditing or compliance logging Here duplicates are visible but don't cause incorrect aggregations — they inflate counts. Annoying but not catastrophic. 6. Topics consumed by systems that deduplicate themselves If the consumer is a database with its own UPSERT semantics keyed on the business key, it will naturally collapse the duplicates. The harm is wasted I/O and potential transient inconsistency windows, not permanent data corruption. Low or no harm: 7. Pure event streams where every event is intentionally unique If you're publishing click events or sensor readings and every record is genuinely a new fact (append mode, no deduplication intent), partition distribution is irrelevant to correctness. 8. Topics consumed only by systems that read all partitions and deduplicate at query time If your entire consumption layer uses the ROW_NUMBER() view pattern described in the document, partition-level duplicates are invisible to end users. The cost is query performance, not correctness. The Meta-Point The underlying issue is that Kafka's partition is a routing/ordering unit, not a semantic unit — but Tableflow's upsert mode necessarily promotes it to a semantic unit (part of the primary key) because that's the only stable identity Kafka itself provides. This creates a fundamental tension: Kafka was designed to allow flexible, independent producer behavior, while Tableflow upsert requires a global invariant ( ────────────────────── Q: What is it about the debezium envelope that might cause an issue for key + partition deduping? The Debezium Envelope and Key/Partition Deduplication This is a subtle but important issue. Let me break it down carefully. What the Debezium Envelope Actually Is When Debezium captures a change event, it doesn't just emit the row's current state. It wraps it in a structured envelope that looks something like this: { "before": { "id": 1001, "email": "old@example.com" }, "after": { "id": 1001, "email": "new@example.com" }, "op": "u", "source": { "lsn": 12345678, "ts_ms": 1700000000000, "table": "customers" }, "ts_ms": 1700000000123 } The Kafka message key, by contrast, is typically just the primary key fields — e.g., {"id": 1001}. Why This Creates a Problem for Deduplication Here's the core tension: Tableflow's upsert deduplication works on the Kafka message key and partition. That part is fine — the key is still {"id": 1001}, so two updates to the same row will correctly overwrite each other in the Iceberg table. The problem isn't with Tableflow's deduplication mechanism per se. The problem is with what ends up in the table and how you reason about identity afterward: 1. The Table Schema Reflects the Envelope, Not the Row If you don't unwrap the envelope, the Iceberg table that Tableflow materializes has columns like before, after, op, source, tsms — not id, email, updatedat. So when you or a downstream analyst tries to deduplicate or identify "the current state of customer 1001," they have to write: WHERE after.id = 1001 ...instead of just WHERE id = 1001. This is error-prone and easy to get silently wrong — a filter on a top-level business column simply misses rows rather than throwing an error. 2. The op='d' Row Is the Ghost Problem This is the more insidious deduplication-adjacent issue. When Debezium captures a DELETE, it emits: { "before": { "id": 1001, ... }, "after": null, "op": "d" } This is not a Kafka tombstone (a message with a null value). It's a real message with a real value. Tableflow's upsert mode only removes a row from the Iceberg table when it sees a true tombstone (null value). So this op='d' record upserts a row into your table — a row that says "this entity was deleted." The original row is overwritten (good), but you now have a ghost row representing the deletion event itself sitting in your table. If the source later re-inserts that primary key, Debezium emits a new op='c' record. Now you have the new row — but depending on timing, compaction state, and reader behavior, analysts may see both the ghost delete row and the new insert row as "duplicates" even though Tableflow handled the keys correctly. 3. Key Semantics Can Shift If the Envelope Affects Key Extraction If someone configures Debezium to use a non-default key serialization — for instance, using the full envelope as the key rather than just the extracted PK fields, or switching from Avro to JSON key format mid-stream — then the key bytes change. Tableflow compares raw serialized key bytes. So {"id":1001} in Avro and {"id":1001} in JSON are different keys to Tableflow, meaning the old row is never overwritten and you get a genuine duplicate row in the Iceberg table. 4. Snapshot + Streaming Overlap Compounds This During a Debezium snapshot, records are emitted with op='r' (read). When streaming begins, the same rows may come through again as op='c' (create) or op='u'. If the key serialization or envelope structure differs between snapshot and streaming phases (which can happen with certain connector configurations or version upgrades), those records land as distinct keys — orphaning the snapshot rows permanently. The Fix The document points to two remedies: after.state.only = true on the Debezium connector — this makes Debezium emit only the after state as the message value, making it look like a normal application-produced change stream. No envelope, no before, no op. The table schema becomes clean. Unwrap with Flink — consume the raw envelope topic, run it through a Flink job with changelog.mode = 'upsert' and the ExtractNewRecordState SMT equivalent, and write to a new clean topic that Tableflow then reads. This gives you full control and lets you also handle op='d' by emitting proper tombstones. The key insight is: Tableflow's key+partition deduplication is working correctly even with the envelope — the envelope doesn't break the mechanism, it breaks the semantics and the schema, making it very easy to write queries that appear to deduplicate but are actually operating on the wrong level of abstraction. ────────────────────── Q: Help me intuit this solution to normalize Kafka messages using Flink Intuiting the Flink Re-keying Solution Let me build this up from first principles so the mechanics click rather than just being steps to follow. The Core Problem It's Solving Tableflow's upsert mode is essentially saying: "I will keep the latest record per (key, partition) pair." That's its contract. The problem is that Kafka's partition assignment is determined by the producer, and producers can be inconsistent — different libraries, partition count changes, explicit partition overrides, etc. So the same logical entity (say, customer_id = 42) can end up in partition 0 and partition 3, and Tableflow dutifully keeps both, because from its perspective they're different rows. The insight is: Tableflow can't fix this because it doesn't own a repartitioning step. It only sees what Kafka hands it. So you need to fix it before Tableflow sees it — and Flink is the right tool because it can read a topic, reason about the data, and write a new topic with a controlled, consistent key and partition assignment. The Mental Model: A "Normalization Layer" Think of it like a database normalization step, but for a stream: Raw Topic (messy) Flink Job Clean Topic Tableflow ───────────────── → (re-key + dedup) → (normalized) → (Iceberg table) - inconsistent keys - stable keys - multiple partitions - consistent partitioning for same entity - one row per entity - maybe duplicates Flink becomes your single source of truth for key→partition mapping. Once you own that mapping in Flink, everything downstream is clean. Why changelog.mode = 'upsert' Is the Key Ingredient When you write to a Kafka topic from Flink SQL with changelog.mode = 'upsert', you're telling Flink: "This topic represents the current state of a keyed table. For each key, only the latest value matters. Emit upsert messages (insert/update = record with value, delete = tombstone with null value)." This has two important effects: Flink hash-distributes on the primary key — deterministically. customerid = 42 will always go to the same partition, regardless of which Flink task writes it, because the partition is computed as hash(primarykey) % num_partitions. No more partition drift. The topic becomes semantically clean — it's no longer "a stream of events that happened to involve customer 42" but rather "the current state of customer 42." Tableflow then reads this clean contract. Compare this to changelog.mode = 'append' where Flink just emits every row as a new record — no deduplication, no key-based routing guarantee. Walking Through the Actual Mechanics Step 1: The Re-keying Statement INSERT INTO clean_customers_topic -- sink: upsert-kafka connector, PK = customer_id SELECT customer_id, name, email, updated_at FROM raw_customers_topic; -- source: whatever messy topic Behind the scenes, Flink: Reads every record from the raw topic Routes each record to a partition based on hash(customer_id) % partitions Writes it as an upsert message Now customer_id = 42 is always in partition hash(42) % N. Stable. Predictable. Step 2: The ROW_NUMBER() Dedup (When You Need It) The re-keying above handles the partition drift problem. But what if you also have genuine duplicates — multiple records with different keys that represent the same logical entity? (e.g., a retry that minted a new UUID, or an event-keyed topic where you want latest-state-per-entity) INSERT INTO clean_orders_topic SELECT order_id, customer_id, amount, status, updated_at FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY order_id -- business key ORDER BY updated_at DESC -- keep the latest ) AS rn FROM raw_orders_topic ) WHERE rn = 1; This is Flink's streaming deduplication pattern. Here's what makes it work in a streaming context (which is non-obvious): Flink maintains state for each order_id — it remembers what it's seen When a new record arrives for order_id = 99, Flink compares it to the stored state If the new record is "later" (higher updated_at), it emits an upsert (update) to the output topic If it's "earlier" (out-of-order arrival), it either ignores it or emits a retraction, depending on configuration This is fundamentally different from a batch ROW_NUMBER() — the streaming version is incremental and stateful. The State Size and TTL Warning — Why It Matters The document says "budget for state size and set a TTL" — this deserves elaboration because it's a real operational concern. For every unique order_id Flink has ever seen, it keeps a record in its state backend (RocksDB in production). If you have: 100M unique orders Each state entry ~500 bytes That's ~50GB of state This is fine if you size your Flink cluster appropriately. But the real danger is unbounded state growth — old orders from 3 years ago are still in state, taking up space, even though you'll never get a late-arriving update for them. The fix is a state TTL: -- In Flink SQL SET 'table.exec.state.ttl' = '7 days'; This tells Flink: "If I haven't seen an update for a given key in 7 days, evict it from state." The tradeoff: if a genuinely late record arrives after the TTL, Flink will treat it as a new entity rather than an update. For most use cases, that's acceptable — you tune the TTL to be longer than your realistic late-arrival window. The "Two Topic" Architecture and Why It's Worth the Cost The document acknowledges this "costs a compute pool and a second topic." Here's why that cost is often worth it: | Concern | Without Re-keying | With Re-keying | |---|---|---| | Partition drift | Any partition count change breaks dedup | Flink controls partitioning; it's stable | | Multiple producers | Each producer can hash differently | One Flink job is the single writer | | Dedup logic location | Replicated in every query/view | Centralized once in Flink | | Downstream consumers | All must handle duplicates | All get a clean table | | Tableflow contract | (key, partition) — fragile | business_key — explicit | The second topic is your "clean" or "silver" layer in a medallion architecture. The raw topic is bronze — it captures everything faithfully. The Flink-normalized topic is silver — it enforces the contract. Tableflow sits on silver, not bronze. A Concrete Intuition Pump Imagine a post office (Kafka) with 8 sorting bins (partitions). Multiple mail carriers (producers) are dropping off letters for "John Smith at 42 Oak Street." One carrier puts it in bin 3, another puts it in bin 7 (different routing logic). The post office keeps both letters because they're in different bins. Flink is like hiring a single, careful mail sorter who: Reads all incoming mail Always puts "John Smith at 42 Oak Street" in exactly bin hash("42 Oak Street") % 8 — always bin 5, say If two letters arrive for John, keeps only the most recent one Now Tableflow reads from this sorted mailroom and sees exactly one letter per address. Clean. When to Use This vs. the Read-Time View The document offers read-time dedup (a ROW_NUMBER() view) as a lighter alternative. Here's the honest tradeoff: Use the Flink re-key approach when: Multiple downstream consumers need clean data (you pay the dedup cost once, not per query) You have partition drift (the view can't fix this — it's a structural problem) You need clean data for ────────────────────── Q: What would be the best way conceptually (pseudocode) to identify duplicates in a topic, specifically the outdated record using Flink Identifying Outdated Duplicate Records in a Kafka Topic Using Flink This is a great problem to think through carefully, because the challenge isn't just "find duplicates" — it's "find the stale copy after a partition-count increase," which means you need to reason about which record is the authoritative survivor and which is the orphan. The Core Mental Model First After a partition increase, you have this situation: Partition 0 (old): key="order-123" → row written at t=100 Partition 2 (new): key="order-123" → row written at t=150 ← producer now routes here Tableflow sees these as two different primary keys (because its PK is kafkakey + kafkapartition). So both rows survive. The "outdated" record is the one in the old partition — it's the one that will no longer receive updates, because the producer has drifted to the new partition. The authoritative record is the one in the partition where the most recent write landed. Conceptual Approach The algorithm has three stages: Stage 1: Group by Business Key, Find the Winning Partition FOR EACH message in the topic: emit (business_key, partition, offset, event_timestamp, full_record) GROUP BY business_key: winning_partition = partition where MAX(event_timestamp) was seen -- tie-break: MAX(offset) within that partition -- tie-break-2: MAX(partition number) as last resort The winning partition is the one the producer is currently routing to. Any other partition that also holds this business key is stale. Stage 2: Identify Stale (partition, key) Pairs FOR EACH business_key with records in multiple partitions: stale_records = all records WHERE partition != winning_partition emit (stale_record.original_kafka_partition, stale_record.kafka_key) These are your tombstone targets. Stage 3: Emit Tombstones to the Stale Partitions FOR EACH (stale_partition, kafka_key) in stale_records: produce tombstone: topic = original_topic key = kafka_key -- exact original bytes, not re-serialized value = null -- true tombstone partition = stale_partition -- MUST target the original partition explicitly Flink SQL Pseudocode -- Step 1: Read the topic as a table, exposing metadata -- Flink can expose kafka partition and offset as metadata columns CREATE TABLE kafka_source ( kafka_key BYTES METADATA FROM 'key', business_key STRING, -- extracted from key or value event_ts TIMESTAMP(3), -- source system timestamp (LSN/SCN preferred) kafka_partition INT METADATA FROM 'partition', kafka_offset BIGINT METADATA FROM 'offset', payload ROW<...> ) WITH ( 'connector' = 'kafka', 'topic' = 'your-topic', 'scan.startup.mode' = 'earliest-offset', ... ); -- Step 2: For each business key, find the winning partition -- (the one that received the most recent write) CREATE VIEW winning_partitions AS SELECT business_key, -- The partition that has the latest event is the authoritative one LAST_VALUE(kafka_partition) OVER ( PARTITION BY business_key ORDER BY event_ts, kafka_offset -- offset as tiebreaker ) AS winning_partition, MAX(event_ts) OVER (PARTITION BY business_key) AS latest_ts FROM kafka_source; -- Step 3: Identify stale records -- These are rows where this record's partition is NOT the winning partition -- AND there exists a newer record for the same business_key in a different partition CREATE VIEW stale_records AS SELECT DISTINCT ks.kafka_key, ks.kafka_partition AS stale_partition, ks.business_key FROM kafka_source ks JOIN winning_partitions wp ON ks.business_key = wp.business_key WHERE ks.kafka_partition <> wp.winning_partition AND ks.event_ts < wp.latest_ts; -- confirm this partition is truly behind -- Step 4: Write tombstones back to the original partitions -- (Flink DataStream API for explicit partition targeting) INSERT INTO kafka_sink -- configured with fixed-partition routing SELECT kafka_key, stale_partition, CAST(NULL AS BYTES) AS value -- tombstone FROM stale_records; Important Nuances You Must Handle 1. Tombstone Delivery Requires Explicit Partition Assignment This is critical. You cannot let the partitioner decide where to send the tombstone — it will route to the new partition (which is exactly the problem). In Flink's DataStream API: # Pseudocode for the producer side producer.send( topic = original_topic, partition = stale_partition, # HARDCODED to the old partition key = original_key_bytes, # exact bytes, no re-serialization value = None # tombstone ) In Flink SQL, you'd need a custom sink or use the kafka connector with a partitioner configured to pass through an explicit partition column. 2. Key Bytes Must Be Exact If the original key was Avro-serialized, your tombstone key must also be Avro-serialized identically. Deserializing to a string and re-serializing will produce a different byte sequence and Tableflow/log compaction won't match it. -- WRONG: deserialize then re-serialize tombstone_key = avro_serialize(avro_deserialize(original_key)) # may differ -- RIGHT: pass through the raw bytes tombstone_key = original_key_bytes # untouched 3. Ordering Problem in Streaming Mode In a streaming context, you can't know a partition is "stale" until you've seen a later write in another partition. This means: Batch mode (scan full topic from earliest): straightforward, process all records then identify staleness Streaming mode: you need a watermark + a time window, and you accept some latency before declaring a partition stale For this use case, batch mode is almost always correct — you're doing a one-time remediation after a partition-count change, not continuous dedup. 4. The Diagnostic Query First Before writing tombstones, run the diagnostic to confirm your assumptions: SELECT business_key, COUNT(*) AS total_rows, COUNT(DISTINCT kafka_partition) AS partition_count, MIN(event_ts) AS oldest_event, MAX(event_ts) AS newest_event, COLLECT(kafka_partition) AS partitions_seen FROM kafka_source GROUP BY business_key HAVING COUNT(DISTINCT kafka_partition) > 1 ORDER BY total_rows DESC LIMIT 100; If partition_count > 1, you have partition drift. This is your confirmation before you start emitting tombstones. The Full Conceptual Flow kafka_source (full scan, earliest offset) │ ▼ [Group by business_key] │ ├─→ Find winning_partition (latest event_ts + offset tiebreaker) │ ├─→ Identify stale (partition, key_bytes) pairs │ where partition != winning_partition │ └─→ Emit null-value tombstone to each stale partition with EXACT original key bytes targeting EXACT original partition number │ ▼ Kafka log compaction drops stale record Tableflow drops stale row on next compaction cycle One Gotcha Worth Calling Out If the same business key has been through multiple partition increases (e.g., 3 → 6 → 12), you may have records stranded in several old partitions. The algorithm above handles this naturally — all partitions except the winning one get tombstones — but make sure your scan goes back to `earliest-offset
Unstarred
Dunk (exclude from study)
Tags
General
Learning
Life
Strategy
Planning
Training
Risk
Problem Solving
Behavior Change
Business
Financial Planning
Startups
Personal Finance
Relationships
Financial Strategy
Finance
Software
Software Development/Design
Diet/Fitness
Games
Thinking
Investing
Self-Esteem
Sales
Physiology
Emotion
Writing
Creativity
Narratives
Time
Working
Pickup
Social Dynamics
Negotiation
Parenting
Marketing
Databases
Scaling
Software Security
Software Architecture
Interrogation
UI/UX
Fantasy Football
Grooming
Future Planning
Products
Cognitive Behavioral Therapy
Networking
Comedy
Web Design
Naval
Decision Making
Systems Thinking
Mindsets
Math
Analytics
Careers
Goal Setting
Culture
Habits
Resistance
Kafka
Docs
wri
Copywriting
Frameworks
Checklists
Digital Strategy
Data
Digital Transformation
Information Science
Product
Critical Thinking
Content Marketing
SEO
Rory Sutherland
Psychology
Content Creation
Differentiation
Capital Allocation
Distributed Systems
Storytelling
Systems
Behavior
Effectiveness
Big Data
Integrity
Productivity
Work Ethic
Discipline
Questions
Interviews
Life Planning
Failure
Success
Expertise
Positioning
Dating
Betting
Frames
Power
Office Politics
Growth
Personal Growth
Data Engineering
Rules
Microservices
Reading
Laravel
Organizations
Product Development
Ideation
Communication
Design
Wealth
Entrepreneurship
Customer Development
Writ
Recipes
Health
Mastery
Management
Product-Led Growth
Tech
Stream Processing
Time Management
Prioritization
produ
SaaS
Confluent
Customer Success
Mindfulness
Leadership
Operator
Network Theory
UAI
HTBAGASPB
MOTHA
MOTHA-U
HTBAGASPB-O
MOTHA-A
HTBAGASPB-P
HTBAGASPB-S
MOTHA-I
HTBAGASPB-M
Sex
Project Management
Leverage
knowledge|1195
knowledge|1033
knowledge|442
knowledge|938
knowledge|358
knowledge|875
Process
statistical proccess control
Chess
Performance
Focus
Screenshot Essay
AI
Prompting
Reasoning Through Feeling
Virtues
AI Agents
Economics
Identity
Evolution
Execution
Philosophy
Trueridge
Agents
Cancer
Trading
Stock Market
Neuroscience
Pain
Discomfort
ADHD
Creative
Art
Rating
Great
OK
Incomplete
Get Help
Ask a Question
Submit
Previous Answers
Review Questions
help questions
Submit
Todos
Submit
Sensemaker
Sensemaker
× Close