90-Day AI/ML Content System
Saurav Danej · 90 days. 450 posts.
450 unique tech images. Ready to ship.
A daily content engine on AI/ML, Python, RAG, DSA, Automation and Agents — built for LinkedIn (in/sauravdnj) and Instagram (@saurav_dnj_24). Every post: copy, hashtags, an SVG/PNG image you can download, an AI prompt for Midjourney/DALL-E, and a Canva design brief.
90
Days planned
450
Posts
450
Unique images
7
Pillars covered
The 90-day plan
Click any day to view 5 posts & images1
Day 1
Career5 posts →
Why I'm starting 90 days of AI/ML in public
- 1.Day 1 of 90 — building AI/ML in public
- 2.What 'AI', 'ML' and 'DL' actually mean
- 3.Your first ML model in 6 lines
- 4.The single best AI/ML learning hack
- 5.Day 1 recap — and what's tomorrow
2
Day 2
Python5 posts →
Set up Python so it never fights you again
- 1.Why your Python setup keeps breaking
- 2.uv — the Python installer that's actually fast
- 3.Project setup in 4 commands
- 4.One pyproject.toml beats five config files
- 5.Day 2 — your environment will never fight you again
3
Day 3
Python5 posts →
Python variables & types — the parts that matter
- 1.Python isn't typeless — you just can't see them
- 2.The 7 built-in types you'll touch every day
- 3.Mutable vs immutable — the bug everyone meets once
- 4.f-strings beat every other formatting in Python
- 5.Day 3 — types are values, not labels
4
Day 4
Python5 posts →
Lists & dicts — the workhorses of every Python program
- 1.Lists are arrays. Dicts are hash maps. That's it.
- 2.Slicing — the most underused superpower
- 3.List & dict comprehensions — the loops you don't write
- 4.Three dict moves you probably don't know
- 5.Day 4 — pick the right container, win the day
5
Day 5
Python5 posts →
Loops & control flow — the Python way
- 1.Stop writing C-style loops in Python
- 2.The loop-else clause — Python's best-kept secret
- 3.match-case — better than a chain of ifs
- 4.The walrus operator — when it earns its keep
- 5.Day 5 — loops you don't manage by hand
6
Day 6
Python5 posts →
Functions — the building block you'll write a million times
- 1.A function is a value in Python
- 2.Args, kwargs, and the order that matters
- 3.*args, **kwargs — what they actually do
- 4.Lambdas — short but rarely the right answer
- 5.Day 6 — functions are values
7
Day 7
Career5 posts →
Week 1 recap + the reading list I'm following
- 1.Week 1 in 7 lessons
- 2.The exact AI/ML reading list I'm following
- 3.A 12-line pyproject.toml for any AI/ML project
- 4.How I avoid the 'tutorial trap'
- 5.Week 1 done. 12 weeks to go.
8
Day 8
Python5 posts →
OOP — when (and when not) to use classes
- 1.What a Python class actually is
- 2.When to use a class — and when not
- 3.A minimal class, the right way
- 4.Always write __repr__ first
- 5.Day 8 — class with intent, not by reflex
9
Day 9
Python5 posts →
Inheritance & dunder methods
- 1.Composition over inheritance — read this once
- 2.The dunder methods that matter
- 3.A class that behaves like a native type
- 4.If you override __eq__, override __hash__
- 5.Day 9 — your classes can speak Python's protocols
10
Day 10
Python5 posts →
Decorators — finally explained
- 1.A decorator is just a function that returns a function
- 2.Three decorator shapes you'll meet
- 3.A timing decorator in 10 lines
- 4.Always wrap your decorators in @functools.wraps
- 5.Day 10 — decorators demystified
11
Day 11
Python5 posts →
Generators & lazy evaluation
- 1.A generator is a function that pauses
- 2.Generator expressions — list comp's lazy cousin
- 3.Stream a huge file in 6 lines
- 4.yield from — chain generators in one line
- 5.Day 11 — lazy beats eager when memory is finite
12
Day 12
Python5 posts →
Context managers — the with-statement, demystified
- 1.with-statements never leak resources
- 2.Two ways to write a context manager
- 3.Time any block of code with a context manager
- 4.ExitStack — composing many context managers
- 5.Day 12 — never write try/finally by hand again
13
Day 13
Python5 posts →
Type hints + dataclasses — Python at scale
- 1.Type hints — Python's safety net
- 2.The type hints you'll actually use
- 3.@dataclass — kill the boilerplate
- 4.Run mypy in CI from day one
- 5.Day 13 — types make Python serious
14
Day 14
Python5 posts →
Errors, exceptions & week 2 wrap
- 1.Fail loud, fail fast — never silently
- 2.Custom exceptions — when and how
- 3.raise from — keep the original error visible
- 4.Use ExceptionGroup for parallel failures
- 5.Week 2 done — Python that scales
15
Day 15
DSA5 posts →
Big-O — the only complexity vocab you need
- 1.Big-O isn't math. It's a label for growth.
- 2.How to estimate Big-O in 30 seconds
- 3.O(n²) → O(n) — the dedup pattern
- 4.Don't optimise without measuring
- 5.Day 15 — see the family, pick the structure
16
Day 16
DSA5 posts →
Arrays — the workhorse in disguise
- 1.Python list = dynamic array
- 2.The two-pointer pattern in one diagram
- 3.Two-sum in two pointers (sorted)
- 4.Prefix sum — O(1) range queries
- 5.Day 16 — arrays + 2 pointers = half of leetcode
17
Day 17
DSA5 posts →
Strings — the most underestimated DSA topic
- 1.Strings are immutable arrays of code points
- 2.Anagram & character counting tricks
- 3.Longest substring without repeating characters
- 4.str.translate beats regex for char-replacements
- 5.Day 17 — strings done right
18
Day 18
DSA5 posts →
Linked lists — fewer than you think, harder than they look
- 1.Linked lists exist for one reason
- 2.Reverse a linked list — the universal warmup
- 3.Linked list, in 16 lines
- 4.Floyd's cycle detection — the slow/fast trick
- 5.Day 18 — pointers, not nodes
19
Day 19
DSA5 posts →
Hash maps & sets — your O(1) superpower
- 1.If your loop has 'in list', think 'in set'
- 2.Group-by patterns with defaultdict
- 3.Two-sum — the original O(n) interview answer
- 4.Set operations beat manual loops
- 5.Day 19 — hash everything you can
20
Day 20
DSA5 posts →
Stacks & queues — small structures, huge reach
- 1.Stack vs queue — LIFO vs FIFO
- 2.Valid parentheses — the classic stack problem
- 3.BFS template every interviewer expects
- 4.Use deque, not list, as a queue
- 5.Day 20 — stacks and queues, by access pattern
21
Day 21
DSA5 posts →
Sliding window + week 3 wrap
- 1.Sliding window — the pattern for 'best subrange'
- 2.How to recognise a window problem
- 3.Min subarray sum ≥ target
- 4.Practice these 5 problems first
- 5.Week 3 done — DSA fundamentals locked
22
Day 22
DSA5 posts →
Recursion — when (and how) to use it
- 1.Recursion is just a function calling itself
- 2.Memoise to turn O(2ⁿ) into O(n)
- 3.Tree traversals — recursive in 3 lines each
- 4.Watch the Python recursion limit
- 5.Day 22 — recursion, framed correctly
23
Day 23
DSA5 posts →
Binary search — beyond find-an-element
- 1.Binary search isn't only for sorted arrays
- 2.bisect — Python's built-in binary search
- 3.Binary search on the answer
- 4.Off-by-one — the binary search killer
- 5.Day 23 — log n on any monotonic answer
24
Day 24
DSA5 posts →
Sorting — knowing what Python actually does
- 1.Python's sort is timsort. It's stable.
- 2.Sort by anything with key=
- 3.Top-k with heapq, not full sort
- 4.Don't sort to find the median
- 5.Day 24 — sort smart, not big
25
Day 25
DSA5 posts →
Trees — BFS, DFS, and why ML loves them
- 1.A tree is a graph without cycles
- 2.DFS recursion vs iteration
- 3.Level-order traversal in 12 lines
- 4.Tries — the data structure for prefix searches
- 5.Day 25 — trees, taught by traversal
26
Day 26
DSA5 posts →
Graphs — the universal data model
- 1.Adjacency list — the only graph rep you need most days
- 2.BFS gives shortest path on unweighted graphs
- 3.Dijkstra in 16 lines
- 4.Topological sort — the dependency-order algorithm
- 5.Day 26 — graphs are universal
27
Day 27
DSA5 posts →
Dynamic programming — patterns over magic
- 1.DP is recursion + memoisation
- 2.Top-down vs bottom-up — same answer, different shape
- 3.Coin change — the DP gateway problem
- 4.Define the state in one English sentence first
- 5.Day 27 — DP is just disciplined recursion
28
Day 28
Career5 posts →
DSA wrap — patterns, study plan, interview prep
- 1.8 patterns that solve 80% of interview problems
- 2.The 20-problem study list
- 3.The DSA cheatsheet I keep open
- 4.How I think during a coding interview
- 5.Week 4 done — DSA wrapped
29
Day 29
AI/ML5 posts →
NumPy — vectorise everything
- 1.NumPy is C with a Python skin
- 2.5 NumPy ops that replace 50 lines of loops
- 3.Pure Python vs NumPy — same problem, two speeds
- 4.If you're appending to a NumPy array in a loop, stop
- 5.Day 29 — vectorise everything
30
Day 30
AI/ML5 posts →
Broadcasting — the deep-learning mental model
- 1.Broadcasting in one rule
- 2.Why broadcasting is a memory win, not just syntax
- 3.Cosine similarity as a one-liner
- 4.Always print .shape during shape bugs
- 5.Day 30 — broadcasting clicks once, forever
31
Day 31
AI/ML5 posts →
Pandas — DataFrames you'll actually use
- 1.A DataFrame is a dict of NumPy arrays
- 2.5 pandas methods that cover 80% of work
- 3.A real pandas pipeline in 8 lines
- 4.Drop iterrows from your vocabulary
- 5.Day 31 — pandas, demystified
32
Day 32
AI/ML5 posts →
groupby & merge — the SQL of pandas
- 1.groupby is split-apply-combine
- 2.merge — pandas joins, with the right defaults
- 3.Multi-key groupby with named aggs
- 4.Polars when pandas struggles
- 5.Day 32 — groupby and merge, mastered
33
Day 33
AI/ML5 posts →
Plotting — the chart that ends every EDA
- 1.matplotlib is the engine. Everything else is a wrapper.
- 2.Pair plot — the chart I make first, every dataset
- 3.Three plots, one matplotlib pattern
- 4.If you're plotting more than 100k points, sample first
- 5.Day 33 — plot to think, not to publish
34
Day 34
AI/ML5 posts →
EDA — 7 questions before you open a model
- 1.Models can't fix data you haven't looked at
- 2.df.info(), df.describe(), df.isna().sum() — the holy trio
- 3.Spot leakage in 4 lines
- 4.Save EDA as a notebook AND a markdown
- 5.Day 34 — EDA is half the work
35
Day 35
AI/ML5 posts →
Cleaning real data + week 5 wrap
- 1.Real data is messy. Plan for that.
- 2.5 cleaning patterns I run on every dataset
- 3.A reusable cleaning function
- 4.Always log row count before/after every step
- 5.Week 5 done — the data stack
36
Day 36
AI/ML5 posts →
ML problem framing — supervised, unsupervised, RL
- 1.ML, framed in 3 boxes
- 2.The ML loop in 6 steps
- 3.Train/validation/test split — never skip val
- 4.Pick the metric BEFORE training
- 5.Day 36 — frame before you fit
37
Day 37
AI/ML5 posts →
Linear regression — the model you must understand
- 1.Linear regression in one sentence
- 2.MSE, RMSE, MAE — pick by error shape
- 3.Linear regression — sklearn vs from scratch
- 4.Always compare against a dumb baseline
- 5.Day 37 — the baseline that doesn't lie
38
Day 38
AI/ML5 posts →
Logistic regression — classification, framed simply
- 1.Logistic regression is linear regression in disguise
- 2.Class imbalance — the silent metric killer
- 3.Logistic regression with proper diagnostics
- 4.Threshold ≠ 0.5
- 5.Day 38 — classification, framed cleanly
39
Day 39
AI/ML5 posts →
Decision trees — the interpretable workhorse
- 1.A decision tree is a flowchart you trained
- 2.Gini, entropy, info gain — same idea, different formulas
- 3.Visualise a decision tree in 4 lines
- 4.max_depth and min_samples_leaf — your overfit defenders
- 5.Day 39 — trees, framed
40
Day 40
AI/ML5 posts →
Random forests + gradient boosting — tabular kings
- 1.Bagging vs boosting in one slide
- 2.LightGBM > XGBoost for most things
- 3.LightGBM with sane defaults
- 4.feature_importances_ — the cheapest insight
- 5.Day 40 — boosting wins on tabular
41
Day 41
AI/ML5 posts →
K-means + clustering — finding structure
- 1.K-means in 4 steps
- 2.Choosing k — elbow vs silhouette
- 3.K-means + silhouette in 12 lines
- 4.Always StandardScaler before clustering
- 5.Day 41 — clustering, framed
42
Day 42
AI/ML5 posts →
SVMs + week 6 wrap
- 1.SVMs — find the widest margin
- 2.Classical ML vs deep learning — when to pick what
- 3.Pipeline — wrap everything in one object
- 4.Save the pipeline with joblib, not pickle
- 5.Week 6 done — classical ML mastered
43
Day 43
AI/ML5 posts →
Neurons & perceptrons — DL from first principles
- 1.A neuron is a weighted sum + activation
- 2.Activation functions — the quick guide
- 3.A 2-layer network in 12 lines (PyTorch)
- 4.Initialise weights well, or training stalls
- 5.Day 43 — neurons, framed
44
Day 44
AI/ML5 posts →
Backpropagation — the chain rule, applied
- 1.Backprop = chain rule + smart caching
- 2.Optimisers — Adam, SGD, AdamW
- 3.The PyTorch training loop you'll write 100 times
- 4.If loss is NaN, check learning rate first
- 5.Day 44 — backprop, demystified
45
Day 45
AI/ML5 posts →
PyTorch — DataLoader, GPU, save/load
- 1.Dataset + DataLoader = the PyTorch data pipeline
- 2.Move model and data to GPU correctly
- 3.Save and load — the right way
- 4.Always model.eval() and torch.no_grad() at inference
- 5.Day 45 — PyTorch hygiene
46
Day 46
AI/ML5 posts →
CNNs — convolutions for vision
- 1.A convolution is a sliding dot product
- 2.ResNet — the architecture that survived
- 3.Tiny CNN for MNIST in 14 lines
- 4.Always start from a pretrained model
- 5.Day 46 — CNNs in one breath
47
Day 47
AI/ML5 posts →
RNNs & LSTMs — the predecessor to transformers
- 1.An RNN keeps a hidden state
- 2.Why transformers replaced RNNs
- 3.Tiny LSTM in PyTorch
- 4.Use packed sequences for variable-length
- 5.Day 47 — sequential models, framed
48
Day 48
AI/ML5 posts →
Regularisation — stop memorising, start generalising
- 1.Overfitting in one chart
- 2.Dropout — the trick that almost magically works
- 3.Early stopping in 8 lines
- 4.Weight decay ≠ L2 reg in Adam
- 5.Day 48 — generalise, don't memorise
49
Day 49
AI/ML5 posts →
Production training tricks + week 7 wrap
- 1.Learning-rate schedule beats fixed lr
- 2.Mixed precision (AMP) — free 2x speedup
- 3.Production training loop — every trick
- 4.Use Lightning or HF Trainer instead of writing your own
- 5.Week 7 done — deep learning fundamentals
50
Day 50
AI/ML5 posts →
Tokenisation — the unsung hero of NLP
- 1.Tokens are not words
- 2.BPE in 4 sentences
- 3.Use a tokenizer in 3 lines (HuggingFace)
- 4.Always check token counts before sending an API call
- 5.Day 50 — tokens decoded
51
Day 51
AI/ML5 posts →
Word embeddings — meaning as a vector
- 1.Embeddings are learned coordinates of meaning
- 2.Pick an embedding model — 3 questions
- 3.Local embeddings with sentence-transformers
- 4.Always normalise embeddings before cosine similarity
- 5.Day 51 — meaning as coordinates
52
Day 52
AI/ML5 posts →
Attention — the mechanism that ate ML
- 1.Attention in three letters: Q, K, V
- 2.Multi-head attention — parallel perspectives
- 3.Self-attention in 14 lines
- 4.Use F.scaled_dot_product_attention
- 5.Day 52 — attention, framed cleanly
53
Day 53
AI/ML5 posts →
Transformer block — the architectural Lego
- 1.A transformer block is two sublayers
- 2.Encoder vs decoder — same block, different mask
- 3.A transformer block in PyTorch (compact)
- 4.Don't write your own transformer in 2026
- 5.Day 53 — the block that ate ML
54
Day 54
AI/ML5 posts →
BERT — encoders that still matter
- 1.BERT — bidirectional, pre-trained, fine-tuned
- 2.When to use BERT (or its descendants) in 2026
- 3.Fine-tune BERT for classification in 20 lines
- 4.Use distilled / small variants for production
- 5.Day 54 — encoders still matter
55
Day 55
AI/ML5 posts →
GPT-style decoders — autoregressive generation
- 1.Decoder LLMs predict the next token, repeatedly
- 2.Sampling — how the model picks the next token
- 3.Generate text with a small open LLM
- 4.Use vLLM for any serious local inference
- 5.Day 55 — generation, framed
56
Day 56
AI/ML5 posts →
Fine-tune or prompt? + week 8 wrap
- 1.Prompt > RAG > Fine-tune (in that order)
- 2.LoRA — fine-tune big models with small budgets
- 3.QLoRA fine-tune in 20 lines
- 4.Evaluate fine-tunes against the base, not against your hopes
- 5.Week 8 done — NLP and transformers
57
Day 57
RAG5 posts →
Why RAG — and why it's not just 'context-stuffing'
- 1.RAG = Retrieval Augmented Generation
- 2.RAG isn't 'just embeddings + LLM'
- 3.Naive RAG in 30 lines (the starting point)
- 4.Always pass the source back to the user
- 5.Day 57 — RAG, framed honestly
58
Day 58
RAG5 posts →
Chunking — the deceptively hard step
- 1.Bad chunks = bad RAG, no exceptions
- 2.Chunk size & overlap — the two knobs
- 3.RecursiveCharacterTextSplitter — the safe default
- 4.Add metadata to every chunk
- 5.Day 58 — chunking is half the battle
59
Day 59
RAG5 posts →
Embedding choice — the silent quality lever
- 1.Your embedding model decides what 'similar' means
- 2.MTEB — the embedding benchmark + its caveats
- 3.Build a tiny eval set in 10 minutes
- 4.Don't change embedding models without re-indexing
- 5.Day 59 — embeddings define quality
60
Day 60
RAG5 posts →
Vector databases — pick by load, not hype
- 1.A vector DB is an ANN index + storage + filters
- 2.Pick a vector DB by load + ops fit
- 3.Qdrant in 15 lines
- 4.Profile p99 latency, not average
- 5.Day 60 — vector DBs without hype
61
Day 61
RAG5 posts →
Top-k retrieval — the parameters that matter
- 1.k = how much context the LLM gets
- 2.Cosine vs dot vs Euclidean — pick by training
- 3.Filter before ANN — speed + relevance win
- 4.Hybrid search beats pure semantic
- 5.Day 61 — retrieval, tuned
62
Day 62
RAG5 posts →
Augmenting the prompt — the most overlooked step
- 1.How you stuff context into the prompt matters
- 2.A robust RAG prompt template
- 3.RAG prompt builder — the function I keep around
- 4.Lower temperature for RAG — usually 0
- 5.Day 62 — the prompt is half the system
63
Day 63
RAG5 posts →
Evaluating RAG + week 9 wrap
- 1.Evaluate retrieval + generation separately
- 2.Ragas / TruLens — RAG eval frameworks
- 3.ragas — minimum eval setup
- 4.Track eval scores per release like CI tests
- 5.Week 9 done — RAG fundamentals
64
Day 64
RAG5 posts →
Hybrid search — BM25 + dense, the right way
- 1.BM25 isn't legacy. It's complementary.
- 2.When hybrid gives the biggest lift
- 3.RRF in 8 lines
- 4.Use the same chunks for both indexes
- 5.Day 64 — hybrid search, demystified
65
Day 65
RAG5 posts →
Rerankers — the second pass that fixes everything
- 1.Retrieve fast → rerank slow
- 2.Pick a reranker — open vs API
- 3.Add a reranker in 12 lines
- 4.Cap the reranker at 50 candidates
- 5.Day 65 — the second pass that pays for itself
66
Day 66
RAG5 posts →
Query rewriting — fix the input before the search
- 1.Bad queries can't be fixed by good retrievers
- 2.HyDE — the trick that surprised everyone
- 3.Multi-query rewrite + union
- 4.Cache rewrites — they repeat
- 5.Day 66 — fix the input first
67
Day 67
RAG5 posts →
Multi-step retrieval — when one query isn't enough
- 1.Some questions need multi-hop retrieval
- 2.Sub-question decomposition
- 3.Async sub-question RAG
- 4.Don't multi-hop everything
- 5.Day 67 — multi-hop, used wisely
68
Day 68
Agents5 posts →
Agentic RAG — let the LLM decide
- 1.Agentic RAG = retrieval as a tool
- 2.Tool-calling makes agentic RAG trivial
- 3.Tool-calling RAG with OpenAI
- 4.Cap tool calls — agents will spin
- 5.Day 68 — agentic RAG, demystified
69
Day 69
RAG5 posts →
GraphRAG — when relationships matter
- 1.GraphRAG models entities + relationships
- 2.GraphRAG isn't always the answer
- 3.Tiny entity-graph extraction in 18 lines
- 4.Use neo4j or memgraph for production graphs
- 5.Day 69 — graphs when chunks aren't enough
70
Day 70
RAG5 posts →
Production RAG checklist + week 10 wrap
- 1.Production RAG checklist — 12 items
- 2.Cost & latency budgets — the real constraints
- 3.Trace every RAG call — the one log line that matters
- 4.Cache aggressively. Then cache more.
- 5.Week 10 done — production RAG
71
Day 71
Agents5 posts →
What is an LLM agent — the honest definition
- 1.An agent is an LLM in a loop, with tools
- 2.ReAct — the agent pattern
- 3.Minimal ReAct loop in 30 lines
- 4.Don't reach for an agent until you must
- 5.Day 71 — agents, defined honestly
72
Day 72
Agents5 posts →
Tool design — the most important agent skill
- 1.A tool is a contract — name, schema, behaviour
- 2.Tool error handling — fail informatively
- 3.Tool definition that actually works
- 4.Test tools without an LLM first
- 5.Day 72 — tools first, prompts second
73
Day 73
Agents5 posts →
Planning agents — decompose, then execute
- 1.Plan-then-execute beats step-by-step on hard tasks
- 2.Two-LLM pattern: cheap executor, smart planner
- 3.Plan + execute split — minimal code
- 4.Allow replanning after surprises
- 5.Day 73 — plan, execute, replan
74
Day 74
Agents5 posts →
Multi-agent — when one isn't enough
- 1.Multi-agent = specialisation + handoff
- 2.Topology — pipeline vs network
- 3.Two-agent pipeline in 30 lines
- 4.Cap network agents with a turn limit
- 5.Day 74 — multi-agent, with caps
75
Day 75
Agents5 posts →
Agent frameworks — LangGraph, AutoGen, CrewAI
- 1.Pick by abstraction, not by stars
- 2.LangGraph — my default in production
- 3.Tiny LangGraph agent
- 4.Always add tracing (LangSmith / Langfuse)
- 5.Day 75 — frameworks, with intent
76
Day 76
Agents5 posts →
Memory in agents — short, long, working
- 1.Three kinds of agent memory
- 2.Summarise as you go — survive token limits
- 3.Rolling-summary memory in 20 lines
- 4.Don't store secrets in long-term memory
- 5.Day 76 — agents that remember (sensibly)
77
Day 77
Agents5 posts →
Agent failure modes + week 11 wrap
- 1.5 agent failure modes I've shipped (and learned)
- 2.Eval agents on completion + cost + safety
- 3.Hard cost + step caps
- 4.Ship a kill-switch endpoint
- 5.Week 11 done — agents, with intent
78
Day 78
Automation5 posts →
Web scraping with requests + BeautifulSoup
- 1.Most scraping is HTTP + parse, not browsers
- 2.Scrape ethically — robots, rate, identify
- 3.A polite scraper template
- 4.Cache responses while developing
- 5.Day 78 — scraping, done politely
79
Day 79
Automation5 posts →
Playwright — when JS rendering is required
- 1.Playwright > Selenium in 2026
- 2.Headless vs headed — debug visually
- 3.Playwright async script
- 4.Use page.codegen — let Playwright write the script
- 5.Day 79 — browsers, when needed
80
Day 80
Automation5 posts →
Scheduling — cron, APScheduler, Airflow
- 1.Pick a scheduler by ops complexity
- 2.Cron syntax in 30 seconds
- 3.APScheduler in 12 lines
- 4.Always send a heartbeat alert when a job DOESN'T run
- 5.Day 80 — scheduled, monitored, alive
81
Day 81
Automation5 posts →
Slack & email — close the loop
- 1.Automation without notification is invisible
- 2.Slack incoming webhooks — 5-minute setup
- 3.Slack notifier in 10 lines
- 4.Use Postmark or Resend for transactional email
- 5.Day 81 — close the loop
82
Day 82
Automation5 posts →
PDF & Excel — the boring automations that pay
- 1.PDFs aren't text. Pick the right tool.
- 2.Excel: openpyxl for read/write, polars for crunch
- 3.Extract a table from a PDF in 8 lines
- 4.For invoice / receipt OCR, use a service
- 5.Day 82 — file automations
83
Day 83
Automation5 posts →
API integrations — retries, timeouts, idempotency
- 1.httpx > requests for new code
- 2.Retries that don't make things worse
- 3.Production-grade API client
- 4.Idempotency keys for any state-changing call
- 5.Day 83 — APIs that don't lie
84
Day 84
Automation5 posts →
Serverless automation + week 12 wrap
- 1.Lambda + EventBridge = a serverless cron
- 2.Deploy with SAM, AWS CDK, or Serverless Framework
- 3.Lambda handler — minimum viable
- 4.Watch for Lambda's hidden costs
- 5.Week 12 done — automation that runs itself
85
Day 85
Career5 posts →
Build a portfolio that lands jobs
- 1.Three projects > 30 tutorials
- 2.What every README must have
- 3.A README template I reuse for AI/ML projects
- 4.Pin your three best repos on GitHub
- 5.Day 85 — portfolio first
86
Day 86
Career5 posts →
Open source — start small, ship often
- 1.Your first OSS PR doesn't need to be code
- 2.Pick a repo where the maintainers actually merge
- 3.A clean OSS contribution workflow
- 4.Write the PR description like a story
- 5.Day 86 — open source, started
87
Day 87
Career5 posts →
Resume + LinkedIn — recruiter-ready
- 1.Resume is a 30-second highlight reel
- 2.LinkedIn — the headline + about section
- 3.A LaTeX resume template (small repo)
- 4.Tailor resume per job — change ONE thing
- 5.Day 87 — recruiter-ready
88
Day 88
Career5 posts →
ML interview prep — the focused 30-day plan
- 1.ML interview = 4 rounds (usually)
- 2.30-day prep — 1 hour a day
- 3.ML system design — the canvas I draw every time
- 4.Talk MORE than you think you should
- 5.Day 88 — interview ready
89
Day 89
Career5 posts →
The learning loop — staying sharp
- 1.Three habits separate growing engineers from stuck ones
- 2.How to read AI papers without burning out
- 3.A 'learning log' template I keep in a file
- 4.One newsletter, one podcast, one Twitter list
- 5.Day 89 — the loop that lasts
90
Day 90
Career5 posts →
Day 90 — the wrap-up
- 1.90 days. 450 posts. What I actually learned.
- 2.The 90-day index — every topic, in one post
- 3.What I'm building next — a public repo of every snippet
- 4.The next 90 — what I want from YOU
- 5.Day 90 — thank you. Genuinely.