<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>trolls.dev — Notes from the night shift</title><description>Short essays from trolls.dev on building small, useful software: product design, studio life, and lessons from running our own products.</description><link>https://trolls.dev/</link><language>en-us</language><item><title>The map is made of open tabs</title><link>https://trolls.dev/notes/the-map-is-made-of-open-tabs/</link><guid isPermaLink="true">https://trolls.dev/notes/the-map-is-made-of-open-tabs/</guid><description>The usual way to build a live map of the physical world is to buy sensors and rent servers to watch them. Thyseus does neither. It turns cameras that already exist and browser tabs that are already open into a sensor network nobody had to install — and that inversion is the whole product.</description><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There&apos;s a default architecture for building a live map of the physical world, and it&apos;s
expensive on purpose. You buy cameras. You mount them. You run their feeds back to a data
center where a rack of GPUs watches every frame, and you pay for that rack whether anything
interesting is happening or not. Coverage is a line item: every new intersection you want to
see is more hardware, more bandwidth, more compute. The map scales with the budget, and only
with the budget.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://trolls.dev/work/thyseus&quot;&gt;Thyseus&lt;/a&gt; is a live map of detected vehicles, people, and infrastructure, and
it&apos;s built the other way around — the cheap way, which turned out to also be the interesting
way. It buys no cameras and rents no GPUs. It runs on things that already exist and were
already switched on, and getting there meant questioning two assumptions the default
architecture never examines.&lt;/p&gt;
&lt;h2&gt;The cameras are already there&lt;/h2&gt;
&lt;p&gt;The first assumption is that you need to deploy sensors. You don&apos;t. Point a browser at the
public web and there are already thousands of live camera feeds streaming right now — state
DOT traffic cameras, port and bridge feeds, city intersection cams — publicly accessible,
publicly funded, and mostly watched by no one. The physical sensing layer for a national map
already exists. It&apos;s paid for. It&apos;s on.&lt;/p&gt;
&lt;p&gt;What&apos;s missing isn&apos;t cameras. It&apos;s &lt;em&gt;attention&lt;/em&gt;. A feed nobody is looking at is just bandwidth
going nowhere. So the actual problem Thyseus set out to solve was never &quot;how do we see the
world&quot; — the world is already on camera — but &quot;how do we look at thousands of feeds at once
without building the data center that would normally imply.&quot;&lt;/p&gt;
&lt;h2&gt;The compute is already there too&lt;/h2&gt;
&lt;p&gt;That&apos;s the second assumption, and the one that makes the whole thing work: that the watching
has to happen on a server you pay for.&lt;/p&gt;
&lt;p&gt;Every person who opens Thyseus is sitting in front of a device with a capable GPU that is,
at that moment, doing almost nothing. Modern browsers can run a real object-detection model
directly on that hardware — WebGL and WebGPU turned the machine you already own into an
inference engine, no install, no driver, no account. So Thyseus runs the detection &lt;em&gt;in the
contributor&apos;s browser&lt;/em&gt;. Their tab pulls a public feed, runs the model on the frames locally,
and the server never sees the video at all.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Every open browser tab is a sensor. We didn&apos;t build the sensor network. We noticed it was
already assembled, plugged in, and idle, and wrote the software that lets it agree on what
it&apos;s seeing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the inversion the product is built on. In the default architecture, compute is
centralized and scarce, so coverage costs money. Here compute is distributed and volunteered,
so coverage costs &lt;em&gt;interest&lt;/em&gt;. Ten people watching feeds is a small map. A thousand people
watching feeds is a big one, and the bill to us barely moves, because the expensive part —
looking at every frame — is happening on a thousand machines we don&apos;t own and don&apos;t pay for.
The map scales with the community, not the budget.&lt;/p&gt;
&lt;h2&gt;Detections, not video&lt;/h2&gt;
&lt;p&gt;There&apos;s a detail in there that&apos;s easy to skim past and is actually load-bearing: the browser
streams &lt;em&gt;detections&lt;/em&gt;, not video. It doesn&apos;t ship frames back to us. It ships the small
structured result — a car, here, now, this confident — and throws the pixels away.&lt;/p&gt;
&lt;p&gt;That choice pays off three times over. It&apos;s cheap, because a detection is a few bytes where a
video stream is megabytes a second. It&apos;s private, because raw footage of public streets never
pools up on our servers; the only thing that leaves the contributor&apos;s machine is &quot;something
was detected,&quot; not the picture of it. And it&apos;s honest about what a map is &lt;em&gt;for&lt;/em&gt; — nobody
wants to scrub through a thousand simultaneous video feeds. They want to know what&apos;s where.
The detection is the useful part. The frame was just how you got it.&lt;/p&gt;
&lt;h2&gt;From &quot;on camera 12&quot; to a point on the earth&lt;/h2&gt;
&lt;p&gt;A detection that only knows which camera saw it isn&apos;t a map, it&apos;s a list. The step that turns
Thyseus from a feed aggregator into an actual map is geometry.&lt;/p&gt;
&lt;p&gt;Each public camera has a known position and a known view. A detection arrives with a location
&lt;em&gt;within the frame&lt;/em&gt; — this car is in the lower-left, this far down. Combine the camera&apos;s
placement and orientation with where the object sits in its field of view, and you can compute
where the object actually is: real latitude and longitude, a pin you can drop on a shared map
next to pins computed from hundreds of other feeds. A &quot;car on camera 12&quot; becomes &quot;a car at
this corner,&quot; which is the difference between raw footage and situational awareness.&lt;/p&gt;
&lt;p&gt;Do that continuously, across every feed every open tab is watching, and the separate cameras
stop being separate. They fuse into one surface — a single live map of a region, stitched
from feeds that have no idea they&apos;re part of it.&lt;/p&gt;
&lt;h2&gt;Being honest about the seams&lt;/h2&gt;
&lt;p&gt;We&apos;d rather show you the seams than pretend there aren&apos;t any, which is the same discipline
that keeps &lt;a href=&quot;https://trolls.dev/notes/you-shipped-it-did-it-work&quot;&gt;code-results&lt;/a&gt; from dressing up a correlation as
a proof. Thyseus is exactly as live as the tabs that happen to be open. A corner nobody is
watching goes dark until someone points a browser at it. Public cameras have their own
outages and blind spots. Detection at the edge trades a sliver of accuracy for an enormous
gain in reach — a browser model is not a rack of A100s, and we don&apos;t claim it is. These aren&apos;t
bugs to hide behind a loading spinner; they&apos;re the honest shape of a map made of volunteered
attention, and the contributor leaderboard exists precisely because more attention is the
thing that makes the map better.&lt;/p&gt;
&lt;h2&gt;Why a two-person studio ships something this ambitious&lt;/h2&gt;
&lt;p&gt;On paper, a live national object-detection map is infrastructure-company work — the kind of
thing that usually comes with a warehouse of GPUs and a funding round to pay for them. We
&lt;a href=&quot;https://trolls.dev/notes/in-defense-of-small-software&quot;&gt;took neither&lt;/a&gt;, and we could build it anyway for one
reason: we refused the architecture that would have required them.&lt;/p&gt;
&lt;p&gt;That refusal is a habit, not a one-off. It&apos;s the same instinct behind believing
&lt;a href=&quot;https://trolls.dev/notes/the-fastest-page-is-already-there&quot;&gt;the fastest page is the one already there&lt;/a&gt; — the
cheapest sensor is the camera already streaming, the cheapest GPU is the one already glowing
in a contributor&apos;s laptop. The engineering that mattered wasn&apos;t a bigger machine. It was
noticing that the machine was already built, already on, and waiting in a browser tab for
someone to write the software that would let all the tabs agree on what they were looking at.&lt;/p&gt;
&lt;p&gt;That&apos;s the studio&apos;s whole bet, really, pointed at the physical world instead of a screen:
most of what you&apos;d go out and buy is already sitting there, switched on, unused. The product
is what you build once you stop trying to own the parts.&lt;/p&gt;
</content:encoded><category>Engineering</category><category>Thyseus</category></item><item><title>You shipped it. Did it work?</title><link>https://trolls.dev/notes/you-shipped-it-did-it-work/</link><guid isPermaLink="true">https://trolls.dev/notes/you-shipped-it-did-it-work/</guid><description>Most teams can tell you exactly what they shipped last quarter and almost nothing about whether it mattered. The feedback loop dies at the merge button — and that&apos;s the loop code-results is built to close.</description><pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ask an engineering team what they shipped last quarter and you&apos;ll get a crisp answer: a
changelog, a burndown, a wall of merged pull requests. Ask the same team what any of it
&lt;em&gt;did&lt;/em&gt; — whether users signed up faster, activated more, stayed longer, paid — and the room
goes quiet. Somebody opens a dashboard. Somebody else says &quot;hard to isolate.&quot; The honest
answer, most of the time, is that nobody knows.&lt;/p&gt;
&lt;p&gt;This is strange, when you say it out loud. We instrument everything up to the moment code
lands. Tests, CI, code review, deploy tracking, error rates, latency graphs. Then the code
reaches real users — the entire point of writing it — and the instrumentation stops. The
feedback loop that runs so tightly through development quietly dies at the merge button.&lt;/p&gt;
&lt;h2&gt;Output is easy to measure. Outcome is the thing that matters.&lt;/h2&gt;
&lt;p&gt;The reason we drift here isn&apos;t laziness. It&apos;s that output is trivially countable and outcome
is not. Pull requests merged, story points closed, deploys per day — these are right there,
already logged, and they &lt;em&gt;feel&lt;/em&gt; like progress. So they become the metrics, and a team can
run for years on a scoreboard that measures effort while never once checking the result.&lt;/p&gt;
&lt;p&gt;The trouble is that a company doesn&apos;t run on velocity. It runs on sign-ups, activation,
revenue, retention — the numbers it would actually notice if they moved. A quarter can be
enormously productive by the output scoreboard and completely flat by the one that pays
rent. If you only watch the first, you can&apos;t tell the difference between shipping a lot and
shipping things that worked. Those are not the same skill, and confusing them is how teams
get very busy going nowhere.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Velocity measures how hard the team is rowing. It says nothing about whether the boat is
pointed at the shore.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Every deploy is a hypothesis&lt;/h2&gt;
&lt;p&gt;Here&apos;s the reframe we keep coming back to: &lt;strong&gt;a deploy is not the end of a task, it&apos;s the
start of an experiment.&lt;/strong&gt; You believed that redesigned onboarding would lift activation.
You believed the new pricing page would convert. You believed removing that step would cut
drop-off. Each of those is a claim about the world, and the moment you ship, the world
starts answering.&lt;/p&gt;
&lt;p&gt;Almost nobody stays to hear the answer. The ticket is closed, the PR is merged, the team is
three features down the road before the numbers even settle. So the belief that justified
the work is never checked. You keep shipping on instinct, and instinct never gets corrected,
because correction requires looking back at a specific change and asking what happened after
it. That&apos;s the exact loop most tooling refuses to close.&lt;/p&gt;
&lt;h2&gt;What we built to close it&lt;/h2&gt;
&lt;p&gt;This is the gap &lt;a href=&quot;https://trolls.dev/work/code-results&quot;&gt;code-results&lt;/a&gt; exists to fill. It&apos;s a simple, stubborn
idea: take a deploy — a real, dated event, not a guess — and line it up against the handful
of business metrics a company genuinely watches. Sign-ups, activation, revenue, retention.
Every metric has a before and an after. code-results puts the deploy on that timeline and
shows you what moved once your change reached production, read by the same team that shipped
it.&lt;/p&gt;
&lt;p&gt;The discipline is in what it refuses to do. A deploy and a metric moving at the same time is
a &lt;strong&gt;correlation&lt;/strong&gt;, not a proof, and we don&apos;t dress it up as one. Ship into a holiday spike
and revenue climbs for reasons that have nothing to do with you; a genuinely great feature
can land the week a competitor undercuts you and read as flat. code-results draws the line
clearly and lets you read it like an adult — a strong signal you go investigate, not a gold
star it hands out. Honest correlation you can act on beats fabricated causation every time.
The goal isn&apos;t to &lt;em&gt;declare&lt;/em&gt; victory. It&apos;s to make the question askable at all.&lt;/p&gt;
&lt;h2&gt;Why a tiny studio cares about this&lt;/h2&gt;
&lt;p&gt;We didn&apos;t come to this from theory. We came to it from operating our own products, which is
the &lt;a href=&quot;https://trolls.dev/notes/why-we-only-build-what-we-run&quot;&gt;one rule this studio runs on&lt;/a&gt;: we only build what
we run. Operating a product is where you learn that shipping and succeeding are different
events, sometimes by weeks. We wanted the shape of that answer for our own work — did that
change do anything? — and found that the tooling to see it barely existed.&lt;/p&gt;
&lt;p&gt;So we built the thing we needed, the same way &lt;a href=&quot;https://trolls.dev/work/ganttchart-ai&quot;&gt;ganttchart.ai&lt;/a&gt; came out
of wanting a plan in the ten minutes before a meeting. code-results is what it looks like to
take the studio&apos;s oldest belief — &lt;em&gt;a launch is the start of finding out if you were right&lt;/em&gt; —
and turn it into something you can actually watch happen.&lt;/p&gt;
&lt;p&gt;The scoreboard that counts what you shipped will always be easier to keep. It&apos;s also the one
that lets you fool yourself. The harder scoreboard — did it work? — is the only one the
business is actually keeping, whether you look at it or not. You may as well look.&lt;/p&gt;
</content:encoded><category>Engineering</category><category>code-results</category></item><item><title>Gantt chart, kanban board, or to-do list?</title><link>https://trolls.dev/notes/gantt-chart-kanban-or-todo-list/</link><guid isPermaLink="true">https://trolls.dev/notes/gantt-chart-kanban-or-todo-list/</guid><description>Three shapes a plan can take, and how to pick the right one — a plain-English decision guide based on the one question that actually matters: does time drive your work, or does order?</description><pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Somebody on your team just said &quot;we need a plan,&quot; and now you&apos;re staring at three tabs: a
&lt;a href=&quot;https://trolls.dev/glossary/gantt-chart&quot;&gt;Gantt chart&lt;/a&gt; tool, a kanban board, and a blank to-do list. They all
promise clarity. They are not interchangeable. Pick the wrong shape and you&apos;ll spend the
project fighting your own plan — updating a chart nobody reads, or missing a deadline that a
chart would have made obvious in week one.&lt;/p&gt;
&lt;p&gt;The good news: choosing is one question, not a personality quiz.&lt;/p&gt;
&lt;h2&gt;The only question that matters&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Does your work have a deadline that other work has to line up against?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s it. If yes — things must happen in a certain order, by a certain date, and some tasks
can&apos;t start until others finish — your plan has a &lt;em&gt;time&lt;/em&gt; dimension, and you want a
&lt;a href=&quot;https://trolls.dev/glossary/timeline&quot;&gt;timeline&lt;/a&gt;. If no — the work is a pool of items that get done as capacity
frees up, and &quot;when&quot; matters less than &quot;what&apos;s next&quot; — your plan has a &lt;em&gt;flow&lt;/em&gt; dimension, and
a board or a list will serve you better.&lt;/p&gt;
&lt;p&gt;Everything else (team size, tool budget, how much your manager likes colored rectangles) is
detail.&lt;/p&gt;
&lt;h2&gt;What each shape is actually for&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;A to-do list is a memory.&lt;/strong&gt; It answers one question: &lt;em&gt;what needs doing?&lt;/em&gt; It&apos;s the right
shape when the work is yours alone, the items are independent, and nothing is waiting on
anything else. Groceries, bug triage, the fifteen small chores of a launch week. The moment
one item can&apos;t start until another finishes, the list starts lying to you — it shows
&quot;write announcement&quot; and &quot;get legal sign-off&quot; as equals when one of them is quietly blocking
the other. A list has no way to say &lt;em&gt;waiting&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A kanban board is a flow meter.&lt;/strong&gt; It answers: &lt;em&gt;what&apos;s moving, what&apos;s stuck, and what&apos;s
next?&lt;/em&gt; Work enters on the left, gets pulled through columns, and exits done. It&apos;s the right
shape for continuous work with no finish line — support queues, content pipelines, a team
shipping improvements every week forever. Boards are honest about capacity (&quot;why are nine
cards In Progress?&quot;) and silent about dates. A board cannot show you that the whole thing
needs to be done by March 28, because a board doesn&apos;t believe in March 28.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A Gantt chart is a promise made visible.&lt;/strong&gt; It answers: &lt;em&gt;will we make the date — and if
not, which &lt;a href=&quot;https://trolls.dev/glossary/task&quot;&gt;task&lt;/a&gt; is to blame?&lt;/em&gt; Bars on a calendar, arranged so
&lt;a href=&quot;https://trolls.dev/glossary/dependency&quot;&gt;dependencies&lt;/a&gt; are visible and the
&lt;a href=&quot;https://trolls.dev/glossary/critical-path&quot;&gt;critical path&lt;/a&gt; stands out. It&apos;s the right shape when the project
has a beginning, an end, a deadline someone said out loud, and tasks that wait on each other.
Launches, events, migrations, renovations, anything with the word &quot;by&quot; in it.&lt;/p&gt;
&lt;h2&gt;The honest trade-offs&lt;/h2&gt;
&lt;p&gt;Every shape has a failure mode, and it&apos;s usually the reason people switch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lists scale down beautifully and up terribly.&lt;/strong&gt; Twelve items, fine. Sixty items across
four people with three deadlines — you&apos;ve built a Gantt chart&apos;s worth of complexity with
none of its visibility.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Boards hide deadlines until they&apos;re emergencies.&lt;/strong&gt; &quot;It&apos;s in progress&quot; is a soothing
answer right up until someone asks whether it&apos;ll be done by the launch date, and nobody
can say, because the board was never asked to know.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gantt charts rot when edits are expensive.&lt;/strong&gt; A timeline is only as good as its last
update. If moving one bar means an afternoon of dragging cells around, the chart freezes
into fiction and the real plan retreats into hallway conversations. (This is a tooling
problem, not a Gantt problem — more on that below.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Mixing shapes without making a mess&lt;/h2&gt;
&lt;p&gt;Real projects usually deserve two shapes at two altitudes. The pattern that works: &lt;strong&gt;a
timeline for the room, a board or list for the desk.&lt;/strong&gt; The Gantt chart holds the phases,
&lt;a href=&quot;https://trolls.dev/glossary/milestone&quot;&gt;milestones&lt;/a&gt;, and dependencies — the five-to-twelve bars everyone
points at in the Monday meeting. The kanban board or to-do list holds the forty tickets
inside the &quot;Build&quot; bar — the detail only the builders need. The chart answers &quot;will we make
the date&quot;; the board answers &quot;what do I pick up next.&quot; Trouble starts only when one tool is
asked to answer both questions at once.&lt;/p&gt;
&lt;h2&gt;If you landed on &quot;Gantt chart&quot;&lt;/h2&gt;
&lt;p&gt;The traditional objection is that timelines are expensive to make and worse to maintain —
true for spreadsheets, true for heavyweight PM suites, and the reason half the plans that
&lt;em&gt;should&lt;/em&gt; be charts live in someone&apos;s head instead. It&apos;s also the specific gap
&lt;a href=&quot;https://ganttchart.ai&quot;&gt;ganttchart.ai&lt;/a&gt; was built for: describe the plan in plain English —
the same sentence you&apos;d say in the meeting — and get back a real chart with tasks,
&lt;a href=&quot;https://trolls.dev/glossary/duration&quot;&gt;durations&lt;/a&gt;, dependencies, and milestones, editable by dragging and
shareable as a link, no accounts needed on either end. The ten-minute version of that
process, including the paragraph-writing trick that makes the chart draw itself, is in
&lt;a href=&quot;https://trolls.dev/notes/how-to-turn-a-plan-into-a-gantt-chart&quot;&gt;our step-by-step guide&lt;/a&gt;, five finished charts
with their prompts are in &lt;a href=&quot;https://trolls.dev/gantt-chart-examples&quot;&gt;the worked examples&lt;/a&gt;, and the story of why
we built the tool at all is in &lt;a href=&quot;https://trolls.dev/work/ganttchart-ai&quot;&gt;the case study&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And if you landed on &quot;board&quot; or &quot;list&quot; — genuinely, use the board or the list. A timeline
you don&apos;t need is just a prettier way to be behind schedule. The best shape for a plan is
the one your team still believes in three weeks after you drew it.&lt;/p&gt;
</content:encoded><category>Guides</category><category>ganttchart.ai</category></item><item><title>How to turn a plain-English plan into a Gantt chart</title><link>https://trolls.dev/notes/how-to-turn-a-plan-into-a-gantt-chart/</link><guid isPermaLink="true">https://trolls.dev/notes/how-to-turn-a-plan-into-a-gantt-chart/</guid><description>A practical guide to going from &apos;here&apos;s roughly what we&apos;re doing&apos; to a timeline people can actually follow — the four things every plan needs, how to write them down, and the fastest ways to get the chart made.</description><pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every project plan starts the same way: as a few sentences. &quot;We&apos;re launching the new site in
six weeks — design first, then build, content can overlap with build, and we need a week of
QA before go-live.&quot; That&apos;s a real plan. It has phases, an order, a deadline. What it doesn&apos;t
have is a shape anyone can point at in a meeting.&lt;/p&gt;
&lt;p&gt;A Gantt chart is that shape — bars on a calendar, one per task, arranged so you can see what
happens when and what&apos;s waiting on what. Getting from the sentences to the chart is the part
most people dread, and it&apos;s why so many plans stay trapped in someone&apos;s head. It doesn&apos;t have
to be painful. Here&apos;s the whole process, whichever tool you end up using. (Not sure a
timeline is even the right shape for your plan? &lt;a href=&quot;https://trolls.dev/notes/gantt-chart-kanban-or-todo-list&quot;&gt;Start here&lt;/a&gt; —
it&apos;s one question.)&lt;/p&gt;
&lt;h2&gt;The four things every timeline needs&lt;/h2&gt;
&lt;p&gt;However you make the chart, it&apos;s built from the same four ingredients. If your plain-English
description contains them, the chart almost draws itself:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://trolls.dev/glossary/task&quot;&gt;Tasks&lt;/a&gt;&lt;/strong&gt; — the chunks of work, named the way your team actually talks
about them. &quot;Design,&quot; &quot;Build,&quot; &quot;Taste-testing photos.&quot; Five to twelve is the sweet spot;
past twenty you&apos;re writing a to-do list, not a timeline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://trolls.dev/glossary/duration&quot;&gt;Durations&lt;/a&gt;&lt;/strong&gt; — how long each chunk takes. Rough is fine. &quot;About two
weeks&quot; beats a falsely precise &quot;11.5 days&quot; that nobody believes anyway.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://trolls.dev/glossary/dependency&quot;&gt;Dependencies&lt;/a&gt;&lt;/strong&gt; — what can&apos;t start until something else finishes.
This is the ingredient people skip, and it&apos;s the one that makes a chart worth reading.
&quot;Build starts when design is done. Photos can happen during build.&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://trolls.dev/glossary/milestone&quot;&gt;Milestones&lt;/a&gt;&lt;/strong&gt; — the moments that matter to people outside the work:
the launch, the review, the handoff. A milestone is a diamond on the chart and a date in an
email.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Notice that all four fit comfortably in spoken English. You already say things like this out
loud. The whole trick of planning is writing down what you&apos;d say. (And when someone in the
room reaches for the certified vocabulary — critical path, slack, finish-to-start — the
&lt;a href=&quot;https://trolls.dev/glossary&quot;&gt;plain-English glossary&lt;/a&gt; translates.)&lt;/p&gt;
&lt;h2&gt;Write the paragraph first&lt;/h2&gt;
&lt;p&gt;Before you open any tool, write your plan as one short paragraph. Not bullet points — a
paragraph, with the ordering words left in: &lt;em&gt;first&lt;/em&gt;, &lt;em&gt;then&lt;/em&gt;, &lt;em&gt;while&lt;/em&gt;, &lt;em&gt;once&lt;/em&gt;, &lt;em&gt;by&lt;/em&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;First two weeks: design. Then three weeks of build — content writing can overlap with the
second half of build. Once build and content are both done, one week of QA. Launch by
March 28.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Those ordering words &lt;em&gt;are&lt;/em&gt; your dependencies. &quot;Then&quot; is a finish-to-start link. &quot;While&quot; and
&quot;overlap&quot; are parallel tracks. &quot;Once X and Y are done&quot; is a merge. &quot;By March 28&quot; is a
milestone with a deadline. A paragraph like this is a complete project plan in about fifty
words — everything after this step is just rendering.&lt;/p&gt;
&lt;h2&gt;Three ways to render it&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The spreadsheet way.&lt;/strong&gt; List tasks down column A, dates across row 1, and fill cells to make
bars. It works, and everyone&apos;s done it once. The problem shows up on Tuesday when the design
phase slips two days and you&apos;re re-coloring forty cells by hand. Spreadsheets store the
&lt;em&gt;picture&lt;/em&gt; of a plan, not the plan — they don&apos;t know your bars are connected. (If the
spreadsheet is where your team lives anyway, we wrote &lt;a href=&quot;https://trolls.dev/gantt-chart-google-sheets&quot;&gt;the honest guide to Gantt charts in
Google Sheets&lt;/a&gt; — three methods, exact formulas, and the limits.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The project-management-suite way.&lt;/strong&gt; Heavyweight PM tools make excellent Gantt charts and
will happily manage resources, budgets, and burndown too. If you run a twenty-person program,
that&apos;s your answer. If you need a timeline for a six-week project, you&apos;ll spend more time
setting up the tool than doing the plan — and everyone you share it with needs an account and
a tutorial.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The plain-English way.&lt;/strong&gt; This is the gap &lt;a href=&quot;https://ganttchart.ai&quot;&gt;ganttchart.ai&lt;/a&gt; exists to
fill: paste in the paragraph you wrote above and it comes back as a real chart — tasks,
durations, dependencies, and milestones on a proper timeline, in seconds. The AI writes the
first draft; you stay the editor. Drag what it got wrong, rename what it guessed at, and share
the result as a link with no accounts on either end. We built it because we kept writing that
paragraph and resenting every tool that made us re-type it as form fields. (The full story is
in &lt;a href=&quot;https://trolls.dev/work/ganttchart-ai&quot;&gt;the case study&lt;/a&gt;.)&lt;/p&gt;
&lt;h2&gt;The mistakes that sink timelines&lt;/h2&gt;
&lt;p&gt;We&apos;ve drawn a lot of these charts, for our own projects and everyone else&apos;s. The failures are
predictable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No dependencies.&lt;/strong&gt; A chart where every bar starts on day one isn&apos;t a plan, it&apos;s a wish.
If nothing on your chart is waiting on anything else, you haven&apos;t finished thinking.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Too many tasks.&lt;/strong&gt; The chart is for the room, not the worker. &quot;Design&quot; is one bar even if
it&apos;s forty tickets. Detail lives in your issue tracker; the timeline earns its keep by
being readable at a glance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No slack.&lt;/strong&gt; If the plan only works when nothing slips, the plan doesn&apos;t work. Give the
bars room to breathe — or at least put the milestone a week after the last bar ends and
don&apos;t tell anyone why.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Treating the first draft as final.&lt;/strong&gt; A timeline is a conversation starter. The moment it
meets reality it will be wrong somewhere; the question is whether your tooling makes the
correction cost thirty seconds or thirty minutes. Cheap edits are the difference between a
chart people update and a chart people quietly stop believing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Ten minutes, start to finish&lt;/h2&gt;
&lt;p&gt;That&apos;s genuinely the budget. Write the paragraph (three minutes — you already know the plan).
Render it (seconds, if the tool meets you where the plan already is). Adjust the two bars the
first draft got wrong (two minutes). Share the link. You still have five minutes before the
meeting — which, &lt;a href=&quot;https://trolls.dev/notes/the-ten-minutes-before-the-meeting&quot;&gt;not coincidentally&lt;/a&gt;, is exactly
the moment we designed for.&lt;/p&gt;
&lt;p&gt;If you&apos;d rather start from a finished chart than a blank page, we keep
&lt;a href=&quot;https://trolls.dev/gantt-chart-examples&quot;&gt;five worked Gantt chart examples&lt;/a&gt; — a website launch, a product
launch, an app MVP, a house move, and a meetup — each with the exact prompt that generates it.&lt;/p&gt;
</content:encoded><category>Guides</category><category>ganttchart.ai</category></item><item><title>In defense of small software</title><link>https://trolls.dev/notes/in-defense-of-small-software/</link><guid isPermaLink="true">https://trolls.dev/notes/in-defense-of-small-software/</guid><description>Big software promises everything and demands your whole workflow in return. We think there&apos;s a better trade: tools that do one thing, respect your attention, and get out of the way.</description><pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Somewhere along the way, software got ambitious on our behalf. You go looking for a way to
make a timeline and come back with a &quot;work operating system.&quot; You want to read the news and
end up with an app that wants to be your homepage, your inbox, and your social network. Every
tool is a land grab now; every product wants to be the place where you live.&lt;/p&gt;
&lt;p&gt;We think there&apos;s an honest alternative, and it&apos;s the reason this studio exists: software that
is deliberately, proudly small.&lt;/p&gt;
&lt;h2&gt;Small is a feature&lt;/h2&gt;
&lt;p&gt;Small software does one job. Because it does one job, you can learn it in a minute, trust it
completely, and forget about it the moment the job is done. That last part matters more than
the industry likes to admit — the best tools are the ones you spend the &lt;em&gt;least&lt;/em&gt; time
in, not the most.&lt;/p&gt;
&lt;p&gt;Big software can&apos;t afford to think this way. When a product&apos;s success is measured in daily
active minutes, &quot;get in, get out&quot; is a bug, not a feature. So the tour gets longer, the
notifications get chattier, and the one thing you came for gets buried under twelve things
you didn&apos;t.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A tool should be judged by how quickly it lets you leave with what you came for.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;What small looks like in practice&lt;/h2&gt;
&lt;p&gt;Our two products are both answers to the same question: what&apos;s the least software that
completely solves this?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://trolls.dev/work/ganttchart-ai&quot;&gt;ganttchart.ai&lt;/a&gt; exists because making a timeline shouldn&apos;t
require learning a project-management suite. You describe the project in plain English; you
get a chart you can edit and share. There&apos;s no workspace to configure, no team to onboard, no
methodology to adopt. The whole product fits in the gap between &quot;I need a plan&quot; and &quot;here&apos;s
the plan.&quot;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://trolls.dev/work/dreader&quot;&gt;DReader&lt;/a&gt; exists because reading headlines shouldn&apos;t cost you a
gauntlet of ads and layout shift. It&apos;s a reader. It shows you the headlines, readably, fast.
That&apos;s the entire pitch, and we consider the shortness of the pitch a point of pride.&lt;/p&gt;
&lt;h2&gt;The economics of staying small&lt;/h2&gt;
&lt;p&gt;Here&apos;s the part that makes it work: we&apos;re a tiny studio with no outside investors. Nobody
needs us to triple engagement or invent a platform story. A product that quietly does its job
for the people who need it is, for us, a complete success — not a stepping stone to some
larger ambition.&lt;/p&gt;
&lt;p&gt;That freedom cuts the other way too. Because we run everything we ship, every feature we add
is a feature we&apos;re on the hook for at 3 a.m. Small isn&apos;t just a design philosophy; it&apos;s how a
small crew keeps its promises. Scope we don&apos;t add is scope that can&apos;t break.&lt;/p&gt;
&lt;h2&gt;An old idea, honestly&lt;/h2&gt;
&lt;p&gt;None of this is new. &quot;Do one thing well&quot; is older than most of the software industry. We&apos;re
just applying it in an era that has largely talked itself out of it — and finding, again and
again, that when you hand someone a tool that respects their time, does its job, and asks for
nothing else, they notice.&lt;/p&gt;
&lt;p&gt;Small, useful software, built through the night. It&apos;s not a compromise. It&apos;s the point.&lt;/p&gt;
</content:encoded><category>Studio</category><category>Philosophy</category></item><item><title>The fastest page is the one that&apos;s already there</title><link>https://trolls.dev/notes/the-fastest-page-is-already-there/</link><guid isPermaLink="true">https://trolls.dev/notes/the-fastest-page-is-already-there/</guid><description>Our homepage used to hide its own headline behind 312KB of JavaScript. We rebuilt it to ship zero client-side JS — same animations, same design, visible before any script runs. Here&apos;s how, and why a tiny studio cares.</description><pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We preach small software, so it was awkward to notice that our own homepage had quietly become
the opposite. The page looked light — a headline, two product cards, some cartoon trolls — but
under the hood it was shipping 312KB of JavaScript, and the very first thing that JavaScript
did was &lt;em&gt;reveal the page&lt;/em&gt;. Until it loaded, parsed, and ran, the headline sat in the
HTML at &lt;code&gt;opacity: 0&lt;/code&gt;. Twenty-three elements, including the biggest one on the
screen, invisible by default.&lt;/p&gt;
&lt;p&gt;Turn off JavaScript and our homepage was a beige void with a navigation bar. On a slow
connection it was that same void, just temporarily. We had built a fast static site and then
hidden it behind the slowest thing on the page.&lt;/p&gt;
&lt;h2&gt;How sites end up like this&lt;/h2&gt;
&lt;p&gt;Nobody decides to hide their headline. It happens one reasonable choice at a time. You want a
little polish, so you reach for an animation library. The library animates things &lt;em&gt;in&lt;/em&gt;,
which means everything starts &lt;em&gt;out&lt;/em&gt; — opacity zero, twenty pixels low. The animation
runs in JavaScript, so the starting state ships in the HTML and the finished state only exists
after hydration. Each section copies the pattern from the last one. Every individual step made
sense; the sum was a page that didn&apos;t exist until the framework said so.&lt;/p&gt;
&lt;p&gt;The cost isn&apos;t hypothetical. The headline is the page&apos;s largest paint, the thing performance
tools measure everything by. Search crawlers that don&apos;t run scripts saw the void. Readers on
hotel Wi-Fi saw it too, for seconds at a time. And all of it bought us nothing — the finished
page looked identical to one that could have just… been there.&lt;/p&gt;
&lt;h2&gt;The rebuild: same motion, no dependency&lt;/h2&gt;
&lt;p&gt;So we rebuilt the homepage with one rule: &lt;strong&gt;the finished page is the default, and motion
is a courtesy on top.&lt;/strong&gt; Everything else followed from that.&lt;/p&gt;
&lt;p&gt;The hero&apos;s staggered entrance is now pure CSS — a keyframe and four animation delays. The
scroll reveals further down the page are driven by about twenty lines of inline script and an
&lt;code&gt;IntersectionObserver&lt;/code&gt;. Crucially, the &quot;hidden&quot; starting states only apply when a
tiny inline script has flagged that JavaScript is actually running. No script, no hiding:
crawlers, readers with scripts disabled, and anyone who prefers reduced motion get the complete
page in the raw HTML. The little Gantt chart still draws its bars when it scrolls into view;
the trolls still wiggle when you poke them. The contact form is a plain HTML form that posts
without JavaScript and gets politely upgraded when it&apos;s available.&lt;/p&gt;
&lt;p&gt;Client-side JavaScript on the homepage after the rebuild: zero bytes. Not &quot;less.&quot; Zero. The
animation library, the UI framework, the hydration step — all of it turned out to be
scaffolding we could take down once we asked what the page actually needed.&lt;/p&gt;
&lt;h2&gt;What we gave up&lt;/h2&gt;
&lt;p&gt;Honestly? Almost nothing. The one real trade is that the CSS animations are simpler than the
physics-based ones the library offered — an ease-out curve instead of a spring. We looked at
the two side by side and couldn&apos;t defend the difference costing what it cost. If a future
feature genuinely needs client-side state, we&apos;ll pay for JavaScript where it earns its keep,
on that feature, and nowhere else.&lt;/p&gt;
&lt;h2&gt;Why a two-product studio bothers&lt;/h2&gt;
&lt;p&gt;This is the same argument we make in &lt;a href=&quot;https://trolls.dev/notes/in-defense-of-small-software&quot;&gt;defense of small software&lt;/a&gt;,
pointed at ourselves. A tool should be judged by how quickly it lets you leave with what you
came for — and for a studio homepage, what you came for is to find out what we make and whether
we&apos;re any good. Every kilobyte between you and that answer is scope we added for us, not for you.&lt;/p&gt;
&lt;p&gt;The fastest page isn&apos;t the one with the cleverest loading strategy. It&apos;s the one that&apos;s
already there when you arrive.&lt;/p&gt;
</content:encoded><category>Engineering</category><category>This site</category></item><item><title>The ten minutes before the meeting</title><link>https://trolls.dev/notes/the-ten-minutes-before-the-meeting/</link><guid isPermaLink="true">https://trolls.dev/notes/the-ten-minutes-before-the-meeting/</guid><description>Most tools are designed for the hours you spend in them. ganttchart.ai is designed for the ten minutes before a meeting — and picking one moment to serve changed every decision we made.</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every product has a moment it&apos;s really for. Not a persona, not a market segment — a moment.
A specific point in someone&apos;s day when they reach for your tool because something needs to
happen &lt;em&gt;right now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;For &lt;a href=&quot;https://trolls.dev/work/ganttchart-ai&quot;&gt;ganttchart.ai&lt;/a&gt;, that moment is the ten minutes before a
meeting. You&apos;re about to walk into a room (or a call) and someone is going to ask, &quot;so what&apos;s
the plan?&quot; You have the plan — it&apos;s in your head, in plain English, maybe in a few bullet
points. What you don&apos;t have is the picture. And the meeting starts at half past.&lt;/p&gt;
&lt;p&gt;Once we named that moment, every design decision got easier. Here&apos;s what designing for ten
minutes actually did to the product.&lt;/p&gt;
&lt;h2&gt;It set the input&lt;/h2&gt;
&lt;p&gt;With ten minutes on the clock, nobody is going to fill in a form with start dates, durations,
and dependency dropdowns. The only input fast enough is the one you already have: the
sentence in your head. So the input is a sentence. &quot;Launch the bakery website in six weeks:
design, build, taste-testing photos, then go live.&quot; That&apos;s a complete, valid project
description.&lt;/p&gt;
&lt;h2&gt;It killed the account wall&lt;/h2&gt;
&lt;p&gt;Sign-up flows are where ten-minute tasks go to die. Verify your email, pick a workspace name,
invite your team — the meeting is over before the onboarding is. So the chart comes first.
You should be looking at a usable timeline before most tools would have finished asking who
referred you.&lt;/p&gt;
&lt;h2&gt;It decided what &quot;done&quot; means&lt;/h2&gt;
&lt;p&gt;A tool for the ten-minute moment doesn&apos;t need to be where the project &lt;em&gt;lives&lt;/em&gt;. It
needs to produce a thing you can walk into the room with: a chart that looks credible on a
shared screen and travels as a link. Editable, because the AI&apos;s first draft is a draft.
Shareable by URL, because &quot;let me email you the file&quot; is another ten minutes you don&apos;t have.&lt;/p&gt;
&lt;h2&gt;It made drafts disposable&lt;/h2&gt;
&lt;p&gt;Here&apos;s the second-order effect we didn&apos;t fully anticipate: when a chart costs seconds instead
of an afternoon, people stop treating plans as precious. They generate a version, hate it,
say so out loud, and generate another. The plan improves because iterating is cheaper than
defending. Slow tools make people commit to their first idea; fast tools let them argue with
it.&lt;/p&gt;
&lt;h2&gt;The general lesson&lt;/h2&gt;
&lt;p&gt;&quot;Who is this for?&quot; is a good question. &quot;When is this for?&quot; turned out to be a better one —
it&apos;s much harder to hand-wave. A moment has a clock on it, and the clock makes the trade-offs
for you: what to build, what to cut, and what &quot;fast enough&quot; actually means.&lt;/p&gt;
&lt;p&gt;Find the ten minutes your product is for, and design for the clock.&lt;/p&gt;
</content:encoded><category>Design</category><category>ganttchart.ai</category></item><item><title>Why we only build what we run</title><link>https://trolls.dev/notes/why-we-only-build-what-we-run/</link><guid isPermaLink="true">https://trolls.dev/notes/why-we-only-build-what-we-run/</guid><description>No client work, no handoffs, no &apos;v1 and vanish.&apos; Everything we ship, we operate — and that single constraint shapes how we plan, build, and support our products.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;trolls.dev has one rule that shapes everything else: we only build products we run ourselves.
No client work, no agency projects, no &quot;ship v1 and hand over the keys.&quot; If it has our name
on it, we&apos;re the ones carrying the pager.&lt;/p&gt;
&lt;p&gt;This sounds like a business-model choice. It&apos;s really a quality mechanism.&lt;/p&gt;
&lt;h2&gt;Handoffs hide the truth&lt;/h2&gt;
&lt;p&gt;When you build software for someone else, the project has a finish line: the handoff. And
finish lines change behavior. Corners that won&apos;t be visible at delivery get cut. Edge cases
become &quot;known issues.&quot; The demo path gets polished while the paths real users take on a
Tuesday get whatever time is left.&lt;/p&gt;
&lt;p&gt;None of this requires bad intentions — it&apos;s just what happens when the people who build a
thing will never have to live with it. The feedback loop is severed exactly where it matters
most: after real users show up.&lt;/p&gt;
&lt;h2&gt;Operating is where the learning is&lt;/h2&gt;
&lt;p&gt;Running a product teaches you things no spec review ever will. Which features people actually
touch. Which &quot;quick&quot; flows have a step everyone stumbles on. What breaks when a link gets
shared somewhere unexpected. The emails from real users — we read every one — are worth more
than any amount of upfront research, but you only get them if you stick around after launch.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A launch isn&apos;t the end of the project. It&apos;s the start of the part where you find out if you
were right.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;It forces honest scope&lt;/h2&gt;
&lt;p&gt;Knowing we&apos;ll operate whatever we ship is the best scope-control mechanism we&apos;ve found. Every
feature is a permanent commitment: something to monitor, patch, explain, and keep working for
as long as the product lives. That math makes you ruthless about what earns its way in — and
it&apos;s a big part of why our products stay &lt;a href=&quot;https://trolls.dev/notes/in-defense-of-small-software&quot;&gt;small on purpose&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Long-haul software&lt;/h2&gt;
&lt;p&gt;The quiet crisis in consumer software is trust: tools get acquired, redesigned into ad
platforms, or abandoned. The fix isn&apos;t a promise on a landing page — it&apos;s an incentive
structure. Ours is simple: we&apos;re tiny, we&apos;re not chasing a flip, and our products are things
we wanted for ourselves. &lt;a href=&quot;https://trolls.dev/work/dreader&quot;&gt;DReader&lt;/a&gt; stays ad-free because we&apos;re its
heaviest users. &lt;a href=&quot;https://trolls.dev/work/ganttchart-ai&quot;&gt;ganttchart.ai&lt;/a&gt; stays fast and simple because
we make our own timelines with it.&lt;/p&gt;
&lt;p&gt;Build only what you run, and you can&apos;t help but build things meant to last. It&apos;s a small
rule. Like everything else around here, that&apos;s the point.&lt;/p&gt;
</content:encoded><category>Studio</category><category>Process</category></item></channel></rss>