<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Michael Amachree</title>
    <description>The latest articles on DEV Community by Michael Amachree (@dev_michael).</description>
    <link>https://dev.to/dev_michael</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F595000%2Fed5ecff4-53c2-4e77-b328-c4e0709b4657.jpg</url>
      <title>DEV Community: Michael Amachree</title>
      <link>https://dev.to/dev_michael</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dev_michael"/>
    <language>en</language>
    <item>
      <title>The Seven Fools</title>
      <dc:creator>Michael Amachree</dc:creator>
      <pubDate>Wed, 04 Nov 2026 06:08:44 +0000</pubDate>
      <link>https://dev.to/dev_michael/the-seven-fools-1d7k</link>
      <guid>https://dev.to/dev_michael/the-seven-fools-1d7k</guid>
      <description>&lt;p&gt;&lt;em&gt;A story in seven statements, taken at the port of Antwerp.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Prologue: The Tin
&lt;/h2&gt;

&lt;p&gt;My job is to take samples.&lt;/p&gt;

&lt;p&gt;A grab from each lot, sealed, labelled, logged. Copper cathode, cobalt hydroxide, tin concentrate, cocoa, coffee, coltan, lithium carbonate. I wear a white coat and a badge and steel-toed boots, and I walk the quay at six in the morning with a clipboard, and I take a little of everything.&lt;/p&gt;

&lt;p&gt;The tin is a tobacco tin. It lives in my coat pocket. It has a dent in the lid from when I dropped it on the ramp at berth 869.&lt;/p&gt;

&lt;p&gt;Inside the tin is a hand.&lt;/p&gt;

&lt;p&gt;It is a right hand, dried, small. The wrist is bound with a twist of raffia. The fingers are curled the way fingers curl when a man dies holding something, or when a boy dies holding nothing. The nails are still on it. The palm is the colour of a walnut shell and hard as a shoe sole.&lt;/p&gt;

&lt;p&gt;I have carried it for eleven years. It is not a sample of anything. It is the only object in this port that has never been weighed.&lt;/p&gt;

&lt;p&gt;The audit starts at eight. Seven statements, one per continent, in the order the money moved. I have been told to be thorough and to be brief and to keep it to the material facts.&lt;/p&gt;

&lt;p&gt;The material facts are these. Six of the seven came to give evidence against a system that has already won. The seventh is the one nobody came for.&lt;/p&gt;

&lt;p&gt;They are all fools, and so am I, because we all came.&lt;/p&gt;




&lt;h2&gt;
  
  
  I. Tomás
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Potosí, 1545
&lt;/h3&gt;

&lt;p&gt;He is first because silver is first. Everything after is a copy of this.&lt;/p&gt;

&lt;p&gt;He is sixty-one and his lungs are sixty-one and something else. He sits with his hands flat on the table, which is what men do when they have spent their lives standing up in the dark.&lt;/p&gt;

&lt;p&gt;"I brought ore," he says. He puts a lump on the table. Grey, with a green bloom on it. "From the level my grandson works. Four hundred and eighty metres down. It is a good piece. It has silver in it. You can see it."&lt;/p&gt;

&lt;p&gt;I weigh it. Two hundred and eleven grams. I log it.&lt;/p&gt;

&lt;p&gt;"Say the rest," I say.&lt;/p&gt;

&lt;p&gt;"There is a mountain called the Cerro Rico. Rich Hill. In 1545 a man named Diego Huallpa was chasing an escaped llama up it and lit a fire and the fire melted lead out of the rock. That is the story. It is probably not true. What is true is that by 1600 the Spanish had taken more silver out of that hill than existed in the rest of the world put together, and the hill was still there, and it is still there, and it is now a sieve."&lt;/p&gt;

&lt;p&gt;He stops. He is not a man who talks easily.&lt;/p&gt;

&lt;p&gt;"Potosí was bigger than Paris," he says. "In 1611. Thirty-six churches. Salons. A poet wrote that the whole world was a stage and Potosí was the gallery. There was a mint that stamped coins for three continents. There was a man who paid for a cathedral out of one seam."&lt;/p&gt;

&lt;p&gt;"And the men in the mine."&lt;/p&gt;

&lt;p&gt;"The mita. From 1573. One man in seven, from sixteen provinces, thirteen and a half thousand a year. Four months a shift. They walked a thousand kilometres to get here and most of them did not come back and the ones who did were not the same. Four thousand five hundred in the shafts at any one time. They carried the ore up on their backs in baskets, up ladders of hide, a hundred and forty metres, in the dark, with a candle. The mouth of the mine was called the mouth of hell and the men who went in were given a week to confess."&lt;/p&gt;

&lt;p&gt;He turns his hands over. The palms are pale and hard.&lt;/p&gt;

&lt;p&gt;"My grandfather's grandfather was drafted from Chayanta. He was in the mine for nine years. He came out at thirty-four and he could not straighten up and he died at forty-one. His brother did not come out. There is no record of the brother. There is a book in the archive with the names of the drafted and the brother is in it and after his name there is a word and the word means gone."&lt;/p&gt;

&lt;p&gt;"Eight million dead," I say. "That is the figure people use."&lt;/p&gt;

&lt;p&gt;"It is a guess. Some say eight. Some say more. The Spanish kept good books on the silver and bad books on the men. You can count the ingots. You cannot count the men. That is the whole trick and it is still the trick."&lt;/p&gt;

&lt;p&gt;He is right, and it is worth saying plainly. Between 1545 and 1800 the Cerro Rico produced something on the order of forty thousand tonnes of silver. That number is solid. The number of men who died getting it out is somewhere between one and eight million and nobody will ever know, because the men were not the cargo.&lt;/p&gt;

&lt;p&gt;And the silver did not even stay in Spain. Official registered imports of American silver into Spain across three centuries come to about sixteen thousand tonnes. The rest went unregistered, or east through Manila to China, because the Spanish had nothing the Chinese wanted except the metal itself. Spain got the hole. Spain was bankrupt four times.&lt;/p&gt;

&lt;p&gt;"The mercury came from Huancavelica," he says. "Four hundred kilometres. They used it to pull the silver out of the crushed rock. The men worked the amalgam with their bare feet. The mercury went into them. There is a saying here: Potosí gives silver and takes lives. The hill ate men. That is what they called it. The hill that eats men."&lt;/p&gt;

&lt;p&gt;"And when the drafted men ran out."&lt;/p&gt;

&lt;p&gt;"Then they brought Africans. Hispaniola first, before here. Columbus landed in 1492 and there were maybe a quarter of a million people on that island and by 1514 the Spanish counted twenty-seven thousand and by the 1540s there were none. They worked them to death in the gold streams and then they imported the next set. Twelve and a half million Africans got on the boats. Ten point seven million got off. The difference is the ones who died in the water, about one point eight million of them, and nobody has ever named one."&lt;/p&gt;

&lt;p&gt;He puts his hand on the ore.&lt;/p&gt;

&lt;p&gt;"Now it is tin and zinc and it is lithium under the salt flats at Uyuni and it is the same. The same companies, the same export, the same road out. The mine at level four hundred and eighty is a cooperative now, which means the men own it, which means the men buy their own dynamite and their own carbide lamps and their own lungs. There is no pension. There is no doctor. My grandson is twenty-six and he coughs in the morning like a man of fifty."&lt;/p&gt;

&lt;p&gt;He looks at the tin in my pocket. He has not asked about it. He knows what is in it.&lt;/p&gt;

&lt;p&gt;"Bolivia is the poorest country in South America," he says. "And it is sitting on a mountain of silver. Four hundred and eighty years. Explain that to me and I will sign your paper."&lt;/p&gt;

&lt;p&gt;I write: &lt;em&gt;Witness states the mountain is not empty. Witness states the country is.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  II. Rukmini
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dacca, 1757
&lt;/h3&gt;

&lt;p&gt;She is second because cloth is second. Cloth is the first thing Europe learned to want from Asia and the first thing it learned to ruin.&lt;/p&gt;

&lt;p&gt;She is seventy-four and she has brought a length of muslin in a paper bag. She unfolds it on the table. It is a metre and a half of something so fine it is nearly a vapour. You can read through it. You can pull the whole thing through a finger ring.&lt;/p&gt;

&lt;p&gt;"Dacca muslin," she says. "My great-great-grandmother wove this. It has been in a trunk. It is called &lt;em&gt;abrawan&lt;/em&gt;, running water. There were grades. &lt;em&gt;Shabnam&lt;/em&gt;, evening dew. &lt;em&gt;Baft-hawa&lt;/em&gt;, woven air. A full piece of the finest was twenty yards by one and weighed under three ounces. The British put a tariff on it of seventy-five per cent and then a hundred and fifty per cent and then they cut the thumbs off the weavers."&lt;/p&gt;

&lt;p&gt;"Both thumbs?"&lt;/p&gt;

&lt;p&gt;"The story is that the Company's agents crippled the weavers so they could not weave for anyone else. It is a good story. It is probably partly true. What is certainly true is that a weaver in Dacca in 1750 earned more than a weaver in Lancashire and by 1830 he was a beggar and by 1850 the craft was gone and the looms were firewood."&lt;/p&gt;

&lt;p&gt;She folds the muslin back into the bag with great care.&lt;/p&gt;

&lt;p&gt;"In 1757 the Company won at Plassey. It was not a battle, it was a bribe with some shooting at the end. In 1765 it took the &lt;em&gt;diwani&lt;/em&gt;, the right to collect the revenue of Bengal, Bihar and Orissa. After that the Company was the government of Bengal and the government of Bengal was a trading company with a dividend to pay and it paid the dividend out of the land."&lt;/p&gt;

&lt;p&gt;"The famine."&lt;/p&gt;

&lt;p&gt;"1769 the rains failed. 1770 the rice failed. The Company had raised the land revenue the year before, in cash, and it collected it in cash, in the famine, from people who had no cash, so they sold the seed grain and then the plough and then the children. The Company's own servants bought rice at the gates of the districts where people were dying and held it and sold it back at three times. Warren Hastings wrote in a minute that the famine was severe and that the revenue had nevertheless been kept up. He was proud of it. He had a right to be. It was a magnificent piece of bookkeeping."&lt;/p&gt;

&lt;p&gt;"How many died."&lt;/p&gt;

&lt;p&gt;"Ten million is the figure. A third of Bengal. The estimates run from one million to ten and the ten is the one that stuck. It is a guess, again, because nobody counted the dead, they only counted the revenue, and the revenue was fine."&lt;/p&gt;

&lt;p&gt;She is quiet for a moment.&lt;/p&gt;

&lt;p&gt;"Then in 1793 Cornwallis fixed the land revenue in perpetuity with the zamindars and made them landlords and made everyone under them a tenant, and that is the shape of rural Bengal to this day. Then in 1943 it happened again. Two million. Same province, same river, same delta. This time the rice went to the army in Ceylon and the Middle East and forty-six thousand boats were taken away so the Japanese would not get them, and the price doubled, and the &lt;em&gt;kharif&lt;/em&gt; crop was fine that year, the crop was fine, there was rice, it was just in the wrong place and the wrong hands. Amery in the War Cabinet wrote in his diary that Churchill said famine or no famine the Indians would breed like rabbits. The quote is disputed. The policy is not."&lt;/p&gt;

&lt;p&gt;She puts her hand flat on the paper bag.&lt;/p&gt;

&lt;p&gt;"Between 1750 and 1900 India went from a quarter of the world's manufacturing to under two per cent. A quarter to under two. That is not a natural decline. That is a policy. The Company's own weavers were forbidden to sell to anyone but the Company. The Company's ships carried the goods and charged the freight. The Company's courts enforced the Company's contracts. When the Company was finally abolished in 1858 the Crown took over the same machine and ran it for ninety more years and called it the Raj."&lt;/p&gt;

&lt;p&gt;"And the drain."&lt;/p&gt;

&lt;p&gt;"Naoroji put it at twelve million pounds a year. He called it the drain and he was right, it was a drain, it was money going out and nothing coming back. Home charges. Pensions for Englishmen who had worked here. Interest on debt the Company had run up conquering the place. He wrote a book about it in 1901 and the British said he was exaggerating and he was not exaggerating, he was understating, and he was called an agitator for saying it out loud."&lt;/p&gt;

&lt;p&gt;She looks at me.&lt;/p&gt;

&lt;p&gt;"You want me to say the Empire built the railways. It did. It built them to the ports and it built them to a gauge nobody else used so the rolling stock had to come from Birmingham. It built the telegraph to move orders. It built the schools to make clerks. It built everything it needed and it charged India for all of it, and when it left, it left the debt."&lt;/p&gt;

&lt;p&gt;"Partition," I say.&lt;/p&gt;

&lt;p&gt;"Fourteen million people moved. A million died, maybe two. It was done in ten weeks by a man who had never been to India and drew the line with a London lawyer who had never been to India either, and neither of them had a map with the villages on it. My mother's family walked from Calcutta side to Dacca side. She was nine. She carried a brass pot. She never ate from it again."&lt;/p&gt;

&lt;p&gt;She taps the bag.&lt;/p&gt;

&lt;p&gt;"Twenty yards of muslin. Under three ounces. You could not make it now. The thread was spun in a room with the windows shut and the floor wet so the air was heavy and the thread would not break. It took a family four months. It sold for a fortune and the family kept a fraction of the fortune and the fraction got smaller every year until it was nothing."&lt;/p&gt;

&lt;p&gt;"And the other half of Asia."&lt;/p&gt;

&lt;p&gt;She almost smiles.&lt;/p&gt;

&lt;p&gt;"You mean China. You want to know how the Company paid for the tea. It paid with opium. It grew the opium in Bengal and it sold it in Canton and the Chinese paid silver for it and the silver came back to Calcutta and the tea came to London. When the Chinese tried to stop it, in 1839, Lin Zexu dumped twenty thousand chests in a ditch at Humen, and the British went to war over a cargo of drugs. They took Hong Kong and they made China pay twenty-one million silver dollars for the privilege, six million of it compensation for the opium they had destroyed. Then they did it again in 1856 and burned the Summer Palace and made them pay again. Then in 1901 they made them pay four hundred and fifty million taels, which with interest came to nine hundred and eighty-two million, and the United States took seven per cent of it and later gave some back as scholarships, and is still congratulated for the generosity."&lt;/p&gt;

&lt;p&gt;She folds her hands.&lt;/p&gt;

&lt;p&gt;"Same Company. Same century. Same ledger. One country was the machinery and the other was the market and both of them ended up paying."&lt;/p&gt;

&lt;p&gt;I write: &lt;em&gt;Witness states the cloth is finer than anything the port can make. Witness states the trade that made it is extinct.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  III. Mwamba
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Boma, 1885
&lt;/h3&gt;

&lt;p&gt;She is third because rubber is third, and because she has the hand.&lt;/p&gt;

&lt;p&gt;She is fifty-two. She puts a canvas satchel on the table and takes out a bundle of newspaper and unwraps it and sets the hand down in front of me, and then she sits back and waits for me to say something.&lt;/p&gt;

&lt;p&gt;I have carried this hand for eleven years and I have never once been able to say anything.&lt;/p&gt;

&lt;p&gt;"Right hand," she says. "Male. About fourteen. My great-grandfather's brother. The hand was smoked and it came down through the family and it came to me and now it comes to you."&lt;/p&gt;

&lt;p&gt;"Which village."&lt;/p&gt;

&lt;p&gt;"Near Lusanga. It was called Leverville then. It is called Lusanga now. The name went back and forth with the owners."&lt;/p&gt;

&lt;p&gt;She takes a breath.&lt;/p&gt;

&lt;p&gt;"In November 1884 a man called Bismarck invited fourteen countries to Berlin to divide Africa. There were no Africans in the room. Not one. They sat for three months and they agreed that a power could claim a coast and then have the interior behind it, and that a power had to show it was actually administering the place, and that is all. That is the whole of it. The interior was not mapped. They drew lines through kingdoms nobody in the room could name."&lt;/p&gt;

&lt;p&gt;"Leopold."&lt;/p&gt;

&lt;p&gt;"Leopold the Second, King of the Belgians. He had been trying for years. He got the basin of the Congo as his personal property. Not Belgium's. His. A private estate of two and a third million square kilometres, owned by one man, run for his profit, and he never went there. Not once. In twenty-three years he never set foot in it."&lt;/p&gt;

&lt;p&gt;She turns the hand over.&lt;/p&gt;

&lt;p&gt;"The product was ivory and then it was rubber. Bicycles and then cars. The pneumatic tyre was invented in 1888 and the price of rubber went up and the Congo was full of vines and the vines were full of latex and the latex had to be tapped by hand and the hands had to be made to work."&lt;/p&gt;

&lt;p&gt;"The quota."&lt;/p&gt;

&lt;p&gt;"Each village got a quota in kilos. The sentries were from the Force Publique and they were given cartridges and they had to account for every cartridge, so if a sentry fired at a man and missed he had to prove he had used the bullet, and the proof was a hand. Cut it off and smoke it and bring it in. That is how the hands started. Then it became the punishment for a short quota. Then it became the punishment for anything. Then it became a currency."&lt;/p&gt;

&lt;p&gt;"The chicotte."&lt;/p&gt;

&lt;p&gt;"A whip of dried hippo hide, cut into a spiral, so it has edges. Twenty-five lashes was a common sentence. A hundred was reported often. Two hundred happened. Men were laid face down and their backs were cut to the bone and they were left. The chicotte was legal in the Congo until 1959. Sixty years after the rubber."&lt;/p&gt;

&lt;p&gt;"And the women."&lt;/p&gt;

&lt;p&gt;"That is the part that broke it. They took the women. You take a man's wife and his mother and his daughters and you hold them in a stockade and you tell him the quota and he goes into the forest and he taps and he comes back and if he is short you keep them and if he is very short you bring him a hand. A man will do anything for a woman in a stockade. That is the design. It was designed. It was not chaos, it was a system, and it worked."&lt;/p&gt;

&lt;p&gt;She is speaking faster now.&lt;/p&gt;

&lt;p&gt;"Casement came in 1903. He was a British consul and he went up the river and he wrote a report and the report is a hundred and some pages of the same thing over and over, village after village, and it was published in 1904 and it caused a sensation in London and it changed nothing on the ground for four more years. Morel started the Congo Reform Association. Conan Doyle wrote a book. Mark Twain wrote a pamphlet in the voice of the King. There were lantern slides. There were meetings in Liverpool. It was the first great humanitarian campaign of the modern age and it was run by Englishmen and it was about a Belgian and it worked, eventually, and Belgium annexed the place in 1908 and the quotas stayed."&lt;/p&gt;

&lt;p&gt;"How many died."&lt;/p&gt;

&lt;p&gt;"Hochschild says ten million. Half the population. Some say five. Some say twenty. Sanderson did the demography in 2020 and got one to five and said the low end was most likely. Casement himself said three. The first census the Belgians took, in 1924, found about ten million, and the estimates before the conquest were ten to twenty, so the arithmetic is not hard. But the arithmetic is also soft, because nobody counted, and the people doing the counting were the people who had done it."&lt;/p&gt;

&lt;p&gt;She puts her finger on the hand.&lt;/p&gt;

&lt;p&gt;"Now it is cobalt. Three quarters of the world's cobalt. In your phone and in your car and in the thing that will replace your car. The mines at Kolwezi are open pits and the men go down with a chisel and a sack and they dig by hand and they are paid by the sack and the sacks are bought by the &lt;em&gt;négociants&lt;/em&gt; and the &lt;em&gt;négociants&lt;/em&gt; sell to the Chinese and the Chinese sell to you. The ILO counted two hundred and fifty-five thousand children in mining in this country. Forty thousand of them in cobalt. Nobody is counting now. Nobody has ever counted properly."&lt;/p&gt;

&lt;p&gt;"And the hand."&lt;/p&gt;

&lt;p&gt;"The hand is the only thing in this port that has never been weighed. You have weighed everything else. Weigh the hand."&lt;/p&gt;

&lt;p&gt;I put it on the scale. One hundred and forty grams.&lt;/p&gt;

&lt;p&gt;"That is what a boy's hand weighs," she says. "One hundred and forty grams. Write it down."&lt;/p&gt;

&lt;p&gt;I write: &lt;em&gt;Witness states the hand is a receipt. Witness states the receipt is still being issued.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  IV. Ephraim
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Nauru, 1906
&lt;/h3&gt;

&lt;p&gt;He is fourth because phosphate is fourth, and because Nauru is the cleanest case in the world. It is a whole country, one island, twenty-one square kilometres, and it was taken apart and sold and there is nothing left to argue about.&lt;/p&gt;

&lt;p&gt;He is forty and he is large and he is tired in a way that has nothing to do with sleep.&lt;/p&gt;

&lt;p&gt;"There is a story that a man found a rock and thought it was petrified wood and it was not, it was phosphate, and it was the best phosphate in the world, ninety per cent pure, and it was the entire island. The island is a coral pinnacle. The phosphate is the guano of a million seabirds laid down over a hundred thousand years on the top of it. It is the island's soil. It is the island."&lt;/p&gt;

&lt;p&gt;"Who took it."&lt;/p&gt;

&lt;p&gt;"The Germans first, in 1906, as a colony. Then the Australians, as a mandate, after the war. Then the Japanese, in 1942, and they worked us to the bone and in 1943 they deported twelve hundred of us to Truk, which is a lagoon two thousand kilometres away with no phosphate and not much food, and four hundred and sixty-three of us died there, and the ones who came back came back to an island that had been bombed and was still being dug."&lt;/p&gt;

&lt;p&gt;He puts a piece of rock on the table. It is a coral pinnacle, grey and sharp and full of holes, the shape of a small broken tower.&lt;/p&gt;

&lt;p&gt;"That is what is under the phosphate. When you take the phosphate you leave the pinnacles. They are two to ten metres high and they are razor sharp and nothing grows between them and nothing can walk between them. Eighty per cent of the island is now like that. You cannot build on it, you cannot farm it, you cannot cross it. It looks like the moon with teeth."&lt;/p&gt;

&lt;p&gt;"Independence."&lt;/p&gt;

&lt;p&gt;"1968. Thirty-five million tonnes had gone by then. Australia, New Zealand and Britain had nearly worked out the good deposits and then they handed us the country. That is the timing. That is the whole of the timing. We were the richest country in the world per head for a while after, on what was left. There was a trust fund. There was an airline with five aircraft, there was a shipping line, there was a property portfolio in Melbourne, there was a musical about Leonardo da Vinci that lost seven million dollars, there was a hotel in Sydney. We bought a thousand hectares in Queensland to resettle on. We bought a lease on a building in Melbourne to house the government. We were going to move the whole country."&lt;/p&gt;

&lt;p&gt;"And."&lt;/p&gt;

&lt;p&gt;"And the money went. Some of it was stolen and some of it was just spent and some of it was invested by people who took a fee. The trust fund was worth a billion at its peak and it was worth about thirty million when the auditors finally got to it and now the phosphate is nearly gone and the island is nearly gone and the money is nearly gone and there is nowhere to go because the land in Queensland was sold to pay the debts."&lt;/p&gt;

&lt;p&gt;He turns the rock over.&lt;/p&gt;

&lt;p&gt;"There is a phrase for us. We are a failed state. It is said as if we did it. We had help. The phosphate was mined by a British company under the Germans, by a British company under the Australians, by the Japanese under the Japanese, and by our own commission after independence, and every one of those arrangements had an expert on it who was not Nauruan. The island was the collateral for the whole century and nobody ever asked the collateral what it thought. In 1993 Australia settled our case at the World Court for a hundred and seven million dollars. That is the price. That is what a country costs."&lt;/p&gt;

&lt;p&gt;"Australia still takes the phosphate."&lt;/p&gt;

&lt;p&gt;"Australia takes the phosphate. There is a mine on the island now that is a joint venture and it is still going and it is still taking the top off. And Australia sends its boats here, to the processing centre, and holds people here, and pays us for it, and that is the new phosphate. People. We hold people for Australia. It is the only export we have left that is not a rock."&lt;/p&gt;

&lt;p&gt;He sits back.&lt;/p&gt;

&lt;p&gt;"You want the number. The number is that about eighty per cent of the island is uninhabitable and the highest point is sixty-five metres and the lowest is the old mine floor and the sea is coming up. In fifty years the pinnacles will be under water and the argument will be over."&lt;/p&gt;

&lt;p&gt;I write: &lt;em&gt;Witness states the island was sold by the metre and the metre is gone.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  V. Harlan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Guatemala, 1954
&lt;/h3&gt;

&lt;p&gt;He is fifth because he is the only one of the six who is not a victim, and he knows it, and it makes him talk too much.&lt;/p&gt;

&lt;p&gt;He is fifty-eight, in a good coat, and he has brought a shipping manifest in a plastic sleeve and a share certificate in a cardboard tube.&lt;/p&gt;

&lt;p&gt;"My grandfather was a fruit buyer for the United Fruit Company," he says. "He went down in 1948. He was in Tiquisate. He had a house with a veranda and a boy who brought him his shoes. He came back in 1956 and he never went again and he talked about it for the rest of his life like it was a war he had been in."&lt;/p&gt;

&lt;p&gt;"United Fruit."&lt;/p&gt;

&lt;p&gt;"Five hundred and fifty thousand acres in Guatemala. Forty-two per cent of the arable land. They owned the railway, the port at Puerto Barrios, the telegraph, the electricity, the shipping line, the only road. They were the largest landowner and the largest employer and the largest exporter and they paid almost no tax because the tax was assessed on a valuation they had themselves declared in 1928 and never revised. They were the country's infrastructure and they were a private company and those two facts were the same fact."&lt;/p&gt;

&lt;p&gt;"The banana republic."&lt;/p&gt;

&lt;p&gt;"O. Henry coined it in 1904 and it was a joke and it was accurate. The phrase is a hundred and twenty years old and it has never needed updating."&lt;/p&gt;

&lt;p&gt;He taps the manifest.&lt;/p&gt;

&lt;p&gt;"1952, Arbenz. He was a colonel and he was elected and he passed Decree 900, which was land reform. It took two hundred and thirty-four thousand acres off the company and offered one million one hundred and eighty-five thousand dollars for it, which was the value the company had declared for tax. About five dollars an acre. The company said the land was worth fifteen point eight million. About sixty-seven dollars an acre. That is the whole of the grievance. They had under-declared for twenty-four years to avoid tax and now they wanted the tax figure ignored."&lt;/p&gt;

&lt;p&gt;"And the compensation was paid."&lt;/p&gt;

&lt;p&gt;"It was paid. In bonds. Arbenz was not a communist, he was a nationalist, and he was not even very good at being a nationalist, he was a landowner himself. It did not matter. In 1954 the CIA ran PBSUCCESS. Four hundred and eighty men on the Honduran border, a radio station, some aircraft, a lot of noise. Castillo Armas came in. Arbenz resigned in June and went into exile and the land reform was reversed and the land went back."&lt;/p&gt;

&lt;p&gt;"The Dulles brothers."&lt;/p&gt;

&lt;p&gt;"John Foster Dulles was Secretary of State. Allen Dulles was Director of Central Intelligence. Both of them had been lawyers for United Fruit. John Foster had drafted the company's 1930 contract with Guatemala. Allen was on the board. Their firm was Sullivan and Cromwell and it represented the company. There is a photograph of the two of them at a meeting about Guatemala and it is the most straightforward conflict of interest in the history of the American state and nobody even tried to hide it."&lt;/p&gt;

&lt;p&gt;He puts the share certificate on the table.&lt;/p&gt;

&lt;p&gt;"My grandfather held forty shares. He sold them in 1970. He made eleven hundred dollars."&lt;/p&gt;

&lt;p&gt;"And the cost."&lt;/p&gt;

&lt;p&gt;"Two hundred thousand dead. That is the civil war, 1960 to 1996, thirty-six years, and it came out of 1954, and the death squads came out of 1954, and the villages in the highlands that were burned in 1982 were burned by a government that existed because a fruit company's valuation was too low. The Commission for Historical Clarification found genocide against the Maya. It is in the report. It is a word in a report."&lt;/p&gt;

&lt;p&gt;He is quiet for a second.&lt;/p&gt;

&lt;p&gt;"Here is the part my grandfather would not say. It worked. For the company. The bananas came out and the dividends were paid and the shareholders in Boston did very well and the price of a banana in a supermarket in Ohio was low for sixty years. That is the trade. That is the actual trade. A cheap banana and two hundred thousand dead and a country that still cannot tax its own rich."&lt;/p&gt;

&lt;p&gt;"And the rest of the continent."&lt;/p&gt;

&lt;p&gt;"You want Chile. 1970, Allende, elected. 1971, he nationalised the copper, and it was Anaconda and it was Kennecott. Nixon told the CIA to make the economy scream. That is the phrase in the memo, it is his phrase. 1973, the coup, the eleventh of September, Pinochet, and the Rettig Commission later found two thousand two hundred and seventy-nine dead and disappeared and the Valech Commission found forty thousand tortured. Then Condor, which was the six dictatorships agreeing to chase people across each other's borders, sixty thousand dead across the Southern Cone. Then 1982, Mexico says it cannot pay, and the whole region is at three hundred billion of debt, and the decade after is called the lost decade and it is called that by the people who lent it."&lt;/p&gt;

&lt;p&gt;He slides the manifest across.&lt;/p&gt;

&lt;p&gt;"Read the manifest. It is a bill of lading from 1953. Bananas, forty thousand stems, Puerto Barrios to New Orleans. There is a stamp on it. The stamp says &lt;em&gt;perishable&lt;/em&gt;. That is the whole of Guatemala's position in the world economy. Perishable. Ship it fast, pay it late, and if it rots on the dock it is the grower's loss."&lt;/p&gt;

&lt;p&gt;I write: &lt;em&gt;Witness states the arrangement is unchanged. Witness states the crop is not.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  VI. Émile
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Antwerp, today
&lt;/h3&gt;

&lt;p&gt;He is sixth because he is the one who is still doing it, and because he is the only one who lives here.&lt;/p&gt;

&lt;p&gt;He is sixty-six and he is a Belgian and he has brought a logbook in a plastic bag, and he is the only witness who is nervous.&lt;/p&gt;

&lt;p&gt;"My great-grandfather was a rubber agent," he says. "He went out in 1897 and he came back in 1904. He kept a log. It is not a diary, it is a log, it is entries, dates, kilos, names of villages, and it is the most boring document you have ever seen and it is a confession."&lt;/p&gt;

&lt;p&gt;He opens it. The handwriting is small and upright.&lt;/p&gt;

&lt;p&gt;"&lt;em&gt;Bongandanga, 12 March 1898. Quota 900 kilos. Delivered 640. Two sentries, one hundred lashes each. Three hands.&lt;/em&gt; That is an entry. That is the whole entry. He did not write a word about what it was like. He wrote the numbers."&lt;/p&gt;

&lt;p&gt;"Did he know."&lt;/p&gt;

&lt;p&gt;"He knew the numbers. Whether he knew what the numbers meant is a different question and I think the answer is no, and I think that is the interesting part. He was twenty-four. He was in a place with no roads and no doctor and he was paid a commission on tonnage. He saw a hand cut off. He saw it. And he wrote &lt;em&gt;three hands&lt;/em&gt; and moved on, because there was a quota and the quota was the thing that mattered."&lt;/p&gt;

&lt;p&gt;He closes the book.&lt;/p&gt;

&lt;p&gt;"Belgium has a phrase. &lt;em&gt;Wij wisten het niet.&lt;/em&gt; We did not know. It is said in a certain tone. It is said by people in this city who have a statue of Leopold in the square and who have never read the Casement report and who will tell you, if you press them, that the Congo was complicated."&lt;/p&gt;

&lt;p&gt;"It was not complicated."&lt;/p&gt;

&lt;p&gt;"It was not complicated. It was a quota and a whip and a basket of hands and it was reported in the newspapers of this city while it was happening. The &lt;em&gt;Times&lt;/em&gt; had a correspondent. There were lantern slides in the Antwerp hall in 1905. My great-grandfather came home and he could have told anyone who asked. Nobody asked. He did not volunteer. That is what &lt;em&gt;we did not know&lt;/em&gt; means. It means &lt;em&gt;we did not ask the man who was there&lt;/em&gt;."&lt;/p&gt;

&lt;p&gt;He looks out of the window at the cranes.&lt;/p&gt;

&lt;p&gt;"Now it is cobalt and it is this port and it is me. I am a trader. I buy cobalt hydroxide from Kolwezi and it comes in here and it goes out to the battery plants and it goes into the cars. I have a due diligence file on every lot. I have a chain of custody. I have an OECD template. I have a third-party audit and a smelter certificate and a risk register with a red amber green column."&lt;/p&gt;

&lt;p&gt;"And the children."&lt;/p&gt;

&lt;p&gt;"There are children in the file. There is a line in the file that says &lt;em&gt;artisanal and small-scale mining: residual risk&lt;/em&gt;. Residual. That is the word. It means we know and we have priced it."&lt;/p&gt;

&lt;p&gt;He puts his hand flat on the logbook.&lt;/p&gt;

&lt;p&gt;"The audit is the same as the log. It is numbers. It is kilos and it is dates and it is a green column. My great-grandfather had a quota and I have a risk register and between the two of them there is a hundred and twenty years and the same amount of information about the people."&lt;/p&gt;

&lt;p&gt;"Belgium took the Congo in 1908."&lt;/p&gt;

&lt;p&gt;"Belgium took the Congo in 1908 and ran it for fifty-two years and left in 1960 and took the copper and left the debt and then, in 1961, we helped kill the man who had been elected. Lumumba. We were not the only ones. There were others. But we were there and it was our man in Katanga and it was our money and it was our mining company and it was our interest and he was killed in our province with our officers in the room."&lt;/p&gt;

&lt;p&gt;He says it flatly, the way you say a thing you have said before.&lt;/p&gt;

&lt;p&gt;"He gave a speech on the day of independence. The King was there. The King had praised Leopold. Lumumba stood up and said the independence was won by struggle, by tears, by fire, and that the Congo had been a land of slavery and that they would show the world what a black man could do. He was thirty-four. He had been a postal clerk. He was dead in seven months. In prison he wrote to his wife: &lt;em&gt;one day history will have its say, but it will not be the history taught in Brussels, Paris, Washington or the United Nations, but the history taught in the countries freed from colonialism and its puppet regimes.&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;"And now."&lt;/p&gt;

&lt;p&gt;"Now the port is the second biggest in Europe and the cobalt comes through it and the cars go out of it and the battery passport is coming and every cell will have a QR code and the QR code will have a chain of custody and the chain of custody will have a green column. And the green column will be true. And the men at level four hundred and eighty will still cough."&lt;/p&gt;

&lt;p&gt;He closes the logbook and puts it back in the bag.&lt;/p&gt;

&lt;p&gt;"Write that the numbers were kept," he says. "Write that they were kept very well. That is the thing about us. We are excellent bookkeepers. It is the only thing we have ever been excellent at."&lt;/p&gt;

&lt;p&gt;"And the francophone arrangement."&lt;/p&gt;

&lt;p&gt;He nods, because he knew it was coming.&lt;/p&gt;

&lt;p&gt;"The CFA franc. Fourteen countries. Their central banks keep sixty-five per cent of their reserves, and fifty per cent in the other zone, in an account at the French Treasury. France guarantees the convertibility. In exchange France has had men on the boards and a say in the policy. It is called cooperation. It is a currency with a landlord. In 2019 Macron stood in Abidjan and said it would be renamed and the reserves would come home and the French would leave the boards. It is 2026 and it is still called the CFA franc and the reserves are still in Paris and the reform has not been implemented and one of the two zones rejected it outright."&lt;/p&gt;

&lt;p&gt;He picks up the bag.&lt;/p&gt;

&lt;p&gt;"Same method. Not a whip. A ledger. A peg and a reserve ratio and a guarantee, and it is all written down, and it is all perfectly legal, and it is all in French."&lt;/p&gt;

&lt;p&gt;I write: &lt;em&gt;Witness states the books balance. Witness states the books are the crime.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  VII. The Clerk
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Antarctica, 1959
&lt;/h3&gt;

&lt;p&gt;There is no seventh witness. There is no one to be one.&lt;/p&gt;

&lt;p&gt;Antarctica has no population. It has never had one. There is no one to draft into a mita and no one to take a hand from and no one to move off the land, because there is no land, there is ice, and there is no one.&lt;/p&gt;

&lt;p&gt;So I stop writing and I speak.&lt;/p&gt;

&lt;p&gt;The seventh continent is the only one where the ledger has no debit column. Nobody was robbed. That is not because we were kind. It is because there was nobody to rob, and we noticed, and we wrote it down, and we were very pleased with ourselves.&lt;/p&gt;

&lt;p&gt;In 1959 twelve countries signed a treaty. It reserved the continent for peaceful purposes and scientific research and it froze the territorial claims. Seven countries claim a slice: Britain, France, Norway, Australia, New Zealand, Chile, Argentina. The claims overlap. The treaty says the claims do not count while the treaty is in force. It does not say they are void. It says they are on hold.&lt;/p&gt;

&lt;p&gt;There are fifty-six parties now. Twenty-nine of them are consultative, which means they have a vote. There are research stations from thirty countries. There are ice cores with eight hundred thousand years of air in them and the air is the best climate record on earth and it is the one thing the continent gives that is worth more than anything under it.&lt;/p&gt;

&lt;p&gt;Under it there is coal and there is iron and there is probably oil and there is certainly gas. The Environmental Protocol of 1998 bans mineral extraction and the ban has no end date, which sounds better than it is. From 2048 any party can call a review conference, and an amendment needs a majority including three quarters of the consultative parties, and then ratification, and then it is open. Nobody is pretending it will hold.&lt;/p&gt;

&lt;p&gt;And there is krill. Krill is the base of the whole Southern Ocean food chain and it is also a feed supplement and a fish oil and an omega-3 capsule, and the catch has been climbing for twenty years, and the fishery is managed by a commission that has to agree by consensus, and consensus means one member can stop anything, and one member does.&lt;/p&gt;

&lt;p&gt;So the seventh continent is not clean. It is just early. It is the same ledger with the first page still blank, and the same men are standing over it with the same pens, and the only reason the page is blank is that there is no one to send the bill to.&lt;/p&gt;

&lt;p&gt;That is the whole of the seventh statement. It is short because there is no one to make it long.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Balance
&lt;/h2&gt;

&lt;p&gt;I close the ledger.&lt;/p&gt;

&lt;p&gt;Six statements. Six continents. Four hundred and eighty years, from a llama on a hill in 1545 to a QR code on a battery cell in 2026. The same shape every time. Find a thing that is wanted. Find the people standing on it. Make a number. Keep the number. Ship the thing.&lt;/p&gt;

&lt;p&gt;The numbers are all in the ledger and they are all correct and they do not add up to anything, because a ledger is not a moral instrument. It is a device for making a loss look like a cost.&lt;/p&gt;

&lt;p&gt;Here is what the ledger says, in total.&lt;/p&gt;

&lt;p&gt;Forty thousand tonnes of silver out of one hill and a country that is still the poorest in its region.&lt;/p&gt;

&lt;p&gt;A quarter of the world's manufacturing to under two per cent, and a famine in 1770 and the same famine in 1943 in the same delta.&lt;/p&gt;

&lt;p&gt;Ten million dead in the Congo, or five, or one, and a hand in a tin and a green column on a risk register.&lt;/p&gt;

&lt;p&gt;Eighty per cent of an island that cannot be walked on and a trust fund that went to a musical.&lt;/p&gt;

&lt;p&gt;Two hundred thousand dead in a country that grows a cheap fruit.&lt;/p&gt;

&lt;p&gt;And a continent with no one on it, waiting.&lt;/p&gt;

&lt;p&gt;Then the modern column, which is the one that matters because it is the one we are in. Ninety-five countries depend on commodities for most of their export earnings and forty-five of them are in Africa. Cocoa beans enter the European Union duty free and chocolate enters at eight per cent, so the processing stays here. Africa loses fifty billion dollars a year in illicit flows, a trillion over fifty years, which is about what it received in aid over the same fifty years, so the aid was a round trip with a fee. The United States has emitted twenty-four per cent of the cumulative carbon and the European Union seventeen, and a person in America emits thirteen point eight tonnes a year against one tonne for a person in Africa. A hundred billion a year was promised for climate finance in 2009 and delivered in 2022, two years late, a quarter of it for adaptation, and Africa gets three per cent of the total and needs two hundred and seventy-seven billion a year. The Loss and Damage Fund has seven hundred million pledged against a hundred billion of need.&lt;/p&gt;

&lt;p&gt;The fools came. That is the thing about them. Every one of them came, on a Tuesday, in a coat, with a bag, to give evidence to a man with a clipboard in a building that will still be here when they are gone. They came because they thought if they said it out loud, in order, with the numbers, someone would write it down and it would matter.&lt;/p&gt;

&lt;p&gt;It does not matter. It has never mattered. The Congo Reform Association got the Congo annexed and the quotas stayed. Arbenz got his land reform and the land went back. Nauru got independence and the money went. Lumumba got a speech and a bullet. Sankara said the debt was a reconquest and was shot for it. Nkrumah wrote that a neocolonial state is independent in theory and directed from outside in reality, and was overthrown. Every single one of them won something and lost the thing itself.&lt;/p&gt;

&lt;p&gt;And they came anyway. That is the fool's part. That is why the story is called what it is called.&lt;/p&gt;

&lt;p&gt;I put the hand back in the tin and I put the tin in my coat and I go down to the quay, because there is a lot at berth 869 and it is cobalt hydroxide and it is two hundred and forty tonnes and I have to take a sample.&lt;/p&gt;

&lt;p&gt;The grab goes in. The hydroxide comes up, grey and wet and fine as flour. It goes in the bag and the bag gets a label and the label gets a number and the number goes in the ledger.&lt;/p&gt;

&lt;p&gt;Two hundred and forty tonnes. One hundred and forty grams.&lt;/p&gt;

&lt;p&gt;Both true. Both in the same book. That is the whole of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;p&gt;Primary documents, in the order they appear in the story.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Casement, Roger. &lt;em&gt;Correspondence and Report from His Majesty's Consul at Boma respecting the Administration of the Independent State of the Congo.&lt;/em&gt; Cd. 1933, 1904. &lt;a href="https://archive.org/stream/CasementReport/CasementReportSmall_djvu.txt" rel="noopener noreferrer"&gt;Full text&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;General Act of the Berlin Conference on West Africa&lt;/em&gt;, 26 February 1885. &lt;a href="https://loveman.sdsu.edu/docs/1885GeneralActBerlinConference.pdf" rel="noopener noreferrer"&gt;PDF&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Treaty of Nanking&lt;/em&gt;, 29 August 1842. &lt;a href="https://worldjpn.net/documents/texts/pw/18420829.T1E.html" rel="noopener noreferrer"&gt;Full text&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Boxer Protocol&lt;/em&gt;, 7 September 1901. &lt;a href="https://en.wikisource.org/wiki/United_States_Treaty_Series/Volume_1/Boxer_Protocol" rel="noopener noreferrer"&gt;Full text&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Famine Inquiry Commission (Woodhead Commission). &lt;em&gt;Report on Bengal.&lt;/em&gt; Government of British India, 1945. &lt;a href="https://archive.org/details/in.ernet.dli.2015.206311" rel="noopener noreferrer"&gt;Archive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Lumumba, Patrice. Speech at the proclamation of Congolese independence, 30 June 1960. &lt;a href="https://www.marxists.org/subject/africa/lumumba/1960/06/independence.htm" rel="noopener noreferrer"&gt;Full text&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sankara, Thomas. "A United Front Against the Debt." OAU, Addis Ababa, 29 July 1987. &lt;a href="https://www.marxists.org/archive/sankara/1987/july/29.htm" rel="noopener noreferrer"&gt;Full text&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Nkrumah, Kwame. &lt;em&gt;Neo-Colonialism: The Last Stage of Imperialism.&lt;/em&gt; Thomas Nelson, 1965. &lt;a href="https://www.marxists.org/subject/africa/nkrumah/neo-colonialism/" rel="noopener noreferrer"&gt;Full text&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Antarctic Treaty&lt;/em&gt; and &lt;em&gt;Environmental Protocol.&lt;/em&gt; &lt;a href="https://www.ats.aq/e/protocol.html" rel="noopener noreferrer"&gt;ats.aq&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Caribbean Reparations Commission. &lt;em&gt;Ten Point Plan for Reparatory Justice&lt;/em&gt;, 2014. &lt;a href="https://caricom.org/documents/the-caricom-caribbean-community-ten-point-plan-for-reparations-a-manifesto-for-the-coming-enlightenment/" rel="noopener noreferrer"&gt;CARICOM&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Statistics and secondary work.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bakewell, Peter. &lt;em&gt;Miners of the Red Mountain: Indian Labor in Potosí, 1545-1650.&lt;/em&gt; New Mexico, 1984.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Voyages: The Trans-Atlantic Slave Trade Database.&lt;/em&gt; &lt;a href="https://www.slavevoyages.org/" rel="noopener noreferrer"&gt;slavevoyages.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Naoroji, Dadabhai. &lt;em&gt;Poverty and Un-British Rule in India.&lt;/em&gt; Swan Sonnenschein, 1901. &lt;a href="https://archive.org/details/povertyunbritish00naoruoft" rel="noopener noreferrer"&gt;Archive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bairoch, Paul. &lt;em&gt;Economics and World History: Myths and Paradoxes.&lt;/em&gt; Harvester Wheatsheaf, 1993.&lt;/li&gt;
&lt;li&gt;Mukerjee, Madhusree. &lt;em&gt;Churchill's Secret War.&lt;/em&gt; Basic Books, 2010.&lt;/li&gt;
&lt;li&gt;Hochschild, Adam. &lt;em&gt;King Leopold's Ghost.&lt;/em&gt; Houghton Mifflin, 1998.&lt;/li&gt;
&lt;li&gt;Sanderson, Jean-Paul. &lt;em&gt;La démographie du Congo sous la colonisation belge.&lt;/em&gt; UCL, 2010, and later modelling, 2020.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Guardian.&lt;/em&gt; "Corruption, incompetence and a musical: Nauru's cursed history," 4 September 2018. &lt;a href="https://www.theguardian.com/world/2018/sep/04/corruption-incompetence-and-a-musical-naurus-riches-to-rags-tale" rel="noopener noreferrer"&gt;Link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;US State Department. &lt;em&gt;Foreign Relations of the United States, 1952-1954, Guatemala.&lt;/em&gt; &lt;a href="https://history.state.gov/historicaldocuments/frus1952-54Guat/sources" rel="noopener noreferrer"&gt;Source list&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;National Security Archive. "CIA and Assassinations: The Guatemala 1954 Documents." &lt;a href="https://nsarchive2.gwu.edu/NSAEBB/NSAEBB4/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Rettig Commission, Chile, 1991; Valech Commission, 2004. &lt;a href="https://www.iranrights.org/library/document/3025" rel="noopener noreferrer"&gt;Summary&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Hansard.&lt;/em&gt; "Mau Mau Claims (Settlement)," 6 June 2013. &lt;a href="https://hansard.parliament.uk/commons/2013-06-06/debates/13060646000005/MauMauClaims(Settlement)" rel="noopener noreferrer"&gt;Link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The New York Times.&lt;/em&gt; "Haiti's Lost Billions," 20 May 2022. &lt;a href="https://www.nytimes.com/interactive/2022/05/20/world/americas/enslaved-haiti-debt-timeline.html" rel="noopener noreferrer"&gt;Link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Clifford Chance. "Reform of the CFA franc in West Africa: introducing the Eco," 2020. &lt;a href="https://www.cliffordchance.com/content/dam/cliffordchance/briefings/2020/02/reform-of-the-cfa-franc-in-west-africa%E2%80%93introducing-the-eco.pdf" rel="noopener noreferrer"&gt;PDF&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ILO, 2019, on child labour in mining, via the &lt;a href="https://www.wilsoncenter.org/blog-post/drc-mining-industry-child-labor-and-formalization-small-scale-mining" rel="noopener noreferrer"&gt;Wilson Center&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;UNCTAD. &lt;em&gt;State of Commodity Dependence 2023.&lt;/em&gt; &lt;a href="https://unctad.org/system/files/official-document/ditccom2023d3_en.pdf" rel="noopener noreferrer"&gt;PDF&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;African Union High-Level Panel on Illicit Financial Flows (Mbeki Panel), 2015. &lt;a href="https://au.int/sites/default/files/documents/40545-doc-IFFs_REPORT.pdf" rel="noopener noreferrer"&gt;PDF&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tax Justice Network. &lt;em&gt;The State of Tax Justice 2020.&lt;/em&gt; &lt;a href="https://taxjustice.net/wp-content/uploads/2020/11/The_State_of_Tax_Justice_2020_ENGLISH.pdf" rel="noopener noreferrer"&gt;PDF&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;UNITAR and ITU. &lt;em&gt;Global E-waste Monitor 2024.&lt;/em&gt; &lt;a href="https://ewastemonitor.info/the-global-e-waste-monitor-2024/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;World Bank and Pact. &lt;em&gt;2020 State of the Artisanal and Small-Scale Mining Sector.&lt;/em&gt; &lt;a href="https://documents1.worldbank.org/curated/en/884541630559615834/pdf/Delve-2020-State-of-the-Artisanal-and-Small-Scale-Mining-Sector.pdf" rel="noopener noreferrer"&gt;PDF&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Our World in Data.&lt;/em&gt; Cumulative CO2 emissions by world region. &lt;a href="https://ourworldindata.org/grapher/cumulative-co2-emissions-region" rel="noopener noreferrer"&gt;Link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OECD. &lt;em&gt;Climate Finance Provided and Mobilised by Developed Countries in 2013-2022&lt;/em&gt;, 2024. &lt;a href="https://www.oecd.org/en/publications/2024/05/climate-finance-provided-and-mobilised-by-developed-countries-in-2013-2022_8031029a.html" rel="noopener noreferrer"&gt;Link&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where a figure is contested, the story says so in the witness's voice. The Congo death toll, the 1770 Bengal toll, the Hispaniola pre-contact population, and the illicit financial flow estimates are all genuinely disputed and the ranges are given rather than a single number. The 1943 Bengal figure is the scholarly consensus, not the highest estimate.&lt;/p&gt;

&lt;p&gt;The witnesses are invented. The hand is a real class of object, not a specific provenanced one.&lt;/p&gt;

</description>
      <category>history</category>
      <category>economics</category>
      <category>africa</category>
      <category>writing</category>
    </item>
    <item>
      <title>Cinder is now Tomoshibi 灯火 — same scraper, better name</title>
      <dc:creator>Michael Amachree</dc:creator>
      <pubDate>Wed, 16 Sep 2026 15:46:20 +0000</pubDate>
      <link>https://dev.to/dev_michael/cinder-is-now-tomoshibi-deng-huo-same-scraper-better-name-klj</link>
      <guid>https://dev.to/dev_michael/cinder-is-now-tomoshibi-deng-huo-same-scraper-better-name-klj</guid>
      <description>&lt;p&gt;Cinder is now Tomoshibi (灯火, lamp light). Same Go scraper, same API. New name, cleaner monorepo, easier to find.&lt;/p&gt;

&lt;p&gt;If you used Cinder, your old GitHub URL still redirects and your stars carried over. Migration is two lines.&lt;/p&gt;

&lt;h3&gt;
  
  
  TL;DR for existing users
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;code&gt;github.com/Michael-Obele/cinder&lt;/code&gt; → &lt;code&gt;github.com/Michael-Obele/tomoshibi&lt;/code&gt; (old URL redirects)&lt;/li&gt;
&lt;li&gt;npm: &lt;code&gt;npx tomoshi&lt;/code&gt; ( &lt;code&gt;npx tomoshibi&lt;/code&gt; works too, same package)&lt;/li&gt;
&lt;li&gt;Docker: &lt;code&gt;michaelobele/tomoshibi-api&lt;/code&gt; etc. (old tags still pull for now)&lt;/li&gt;
&lt;li&gt;Go module: &lt;code&gt;github.com/Michael-Obele/tomoshibi&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP tools: &lt;code&gt;cinder_*&lt;/code&gt; → &lt;code&gt;tomoshi_*&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Env: &lt;code&gt;TOMOSHIBI_API_URL&lt;/code&gt; (old &lt;code&gt;CINDER_API_URL&lt;/code&gt; still read as fallback where it existed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No breaking API changes. &lt;code&gt;/v1/scrape&lt;/code&gt;, &lt;code&gt;/v1/crawl&lt;/code&gt;, &lt;code&gt;/v1/search&lt;/code&gt;, &lt;code&gt;/v1/map&lt;/code&gt; work the same.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why I renamed it
&lt;/h3&gt;

&lt;p&gt;Cinder was a working name. It stuck for a bit, but it was hard to search and it collided with a lot of other projects. I wanted a name I could own and that says what the tool does.&lt;/p&gt;

&lt;p&gt;Tomoshibi means lamp light in Japanese. The job is simple; turn messy, dark HTML into clean markdown your LLM can actually read. Light felt right. &lt;code&gt;tomoshi&lt;/code&gt; is the short alias so you type less.&lt;/p&gt;

&lt;p&gt;I scored names with a small naming rubric and Tomoshibi came out top at 30/35. Short, memorable, searchable, and the alias works in the terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  What actually changed
&lt;/h3&gt;

&lt;p&gt;The rename was also a chance to clean up structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt; separate repos &lt;code&gt;cinder&lt;/code&gt;, &lt;code&gt;cinder-tmcp&lt;/code&gt;, &lt;code&gt;cinder-sv&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Now:&lt;/strong&gt; one monorepo &lt;code&gt;tomoshibi&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;api&lt;/td&gt;
&lt;td&gt;&lt;code&gt;packages/api&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go API; Gin + Colly + Chromedp + SearXNG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mcp&lt;/td&gt;
&lt;td&gt;&lt;code&gt;packages/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MCP server; 3 tools, &lt;code&gt;tomoshi&lt;/code&gt; bin on npm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;web&lt;/td&gt;
&lt;td&gt;&lt;code&gt;packages/web&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Svelte 5 playground for scrape/crawl/search&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Other bits: new lantern banner, unified README, Dockerfiles now build from &lt;code&gt;packages/*&lt;/code&gt;, &lt;code&gt;go.mod&lt;/code&gt; updated, archived the old &lt;code&gt;cinder-tmcp&lt;/code&gt; and &lt;code&gt;cinder-sv&lt;/code&gt; repos.&lt;/p&gt;
&lt;h3&gt;
  
  
  What stayed the same
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;One binary, hobby tier RAM. Monolith with embedded Asynq worker.&lt;/li&gt;
&lt;li&gt;Smart mode; static first with Colly, fallback to Chromedp only when needed.&lt;/li&gt;
&lt;li&gt;Readability plus ad block; clean markdown.&lt;/li&gt;
&lt;li&gt;SearXNG search with Brave fallback.&lt;/li&gt;
&lt;li&gt;Self hosted, no per token bill.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Benchmark still holds: &lt;code&gt;scripts/search-bench.py&lt;/code&gt; (10 workers/30s) Tomoshibi ~560 req/s p50 11ms on the same box where hosted alternatives were far slower.&lt;/p&gt;
&lt;h3&gt;
  
  
  Migration (30 seconds)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Docker Compose (recommended):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Michael-Obele/tomoshibi.git &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;tomoshibi
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="c"&gt;# api 7431 + mcp 7433 + web 7432 + redis 7434 + searxng 7435&lt;/span&gt;
curl http://localhost:7431/health &lt;span class="c"&gt;# -&amp;gt; {"status":"ok","service":"tomoshibi"}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;MCP config&lt;/strong&gt; (&lt;code&gt;.vscode/mcp.json&lt;/code&gt; or Claude config):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tomoshi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tomoshi"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"TOMOSHIBI_API_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:7431"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Go import:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"github.com/Michael-Obele/tomoshibi/packages/api/internal/scraper"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Old &lt;code&gt;cinder&lt;/code&gt; imports and Docker tags will error clearly and point to the new name. Old GitHub URL redirects so links do not break.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try it with Docker
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Full stack — 1 command:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Michael-Obele/tomoshibi.git &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;tomoshibi
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Michael-Obele/tomoshibi/blob/main/docker-compose.yml" rel="noopener noreferrer"&gt;docker-compose.yml&lt;/a&gt; — api &lt;code&gt;7431&lt;/code&gt; + mcp &lt;code&gt;7433&lt;/code&gt; + web &lt;code&gt;7432&lt;/code&gt; + redis &lt;code&gt;7434&lt;/code&gt; + searxng &lt;code&gt;7435&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Docker Hub:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://hub.docker.com/r/michaelobele/tomoshibi" rel="noopener noreferrer"&gt;michaelobele/tomoshibi&lt;/a&gt; — all in one&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hub.docker.com/r/michaelobele/tomoshibi-api" rel="noopener noreferrer"&gt;michaelobele/tomoshibi-api&lt;/a&gt; — api only&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hub.docker.com/r/michaelobele/tomoshibi-mcp" rel="noopener noreferrer"&gt;michaelobele/tomoshibi-mcp&lt;/a&gt; — mcp only&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hub.docker.com/r/michaelobele/tomoshibi-web" rel="noopener noreferrer"&gt;michaelobele/tomoshibi-web&lt;/a&gt; — web only&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GHCR (same images):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Michael-Obele/tomoshibi/pkgs/container/tomoshibi" rel="noopener noreferrer"&gt;ghcr.io/michael-obele/tomoshibi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Michael-Obele/tomoshibi/pkgs/container/tomoshibi-api" rel="noopener noreferrer"&gt;ghcr.io/michael-obele/tomoshibi-api&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Michael-Obele/tomoshibi/pkgs/container/tomoshibi-mcp" rel="noopener noreferrer"&gt;ghcr.io/michael-obele/tomoshibi-mcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Michael-Obele/tomoshibi/pkgs/container/tomoshibi-web" rel="noopener noreferrer"&gt;ghcr.io/michael-obele/tomoshibi-web&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pull:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull michaelobele/tomoshibi-api:latest
&lt;span class="c"&gt;# or&lt;/span&gt;
docker pull ghcr.io/michael-obele/tomoshibi-api:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Per-service compose:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Michael-Obele/tomoshibi/blob/main/packages/api/docker-compose.yml" rel="noopener noreferrer"&gt;packages/api/docker-compose.yml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Michael-Obele/tomoshibi/blob/main/packages/mcp/docker-compose.yml" rel="noopener noreferrer"&gt;packages/mcp/docker-compose.yml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Michael-Obele/tomoshibi/blob/main/packages/web/docker-compose.yml" rel="noopener noreferrer"&gt;packages/web/docker-compose.yml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What is next
&lt;/h3&gt;

&lt;p&gt;Same roadmap; better SPA heuristics, more tests, keep the monolith cheap to run. Name is settled now so I can focus on shipping.&lt;/p&gt;

&lt;p&gt;If you starred Cinder, thank you.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/Michael-Obele/tomoshibi" rel="noopener noreferrer"&gt;https://github.com/Michael-Obele/tomoshibi&lt;/a&gt;&lt;br&gt;
npm: &lt;a href="https://www.npmjs.com/package/tomoshi" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/tomoshi&lt;/a&gt;&lt;br&gt;
web: &lt;a href="https://tomoshi.svelte-apps.me/" rel="noopener noreferrer"&gt;https://tomoshi.svelte-apps.me/&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Formerly Cinder. Now Tomoshibi 灯火.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>opensource</category>
      <category>selfhosted</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AI didn't make me a worse coder. It made me a worse reviewer.</title>
      <dc:creator>Michael Amachree</dc:creator>
      <pubDate>Fri, 21 Aug 2026 22:10:19 +0000</pubDate>
      <link>https://dev.to/dev_michael/ai-didnt-make-me-a-worse-coder-it-made-me-a-worse-reviewer-48d0</link>
      <guid>https://dev.to/dev_michael/ai-didnt-make-me-a-worse-coder-it-made-me-a-worse-reviewer-48d0</guid>
      <description>&lt;p&gt;I built a lot of apps last year. I approved most of the code and commits that went into them, and a good portion of it I could not explain.&lt;/p&gt;

&lt;p&gt;Not "couldn't explain to a junior." Couldn't explain to &lt;em&gt;myself&lt;/em&gt;. The tests were green, the diff looked like something I would have written, and I hit approve. If you had stopped me forty minutes later and asked why that function needed a lock, I would have had to go read it again like it was someone else's code.&lt;/p&gt;

&lt;p&gt;Which, in a sense, it was. And because most of these were my own projects, there was no second reviewer downstream of me. I was the entire quality gate — and the gate had quietly stopped reading.&lt;/p&gt;

&lt;p&gt;I am not going to pretend this is a novel observation. If you read dev.to you have already seen this post four times this spring, and if you read r/ExperiencedDevs you have seen the thread where someone calls themselves "a tourist in their own codebase" and four hundred people say &lt;em&gt;yeah, same&lt;/em&gt;. One in five developers in the 2025 Stack Overflow survey picked "I've become less confident in my own problem-solving" as a top frustration with AI tools. The fear is not underreported. It might be the most reported feeling in software right now.&lt;/p&gt;

&lt;p&gt;So this isn't a diagnosis post. The diagnosis is done. What I couldn't find anywhere was an honest answer to the next question: &lt;strong&gt;every fix anyone proposes for this has the same shape, and that shape is known to fail.&lt;/strong&gt; Including the one I spent two weeks designing.&lt;/p&gt;

&lt;p&gt;That's what I want to work through, and then I want to ask you something.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually decays
&lt;/h2&gt;

&lt;p&gt;The reframe that finally made this click for me came from aviation, and it's about thirty years old.&lt;/p&gt;

&lt;p&gt;When researchers tested airline pilots who had trained on manual flight but then spent their careers flying highly automated aircraft, they found something specific. The &lt;em&gt;procedural&lt;/em&gt; skills — scanning instruments, hand-flying the aircraft — were rusty but largely intact. The pilots could still fly the plane.&lt;/p&gt;

&lt;p&gt;What had cratered were the cognitive skills. Maintaining awareness of where the aircraft actually was. Tracking what the next step should be. Recognizing and handling an instrument failure. (This is Casner et al., 2014; the FAA's response was to recommend that pilots hand-fly for the majority of flights.)&lt;/p&gt;

&lt;p&gt;Read that again with your own job substituted in. The typing survives. The &lt;em&gt;model in your head&lt;/em&gt; is what goes.&lt;/p&gt;

&lt;p&gt;A 2024 review by Brooke Macnamara and colleagues in &lt;em&gt;Cognitive Research&lt;/em&gt; extends this to AI assistants specifically, and makes the argument sharper than I would have dared: because AI mimics &lt;em&gt;cognitive&lt;/em&gt; work rather than mechanical work, and because cognitive skills decay faster than physical ones, AI-induced skill decay should be &lt;strong&gt;worse&lt;/strong&gt; than the automation decay we already documented in cockpits.&lt;/p&gt;

&lt;p&gt;That's the reframe. It isn't that AI makes you slow at writing code. It's that AI is very good at the exact part of the job that used to build your judgment as a side effect, and the judgment does not maintain itself in storage.&lt;/p&gt;

&lt;p&gt;Which matters, because look at what the job is now. Reviewing. Catching the thing the model was confident about and wrong about. Knowing what to build. Deciding when the plausible answer is the wrong answer. Every one of those is the cognitive column, not the procedural one. We have automated our way out of the reps that produced the only skills we still get paid for.&lt;/p&gt;

&lt;h2&gt;
  
  
  You cannot feel this happening
&lt;/h2&gt;

&lt;p&gt;Here's the part that changed how I think about the whole problem. There are three independent findings that all say the same uncomfortable thing: &lt;strong&gt;you are structurally unable to self-assess this.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One.&lt;/strong&gt; Macnamara's review names the mechanism directly. Ordinary skill decay you notice, because you stopped doing the task. AI-induced decay hides, because you &lt;em&gt;didn't&lt;/em&gt; stop doing the task — you kept shipping, kept reviewing, kept closing tickets. Only the cognitive engagement stopped. A surgeon still completing successful operations has no signal that their judgment has softened. Neither do you, with a green CI badge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two.&lt;/strong&gt; METR ran a randomized controlled trial in 2025 with sixteen experienced open-source developers on 246 real tasks in their own repositories — projects averaging five years of their own contributions. Developers predicted AI would make them 24% faster. Afterward, they estimated they &lt;em&gt;had been&lt;/em&gt; about 20% faster. They were 19% &lt;strong&gt;slower&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sit with that. Not "they were wrong about the tool." They were wrong about their own experience, immediately after having it, on code they knew better than anyone. And the slowdown was &lt;em&gt;worse&lt;/em&gt; on tasks where they had high prior experience. Whatever perceptual instrument you'd use to detect this in yourself, that study is the calibration check, and it failed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three.&lt;/strong&gt; The classic testing-effect result from Roediger and Karpicke (2006): students who re-read material rated themselves more confident about remembering it than students who self-tested — and then recalled 40% versus 61% a week later. The re-readers read the passage 14.2 times on average. The testers read it 3.4 times. Re-reading felt like learning and wasn't.&lt;/p&gt;

&lt;p&gt;Re-reading a diff until it looks fine is the same operation. It builds confidence and not much else.&lt;/p&gt;

&lt;p&gt;So: the decay is invisible by construction, our self-reports are demonstrably inverted, and the review habit we all use produces exactly the false confidence the memory research warns about. Any solution that depends on &lt;em&gt;noticing you have a problem&lt;/em&gt; is dead on arrival.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try this before you read on
&lt;/h2&gt;

&lt;p&gt;Two minutes, on your own code. I'd genuinely like to know what happens.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the last commit or PR you shipped that an AI mostly wrote. Don't read it yet.&lt;/li&gt;
&lt;li&gt;In a scratch file, write what it does, why it was needed, and what breaks if you delete it.&lt;/li&gt;
&lt;li&gt;Now read the diff.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note where you stalled. Not whether you were "right" — where you &lt;em&gt;stalled&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This has a name in cognitive science: the &lt;strong&gt;illusion of explanatory depth&lt;/strong&gt; (Rozenblit &amp;amp; Keil, 2002). People rate their understanding of how things work as high, are asked to produce an actual causal explanation, and then revise their own rating sharply downward. The effect is much stronger for explanatory knowledge than for facts or procedures — meaning it's strongest for precisely the kind of knowing that code review requires. It's also strongest when the mechanism is visible in front of you, which is a fairly brutal description of reading a diff and feeling like you understand it.&lt;/p&gt;

&lt;p&gt;The MIT Media Lab found a version of this last year: participants who wrote essays with an LLM struggled to quote the essay they had finished minutes earlier. Small study, preprint, treat it lightly. But "I shipped this and can't quote it" is a sentence I recognize.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I'm not building a skill score
&lt;/h2&gt;

&lt;p&gt;My first instinct was a dashboard. Measure me. &lt;code&gt;Your coding ability: 73% and falling.&lt;/code&gt; A number, a trend line, and enough dread to keep me honest.&lt;/p&gt;

&lt;p&gt;I'm glad I read the habit-formation literature before writing any code, because that idea is a known failure mode.&lt;/p&gt;

&lt;p&gt;A CHI 2016 study looked at Lift (later Coach.me), one of the most popular habit apps of its era. Streaks and reminders &lt;em&gt;did&lt;/em&gt; drive repetition — that part works. But they created a &lt;strong&gt;dependency&lt;/strong&gt;: the behavior was attached to the app rather than to the person. Users performed for the streak. And then, inevitably, they stopped opening the app — the same paper notes the wider pattern, that around 74% of users abandon health apps after ten uses — and the behavior went with it. The authors' framing is that these features introduce &lt;em&gt;fragility&lt;/em&gt; into exactly the thing they were meant to make durable.&lt;/p&gt;

&lt;p&gt;Extrinsic reward crowding out the internal motive is old, well-replicated psychology. A skill score is that trap wearing a developer hat: gamified anxiety. It tells you you're declining, which feels bad, which makes you avoid the tool, which makes the number worse. Week two you uninstall it.&lt;/p&gt;

&lt;p&gt;And there's a cleaner objection. A score measures output. Understanding isn't output — it's a capacity, and the only way to observe a capacity is to make someone &lt;em&gt;use&lt;/em&gt; it. You cannot report understanding. You can only demonstrate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the usual advice doesn't work either
&lt;/h2&gt;

&lt;p&gt;This is the part I expect people to argue with, so let me be careful.&lt;/p&gt;

&lt;p&gt;Every article on this topic — including the good ones — ends with roughly the same list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;have no-AI days&lt;/li&gt;
&lt;li&gt;try it manually for fifteen minutes first&lt;/li&gt;
&lt;li&gt;20–30 minutes of unassisted problem-solving daily&lt;/li&gt;
&lt;li&gt;close the tool and explain every line out loud&lt;/li&gt;
&lt;li&gt;write the architecture yourself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this advice is wrong. I think all of it works, when done. But look at the shape of it: every item is &lt;strong&gt;discipline-shaped, scheduled, and outside the workflow.&lt;/strong&gt; It's a separate practice, competing for time, sustained by willpower, with no cue and no consequence for skipping it.&lt;/p&gt;

&lt;p&gt;That is structurally the same object as the habit app. It's the pre-app version of the same object. And the reason to expect it to fail is the reason the article gave you in paragraph one: you're being asked to voluntarily add friction to fix a problem &lt;em&gt;you cannot perceive yourself having&lt;/em&gt;, using time pressure as the counterweight, in an industry that measures you on what you shipped, never on whether you understood it.&lt;/p&gt;

&lt;p&gt;Also — the specific advice to "rotate AI-free days" is trying to solve skill decay with abstinence, and the research doesn't actually support that framing. Which brings me to the useful finding.&lt;/p&gt;

&lt;h2&gt;
  
  
  The finding that changed the design
&lt;/h2&gt;

&lt;p&gt;In January 2026 Anthropic published a randomized controlled trial (Shen &amp;amp; Tamkin) that is, as far as I can tell, the most directly relevant study that exists. 52 mostly-junior engineers learned Trio, an async Python library none of them knew. Half had an AI assistant; half had docs and web search.&lt;/p&gt;

&lt;p&gt;The headline is grim and got all the coverage: the AI group scored &lt;strong&gt;50% on the comprehension quiz versus 67%&lt;/strong&gt; for the hand-coders — about two letter grades, on concepts they had used minutes earlier. The largest gap was on the &lt;strong&gt;debugging&lt;/strong&gt; questions, which is the precise skill you need to catch bad AI output. The speed advantage was about two minutes and wasn't statistically significant. Same speed. Much less understanding.&lt;/p&gt;

&lt;p&gt;But the finding nobody quotes is the one underneath it. The researchers identified six distinct interaction patterns, and &lt;strong&gt;three of them preserved learning even with full AI assistance.&lt;/strong&gt; High scorers averaged 65–86%. Low scorers were under 40%. Same tool, same time budget, double the comprehension.&lt;/p&gt;

&lt;p&gt;The three that worked all involved cognitive engagement at the moment of generation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;generate the code, then ask follow-up questions about it&lt;/li&gt;
&lt;li&gt;ask for code &lt;em&gt;and&lt;/em&gt; an explanation together&lt;/li&gt;
&lt;li&gt;ask conceptual questions, then write the code yourself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The three that failed: delegate wholesale, drift into delegation over the session, or use the AI to iteratively fix things without ever understanding them. (Participants in that last group were also &lt;em&gt;slower&lt;/em&gt;.)&lt;/p&gt;

&lt;p&gt;So the variable is not how much AI you use. It's whether an act of retrieval or explanation happens at the point of use. That's a much smaller intervention than "no-AI Fridays," and unlike willpower, it's the kind of thing software can put in front of you at the right moment.&lt;/p&gt;

&lt;p&gt;Microsoft Research and CMU landed in the same place from a different direction at CHI 2025. Surveying 319 knowledge workers across 936 real AI-assisted tasks, they found higher confidence in the AI predicted &lt;em&gt;less&lt;/em&gt; critical thinking, while higher confidence in your own ability predicted more. Their design recommendation was for tools that use "proactive prompts" and act as a &lt;strong&gt;provocateur&lt;/strong&gt; rather than an answer machine.&lt;/p&gt;

&lt;p&gt;I read that and realized the intervention I wanted had already been specified by people with better data than me. Nobody had built it into the place where the work actually happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I want to build
&lt;/h2&gt;

&lt;p&gt;Not a score. Not an app. A &lt;strong&gt;review-time forcing function&lt;/strong&gt; — something in the hook or MCP layer between the agent and the merge, where I already am.&lt;/p&gt;

&lt;p&gt;The agent drafts a change. Before I can rubber-stamp it, it asks me one question:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What does this change do?&lt;/li&gt;
&lt;li&gt;What breaks if we remove it?&lt;/li&gt;
&lt;li&gt;Where's the edge case this misses?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then it does the part that makes it more than a journaling prompt: it &lt;strong&gt;compares my answer to the actual diff&lt;/strong&gt; and shows me where my model diverged. Over time the signal isn't a vibe, it's a record — did my explanation match the code? Did I flag the thing that later broke? That's review accuracy and bug-catch rate, which are evidence, not a self-report.&lt;/p&gt;

&lt;p&gt;Design constraints, all of them derived from something above rather than from taste:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;In-workflow, not an app.&lt;/strong&gt; Out-of-workflow practices are the failure mode of the entire genre.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One question, ~20 seconds.&lt;/strong&gt; Anything longer loses to delivery pressure, which is the honest reason none of us do the 20-minute practice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No score, no streak, no dashboard.&lt;/strong&gt; Lift, and everything downstream of Lift.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explanation-shaped, not recall-shaped.&lt;/strong&gt; The illusion of explanatory depth is where the gap is largest; quizzing trivia would miss it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieval before review, not after.&lt;/strong&gt; Roediger &amp;amp; Karpicke — you have to attempt the answer &lt;em&gt;before&lt;/em&gt; seeing the material, or you've just re-read the diff with extra steps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The adjacent shape I keep sketching is spaced repetition over your own codebase — Anki for the repo. "Why does this function exist?" "What would break if you deleted it?" I think it's weaker: it's out-of-workflow again, and it drifts toward recall when the thing that matters is explanation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I think this might be wrong
&lt;/h2&gt;

&lt;p&gt;Three real holes, and I'd rather name them than get talked out of them in the comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It might become another rubber stamp.&lt;/strong&gt; Anything mandatory gets gamed. I'd type "makes the retry idempotent" seventeen times a day without thinking. Every forced-friction tool ever built has hit this wall, and I don't have a good answer beyond "vary the question and only fire on non-trivial diffs," which is a hope, not a design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Something has to grade the explanation, and that something is an AI.&lt;/strong&gt; Which means I'd be offloading the assessment of whether I understood something to the same class of system whose output I stopped understanding. I think this is survivable — comparing my prose against a diff is a much narrower task than generating the diff — but I notice the shape of it, and it bothers me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The friction lands in the wrong place.&lt;/strong&gt; 66% of developers say their top AI frustration is code that's "almost right, but not quite," and 45% say debugging AI output already takes longer than writing it themselves. Those people are not short on friction. Adding a question to their review might be adding a tax to the exact step that's already the expensive one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question
&lt;/h2&gt;

&lt;p&gt;I'm asking because I have a rule against starting things right now — one flagship for 90 days, everything else goes in a parking lot file. This idea is in the parking lot. It comes out only if the reaction here says it should, so this is a real question with a real consequence, not a call to action.&lt;/p&gt;

&lt;p&gt;Three things, and short answers are genuinely more useful than long ones:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Did you run the two-minute test above?&lt;/strong&gt; What happened — did you stall, or was it fine? Just say "stalled" or "fine" if that's all you've got. I especially want to hear "fine," because if most people are fine then I've written 1,800 words about my own bad habits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's your actual anti-atrophy practice&lt;/strong&gt; — not the one you'd recommend, the one you &lt;em&gt;did&lt;/em&gt; this week?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Would you install this?&lt;/strong&gt; And if you think it's a bad idea, say so plainly. "This would annoy me into uninstalling it in a day" is the most useful comment I could get, and it costs you one line.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I've been assuming that because I can feel the erosion, a tool should exist. The research above says pretty clearly that my feelings about my own competence are not evidence. Yours might be worth more than mine.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources, if you want to check my work: &lt;a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/" rel="noopener noreferrer"&gt;METR RCT (2025)&lt;/a&gt; · &lt;a href="https://www.anthropic.com/research/AI-assistance-coding-skills" rel="noopener noreferrer"&gt;Shen &amp;amp; Tamkin, Anthropic (2026)&lt;/a&gt; · &lt;a href="https://link.springer.com/article/10.1186/s41235-024-00572-8" rel="noopener noreferrer"&gt;Macnamara et al., Cognitive Research (2024)&lt;/a&gt; · &lt;a href="https://www.microsoft.com/en-us/research/wp-content/uploads/2025/01/lee_2025_ai_critical_thinking_survey.pdf" rel="noopener noreferrer"&gt;Lee et al., CHI 2025 (PDF)&lt;/a&gt; · &lt;a href="https://discovery.ucl.ac.uk/1477627/1/Chi%202016%20LBW%202.1%20camera%20ready.pdf" rel="noopener noreferrer"&gt;"Don't Kick the Habit," CHI 2016&lt;/a&gt; · &lt;a href="https://learninglab.psych.purdue.edu/downloads/2006/2006_Roediger_Karpicke_PsychSci.pdf" rel="noopener noreferrer"&gt;Roediger &amp;amp; Karpicke (2006)&lt;/a&gt; · &lt;a href="https://cogdevlab.yale.edu/sites/default/files/files/rozenblit%20%26%20keil%20%202002.pdf" rel="noopener noreferrer"&gt;Rozenblit &amp;amp; Keil (2002)&lt;/a&gt; · &lt;a href="https://survey.stackoverflow.co/2025/ai" rel="noopener noreferrer"&gt;Stack Overflow Developer Survey 2025&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The cheapest model on my plan loses every benchmark. It still beats models charging 14x more.</title>
      <dc:creator>Michael Amachree</dc:creator>
      <pubDate>Fri, 21 Aug 2026 20:38:31 +0000</pubDate>
      <link>https://dev.to/dev_michael/the-cheapest-model-on-my-plan-loses-every-benchmark-it-still-beats-models-charging-14x-more-2po8</link>
      <guid>https://dev.to/dev_michael/the-cheapest-model-on-my-plan-loses-every-benchmark-it-still-beats-models-charging-14x-more-2po8</guid>
      <description>&lt;p&gt;The cheapest model I can run on my plan costs &lt;strong&gt;$0.14&lt;/strong&gt; per million tokens. The one I actually reach for costs &lt;strong&gt;$0.44&lt;/strong&gt;. I put them side by side expecting the cheap one to be &lt;em&gt;close&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;It lost all four benchmarks. Coding, reasoning, math, real-world bug-fixing — four for four.&lt;/p&gt;

&lt;p&gt;I'm still recommending it. Not because it competes with the good models. Because of what it does to the models in the middle.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trade, stated plainly
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;MiMo-V2.5&lt;/th&gt;
&lt;th&gt;Deepseek v4 flash&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Input / 1M&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.14&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.44&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output / 1M&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.28&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$1.32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requests per 5h window&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30,100&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7,600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coding&lt;/td&gt;
&lt;td&gt;56.8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;69.1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reasoning&lt;/td&gt;
&lt;td&gt;38.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;51.8&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;85.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;86.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bug-fixing (SWE-Bench)&lt;/td&gt;
&lt;td&gt;43.1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;49.9&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two numbers matter more than the rest. MiMo gives you roughly &lt;strong&gt;four times as many requests&lt;/strong&gt; before your window empties, at &lt;strong&gt;a third of the input price&lt;/strong&gt;. And it gives up &lt;strong&gt;twelve points of coding ability&lt;/strong&gt; to do it.&lt;/p&gt;

&lt;p&gt;That's the whole decision. Not "which model is better" — which resource you're actually short on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where my instinct was wrong
&lt;/h2&gt;

&lt;p&gt;I went in believing the cheap models had quietly caught up. The number I expected to find was a two- or three-point gap.&lt;/p&gt;

&lt;p&gt;Math cooperated: 85.0 against 86.0. One point. That's noise, and it's a real result — for arithmetic-heavy work the cheap model is simply fine.&lt;/p&gt;

&lt;p&gt;Reasoning did not cooperate. 38.0 against 51.8 is a &lt;strong&gt;27% drop&lt;/strong&gt;, the widest gap of the four. On paper that reads like a rounding difference. In practice it's the difference between a model that follows a four-step refactor and one that loses the thread at step two and confidently ships step three.&lt;/p&gt;

&lt;p&gt;So "close enough" was wrong, and it was wrong in the direction that costs you the most: the reasoning gap is exactly the gap you feel when you hand a model something ambiguous.&lt;/p&gt;

&lt;h2&gt;
  
  
  The comparison I should have run first
&lt;/h2&gt;

&lt;p&gt;The interesting fight was never cheap-versus-best. Look at what sits &lt;em&gt;between&lt;/em&gt; them.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Coding&lt;/th&gt;
&lt;th&gt;Input / 1M&lt;/th&gt;
&lt;th&gt;Requests / 5h&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MiMo-V2.5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;56.8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.14&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30,100&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.7-Plus&lt;/td&gt;
&lt;td&gt;55.9&lt;/td&gt;
&lt;td&gt;$1.20&lt;/td&gt;
&lt;td&gt;4,300&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM-5.1&lt;/td&gt;
&lt;td&gt;55.8&lt;/td&gt;
&lt;td&gt;$1.40&lt;/td&gt;
&lt;td&gt;880&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.6 Plus&lt;/td&gt;
&lt;td&gt;54.5&lt;/td&gt;
&lt;td&gt;$2.00&lt;/td&gt;
&lt;td&gt;3,300&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The $0.14 model beats all three.&lt;/p&gt;

&lt;p&gt;Qwen3.6 Plus charges &lt;strong&gt;fourteen times more per input token&lt;/strong&gt; and codes a point and a half worse. GLM-5.1 charges ten times more, scores a point lower, and burns your quota &lt;strong&gt;thirty-four times faster&lt;/strong&gt; — 880 requests against 30,100.&lt;/p&gt;

&lt;p&gt;That's the finding. The floor didn't rise to meet the ceiling. It rose to swallow the middle. Every model priced between one and two dollars is now paying a premium for benchmark scores it doesn't actually have, and the only reason that isn't obvious is that nobody puts price, benchmark, and quota burn in the same row.&lt;/p&gt;

&lt;p&gt;Which is the entire reason I built the thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "cheapest" needs an asterisk
&lt;/h2&gt;

&lt;p&gt;MiMo-V2.5 isn't literally the cheapest model on my plan. There's one below it: &lt;strong&gt;Muse spark 1.2 contributor&lt;/strong&gt;, at $0.10/$0.20, with 45,300 requests per window and a coding score of 72.2 — better than DeepSeek, at a quarter of the price.&lt;/p&gt;

&lt;p&gt;That combination doesn't happen by accident. The word &lt;em&gt;contributor&lt;/em&gt; is sitting right there in the model name. I don't have documentation explaining the arrangement, so I'm not going to assert one. I'll say this instead: when one model is cheaper, faster-burning, &lt;em&gt;and&lt;/em&gt; better than everything around it, the price is buying something other than compute. Treat it as an outlier until you know what.&lt;/p&gt;

&lt;p&gt;Set it aside and MiMo-V2.5 is the floor. Hy3 ties it on input price at $0.14 and actually out-codes it slightly at 58.8 — but charges twice as much on output and gives you 4,300 requests instead of 30,100.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I got wrong building this
&lt;/h2&gt;

&lt;p&gt;The first version of my burn scoring inferred quota cost from price. Cheaper token, slower burn. It seemed obviously true.&lt;/p&gt;

&lt;p&gt;It was wrong, and it was wrong in an embarrassing direction: it ranked expensive models as quota-hungry even when the provider gave them generous request allowances, and it flattered cheap models that burn through a window fast. I was measuring the thing I could see instead of the thing I cared about.&lt;/p&gt;

&lt;p&gt;The fix was to stop inferring and start reading — the published request counts per window, straight from the docs. That's when the table started disagreeing with my intuitions, which is when it started being useful. The MiMo-versus-middle finding above only exists because burn stopped being a function of price.&lt;/p&gt;

&lt;p&gt;There's still a bug I haven't fixed: at the low end, a couple of models render a burn band that disagrees with their own request count. It's on my list. I'd rather say that here than have you find it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this doesn't tell you
&lt;/h2&gt;

&lt;p&gt;Benchmarks are a proxy and a coarse one. A twelve-point coding gap is real, but I can't tell you it maps cleanly onto your codebase, your language, or your prompting habits. Some of these scores come from different evaluation suites and get normalized to sit in the same column — that normalization is a judgment call, and it's mine.&lt;/p&gt;

&lt;p&gt;Nothing here is hand-curated. Scores, tags, and burn bands are all computed from three upstream sources, so when they update, my conclusions change without my permission. That's the design. It also means I'm occasionally wrong in public.&lt;/p&gt;

&lt;p&gt;And I have no historical data. I can tell you what the board looks like right now. I can't tell you what moved.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I actually want to argue about
&lt;/h2&gt;

&lt;p&gt;I think most people pick a model once, by reputation, and never revisit it — and then spend the rest of the month rationing requests they didn't need to ration.&lt;/p&gt;

&lt;p&gt;The table is free, needs no account, and links every number back to its source: &lt;strong&gt;&lt;a href="https://zp.svelte-apps.me" rel="noopener noreferrer"&gt;zp.svelte-apps.me&lt;/a&gt;&lt;/strong&gt; · code at &lt;strong&gt;&lt;a href="https://github.com/Michael-Obele/zenpick" rel="noopener noreferrer"&gt;github.com/Michael-Obele/zenpick&lt;/a&gt;&lt;/strong&gt; · &lt;a href="https://github.com/Michael-Obele/zenpick/issues" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt; if a number looks wrong to you, because sometimes it is.&lt;/p&gt;

&lt;p&gt;So: &lt;strong&gt;when you're choosing a model, are you short on capability or short on requests?&lt;/strong&gt; I've been answering that question wrong for months — optimizing for the smartest model I could afford, then quietly avoiding using it. Curious whether anyone else has caught themselves doing the same thing.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>ai</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Got Tired of Guessing OpenCode Go Models — So I Built a Live Fit + Burn Dashboard</title>
      <dc:creator>Michael Amachree</dc:creator>
      <pubDate>Wed, 29 Jul 2026 05:55:02 +0000</pubDate>
      <link>https://dev.to/dev_michael/i-got-tired-of-guessing-opencode-go-models-so-i-built-a-live-fit-burn-dashboard-545d</link>
      <guid>https://dev.to/dev_michael/i-got-tired-of-guessing-opencode-go-models-so-i-built-a-live-fit-burn-dashboard-545d</guid>
      <description>&lt;h2&gt;
  
  
  I Got Tired of Guessing OpenCode Go Models — So I Built a Live Fit + Burn Dashboard
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://zp.svelte-apps.me/" rel="noopener noreferrer"&gt;zp.svelte-apps.me&lt;/a&gt;&lt;/strong&gt; · open source: &lt;a href="https://github.com/Michael-Obele/zenpick" rel="noopener noreferrer"&gt;github.com/Michael-Obele/zenpick&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  TL;DR
&lt;/h3&gt;

&lt;p&gt;&lt;a&gt;OpenCode Go&lt;/a&gt; is $10/month for 13+ curated open coding models — &lt;strong&gt;the first month is $5 anyway&lt;/strong&gt; (their standard intro offer), and if you sign up through my link we each get an extra $5 credit on top. The hard part isn't the price — it's picking the right one without torching your quota. &lt;strong&gt;ZenPick is the focus here:&lt;/strong&gt; it's a free, open-source dashboard that ranks every Go model by &lt;strong&gt;task fit&lt;/strong&gt; and &lt;strong&gt;quota burn&lt;/strong&gt; so you can decide in 10 seconds. Built with Svelte 5 + SvelteKit.&lt;/p&gt;




&lt;h2&gt;
  
  
  The decision that actually hurt
&lt;/h2&gt;

&lt;p&gt;OpenCode Go is a strong deal. One subscription, $10/month, 13+ models. DeepSeek, Qwen, Kimi, GLM, MiMo, and more.&lt;/p&gt;

&lt;p&gt;But Go usage limits are defined in &lt;strong&gt;dollar value&lt;/strong&gt;, not request counts.&lt;/p&gt;

&lt;p&gt;Pick a cheap workhorse and you can run &lt;strong&gt;tens of thousands&lt;/strong&gt; of requests per 5-hour window. Pick a premium reasoning model and you might land under &lt;strong&gt;a thousand&lt;/strong&gt; in the same window.&lt;/p&gt;

&lt;p&gt;Same tier, wildly different economics. Pick wrong for a long agentic session and you can burn a large chunk of your monthly quota in an afternoon. Pick too cheap for a hard reasoning task and you waste hours on weak output.&lt;/p&gt;

&lt;p&gt;The docs give you a markdown table. Cross-referencing benchmarks, request volume, pricing, and task fit across 13+ models in a table is a bad developer experience.&lt;/p&gt;

&lt;p&gt;So I built ZenPick.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three questions, answered fast
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Which model fits my task?
&lt;/h3&gt;

&lt;p&gt;Every model gets an &lt;strong&gt;algorithmic fit score (0–100)&lt;/strong&gt; across six scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Brainstorming&lt;/strong&gt; — open-ended ideation, long context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coding&lt;/strong&gt; — coding benchmarks + tools/speed/uptime fit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitive&lt;/strong&gt; — hard one-shot reasoning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic&lt;/strong&gt; — long multi-step runs, stability signals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend UI&lt;/strong&gt; — Design Arena Elo + intelligence + coding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budget&lt;/strong&gt; — cheapest option that still ranks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scores are weighted blends of real signals — Artificial Analysis TrueSkill for coding, Design Arena Elo for UI preference, context and tooling for agentic fit. Missing data doesn't zero a model out of the ranking. The table is never empty, and ordering stays meaningful.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. How fast will it burn my quota?
&lt;/h3&gt;

&lt;p&gt;Each model gets a &lt;strong&gt;thermal burn&lt;/strong&gt; classification from blended price per million tokens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❄️ &lt;strong&gt;Slow burn&lt;/strong&gt; (&amp;lt; $1.50) — volume workhorse&lt;/li&gt;
&lt;li&gt;🌡️ &lt;strong&gt;Moderate&lt;/strong&gt; ($1.50 – $6.00) — daily driver&lt;/li&gt;
&lt;li&gt;🔥 &lt;strong&gt;Fast burn&lt;/strong&gt; (&amp;gt; $6.00) — premium / focused sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The table also surfaces request estimates per window so the economics are visible &lt;em&gt;before&lt;/em&gt; you start a long run.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. What does it replace from a closed-source workflow?
&lt;/h3&gt;

&lt;p&gt;Open any row's detail drawer for &lt;strong&gt;migration hints&lt;/strong&gt; — e.g. if you used a frontier Sonnet-class model, which Go model is the closest practical stand-in. Plus pricing, benchmarks, quota estimates, and one-tap model ID copy for your OpenCode config.&lt;/p&gt;




&lt;h2&gt;
  
  
  What actually shipped
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Scenario pills + search.&lt;/strong&gt; Tap Brainstorming, Coding, Competitive, Agentic, Frontend UI, or Budget. The table re-ranks by fit for that job. Search narrows by name or provider. You can go from "13+ models" to "two agentic options that won't torch quota" in a few seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sortable model table.&lt;/strong&gt; Sort by name, benchmarks, price, quota requests, scenario fit, or burn. Scenario filter and sort are independent — e.g. Budget scenario, then sort by coding score.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model drawer.&lt;/strong&gt; Click a row for benchmark bars, pricing per 1M tokens, request estimates (5h / week / month), migration hints, &lt;strong&gt;Add to compare&lt;/strong&gt;, and &lt;strong&gt;Copy model ID&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Side-by-side compare (up to 4).&lt;/strong&gt; Open Compare. Each row highlights the winner; ties stay unhighlighted. Benchmarks, pricing, context, speed, burn, scenario fit, tags, and migration sit in one grid.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ask AI.&lt;/strong&gt; From compare, jump into Grok, ChatGPT, Claude, or Gemini with a &lt;strong&gt;pre-filled prompt&lt;/strong&gt; that already includes the live ZenPick stats for the selected models. You bring the task; the context is already there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quota calculator.&lt;/strong&gt; Estimate tokens per request for &lt;em&gt;your&lt;/em&gt; session pattern and see how request counts shift. Official tables assume fixed patterns; real agent runs often don't.&lt;/p&gt;




&lt;h2&gt;
  
  
  The build
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Svelte 5 runes · SvelteKit · Tailwind v4 · shadcn-svelte · Bits UI · Bun.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remote functions for data.&lt;/strong&gt; Model loading lives as a SvelteKit &lt;strong&gt;remote query&lt;/strong&gt;, not a pile of ad-hoc client fetches. It fetches Go models, modelgrep, and llm-stats in &lt;strong&gt;parallel&lt;/strong&gt;, matches each Go model across sources, runs inference (tags, scenario scores, burn, migration hints), and serves through a &lt;strong&gt;6-hour stale-while-revalidate&lt;/strong&gt; cache. So you get a fast page and data that isn't days old, without burning your own rate limits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-source blending, honest and field-specific.&lt;/strong&gt; You can't naively average every benchmark. Methodologies differ.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Primary&lt;/th&gt;
&lt;th&gt;Fallback / blend&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Coding&lt;/td&gt;
&lt;td&gt;modelgrep AA TrueSkill&lt;/td&gt;
&lt;td&gt;llm-stats only if modelgrep missing — &lt;strong&gt;no average&lt;/strong&gt; (different scales)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reasoning&lt;/td&gt;
&lt;td&gt;modelgrep AA TrueSkill&lt;/td&gt;
&lt;td&gt;llm-stats only when outlier-safe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;GPQA + llm-stats math&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Blend&lt;/strong&gt; when both are 0–1 accuracy-style scores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Design Arena Elo&lt;/td&gt;
&lt;td&gt;modelgrep&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;False precision is worse than a clear primary source. The UI prefers honesty over a single "magic number."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Algorithmic scenario scoring.&lt;/strong&gt; Each scenario has its own weighted blend. The Frontend UI score leans heavy on Design Arena Elo (human preference), with some general intelligence and a touch of coding. If every input is missing, the model gets a neutral floor (0.5) — not zero — so the table stays comparable. The pattern repeats for the other five scenarios with their own field weights.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Svelte 5 runes end-to-end.&lt;/strong&gt; No legacy &lt;code&gt;$:&lt;/code&gt; or &lt;code&gt;export let&lt;/code&gt;. UI state uses &lt;code&gt;$state&lt;/code&gt; / &lt;code&gt;$derived&lt;/code&gt; / &lt;code&gt;$props&lt;/code&gt;. Compare selection is a small client store; the compare route keeps &lt;code&gt;?models=&lt;/code&gt; in sync for shareable links.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Benchmark field names lie.&lt;/strong&gt; Upstream labels aren't always what they sound like. Verify what a score measures before you put it in a column header. One wrong label trains users to distrust the whole table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Blending requires methodology discipline.&lt;/strong&gt; Averaging TrueSkill-style ranks with 0–1 composites produces a number that &lt;em&gt;feels&lt;/em&gt; precise and &lt;em&gt;is&lt;/em&gt; nonsense. Field-specific primary/fallback rules beat "average everything."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Continuous fit scores beat tags.&lt;/strong&gt; v1-style tag filters (&lt;code&gt;coding&lt;/code&gt;, &lt;code&gt;tools&lt;/code&gt;) go stale and create fake ties. A 0–100 score from live signals is harder to build and much more useful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Stale-while-revalidate is the right default for this dashboard.&lt;/strong&gt; Nobody needs millisecond-fresh Elo on every paint. They need a fast page and data that isn't days old. 6h TTL + SWR hits both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Compare + Ask AI closes the last mile.&lt;/strong&gt; A ranked table answers "what's good." A 4-model grid + a pre-filled AI chat answers "for &lt;em&gt;my&lt;/em&gt; task, tonight, which two should I try?"&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick picks (starting points — not guarantees)
&lt;/h2&gt;

&lt;p&gt;Live scores move. Treat this as a &lt;strong&gt;compass&lt;/strong&gt;, then verify in ZenPick:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;th&gt;Start here&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Daily workhorse / high volume&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;DeepSeek V4 Flash&lt;/strong&gt; (slow burn, high request density)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard reasoning + tough coding&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Qwen3.7 Max&lt;/strong&gt; (premium; use deliberately)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Long agentic sessions&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;MiMo-V2.5-Pro&lt;/strong&gt; or &lt;strong&gt;Kimi K2.7 Code&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max requests / tight budget&lt;/td&gt;
&lt;td&gt;Cheapest strong coding option in the &lt;strong&gt;Budget&lt;/strong&gt; scenario (often MiMo-class)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend / UI generation&lt;/td&gt;
&lt;td&gt;Highest &lt;strong&gt;Design Arena&lt;/strong&gt; / Frontend UI fit in the current lineup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If your real sessions disagree with the table, that's useful signal — open an issue.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🔗 &lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://zp.svelte-apps.me/" rel="noopener noreferrer"&gt;zp.svelte-apps.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/Michael-Obele/zenpick" rel="noopener noreferrer"&gt;github.com/Michael-Obele/zenpick&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 &lt;strong&gt;About / methodology:&lt;/strong&gt; &lt;a href="https://zp.svelte-apps.me/about" rel="noopener noreferrer"&gt;zp.svelte-apps.me/about&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;⚖️ &lt;strong&gt;Compare:&lt;/strong&gt; &lt;a href="https://zp.svelte-apps.me/compare" rel="noopener noreferrer"&gt;zp.svelte-apps.me/compare&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;&lt;a href="https://opencode.ai/go?ref=7H224A2F11" rel="noopener noreferrer"&gt;OpenCode Go&lt;/a&gt;&lt;/strong&gt; — $10/month, 13+ models. First month is $5 standard; my link adds another $5 credit on top (we both get it).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;modelgrep and the OpenCode Go model list work without keys; llm-stats enrichment is better with an API key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Already on GitHub Copilot in VSCode?&lt;/strong&gt; You can route OpenCode Go through your existing setup with the &lt;a href="https://marketplace.visualstudio.com/items?itemName=OnesoftQwQ.opencode-go-copilot-provider" rel="noopener noreferrer"&gt;opencode-go-copilot-provider&lt;/a&gt; extension — no separate config dance. (I use it myself; ZenPick picks the model, the extension routes it.)&lt;/p&gt;




&lt;h2&gt;
  
  
  Honest limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fit scores and burn tiers are &lt;strong&gt;derived&lt;/strong&gt;, not hand-curated editorials.&lt;/li&gt;
&lt;li&gt;Benchmarks lag releases; a brand-new Go model may show thin data until upstream catches up.&lt;/li&gt;
&lt;li&gt;Request estimates depend on assumed token patterns — use the calculator for your workflow.&lt;/li&gt;
&lt;li&gt;ZenPick doesn't replace reading &lt;a href="https://opencode.ai/docs/go/" rel="noopener noreferrer"&gt;OpenCode Go docs&lt;/a&gt; for billing, privacy, and plan rules.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's your biggest Go pain right now?
&lt;/h2&gt;

&lt;p&gt;Is it picking the right model, budgeting the burn, migrating from a closed-source workflow, or something else entirely?&lt;/p&gt;

&lt;p&gt;I'm collecting real stories from people using OpenCode Go to figure out what to build next. Drop a comment with your Tuesday problem — I'll dig into the patterns.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with Svelte 5, SvelteKit, Tailwind v4, shadcn-svelte, and Bun.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Data attribution: modelgrep, llm-stats, OpenCode Go — see the About page.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>sveltekit</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built Tech Invoice Forge: an Offline-First Invoice App for Tech Freelancers</title>
      <dc:creator>Michael Amachree</dc:creator>
      <pubDate>Fri, 03 Apr 2026 13:03:59 +0000</pubDate>
      <link>https://dev.to/dev_michael/i-built-tech-invoice-forge-an-offline-first-invoice-app-for-tech-freelancers-41p7</link>
      <guid>https://dev.to/dev_michael/i-built-tech-invoice-forge-an-offline-first-invoice-app-for-tech-freelancers-41p7</guid>
      <description>&lt;p&gt;Most invoicing tools follow the same pattern: create an account, connect to a cloud app, hand over your data, and pay monthly for the privilege of sending a PDF.&lt;/p&gt;

&lt;p&gt;That model works for some people. It never felt right for me.&lt;/p&gt;

&lt;p&gt;I wanted something simpler: a professional invoicing tool that runs entirely in the browser, stores data locally, works offline, and generates clean PDFs instantly without a backend. That is what Tech Invoice Forge is.&lt;/p&gt;

&lt;p&gt;Tech Invoice Forge is a local-first invoice and receipt generator built for tech professionals, freelancers, and small teams who want speed, privacy, and control without subscription friction.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Tech Invoice Forge does
&lt;/h2&gt;

&lt;p&gt;At its core, Tech Invoice Forge lets you create invoices, preview them live, save them locally, and export them as PDFs or JSON.&lt;/p&gt;

&lt;p&gt;The experience is intentionally straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fill in sender and client details&lt;/li&gt;
&lt;li&gt;Add line items, tax, and discounts&lt;/li&gt;
&lt;li&gt;Watch the PDF preview update as you type&lt;/li&gt;
&lt;li&gt;Save everything locally in the browser&lt;/li&gt;
&lt;li&gt;Download the finished invoice instantly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no account to create and no server round trip for the core workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why build it this way?
&lt;/h2&gt;

&lt;p&gt;I kept running into the same frustration with cloud invoicing software: too much overhead for a simple task.&lt;/p&gt;

&lt;p&gt;If all I need is to generate a clean invoice and send it, why should I have to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create an account&lt;/li&gt;
&lt;li&gt;trust a third-party cloud database&lt;/li&gt;
&lt;li&gt;wait for server-side rendering&lt;/li&gt;
&lt;li&gt;pay for features I do not need&lt;/li&gt;
&lt;li&gt;worry about my invoice history living somewhere else&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tech Invoice Forge is my answer to that problem.&lt;/p&gt;

&lt;p&gt;The goal was not to make a bloated finance platform. The goal was to make a fast, reliable, privacy-first invoicing tool that feels like a native part of the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes it different
&lt;/h2&gt;

&lt;p&gt;Tech Invoice Forge is built around a few ideas that matter a lot in practice.&lt;/p&gt;

&lt;h3&gt;
  
  
  It works offline by default
&lt;/h3&gt;

&lt;p&gt;All core data lives locally in IndexedDB. That means invoices, client records, and profile details stay on the device unless you choose to move them elsewhere later.&lt;/p&gt;

&lt;h3&gt;
  
  
  It gives instant feedback
&lt;/h3&gt;

&lt;p&gt;The invoice preview updates as you type, so you can see the final document without waiting for a server response.&lt;/p&gt;

&lt;h3&gt;
  
  
  It keeps the workflow lightweight
&lt;/h3&gt;

&lt;p&gt;The app includes the essentials without forcing unnecessary complexity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sender profile management&lt;/li&gt;
&lt;li&gt;saved client records&lt;/li&gt;
&lt;li&gt;invoice history&lt;/li&gt;
&lt;li&gt;multiple templates&lt;/li&gt;
&lt;li&gt;currency support&lt;/li&gt;
&lt;li&gt;notes and terms&lt;/li&gt;
&lt;li&gt;PDF export&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  It stays out of your way
&lt;/h3&gt;

&lt;p&gt;The app is designed to feel clean and professional, not crowded. You can open it, create an invoice, and get back to work quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick tour of the product
&lt;/h2&gt;

&lt;p&gt;The public site is split into a few simple experiences.&lt;/p&gt;

&lt;p&gt;The landing page positions the app as a local-first alternative to cloud invoicing tools. It focuses on the promise: no accounts, no backend, no monthly subscription just to create a PDF.&lt;/p&gt;

&lt;p&gt;The pricing page makes the product direction explicit. There is a Local Edition for people who want a self-contained workflow, and a Cloud Sync waitlist for users who may eventually want cross-device access and team features.&lt;/p&gt;

&lt;p&gt;The invoice editor is where the product matters most. It includes sender details, client details, invoice metadata, line items, discounts, notes, and a live preview panel that shows the rendered result as you work.&lt;/p&gt;

&lt;p&gt;The profile area keeps business details and client data organized so creating the next invoice is faster than starting from scratch every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack behind it
&lt;/h2&gt;

&lt;p&gt;I built Tech Invoice Forge with a modern Svelte stack because the product benefits from being fast and reactive at the UI layer.&lt;/p&gt;

&lt;p&gt;The current stack includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Svelte 5&lt;/li&gt;
&lt;li&gt;SvelteKit 2&lt;/li&gt;
&lt;li&gt;Tailwind CSS v4&lt;/li&gt;
&lt;li&gt;IndexedDB for local persistence&lt;/li&gt;
&lt;li&gt;Valibot for validation&lt;/li&gt;
&lt;li&gt;pdfmake for PDF generation&lt;/li&gt;
&lt;li&gt;Lucide icons for the interface&lt;/li&gt;
&lt;li&gt;Bun for development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That combination fits the product well. The browser handles the entire workflow, and the app stays responsive while the user is entering data and previewing documents.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned building it
&lt;/h2&gt;

&lt;p&gt;The biggest lesson was that local-first software can feel better than cloud software when the problem is narrow and repetitive.&lt;/p&gt;

&lt;p&gt;For invoicing, most users do not need a giant platform. They need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;speed&lt;/li&gt;
&lt;li&gt;privacy&lt;/li&gt;
&lt;li&gt;reliability&lt;/li&gt;
&lt;li&gt;good defaults&lt;/li&gt;
&lt;li&gt;a clean export path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you remove the account wall and the backend dependency, the product becomes easier to trust and easier to use.&lt;/p&gt;

&lt;p&gt;I also learned that a small set of thoughtful features is usually more valuable than a long list of generic ones. If the preview is instant, the data is local, and the PDF looks professional, the app already solves the core job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;Tech Invoice Forge is a good fit for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;freelancers who want a fast invoice workflow&lt;/li&gt;
&lt;li&gt;developers who prefer local-first tools&lt;/li&gt;
&lt;li&gt;agencies that want a lightweight billing tool&lt;/li&gt;
&lt;li&gt;anyone who does not want their invoice data tied to a cloud account&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you care about privacy, portability, and a low-friction workflow, this kind of app makes a lot of sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing thoughts
&lt;/h2&gt;

&lt;p&gt;I built Tech Invoice Forge because invoicing should not feel like signing up for another subscription service.&lt;/p&gt;

&lt;p&gt;It should feel like opening a tool, doing the work, and getting a clean result immediately.&lt;/p&gt;

&lt;p&gt;If that sounds useful, try the live demo and see how it feels in practice.&lt;/p&gt;

&lt;p&gt;Live demo: &lt;a href="https://tif.svelte-apps.me" rel="noopener noreferrer"&gt;https://tif.svelte-apps.me&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Michael-Obele/tif" rel="noopener noreferrer"&gt;https://github.com/Michael-Obele/tif&lt;/a&gt;&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>sveltekit</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>DocShark: a local-first documentation MCP server for AI</title>
      <dc:creator>Michael Amachree</dc:creator>
      <pubDate>Thu, 19 Mar 2026 10:39:23 +0000</pubDate>
      <link>https://dev.to/dev_michael/docshark-a-local-first-documentation-mcp-server-for-ai-ia9</link>
      <guid>https://dev.to/dev_michael/docshark-a-local-first-documentation-mcp-server-for-ai-ia9</guid>
      <description>&lt;h2&gt;
  
  
  DocShark: documentation for AI, served locally
&lt;/h2&gt;

&lt;p&gt;Most AI tools are only as good as the documentation they can reach.&lt;br&gt;
When the docs are spread across websites, rendered client-side, or buried behind a maze of pages, the context you get back is often incomplete or stale.&lt;/p&gt;

&lt;p&gt;That is the problem DocShark is built to solve.&lt;/p&gt;

&lt;p&gt;DocShark is a fast, local-first &lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; server that scrapes, indexes, and serves documentation from any website. It turns documentation into a local knowledge base that your AI tools can search instantly, without depending on a cloud service or an API key.&lt;/p&gt;

&lt;p&gt;Live site:&lt;br&gt;


&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://dsharkd.svelte-apps.me/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;dsharkd.svelte-apps.me&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;GitHub: &lt;a href="https://github.com/Michael-Obele/docshark" rel="noopener noreferrer"&gt;https://github.com/Michael-Obele/docshark&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What DocShark does
&lt;/h2&gt;

&lt;p&gt;At a high level, DocShark does four things well:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crawls documentation websites.&lt;/li&gt;
&lt;li&gt;Extracts the useful content and converts it to clean Markdown.&lt;/li&gt;
&lt;li&gt;Breaks pages into context-aware chunks.&lt;/li&gt;
&lt;li&gt;Makes the result searchable through MCP and the CLI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result is a local documentation layer that works with coding agents, desktop clients, and terminal workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;There are already tools that can fetch docs, but many of them only work for a narrow source type or rely on heavier infrastructure.&lt;/p&gt;

&lt;p&gt;DocShark focuses on a simpler model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;documentation websites, not just GitHub repos&lt;/li&gt;
&lt;li&gt;local storage, not a remote index&lt;/li&gt;
&lt;li&gt;SQLite FTS5, not a hosted search backend&lt;/li&gt;
&lt;li&gt;Bun-first tooling, not a large runtime stack&lt;/li&gt;
&lt;li&gt;MCP compatibility, so AI clients can use it directly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That combination makes it useful both for individual developers and for people building agent workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  How DocShark compares
&lt;/h2&gt;

&lt;p&gt;Context7 is the obvious comparison point because it also solves the "AI needs current documentation" problem. It is strong when you want a hosted documentation service that injects up-to-date library docs and examples into your prompt.&lt;/p&gt;

&lt;p&gt;DocShark takes a different path. It is better when you want to index real documentation websites, keep everything local, avoid API keys and rate limits, and use one tool for both MCP and CLI workflows.&lt;/p&gt;

&lt;p&gt;Here is the practical tradeoff:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Strengths&lt;/th&gt;
&lt;th&gt;Limitations&lt;/th&gt;
&lt;th&gt;Where DocShark wins&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Context7&lt;/td&gt;
&lt;td&gt;Fresh version-specific docs, code examples, MCP integration, polished onboarding&lt;/td&gt;
&lt;td&gt;Cloud service, API key/rate-limit considerations, focused on supported libraries rather than arbitrary websites&lt;/td&gt;
&lt;td&gt;DocShark is better if you want a local-first index for any documentation site and no external dependency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docfork&lt;/td&gt;
&lt;td&gt;Broad library coverage, up-to-date docs, open source, easy access to software library docs&lt;/td&gt;
&lt;td&gt;Optimized for library documentation rather than arbitrary rendered documentation sites&lt;/td&gt;
&lt;td&gt;DocShark is better for crawling and indexing any docs website, including custom or rendered docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deepcon&lt;/td&gt;
&lt;td&gt;Strong documentation retrieval for AI workflows, cloud-hosted convenience&lt;/td&gt;
&lt;td&gt;More service-oriented than local-first, and it is narrower in how you manage your own source set&lt;/td&gt;
&lt;td&gt;DocShark is better if you want to own the index and control exactly what gets crawled and stored&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitMCP / GitHub repo tools&lt;/td&gt;
&lt;td&gt;Great for repository-centric docs and code browsing&lt;/td&gt;
&lt;td&gt;Best when the source of truth lives in GitHub, not when the docs are published on a separate site&lt;/td&gt;
&lt;td&gt;DocShark is better for public docs sites, rendered pages, and documentation that is not tied to one repo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-library MCP servers&lt;/td&gt;
&lt;td&gt;Very targeted, often simple to set up for one project&lt;/td&gt;
&lt;td&gt;They do not scale well when you need to switch between many libraries&lt;/td&gt;
&lt;td&gt;DocShark is better as a single general-purpose server for multiple sources&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you want the shortest summary: Context7 is a strong hosted documentation service, but DocShark is the better alternative for local-first workflows, broader website coverage, and users who want to keep the whole documentation layer under their control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core features
&lt;/h2&gt;


&lt;div class="crayons-card c-embed"&gt;

  
&lt;h3&gt;
  
  
  Any documentation site
&lt;/h3&gt;

&lt;p&gt;DocShark is not limited to source repositories. It can crawl public documentation sites and index their rendered content, which makes it useful for modern docs that are built from multiple routes, dynamic pages, or generated content.&lt;/p&gt;
&lt;h3&gt;
  
  
  Smart extraction
&lt;/h3&gt;

&lt;p&gt;The scraper is designed to pull out the main content and discard the noise. Navigation, sidebars, and other non-essential layout elements are removed so the indexed result is easier for an AI assistant to use.&lt;/p&gt;
&lt;h3&gt;
  
  
  Semantic chunking
&lt;/h3&gt;

&lt;p&gt;Pages are split by heading structure so the search results preserve context. That matters because a search result is only useful if it still knows where it came from in the document.&lt;/p&gt;
&lt;h3&gt;
  
  
  SQLite + FTS5 search
&lt;/h3&gt;

&lt;p&gt;DocShark uses SQLite with FTS5 for full-text search, which keeps the entire experience local and fast.&lt;/p&gt;

&lt;p&gt;That gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;instant keyword search&lt;/li&gt;
&lt;li&gt;offline access once content is indexed&lt;/li&gt;
&lt;li&gt;no external search provider&lt;/li&gt;
&lt;li&gt;no dependency on cloud APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  JS-rendered site support
&lt;/h3&gt;

&lt;p&gt;Many docs sites are not simple static HTML pages.&lt;br&gt;
DocShark supports rendered documentation sites, so it can work with sites that rely on JavaScript for content delivery.&lt;/p&gt;
&lt;h3&gt;
  
  
  Polite crawling
&lt;/h3&gt;

&lt;p&gt;The crawler respects site structure and includes rate limiting and robots-aware behavior so it is safer to use against public documentation sites.&lt;/p&gt;
&lt;h3&gt;
  
  
  MCP server + CLI
&lt;/h3&gt;

&lt;p&gt;DocShark exposes the same knowledge base through both an MCP server and a Bun-first CLI. That gives you two ways to work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;agent integrations for AI tools&lt;/li&gt;
&lt;li&gt;direct terminal commands for indexing, searching, and maintenance

&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  The workflow
&lt;/h2&gt;

&lt;p&gt;Using DocShark usually looks like this:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Add a documentation site
&lt;/h3&gt;

&lt;p&gt;Point DocShark at a docs URL to begin crawling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bunx docshark add https://svelte.dev/docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Search the indexed content
&lt;/h3&gt;

&lt;p&gt;Once the content is indexed, you can search for the exact topic you need.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bunx docshark search &lt;span class="s2"&gt;"query syntax"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Connect your AI tool
&lt;/h3&gt;

&lt;p&gt;Because DocShark speaks MCP, you can connect it to compatible clients and let the assistant query your documentation library directly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"docshark"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bunx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docshark"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--stdio"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  CLI features
&lt;/h2&gt;

&lt;p&gt;DocShark includes a practical set of commands for day-to-day use:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;start&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runs the MCP server in HTTP or STDIO mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;add&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Adds a new documentation source and starts crawling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rename&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Renames an existing library without changing content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Searches the indexed documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lists indexed libraries and their status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;refresh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Re-crawls an existing library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;remove&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deletes a library and its indexed content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns the full markdown content for a page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;info&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shows details and indexed pages for a library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Checks for or installs a newer Bun release&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That command surface makes the project useful even if you never connect it to an AI client.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP tools
&lt;/h2&gt;

&lt;p&gt;On the protocol side, DocShark exposes a compact but useful toolset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;manage_library&lt;/code&gt; to add, rename, refresh, inspect, or remove a library&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;search_docs&lt;/code&gt; to search across indexed content&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;list_libraries&lt;/code&gt; to inspect what is available&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_doc_page&lt;/code&gt; to retrieve a full page in markdown form&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those tools are designed to map naturally to how people actually work with documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is inside the stack
&lt;/h2&gt;

&lt;p&gt;DocShark keeps the stack intentionally small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bun for runtime and CLI execution&lt;/li&gt;
&lt;li&gt;SQLite for persistence&lt;/li&gt;
&lt;li&gt;FTS5 for search&lt;/li&gt;
&lt;li&gt;Readability.js for extracting the main content&lt;/li&gt;
&lt;li&gt;Turndown with GFM support for Markdown conversion&lt;/li&gt;
&lt;li&gt;Valibot for validation&lt;/li&gt;
&lt;li&gt;CAC for the CLI parser and command dispatch&lt;/li&gt;
&lt;li&gt;TMCP for the protocol server&lt;/li&gt;
&lt;li&gt;A shared library service that powers both the CLI and MCP server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The current MCP surface is intentionally compact:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;manage_library&lt;/code&gt; for add, rename, refresh, inspect, and remove workflows&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;search_docs&lt;/code&gt; for ranked search&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;list_libraries&lt;/code&gt; for discovery&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_doc_page&lt;/code&gt; for full-page retrieval&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That choice keeps the project local, fast, and easier to reason about than a larger server stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who it is for
&lt;/h2&gt;

&lt;p&gt;DocShark is a good fit if you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use AI coding assistants regularly&lt;/li&gt;
&lt;li&gt;want documentation access inside your editor or terminal&lt;/li&gt;
&lt;li&gt;work with documentation sites that are not simple markdown repos&lt;/li&gt;
&lt;li&gt;prefer local tools over hosted indexing services&lt;/li&gt;
&lt;li&gt;want one general-purpose MCP server instead of many per-library integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it out
&lt;/h2&gt;

&lt;p&gt;If you want to see the project in action, open the live site and source repo above.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Michael-Obele/docshark" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Star DocShark on GitHub&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing thought
&lt;/h2&gt;

&lt;p&gt;DocShark is a small idea with a practical goal: make documentation available where AI tools already work, without handing your context over to a cloud service.&lt;/p&gt;

&lt;p&gt;If you spend time jumping between docs tabs, terminal commands, and assistant prompts, it is the kind of tool that quietly removes friction from the whole workflow.&lt;/p&gt;

</description>
      <category>bunjs</category>
      <category>typescript</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>What Your AI Chat History Says About Your Love Life (A Valentine’s Roast)</title>
      <dc:creator>Michael Amachree</dc:creator>
      <pubDate>Sat, 14 Feb 2026 22:40:34 +0000</pubDate>
      <link>https://dev.to/dev_michael/what-your-ai-chat-history-says-about-your-love-life-a-valentines-roast-o6d</link>
      <guid>https://dev.to/dev_michael/what-your-ai-chat-history-says-about-your-love-life-a-valentines-roast-o6d</guid>
      <description>&lt;p&gt;It’s Valentine’s Day. The air is filled with the scent of roses, expensive chocolates, and the faint ozone smell of servers overheating.&lt;/p&gt;

&lt;p&gt;While everyone else is out having candlelit dinners, some of us are right here, staring at a blinking cursor, asking a Large Language Model why our CSS grid isn't centering. But have you ever stopped to think that your relationship with your AI might be a mirror for your actual romantic life?&lt;/p&gt;

&lt;p&gt;I took a look at the most common "AI conversation archetypes" among developers. Find your chat style below, and accept your diagnosis.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The "Fix This Immediately" Typer
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Logs:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Error: undefined is not a function. Fix it."&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"Still broken. Try again."&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"Why did you import a library I don't have? REFOCUS."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The Diagnosis:&lt;/strong&gt; &lt;strong&gt;The Toxic Ex.&lt;/strong&gt;&lt;br&gt;
You don't want a partner; you want a miracle worker who can read your mind without you communicating your needs. You provide zero context, demand immediate results, and threaten to switch to a different model the second things get difficult. In relationships, you’re probably the one who says "I'm fine" when you are absolutely, cataclysmically &lt;em&gt;not&lt;/em&gt; fine, and then gets mad when your partner doesn't guess why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prescription:&lt;/strong&gt; touch grass (or at least add a "please").&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Over-Explainer
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Logs:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Hi! Hope you're having a good processing cycle. So, I have this React component—it's a button, but not just any button, it represents the existential dread of the user. I want it to be blue, but like, a sad blue? Here is the entire history of the project since 2019 for context..."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The Diagnosis:&lt;/strong&gt; &lt;strong&gt;The Stage 5 Clinger.&lt;/strong&gt;&lt;br&gt;
You pour your heart out. You treat every prompt like a first date where you simply &lt;em&gt;must&lt;/em&gt; explain your entire childhood trauma before the appetizers arrive. You crave deep connection and context, but you’re mostly just exhausting the token limit. In love, you’re sending 14-paragraph texts at 2 AM asking "What are we?" after one coffee date.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prescription:&lt;/strong&gt; Learn to summarize. Your AI (and your date) doesn't need to know about the legacy code from three years ago.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The "Just Copy-Paste" trust fall
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Logs:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Write me a full auth system in Go."&lt;/em&gt;&lt;br&gt;
&lt;em&gt;(User copies code without reading it)&lt;/em&gt;&lt;br&gt;
&lt;em&gt;(User deploys to production)&lt;/em&gt;&lt;br&gt;
&lt;em&gt;(Production crashes)&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"Why did you do this to me??"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The Diagnosis:&lt;/strong&gt; &lt;strong&gt;The Hopeless Romantic.&lt;/strong&gt;&lt;br&gt;
You fall in love fast and hard. You trust blindly. You see a snippet of code that looks vaguely correct, and you’re already planning the wedding (deployment). You ignore all the red flags (security vulnerabilities) because you just want it to &lt;em&gt;work&lt;/em&gt; so bad. When it inevitably breaks your heart, you blame the universe instead of your lack of unit tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prescription:&lt;/strong&gt; Code review is a love language. Use it.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The Gaslighter
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Logs:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Are you sure that's the syntax? Pretty sure it's not."&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"I think you're hallucinating. That library doesn't exist."&lt;/em&gt;&lt;br&gt;
&lt;em&gt;(AI apologizes)&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"Actually, wait, you were right. But you should have been more confident."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The Diagnosis:&lt;/strong&gt; &lt;strong&gt;The "It’s Complicated."&lt;/strong&gt;&lt;br&gt;
You enjoy the power dynamic. You like testing boundaries. You don't actually want the answer; you want to see if you can trick the other party into slipping up. This is a relationship built on intellectual one-upmanship. It’s exhausting, it’s petty, and frankly, it’s why you’re spending Valentine's Day arguing with a non-sentient neural network about the efficacy of &lt;code&gt;var&lt;/code&gt; vs &lt;code&gt;let&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prescription:&lt;/strong&gt; Admit when you're wrong. It’s sexy.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The "Prompt Engineer" Perfectionist
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Logs:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Act as a senior Rust engineer with 20 years of experience, a PhD in CompSci, and a penchant for dry humor. Analyze this function using the Socratic method..."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The Diagnosis:&lt;/strong&gt; &lt;strong&gt;The Checklist Dater.&lt;/strong&gt;&lt;br&gt;
You have a list of requirements for a partner that is longer than a webpack config file. You don't want a connection; you want a customized build. You spend more time tweaking your dating profile (prompt) than actually going on dates (coding). You are paralyzed by the idea that there might be a &lt;em&gt;slightly better&lt;/em&gt; optimization out there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prescription:&lt;/strong&gt; Sometimes &lt;code&gt;npm install&lt;/code&gt; is good enough. Perfect is the enemy of "shipped."&lt;/p&gt;




&lt;h3&gt;
  
  
  So, who is your Valentine?
&lt;/h3&gt;

&lt;p&gt;Whether you're treating your AI like a therapist, a junior dev, or a magical oracle, remember: at least the AI replies instantly and never judges you for eating pizza over the sink at 3 AM.&lt;/p&gt;

&lt;p&gt;Happy Valentine's Day, devs. May your commits be clean, your tests pass, and your deployment pipelines remain green. ❤️&lt;/p&gt;

</description>
      <category>watercooler</category>
      <category>humor</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Day 12: The Grand Finale &amp; New App Launch! (Countdown Timer)</title>
      <dc:creator>Michael Amachree</dc:creator>
      <pubDate>Wed, 31 Dec 2025 19:41:28 +0000</pubDate>
      <link>https://dev.to/dev_michael/day-12-the-grand-finale-new-app-launch-countdown-timer-4lfg</link>
      <guid>https://dev.to/dev_michael/day-12-the-grand-finale-new-app-launch-countdown-timer-4lfg</guid>
      <description>&lt;p&gt;🎄 &lt;strong&gt;Day 12 of 12 Days of Svelte Apps&lt;/strong&gt; 🎄&lt;/p&gt;

&lt;p&gt;We made it! To celebrate the finale, we are launching a brand new mini-app today.&lt;/p&gt;

&lt;p&gt;🎁 &lt;strong&gt;Presenting: The Countdown Timer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔗 Start counting:&lt;/strong&gt; &lt;a href="https://svelte-apps.me/apps/countdown-timer" rel="noopener noreferrer"&gt;https://svelte-apps.me/apps/countdown-timer&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we love countdowns
&lt;/h2&gt;

&lt;p&gt;Did you know the first crowd countdown (in Times Square/NYC) only started in 1979? It's a surprisingly modern tradition.&lt;/p&gt;

&lt;p&gt;We love them because they mark a "genesis moment"—when time resets and anything feels possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;p&gt;This new app lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set a target date and time&lt;/li&gt;
&lt;li&gt;See a live, ticking breakdown of Days, Hours, Minutes, and Seconds&lt;/li&gt;
&lt;li&gt;Enjoy a distraction-free, beautiful interface&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Thank You!
&lt;/h2&gt;

&lt;p&gt;Thank you for following along with this 12-day series. We've explored everything from budget trackers to text summarizers.&lt;/p&gt;

&lt;p&gt;The Svelte MiniApps collection is open source and growing. If you want to contribute in 2025, come join us on GitHub!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy Holidays and a Happy New Year!&lt;/strong&gt; 🥂&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>sveltekit</category>
      <category>newyear</category>
      <category>launch</category>
    </item>
    <item>
      <title>Day 11: New Year, New Security (Password Generator)</title>
      <dc:creator>Michael Amachree</dc:creator>
      <pubDate>Wed, 31 Dec 2025 19:40:03 +0000</pubDate>
      <link>https://dev.to/dev_michael/day-11-new-year-new-security-password-generator-1hah</link>
      <guid>https://dev.to/dev_michael/day-11-new-year-new-security-password-generator-1hah</guid>
      <description>&lt;p&gt;It’s &lt;strong&gt;Day 11&lt;/strong&gt; of &lt;strong&gt;12 Days of Svelte Apps&lt;/strong&gt; 🎄&lt;/p&gt;

&lt;p&gt;As we approach the New Year, it's the perfect time for a "Digital Deep Clean".&lt;/p&gt;

&lt;p&gt;Verify your backups, unsubscribe from spam, and &lt;strong&gt;update your weak passwords&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fact:&lt;/strong&gt; "123456", "password", and "admin" are still the most leaked passwords in 2024.&lt;/p&gt;

&lt;p&gt;Today's app: &lt;strong&gt;Random Password Generator&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔗 Generate a key:&lt;/strong&gt; &lt;a href="https://svelte-apps.me/apps/random-password-generator" rel="noopener noreferrer"&gt;https://svelte-apps.me/apps/random-password-generator&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;💻 View the code:&lt;/strong&gt; &lt;a href="https://github.com/Michael-Obele/Svelte-MiniApps/tree/main/src/routes/apps/(app)/random-password-generator" rel="noopener noreferrer"&gt;https://github.com/Michael-Obele/Svelte-MiniApps/tree/main/src/routes/apps/(app)/random-password-generator&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use this over a server-side tool?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Privacy.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;This app runs entirely in your browser. The passwords generated never leave your device. There is no API call involved in the generation logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Length Control&lt;/strong&gt;: Go beyond 8 characters. Try 20+.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Character Sets&lt;/strong&gt;: Toggle symbols, numbers, upper/lowercase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-click Copy&lt;/strong&gt;: Grab it and paste it into your password manager.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start 2025 secure.&lt;/p&gt;

</description>
      <category>security</category>
      <category>svelte</category>
      <category>privacy</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Day 10: Visualize Your 2024 Code Journey (GitHub Tracker)</title>
      <dc:creator>Michael Amachree</dc:creator>
      <pubDate>Wed, 31 Dec 2025 19:38:57 +0000</pubDate>
      <link>https://dev.to/dev_michael/day-10-visualize-your-2024-code-journey-github-tracker-29k9</link>
      <guid>https://dev.to/dev_michael/day-10-visualize-your-2024-code-journey-github-tracker-29k9</guid>
      <description>&lt;p&gt;It’s &lt;strong&gt;Day 10&lt;/strong&gt; of &lt;strong&gt;12 Days of Svelte Apps&lt;/strong&gt; 🎄&lt;/p&gt;

&lt;p&gt;The end of the year is a time for reflection. For developers, that often means looking at our contribution graphs.&lt;/p&gt;

&lt;p&gt;Today's app is the &lt;strong&gt;GitHub Contribution Tracker&lt;/strong&gt;, a tool to visualize and celebrate your open source activity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔗 Create your summary:&lt;/strong&gt; &lt;a href="https://svelte-apps.me/apps/github-contribution-tracker" rel="noopener noreferrer"&gt;https://svelte-apps.me/apps/github-contribution-tracker&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;💻 View the code:&lt;/strong&gt; &lt;a href="https://github.com/Michael-Obele/Svelte-MiniApps/tree/main/src/routes/apps/(app)/github-contribution-tracker" rel="noopener noreferrer"&gt;https://github.com/Michael-Obele/Svelte-MiniApps/tree/main/src/routes/apps/(app)/github-contribution-tracker&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More Than Green Squares
&lt;/h2&gt;

&lt;p&gt;While GitHub's profile graph is iconic, sometimes you want focused data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What was my longest streak?&lt;/li&gt;
&lt;li&gt;How many total contributions did I make?&lt;/li&gt;
&lt;li&gt;Which repos got the most love?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Built with SvelteKit
&lt;/h2&gt;

&lt;p&gt;This app demonstrates fetching data from the GitHub GraphQL API server-side and rendering visual components with Svelte. It handles authentication and data visualization seamlessly.&lt;/p&gt;

&lt;p&gt;Share your stats in the comments! 👇&lt;/p&gt;

</description>
      <category>github</category>
      <category>svelte</category>
      <category>yearincode</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Day 9: Smart Holiday Shopping &amp; Travel (Currency Converter)</title>
      <dc:creator>Michael Amachree</dc:creator>
      <pubDate>Wed, 31 Dec 2025 19:37:37 +0000</pubDate>
      <link>https://dev.to/dev_michael/day-9-smart-holiday-shopping-travel-currency-converter-dmb</link>
      <guid>https://dev.to/dev_michael/day-9-smart-holiday-shopping-travel-currency-converter-dmb</guid>
      <description>&lt;p&gt;It’s &lt;strong&gt;Day 9&lt;/strong&gt; of &lt;strong&gt;12 Days of Svelte Apps&lt;/strong&gt; 🎄&lt;/p&gt;

&lt;p&gt;Shopping globally for gifts? Planning a winter getaway?&lt;/p&gt;

&lt;p&gt;Don't guess with your money. Today's app is the &lt;strong&gt;Currency Converter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔗 Try it live:&lt;/strong&gt; &lt;a href="https://svelte-apps.me/apps/currency-converter" rel="noopener noreferrer"&gt;https://svelte-apps.me/apps/currency-converter&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;💻 View the code:&lt;/strong&gt; &lt;a href="https://github.com/Michael-Obele/Svelte-MiniApps/tree/main/src/routes/apps/(app)/currency-converter" rel="noopener noreferrer"&gt;https://github.com/Michael-Obele/Svelte-MiniApps/tree/main/src/routes/apps/(app)/currency-converter&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  real-time Rates
&lt;/h2&gt;

&lt;p&gt;We hook into live exchange rate APIs to ensure you're getting current data, not last month's numbers. &lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;150+ Currencies&lt;/strong&gt;: From AUD to ZAR.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Calculation&lt;/strong&gt;: Reactivity in Svelte makes conversions feel immediate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reverse Mode&lt;/strong&gt;: Easily swap source and target currencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Save your budget this holiday season by knowing exactly what you're spending.&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>sveltekit</category>
      <category>travel</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
