56,966 blogs · [ { "id": "01a087e6-223a-71cc-9a73-05914c9b0d37", "title": "How to Run a Fellowship Program Into the Ground (and get 18M impressions in the process)", "url": "https://stevehanov.ca/blog/how-to-run-a-fellowship", "published_at": "2026-05-26T22:20:27+00:00" }, { "id": "01a087e6-223a-71cc-9a73-05914d1da720", "title": "My Waterloo Intern went back to school. I'll miss him dearly but here's how I replaced him with Hermes", "url": "https://stevehanov.ca/blog/my-waterloo-intern-went-back-to-school-heres-how-i-replaced-him-with-hermes", "published_at": "2026-05-17T13:08:43+00:00" }, { "id": "01a087e6-223a-71cc-9a73-05914d94fe43", "title": "I learned Mandarin. Here's what it taught me about B2C SaaS.", "url": "https://stevehanov.ca/blog/i-learned-mandarin-heres-what-it-taught-me-about-b2c-saas", "published_at": "2026-05-09T12:29:15+00:00" }, { "id": "01a087e6-223a-71cc-9a73-05914dd7b79e", "title": "The VC's Waterloo Coffee Tour: Where to Find Canada's Next Unicorn", "url": "https://stevehanov.ca/blog/the-vcs-waterloo-coffee-tour-where-to-find-canadas-next-unicorn", "published_at": "2026-03-23T14:48:23+00:00" }, { "id": "01a087e6-223a-71cc-9a73-05914e992199", "title": "How I run multiple $10K MRR companies on a $20/month tech stack", "url": "https://stevehanov.ca/blog/how-i-run-multiple-10k-mrr-companies-on-a-20month-tech-stack", "published_at": "2026-03-17T16:46:41+00:00" }, { "id": "01a087e6-223a-71cc-9a73-05914f3b4786", "title": "How to Save a Gemini Canvas as Markdown", "url": "https://stevehanov.ca/blog/how-to-save-a-gemini-canvas-as-markdown", "published_at": "2026-03-13T18:42:46+00:00" }, { "id": "01a087e6-223a-71cc-9a73-059150279031", "title": "A Ralph Loop for Reading: Beating GPT 5.2 with a 4k Context Window (and 4 GPUs)", "url": "https://stevehanov.ca/blog/a-ralph-loop-for-reading-beating-gpt-52-with-a-4k-context-window-and-4-gpus", "published_at": "2026-02-06T00:00:00+00:00" }, { "id": "01a087e6-223a-71cc-9a73-05915085b86e", "title": "I built a Chrome extension that lets an LLM “see” tweets", "url": "https://stevehanov.ca/blog/i-built-a-chrome-extension-that-lets-an-llm-see-tweets", "published_at": "2026-01-26T18:10:25+00:00" }, { "id": "01a087e6-223a-71cc-9a73-059150931f82", "title": "Fighting Blog Comment Spam with Qwen3 and Ollama", "url": "https://stevehanov.ca/blog/fighting-blog-comment-spam-with-qwen3-and-ollama", "published_at": "2025-05-13T13:21:03+00:00" }, { "id": "01a087e6-223a-71cc-9a73-059150f9fe88", "title": "Make a web page screenshot service", "url": "https://stevehanov.ca/blog/make-a-web-page-screenshot-service", "published_at": "2024-11-26T15:11:58+00:00" }, { "id": "01a087e6-223a-71cc-9a73-05915105861d", "title": "Automatically remove wordiness from your writing", "url": "https://stevehanov.ca/blog/automatically-remove-wordiness-from-your-writing", "published_at": "2024-11-16T00:00:00+00:00" }, { "id": "01a087e6-223a-71cc-9a73-05915122261a", "title": "I found Security Vulnerability in your web application", "url": "https://stevehanov.ca/blog/i-found-security-vulnerability-in-your-web-application", "published_at": "2022-01-28T10:54:57+00:00" }, { "id": "01a087e6-223a-71cc-9a73-0591520cc287", "title": "How to detect if an object has been garbage collected in Javascript", "url": "https://stevehanov.ca/blog/how-to-detect-if-an-object-has-been-garbage-collected-in-javascript", "published_at": "2020-05-25T10:35:28+00:00" }, { "id": "01a087e6-223a-71cc-9a73-059152d18d62", "title": "My favourite Google Cardboard Apps", "url": "https://stevehanov.ca/blog/my-favourite-google-cardboard-apps", "published_at": "2017-02-15T10:46:40+00:00" }, { "id": "01a087e6-223a-71cc-9a73-059153b94400", "title": "O(n) Delta Compression With a Suffix Array", "url": "https://stevehanov.ca/blog/on-delta-compression-with-a-suffix-array", "published_at": "2017-01-24T10:16:32+00:00" }, { "id": "01a087e6-223a-71cc-9a73-059153ddfc79", "title": "Finding Bieber: On removing duplicates from a set of documents", "url": "https://stevehanov.ca/blog/finding-bieber-on-removing-duplicates-from-a-set-of-documents", "published_at": "2014-11-10T00:00:00+00:00" }, { "id": "01a087e6-223a-71cc-9a73-059154c2ffc1", "title": "Let's read a Truetype font file from scratch", "url": "https://stevehanov.ca/blog/lets-read-a-truetype-font-file-from-scratch", "published_at": "2014-11-05T15:45:16+00:00" }, { "id": "01a087e6-223a-71cc-9a73-059155597708", "title": "A Quick Measure of Sortedness", "url": "https://stevehanov.ca/blog/a-quick-measure-of-sortedness", "published_at": "2014-09-11T17:45:08+00:00" }, { "id": "01a087e6-223a-71cc-9a73-0591555f16bb", "title": "My thoughts on various programming languages", "url": "https://stevehanov.ca/blog/my-thoughts-on-various-programming-languages", "published_at": "2014-07-06T20:36:53+00:00" }, { "id": "01a087e6-223a-71cc-9a73-059155ef3704", "title": "A little VIM hacking", "url": "https://stevehanov.ca/blog/a-little-vim-hacking", "published_at": "2014-07-06T03:26:18+00:00" } ] posts Claim your blog
Back to Steve Hanov's Blog
Blog · corpus.blog/blogs/stevehanov.ca/posts

Steve Hanov's Blog

stevehanov.ca

2026

2025

2024

2022

2020

2017

2014