{"model":"Xenova/all-MiniLM-L6-v2","dim":384,"builtAt":"2026-05-17T09:47:50.521Z","chunks":[{"type":"blog","slug":"designing-backends-for-agents","title":"Designing Backends for Agents, Not Just Humans","url":"/blog/designing-backends-for-agents","date":"April 2026","id":"blog:designing-backends-for-agents:top","section":"Overview","text":"Designing Backends for Agents, Not Just Humans — The biggest architectural shift of 2025–26 isn't AI inside your app — it's AI calling it. Here's what breaks first, and what to build instead. — Your backend was designed for a human clicking buttons in a React app. In 2026, a meaningful slice of your traffic is LLMs calling your endpoints — and they don't read docs, don't skim, and retry until they succeed. The architecture has to catch up.","embedding":[-0.0745,-0.0828,0.0404,-0.055,-0.0047,-0.0057,-0.04,0.0201,-0.0006,0.0006,-0.1031,0.0137,-0.0049,0.012,0.0372,0.0165,0.0673,-0.0787,0.0408,0.0041,0.0129,0.0473,0.0055,-0.0069,-0.0932,0.0108,0.0173,-0.0836,0.0142,-0.0197,0.0795,0.0553,-0.0291,0.0144,-0.0947,0.0805,-0.0846,-0.059,0.0428,-0.0248,-0.0164,-0.0685,-0.0499,0.0536,0.0922,-0.0586,0.0252,-0.0334,0.0431,0.0317,-0.0045,0.0087,0.0758,-0.0514,-0.0811,0.0014,0.0126,0.0121,-0.0142,-0.0024,0.0555,-0.0854,0.0469,0.0212,0.0268,0.068,-0.0585,-0.0133,0.0483,-0.055,0.0051,-0.007,0.079,-0.0233,-0.0057,-0.0624,-0.0209,-0.0087,0.1072,-0.0711,0.0443,-0.1091,-0.011,0.1039,-0.0258,0.0407,0.0601,-0.0088,-0.01,-0.0118,0.0222,-0.0705,0.0818,0.0245,0.0257,0.0695,-0.1025,-0.0463,-0.0445,0.0148,-0.0262,0.0005,0.0261,0.0384,0.0115,-0.0222,0.014,-0.0387,-0.012,0.0061,-0.0185,0.018,0.0506,-0.017,0.0582,-0.0433,0.0045,-0.0196,0.09,-0.043,0.0504,0.072,-0.0554,0.0477,0.1324,0.0159,0.0047,0,-0.0264,0.0336,0.0292,0.0315,0.0286,0.0382,0.0635,-0.0079,-0.015,-0.0145,-0.0519,0.0396,-0.0083,0.059,0.0667,-0.0607,0.0226,0.0279,-0.0045,-0.0783,-0.0015,-0.0331,-0.018,0.0389,0.04,0.1156,0.0377,0.0117,0.0539,-0.0178,-0.0298,0.051,-0.0057,0.0636,-0.0163,0.035,-0.1281,-0.0234,0.0073,0.0002,-0.0113,0.057,-0.0547,-0.0228,-0.0422,-0.0632,0.0364,0.0129,0.0238,-0.0025,-0.0451,0.0492,0.0428,-0.043,0.0555,-0.0914,0.0126,0.0286,-0.0247,0.0006,0.0079,-0.0369,-0.0486,0.0683,-0.0475,0.0788,0.0128,0.0575,0.0804,0.0347,0.0104,0.0485,0.0455,0.063,-0.0737,-0.0211,-0.0445,-0.0843,0.0815,-0.0405,0.0129,-0.0383,-0.0476,0.0673,0.1264,-0.0057,-0.0629,-0.0952,-0.0022,0.1189,-0.0343,-0.0419,-0.0172,0.1398,-0.0901,0,-0.0909,-0.0412,-0.0943,0.0361,-0.0399,-0.0287,0.0284,0.1123,0.028,0.0346,0.0077,0.0322,0.0705,-0.0069,-0.0124,0.0187,0.0164,-0.094,-0.0158,-0.0722,0.0128,0.0403,-0.0985,0.0384,0.0031,0.0591,0.0065,-0.0356,0.0395,-0.0517,-0.012,-0.06,-0.0407,0.0085,0.0414,0.0623,-0.0156,0.0747,-0.024,-0.0572,0.0178,-0.0953,-0.0008,0.0128,-0.0333,-0.0319,-0.1159,0.0556,-0.0059,-0.0503,-0.0174,-0.0393,0.0071,-0.1312,-0.1159,-0.0128,0.0685,-0.037,0.0423,-0.0095,0.0211,-0.0463,0.0077,-0.0177,-0.0513,-0.041,-0.0893,0.0269,0.0132,0.0073,0.1338,-0.0069,-0.1065,-0.0148,0.0344,-0.0085,-0.0275,-0.0703,0.0573,-0.026,-0.0296,0.0475,0.0061,0.045,0.0291,0.0094,-0.0197,0.0433,-0.0242,0.058,-0.0617,0.0401,-0.0977,0.0606,-0.0594,0,0.0195,0.0694,0.0479,-0.0314,-0.0323,-0.0001,-0.0284,0.0352,0.0012,-0.03,-0.0095,-0.0279,0.0139,0.1112,0.0657,0.0922,-0.0489,-0.0091,-0.0568,-0.0999,-0.0253,-0.0136,-0.0684,0.0433,0.0457,-0.0029,-0.0343,0.0803,-0.0516,0.0314,-0.0175,-0.0265,-0.0075,0.0346,0.0441,0.0934,0.0121,-0.0499,0.0018,-0.002,-0.0151,0.0005,-0.0057,0.0313,-0.0027,-0.0319,-0.0581,-0.0247,0.0913,-0.0311,-0.0126,-0.0737,-0.0755,0.0426,0.1039,0.0205,-0.0047,-0.0778,0.0777,0.0801,0.0654,0.0099,-0.0419,0.0053]},{"type":"blog","slug":"designing-backends-for-agents","title":"Designing Backends for Agents, Not Just Humans","url":"/blog/designing-backends-for-agents","date":"April 2026","id":"blog:designing-backends-for-agents:section:0","section":"The Caller You Didn't Design For","text":"The Caller You Didn't Design For In early 2024, almost every API had two kinds of callers: your own frontend, and a small number of partner integrations written by humans who had read your docs. By early 2026, that isn't quite true anymore. Anthropic launched the Model Context Protocol in November 2024 — a standard for how agents discover and call tools. OpenAI's function calling had been GA since June 2023. By late 2025 the list of vendors shipping MCP servers or native tool bindings included GitHub, GitLab, Linear, Stripe, Notion, Cloudflare, Sentry, and hundreds of smaller teams. Somewhere …","embedding":[-0.0875,-0.0326,-0.0114,-0.0165,0.0098,-0.0959,-0.0304,0.0339,0.048,0.0384,-0.0447,0.0399,-0.0036,0.0242,0.0923,-0.037,0.0473,-0.1121,0.038,-0.0058,-0.0495,0.0638,-0.0906,-0.0123,-0.0386,-0.0015,-0.0156,-0.0977,-0.0071,0.0394,-0.031,0.1126,0.028,-0.001,0.0118,0.115,0.0023,-0.0663,-0.0144,-0.053,0.0479,-0.0649,-0.0375,-0.0212,0.0058,-0.0701,0.0341,-0.0426,-0.046,0.01,-0.0253,-0.0316,-0.0114,-0.0265,-0.0126,-0.0491,-0.0076,-0.0327,-0.0238,0.0328,-0.0261,-0.0406,-0.1192,0.0326,-0.047,0.065,-0.0054,-0.04,0.0507,-0.0782,-0.0124,-0.0522,0.0001,-0.0338,0.0476,0.0403,0.0776,0.0436,0.107,-0.0997,0.0434,0.0252,-0.0365,0.086,-0.0393,0.0964,0.0322,0.0416,0.0661,0.0157,0.0229,0.0082,-0.0138,-0.0016,-0.0506,-0.0015,-0.0492,-0.1001,-0.0365,0.0699,-0.0754,0.0458,0.0328,-0.0056,-0.0372,-0.0175,-0.0703,-0.0102,0.0397,0.0931,-0.0498,-0.0303,0.0122,-0.0315,0.0432,-0.0025,-0.0172,-0.0086,0.0702,-0.0069,-0.0252,0.0377,-0.0253,0.0191,0.0612,0.1119,0.0091,0,0.0216,0.0195,0.0877,0.0133,0.0321,0.0389,0.0399,-0.0508,0.0016,-0.0153,-0.0071,0.0661,0.0074,0.0339,0.0593,-0.0303,-0.0809,0.0561,0.0751,0.0336,-0.0586,0.0205,0.0141,0.0462,0.0947,0.0769,-0.0453,-0.0093,0.0943,0.0338,0.0662,0.0052,-0.0056,0.0585,-0.0383,0.0457,-0.0718,-0.1313,-0.0458,-0.0458,0.0139,0.0895,-0.0567,-0.0105,-0.0459,-0.0721,-0.1076,0.0168,0.0827,0.0005,-0.0568,0.0489,0.1136,0.0003,0.0192,-0.1142,0.0257,-0.0342,0.0268,0.0358,0.0096,-0.0324,-0.0005,0.0055,0.0812,0.0273,-0.0747,-0.0357,0.0391,0.0292,0.0376,0.0509,-0.0352,0.0373,0.0039,-0.0413,0.0194,-0.0013,0.047,0.0536,0.0162,0.0618,0.0539,0.064,0.0425,0.0166,-0.0234,0.0298,0.0445,0.035,-0.0547,-0.0243,-0.0913,0.0998,-0.0463,0,-0.0409,-0.0398,-0.0441,0.0807,-0.0201,-0.1266,0.0084,-0.0368,0.0254,0.0109,0.0677,-0.0121,0.0798,0.006,0.1041,-0.032,0.017,-0.1266,0.0564,0.0343,0.0179,-0.0281,-0.0389,0.0014,0.0173,-0.0308,-0.0232,-0.0504,0.0299,-0.1184,-0.058,0.0572,-0.026,0.0048,-0.0087,0.021,0.0025,0.1833,0.042,-0.0896,0.0223,-0.0408,-0.0338,-0.0032,-0.0337,-0.0318,-0.0542,0.0929,-0.0044,-0.0865,-0.0842,0.0214,-0.0095,-0.0838,-0.0728,0.0494,0.0683,-0.0048,0.0478,-0.0162,0.0278,-0.0289,0.0345,-0.037,-0.0231,0.0781,0.0739,-0.0505,-0.0633,-0.0199,-0.0003,-0.0432,-0.0799,-0.0325,0.0054,0.0322,-0.0923,-0.0319,0.0036,0.0144,0.0256,0.0501,0.0369,0.0743,-0.0073,0.0068,0.0528,0.0366,0.0149,0.0575,-0.0888,-0.0042,-0.072,0.0793,-0.0532,0,-0.0015,0.0473,0.0292,0.0182,0.0016,0.0573,0.0009,0.0031,0.0344,0.063,-0.0157,-0.0332,-0.0097,0.0112,0.0543,0.0548,0.0106,-0.024,-0.0748,-0.1057,-0.09,-0.0202,0.013,-0.0779,0.0061,-0.0249,-0.0613,0.0458,0.0174,-0.0295,0.0012,-0.0446,-0.0136,-0.017,-0.001,-0.0258,-0.0867,-0.0532,0.0534,-0.0522,-0.0156,0.0438,-0.0145,0.0315,0.0886,0.0572,-0.0334,-0.0673,0.0059,-0.0066,-0.0201,0.0183,-0.0274,0.0253,0.032,0.0055,0.0429,-0.1182,0.0386,0.0477,-0.0771,-0.0356,-0.0314,0.041]},{"type":"blog","slug":"designing-backends-for-agents","title":"Designing Backends for Agents, Not Just Humans","url":"/blog/designing-backends-for-agents","date":"April 2026","id":"blog:designing-backends-for-agents:section:1","section":"Tool Descriptions Are the New API Docs","text":"Tool Descriptions Are the New API Docs When you expose an endpoint to an agent, three things go into the model's context: the tool name, the description, and the parameter schema. That is the entire surface the model has to work with. Not your OpenAPI page, not the example payloads buried in your SDK readme, not the onboarding tutorial — just those three fields. If the description is vague, the model either avoids the tool or calls it wrong. The guidance from Anthropic and the MCP spec has been consistent since late 2024: write tool descriptions the way you'd write onboarding notes for a new e…","embedding":[-0.016,0.0228,0.0184,0.018,0.0494,-0.0319,0.0098,0.0614,0.0105,-0.0052,0.0038,-0.0735,0.0311,-0.0059,0.0404,0.0358,0.0982,-0.1069,0.0137,0.0587,0.0994,0.0798,0.011,0.0156,-0.0996,0.001,0.0132,0.024,-0.0059,0.0218,0.0229,0.0499,-0.0005,0.0242,0.1075,0.0918,-0.0066,-0.0368,-0.0675,-0.0616,0.0217,-0.0262,-0.0126,-0.003,0.084,-0.1152,-0.0189,-0.1279,-0.0022,0.0511,-0.0305,-0.0999,-0.0281,-0.0664,0.0312,0.0238,-0.0439,-0.0608,-0.0365,-0.028,0.0431,-0.0115,0.0354,0.0188,-0.011,0.0309,-0.0158,-0.077,-0.0003,-0.0957,-0.0379,-0.0048,-0.0063,-0.0155,0.0192,0.0519,0.0314,0.132,0.0491,-0.1525,-0.0363,0.023,-0.0109,0.0556,-0.0439,0.0948,0.0593,-0.0047,0.0574,0.0902,0.0661,-0.0969,-0.0611,-0.038,0.0116,-0.0346,-0.0862,-0.062,-0.0831,0.0421,-0.0268,0.0205,0.0419,-0.0027,-0.076,-0.038,0.0381,-0.0418,-0.0886,-0.0041,0.0515,-0.0435,-0.0125,-0.035,0.0652,0.0479,-0.0435,-0.0437,0.0643,0.0015,-0.0232,0.0175,0.0119,0.0399,0.0096,0.0193,-0.0156,0,0.0204,-0.0194,0.0211,0.054,0.0287,0.0043,0.0158,-0.0096,0.0151,-0.0032,-0.042,0.0473,-0.0042,0.0884,0.0121,-0.0371,-0.0949,0.0946,0.0135,0.0078,-0.0108,-0.0321,-0.0119,-0.0616,0.0812,0.1105,-0.0609,-0.0198,0.0124,0.0068,-0.0603,0.0058,0.043,0.0134,-0.0362,-0.0021,-0.0283,-0.0971,0.0372,-0.0398,0.0053,0.0176,-0.0132,-0.0778,-0.0277,-0.0215,-0.0469,0.02,0.1051,-0.0395,-0.0171,0.0468,0.0962,-0.0507,-0.0045,-0.0367,0.0343,0.02,0.013,0.0052,-0.033,0.0397,0.0151,-0.0253,0.0501,0.072,-0.0131,0.0168,0.073,-0.0542,-0.0711,0.0295,-0.0116,0.0556,-0.0294,-0.0662,0.0122,-0.0059,0.0586,0.0483,-0.0087,0.0275,-0.0385,0.0057,-0.0202,0.01,0.009,-0.0697,0.0032,0.0407,-0.0262,-0.0075,-0.1439,0.1043,-0.0303,0,0.0178,-0.0268,-0.0321,-0.0052,-0.016,-0.0044,0.0008,0.0264,0.0632,0.0267,0.0351,0.0166,-0.0584,-0.0289,0.0815,-0.0296,-0.0882,0.0005,0.0917,0.0002,0.0062,0.0693,-0.0031,-0.0784,0.0641,-0.0224,0.0188,0.0342,0.0096,-0.0968,0.0446,0.0055,-0.028,0.0391,-0.037,0.0008,0.0505,-0.0391,0.0523,-0.0041,0.0852,-0.0358,-0.0304,-0.0466,-0.0619,-0.004,-0.0189,0.0103,-0.0486,-0.05,-0.0041,-0.0047,-0.0016,-0.0558,-0.0789,0.042,0.0618,-0.1389,0.0074,-0.0893,-0.005,0.0406,0.0089,0.0409,-0.0456,-0.0455,0.0267,-0.0568,-0.1167,-0.0278,-0.0456,-0.1169,-0.0063,-0.0183,0.0731,0.0174,-0.0665,-0.0618,0.0093,-0.0898,-0.0268,0.0054,0.0565,0.0944,0.0108,-0.0168,-0.0049,0.0882,0.0198,0.0742,-0.0847,0.0064,-0.0159,0.1525,-0.0695,0,-0.0523,0.0777,0.0144,0.0081,-0.062,-0.0104,-0.0138,-0.0062,0.0133,0.0439,0.0559,-0.0372,-0.1055,0.0268,-0.0363,0.0759,-0.0234,0.0201,0.0067,-0.1317,-0.0275,0.0176,0.0414,-0.0569,0.0432,0.0278,-0.0526,0.1143,-0.0581,0.0372,0.0184,0.0041,0.0457,0.0675,0.0178,0.0589,-0.0127,0.0041,0.0674,0.0743,-0.0294,0.037,-0.0346,-0.055,0.0706,0.1147,-0.0527,-0.0143,-0.0665,-0.0197,-0.0854,-0.0092,-0.0556,0.0433,-0.0569,0.0175,0.0458,-0.0381,0.0551,0.0164,-0.0559,0.0565,0.0263,0.0133]},{"type":"blog","slug":"designing-backends-for-agents","title":"Designing Backends for Agents, Not Just Humans","url":"/blog/designing-backends-for-agents","date":"April 2026","id":"blog:designing-backends-for-agents:section:2","section":"Error Messages Become Part of the Prompt","text":"Error Messages Become Part of the Prompt When a human hits a 400 in the browser, they see a red toast, read the doc, and fix their code. When an agent hits a 400, it reads your error body and decides what to do next — retry, change approach, or escalate to the user. Your error message is now a prompt. The thing you optimized for terseness, or for 'not leaking internal state,' is the thing that determines whether the agent recovers or loops until someone cancels the run. The useful shape is specific: name the exact field that failed, state what was expected, and suggest the corrective action. '…","embedding":[-0.0001,0.0645,0.0177,0.0093,0.0253,-0.0522,0.0632,0.0702,0.0171,-0.0134,-0.0276,-0.051,0.0213,-0.0292,-0.0155,0.0234,0.0146,-0.0393,-0.0334,0.0243,0.0078,0.0741,-0.0105,0.0722,-0.1159,0.0491,-0.0191,-0.041,-0.0522,-0.0361,-0.0263,-0.0161,-0.0529,-0.0062,0.0502,0.0706,-0.0343,0.0313,-0.0054,-0.0354,0.0296,-0.0092,-0.06,0.084,0.0011,-0.0763,-0.0544,-0.0079,0.0255,-0.0247,-0.0354,0.0641,0.0366,0.0231,-0.0065,-0.0006,0.0536,0.0867,-0.0506,0.0442,0.0031,-0.0435,-0.0154,0.0518,0.0596,0.0742,-0.0084,-0.063,-0.0142,0.0267,0.0342,-0.0003,-0.0655,0.0183,0.0242,0.0133,-0.0651,-0.0206,-0.0204,0.0458,-0.0075,-0.0768,-0.0232,0.0291,0.0499,0.0323,0.0421,-0.0067,0.0895,-0.0287,-0.0028,-0.1291,0.0399,0.1048,-0.0197,0.0828,-0.0162,-0.0949,-0.0579,0.0294,0.0107,-0.0499,0.0285,-0.0273,0.0202,-0.0673,0.0629,0.0862,0.0126,-0.0854,0.0051,-0.0314,0.0641,-0.0001,0.0427,0.0402,-0.0333,0.0365,0.0197,-0.0344,0.0624,-0.03,-0.0105,-0.0448,0.1235,-0.056,0.0319,0,0.0016,0.0503,-0.0364,0.0648,0.0112,0.0254,0.0319,-0.0653,-0.0042,-0.0302,0.0774,-0.0662,0.0418,-0.0519,0.0019,-0.0826,0.0386,0.0977,0.024,-0.0061,0.0478,0.0495,0.0395,-0.0033,0.0201,0.1118,-0.0206,0.031,0.0256,0.0429,0.007,0.0552,0.0253,-0.0003,0.0072,0.0122,-0.0005,-0.0337,0.0336,-0.0241,-0.0669,-0.0325,-0.0344,0.0279,0.0132,-0.1503,-0.0713,0.0343,-0.0365,0.0206,-0.0277,0.0705,0.0869,0.0185,0.0066,-0.0567,0.0437,-0.0043,-0.0507,0.0068,0.1221,-0.0053,-0.0429,-0.0418,-0.021,-0.0582,-0.0306,-0.0123,-0.0425,0.0127,-0.0914,0.02,0.0575,0.0572,-0.0677,-0.0657,0.0319,0.0358,0.0738,-0.1101,0.0626,-0.1185,-0.0789,0.0685,-0.0038,0.0447,-0.0288,0.0187,-0.1099,0.1489,0.028,0.0407,0.0056,0.0683,-0.0319,0,-0.0057,-0.0526,-0.071,0.0605,0.0001,-0.0458,0.0054,0.032,0.006,-0.0373,-0.0352,0.0754,-0.0178,0.0706,-0.0937,0.0121,0.0058,-0.0182,-0.0141,-0.029,0.0755,0.0427,-0.0921,0.0188,-0.0435,0.0131,-0.008,0.0477,-0.019,-0.0819,0.0276,0.017,-0.0454,0.0907,0.034,-0.0114,0.0691,-0.0328,-0.0537,0.0587,0.0702,0.0267,-0.05,0.0019,0.0167,0.0065,0.0259,-0.0598,-0.0117,0.0498,0.0193,-0.0789,0.075,0.0525,-0.0747,-0.0099,-0.0228,-0.0263,-0.0633,-0.0164,-0.0539,-0.016,0.0217,0.0081,0.0313,0.0005,-0.0553,-0.014,0.1073,-0.0466,0.0733,-0.0688,-0.08,-0.0014,0.1088,0.0251,-0.1151,-0.1578,-0.0404,0.0243,0.008,0.0198,-0.0254,0.0677,-0.0309,0.0158,-0.0061,0.0774,-0.0672,-0.022,-0.0404,0.0415,0.0292,0.0363,-0.0199,0,-0.0719,0.0234,0.0092,0.0141,0.1184,-0.0766,-0.0227,-0.0698,-0.0225,-0.0942,-0.0288,0.0018,0.0623,-0.0135,0.0498,-0.0692,-0.0687,-0.0415,-0.0602,-0.0859,0.0268,-0.0361,-0.0035,0.0227,-0.0228,-0.0063,0.0505,0.1028,-0.0838,-0.0163,-0.0341,-0.0172,-0.0133,0.0139,-0.1012,0.1401,0.0598,-0.0424,0.046,-0.0433,0.04,-0.012,-0.0209,0.0329,-0.0479,0.0116,-0.0276,0.0005,0.0283,-0.0948,-0.0615,-0.0148,-0.0643,0.0818,0.0143,-0.035,0.051,-0.0308,-0.0134,0.0441,0.0443,0.0583,-0.0087,-0.0597]},{"type":"blog","slug":"designing-backends-for-agents","title":"Designing Backends for Agents, Not Just Humans","url":"/blog/designing-backends-for-agents","date":"April 2026","id":"blog:designing-backends-for-agents:section:3","section":"Idempotency Stops Being Optional","text":"Idempotency Stops Being Optional Agents retry. They explore. They will POST twice if the first response was ambiguous, and three times if the second looked suspicious. In human API usage you could rely on the fact that a user doesn't double-click buttons that hard. In agent usage you cannot, and the cost of getting it wrong is duplicate deployments, duplicate charges, or duplicate tickets in your queue. The remediation is boring and well-understood: idempotency keys on every write operation, explicit dedup windows, and create-if-not-exists semantics for operations that logically should only ha…","embedding":[-0.0472,0.0058,-0.0153,0.022,-0.0429,-0.0382,0.0767,-0.0466,0.0624,0.0276,0.0048,-0.0084,0.0865,-0.0476,0.0089,0.0049,0.0863,-0.0333,-0.0843,-0.058,-0.0146,-0.0783,-0.0505,-0.0584,-0.0844,-0.0829,-0.0137,-0.0005,-0.0207,-0.031,0.0286,0.032,-0.1422,-0.0474,0.0127,0.0436,0.0019,-0.049,0.0028,-0.0181,0.0529,-0.0863,-0.1438,0.0358,-0.0083,-0.0412,-0.0581,0.0288,-0.0471,0.0152,0.0007,0.0125,0.0371,0.0086,0.0573,-0.042,-0.0085,0.0721,-0.0269,0.0072,0.0263,-0.0405,-0.0198,0.0362,0.0513,0.0379,0.0095,-0.062,0.0434,-0.0147,0.0845,-0.053,-0.0481,-0.0135,0.0438,0.0323,0.0055,-0.0399,0.0245,-0.0328,-0.0094,0.0239,0.0417,0.0281,0.0475,-0.0261,0.0126,0.0085,0.019,0.0299,0.0107,-0.0103,0.0731,-0.0433,0.1825,0.102,-0.0668,-0.0325,-0.0544,0.0284,-0.0077,-0.0127,-0.1034,0.0077,0.0434,-0.0259,0.0074,-0.0017,-0.003,-0.0319,-0.0161,0,0.1133,0.0299,0.0605,0.112,0.0321,0.0863,0.0018,-0.1249,0.0022,-0.0667,0.0928,-0.0694,0.0764,-0.0019,0.051,0,0.0272,0.0086,0.0323,-0.0603,0.0146,-0.0046,0.0226,0.0213,0.0595,-0.0514,-0.0184,0.0335,-0.0029,-0.0221,-0.0803,-0.0061,0.0067,0.1686,0.0111,0.0044,0.0016,-0.0157,0.0014,0.005,0.012,0.0599,0.0113,0.0035,0.0584,0.0466,-0.0524,0.0309,-0.0353,0.0927,-0.11,0.0562,-0.0598,-0.0201,-0.0373,-0.0763,-0.0645,0.0521,-0.0002,-0.0247,-0.0794,-0.083,-0.0632,-0.0741,-0.0167,-0.0206,0.0272,0.1083,0.1118,-0.0124,-0.0142,-0.0644,0.0011,0.0699,0.0091,0.0633,0.0047,-0.0168,-0.0662,0.0734,0.1006,0.0328,-0.048,0.0143,-0.0259,0.0296,0.0593,0.0098,-0.014,-0.0622,0.0127,-0.0783,0.0484,-0.0176,0.0653,-0.0577,0.0443,0.0073,-0.0733,-0.0326,-0.0211,-0.0133,-0.0405,-0.0316,-0.0674,0.0446,0.0398,0.0419,-0.0368,0.0516,-0.0092,0,-0.0397,-0.0548,-0.0622,0.0287,-0.0278,-0.0064,-0.0192,-0.005,-0.0228,-0.0335,-0.0408,-0.0102,0.0312,0.0705,0.0217,-0.0577,-0.0028,-0.0438,0.0154,0.0603,0.1025,0.0028,-0.0343,0.057,0.0154,0.0139,-0.0827,0,0.0056,-0.0763,0.0812,-0.0106,-0.078,-0.0317,0.0522,0.0001,0.0344,0.1091,-0.0617,0.0758,-0.0214,-0.0261,-0.0569,0.046,0.035,0.0106,-0.0004,0.0329,0.037,0.0232,-0.0706,-0.0115,-0.068,0.0356,-0.069,-0.0217,0.038,-0.0142,0.0187,0.0379,0.0333,-0.0352,-0.0012,0.0813,0.0281,0.0042,0.085,0.0262,-0.0046,-0.0066,0.1025,-0.0166,-0.1024,-0.0769,0.078,0.0149,-0.019,-0.0861,-0.0087,-0.0109,-0.0208,-0.0118,0.0435,0.0076,-0.0482,0.0116,0.0622,0.0324,0.0019,0.0732,-0.0633,-0.0024,-0.0814,0.0493,-0.0672,0,-0.0218,0.045,0.083,0.046,0.0138,-0.083,-0.0951,0.038,-0.0256,-0.0908,0.0086,-0.028,0.0513,-0.0396,0.0879,-0.0304,-0.0187,-0.0367,-0.0511,-0.0334,0.0048,-0.0147,0.0098,-0.0543,-0.038,0.0334,0.0851,0.0336,-0.0086,-0.0051,-0.0642,-0.025,0.0804,0.0351,-0.0095,0.0597,0.0407,-0.0054,0.0155,-0.0928,0.0222,0.0081,0.0217,0.0529,0.0312,0.0263,-0.0315,-0.0107,0.023,-0.0513,-0.1044,-0.0916,0.0054,0.0527,0.0817,0.009,0.0086,-0.0084,0.1392,0.0904,0.0833,0.0739,-0.0037,-0.0741]},{"type":"blog","slug":"designing-backends-for-agents","title":"Designing Backends for Agents, Not Just Humans","url":"/blog/designing-backends-for-agents","date":"April 2026","id":"blog:designing-backends-for-agents:section:4","section":"The Long Loop: Agents Don't Do Request / Response","text":"The Long Loop: Agents Don't Do Request / Response Human API interactions are measured in milliseconds to seconds. Agent runs are measured in minutes to hours. A coding agent fixing a bug might read twenty files, run tests four times, roll back a change, and try a different approach before finishing — one session that the backend sees as dozens of correlated calls across forty minutes. Claude Code, Cursor agents, and GitHub Copilot agent mode all run sessions of this shape in production by early 2026. What breaks first: token lifetimes, connection timeouts, request-scoped resources, and any sta…","embedding":[-0.0698,-0.031,-0.0611,-0.0256,-0.0251,-0.08,-0.0416,-0.0061,0.0727,-0.0009,-0.0038,0.0584,-0.0909,-0.0202,0.0904,0.0045,0.0245,-0.0634,-0.0332,-0.0148,0.0402,-0.0168,-0.0631,-0.0177,-0.0832,-0.0167,-0.0461,-0.1272,0.0375,-0.0015,0.0069,0.0681,-0.015,0.08,0.049,0.0847,-0.0024,-0.0464,0.0565,0.0673,0.0441,0.0062,-0.0458,0.0303,-0.0124,-0.0603,-0.0141,0.0015,-0.0446,0.0447,-0.0641,0.039,0.0369,0.0035,-0.0163,-0.0722,-0.0009,0.1033,0.0082,-0.0089,-0.013,-0.0301,-0.0298,0.0295,0.0576,0.0088,-0.0817,-0.0402,0.0744,-0.0271,-0.0647,-0.0119,-0.1006,-0.0427,0.0248,0.0188,-0.0272,-0.0332,0.0775,-0.1417,0.0027,-0.0124,0.0678,0.0663,0.0345,0.0387,0.0585,0.0475,0.0255,-0.0123,0.0465,0.002,0.0072,0.0299,0.0187,0.1055,-0.007,-0.0338,-0.0632,0.0431,-0.013,0.0052,-0.028,0.0464,-0.006,-0.0413,0.0718,-0.0241,0.0002,-0.0112,-0.0176,0.0178,0.056,0.0161,0.0511,0.0372,-0.024,0.0931,0.0795,0.0516,0.1057,-0.0255,-0.0331,-0.0565,0.0936,0.0793,0.0711,0,-0.0547,-0.0253,0.0448,0.0151,0.0004,-0.0021,0.0062,-0.0323,0.0387,0.0173,0.0153,0.0264,-0.0399,0.0306,-0.0086,-0.0435,0.0168,0.0559,-0.0087,0.0188,0.0311,-0.0657,-0.0038,0.0768,0.0833,0.0486,-0.045,0.0593,0.039,0.0114,-0.0382,0.1036,-0.063,0.0575,-0.0457,-0.0178,-0.0039,-0.0477,-0.004,0.0007,-0.0923,0.0163,0.0232,-0.0136,-0.0509,-0.1558,-0.0754,0.0132,-0.0028,0.0828,-0.0249,0.0846,-0.0024,-0.0017,0.0115,-0.0069,0.0416,-0.0242,-0.0591,0.1166,0.094,-0.0347,-0.0059,0.0017,0.0199,0.0207,-0.0116,0.0773,0.032,0.0423,-0.0112,0.107,-0.0183,-0.0378,-0.036,-0.1123,0.0471,0.0231,0.0142,-0.0521,0.0641,-0.0201,-0.0398,-0.022,-0.0451,0.0118,-0.0563,-0.1085,-0.0319,0.0661,-0.0491,0.0116,-0.0336,0.049,-0.0158,0,-0.0212,-0.1234,-0.0489,0.0402,-0.0037,-0.0267,-0.0204,0.0694,0.0138,0.0329,-0.0027,-0.0135,-0.0509,0.0414,0.042,-0.0056,0.0756,-0.0605,0.0502,-0.0298,0.0571,-0.0021,-0.0516,-0.0191,0.0193,0.0266,-0.0714,-0.0257,0.0475,-0.0525,0.0165,-0.0013,-0.0545,0.0577,-0.0237,0.0353,-0.0275,0.1111,0.0262,-0.0206,0.1454,-0.1109,0.0099,-0.0121,0.0434,-0.0107,-0.0688,0.0058,-0.0972,0.0081,0.0085,0.0095,-0.0017,-0.0244,-0.074,-0.0121,0.0128,-0.0728,-0.0112,-0.0552,0.0138,0.0438,-0.0331,0.0646,0.0153,-0.0685,-0.0023,-0.0259,0.1054,0.0049,0.0952,-0.0198,-0.1488,0.0054,-0.0269,0.0633,-0.0979,-0.1389,0.0209,-0.0051,-0.1195,0.0711,-0.0267,0.0223,-0.0323,0.0874,0.0096,0.0611,0.0535,0.0608,0.0299,-0.0372,-0.0231,0.0675,-0.0577,0,0.009,0.0292,0.0021,0.0058,0.0241,-0.0286,-0.0067,0.052,0.0006,0.0466,0.0476,-0.0363,0.0422,0.0161,0.0589,0.0436,-0.043,-0.0429,-0.0517,-0.0738,-0.077,-0.0033,-0.0462,-0.0068,-0.0781,0.0292,0.0279,0.135,-0.087,-0.0262,-0.0355,0.0299,-0.048,-0.0362,-0.0075,0.0031,-0.0298,-0.0756,0.0491,-0.0162,-0.0189,0.0153,0.0006,-0.0057,0.0789,-0.013,-0.0447,-0.028,0.0843,-0.0761,-0.0518,-0.0345,-0.0977,0.0675,0.0528,0.0161,0.0169,-0.0561,0.0594,0.0396,-0.0493,0.0012,-0.0385,-0.0105]},{"type":"blog","slug":"designing-backends-for-agents","title":"Designing Backends for Agents, Not Just Humans","url":"/blog/designing-backends-for-agents","date":"April 2026","id":"blog:designing-backends-for-agents:section:5","section":"Auth for Callers That Aren't People","text":"Auth for Callers That Aren't People OAuth was built for a human in a browser clicking 'Allow.' Agent auth is messier: the agent is acting on behalf of a user, often through a platform, sometimes with scoped capabilities the user didn't fully read, occasionally across organizations. Handing an agent a user's full-permission token is the equivalent of giving a new intern your root password and hoping for the best. In 2025, a handful of well-publicized incidents — agents leaking private repo contents into logs, agents running destructive operations the user didn't intend — made the cost of doing …","embedding":[-0.0949,0.0086,-0.0408,-0.084,-0.0091,-0.1192,0.0294,0.0073,0.0514,-0.0309,-0.0031,0.0797,-0.0237,-0.0236,0.0573,0.0669,0.0334,-0.0178,-0.0456,-0.0217,0.0276,0.0258,-0.0592,-0.0035,-0.0168,-0.0505,-0.0211,-0.0742,0.0123,0.0367,0.0126,0.0385,0.0558,0.0344,-0.0673,0.029,0.0447,0.0412,-0.0054,-0.0241,0.0027,-0.0246,-0.0233,0.0318,-0.0296,0.0075,0.0079,-0.0492,0.0137,0.0019,0.0144,0.0309,0.0237,-0.0011,-0.1133,-0.0389,0.027,0.0092,0.0448,-0.0083,0.0087,-0.04,0.0257,0.0183,-0.0143,-0.0003,-0.0463,-0.0383,-0.0048,-0.0656,0.0219,-0.0096,0.0161,-0.0262,0.099,-0.0188,-0.0494,-0.0018,0.0734,-0.0194,0.0018,-0.0257,0.0609,0.0888,-0.041,0.1065,0.0486,0.0307,0.043,0.0344,-0.0019,-0.0133,0.0943,-0.039,0.0202,0.0015,-0.0421,-0.0581,-0.0845,0.0465,-0.0958,0.036,-0.0272,-0.0036,0.0035,0.02,0.0014,-0.0112,0.0864,0.0414,0.0249,-0.0618,-0.0031,-0.018,0.0707,0.0071,-0.0214,0.025,0.0688,-0.0295,0.0653,0.0524,-0.0309,0.0103,0.1004,0.055,0.0307,0,-0.0122,0.1569,0.0192,-0.0043,0.0096,0.0059,-0.0148,-0.0197,0.0193,0.0318,0.0335,0.0568,0.0759,0.0119,0.0663,-0.0125,-0.0786,-0.0004,-0.0227,0.0492,0.0301,0.0182,0.0296,0.0917,0.0233,-0.0748,-0.0284,-0.0238,0.11,0.0054,-0.0016,0.0362,-0.0151,0.0585,-0.0115,0.0506,0.0088,-0.0494,0.0186,-0.0737,-0.0476,0.0632,0.0462,-0.0053,-0.0795,-0.1089,-0.0767,0.0108,0.0461,0.0338,-0.0601,0.0551,-0.0283,-0.016,-0.0023,-0.0895,0.0179,0.0394,-0.0321,-0.0722,0.0397,-0.0491,0.0298,0.0801,-0.0754,-0.101,0.0106,0.0736,-0.0127,0.0257,-0.0086,0.0614,-0.0006,-0.0024,-0.1653,-0.0155,0.0842,0.0525,0.0975,0.0362,0.0301,-0.0284,0.0489,0.024,-0.0183,0.0381,-0.0697,0.0021,-0.0125,0.0434,0.0174,0.0061,-0.0849,0.121,-0.091,0,-0.0812,-0.0948,-0.006,0.0006,0.0242,-0.004,-0.0262,0.0187,0.0098,-0.0192,-0.0118,0.0618,0.0529,0.0224,0.0335,-0.0817,0.0053,0.0235,-0.0246,-0.0694,0.0197,0.0195,0.005,-0.002,0.0651,-0.0119,-0.0333,0.024,0.0742,-0.0697,0.0313,0.0377,-0.0839,-0.0083,-0.0089,0.0616,0.0148,0.1706,-0.0304,-0.0699,0.0097,-0.0421,0.0332,-0.0182,-0.0125,0.0154,-0.0017,-0.0235,0.0113,-0.0013,0.017,-0.0232,0.1057,-0.0054,-0.0829,0.0346,0.0993,-0.0199,0.1045,-0.1198,0.0064,-0.0185,0.0116,0.0774,-0.1234,0.0128,-0.0338,0.0384,-0.0013,0.014,0.08,-0.0873,-0.0541,-0.0296,0.0603,0.0032,-0.0564,-0.0718,-0.041,-0.0442,-0.0116,0.0306,-0.0127,0.0086,0.0049,-0.0975,0.0306,0.0158,0.0445,0.0814,0.01,0.0281,-0.0816,0.017,-0.06,0,0.0341,0.0166,0.0539,-0.0044,-0.0034,-0.0515,-0.0141,-0.0288,-0.0131,0.0195,0.0122,-0.034,-0.0181,-0.0462,0.0491,0.0535,-0.0334,-0.0747,-0.0429,-0.0237,-0.0886,-0.0725,-0.0237,-0.0339,-0.0706,-0.0058,-0.0619,0.0645,-0.0506,-0.0049,-0.0529,0.0649,-0.0576,-0.0579,-0.1159,0.102,-0.0222,-0.1294,-0.0262,-0.1319,-0.0249,-0.032,0.0381,0.0297,0.0513,-0.0324,0.0208,-0.0994,0.118,-0.056,-0.0294,-0.0354,-0.019,0.064,0.0102,-0.0013,0.0429,-0.0487,0.1401,-0.0198,-0.0105,-0.0013,0.0638,-0.0045]},{"type":"blog","slug":"designing-backends-for-agents","title":"Designing Backends for Agents, Not Just Humans","url":"/blog/designing-backends-for-agents","date":"April 2026","id":"blog:designing-backends-for-agents:section:6","section":"What This Looks Like in CI/CD","text":"What This Looks Like in CI/CD The place all of this lands hardest in practice is DevOps infrastructure, and it's the example I reach for because it's the one I'm closest to. A modern CI/CD platform in 2026 has agents on it — triaging failed builds, proposing dependency upgrades, restarting jobs that flaked, investigating test regressions, opening remediation PRs. Mendral reported 16,000+ automated CI investigations per month by late 2025. GitLab's Duo Agent Platform went GA in January 2026. GitHub's Copilot coding agent mode hit enterprise GA in early 2025 and has been expanding scope steadily…","embedding":[-0.039,-0.0592,-0.0182,0.014,-0.0359,-0.0527,-0.0551,-0.0221,-0.0204,0.0644,0.0057,0.0547,0.0232,0.0225,0.027,-0.0293,0.0217,-0.0537,0.0271,-0.0835,-0.061,0.0037,-0.0652,-0.0274,0.002,-0.0546,-0.0099,-0.083,-0.0268,-0.0025,-0.0472,0.1154,-0.0305,0.1032,0.0534,0.0457,0.0024,-0.0089,0.0582,-0.0167,-0.0075,-0.0319,-0.0128,0.0112,0.0089,-0.081,-0.0123,-0.048,-0.0426,-0.0327,-0.0473,-0.0726,0.0919,-0.0144,0.0031,-0.0799,0.0476,0.0194,0.0297,-0.029,0.0368,0.0019,-0.0515,-0.0007,0.0039,0.061,-0.0041,0.0108,0.0254,-0.1277,-0.0618,-0.0895,-0.0532,-0.0273,0.0468,0.0424,-0.0227,0.0286,0.1276,-0.0978,0.069,-0.0061,-0.0171,0.1136,-0.0793,0.0477,0.0298,0.076,0.0192,-0.0496,0.0677,0.0426,0.0858,0.0452,-0.0228,0.011,-0.0331,-0.0836,-0.0263,0.0455,-0.0178,0.0178,0.0268,-0.0854,-0.069,0.0367,0.0965,-0.0027,0.022,-0.0367,-0.0869,-0.0155,-0.0293,-0.0481,0.0788,0.0258,-0.0209,0.1211,0.1093,-0.0026,0.0455,0.0169,-0.0869,-0.0144,0.1141,0.0932,-0.0325,0,-0.0061,0.0647,0.001,0.0754,0.0127,-0.0126,0.026,-0.0358,-0.0768,0.0021,0.0466,0.0718,-0.0802,0.0179,0.052,-0.0976,-0.0677,0.0091,-0.0012,0.0235,0.0381,-0.037,0.022,-0.0094,0.1433,-0.0057,-0.0467,-0.0214,0.0995,0.0352,-0.0281,0.1107,0.023,0.0628,-0.0526,0.0424,-0.0814,-0.0452,-0.0173,0.093,-0.0565,0.0582,0.0201,-0.0542,0.0912,-0.0465,0.0084,-0.0418,0.0611,-0.0021,-0.0137,0.069,0.0381,0.0293,0.0339,0.0291,0.0457,-0.0799,0.0479,0.0157,-0.0068,0.0455,-0.0638,0.007,0.0248,-0.022,-0.0107,0.0531,0.0176,0.0963,-0.0383,0.0035,-0.0094,-0.0702,-0.0085,-0.0692,-0.0535,-0.0014,0.0045,0.0094,-0.0216,0.0008,-0.0062,0.0136,0.0931,-0.0007,-0.0434,0.0437,0,0.0452,-0.0031,-0.0314,-0.0097,0.0946,0.0193,0,-0.0309,-0.064,-0.0413,0.0637,0.0113,-0.1122,0.0127,-0.0981,0.055,-0.0125,-0.017,-0.0167,0.0191,0.0616,0.0033,-0.0492,0.0324,-0.0693,0.0356,-0.0037,0.0743,-0.0163,-0.0517,-0.0246,0.0678,0.045,-0.0029,0.0096,0.0509,-0.068,-0.0136,0.0435,0.0117,0.0307,-0.0476,-0.0011,-0.0075,0.0415,-0.089,-0.0526,0.0069,-0.0336,-0.0353,-0.0257,0.009,0.0619,0.0118,0.0266,-0.0519,-0.0416,-0.0169,0.0512,-0.0395,-0.04,-0.0183,0.0071,0.0135,0.053,-0.0744,0.0438,0.0344,0.032,0.0344,0.0219,-0.0249,-0.0231,0.0322,0.0635,-0.0643,-0.0248,0.1,-0.0395,-0.1382,-0.0734,-0.0057,0.0339,-0.0628,-0.0136,-0.0354,0.0086,-0.0199,0.0366,-0.0473,0.0816,-0.0053,0.0918,-0.0336,-0.0312,0.0577,0.0083,-0.1211,-0.0778,-0.0266,-0.0011,-0.038,0,0.0173,0.0572,-0.0406,-0.0639,0.0579,-0.0582,-0.014,0.0712,-0.0294,0.0532,0.0379,-0.0161,0.0537,0.0275,0.0471,0.0584,-0.0039,-0.0227,-0.0399,-0.0518,-0.0437,0.0033,-0.0067,-0.0136,-0.0886,-0.0147,-0.0169,0.0293,-0.0225,0.0356,0.003,-0.0384,-0.0033,-0.0778,0.0413,-0.0219,-0.0004,-0.0296,0.0619,-0.0791,-0.0098,-0.0173,0.059,-0.0081,0.0116,-0.0703,-0.0388,-0.0478,0.0901,-0.0829,-0.0349,-0.0024,-0.1377,0.1149,0.1528,0.0397,0.0313,-0.0225,0.0049,0.0519,-0.0036,-0.0857,0.0206,0.0049]},{"type":"blog","slug":"designing-backends-for-agents","title":"Designing Backends for Agents, Not Just Humans","url":"/blog/designing-backends-for-agents","date":"April 2026","id":"blog:designing-backends-for-agents:section:7","section":"Design Moves That Actually Fall Out of All This","text":"Design Moves That Actually Fall Out of All This If I had to compress everything above into a short checklist for a team about to expose an existing backend to agents, it would look like this. None of these items are individually novel. The shift is treating them as load-bearing rather than nice-to-haves. Write tool descriptions the way you'd write onboarding notes for a new on-call engineer. State what, when, when-not, and what the parameters mean in plain language. Make every error body actionable without guessing. Name the field, state the expectation, suggest the fix. Distinguish retryable …","embedding":[-0.0911,-0.0006,0.0479,0.0272,-0.0064,-0.0621,0.0338,0.0237,-0.0101,0.0119,-0.0513,0.0175,-0.0036,-0.041,-0.0306,0.0331,0.075,-0.0927,-0.0027,0.0484,-0.0072,0.044,-0.07,0.0692,-0.0666,0.0534,0.0007,0.0122,-0.0136,-0.1088,-0.0389,0.1604,-0.0596,-0.0044,0.0535,0.1361,-0.0315,0.0273,-0.0167,-0.0313,-0.0551,-0.0741,-0.0088,0.0993,-0.0203,-0.1239,0.0185,-0.0473,0.0197,0.001,-0.0475,-0.0012,0.0112,-0.0096,-0.0045,0.0771,0.0203,0.0421,-0.0239,-0.0145,0.0662,0.0557,-0.0116,0.009,-0.0368,0.0951,-0.0564,-0.0237,-0.0206,0.0114,0.0024,-0.0257,-0.0555,0.0195,0.0408,0.0424,-0.0438,-0.0126,0.0528,-0.1121,-0.0312,-0.0565,-0.0602,0.0691,0.0255,0.0275,0.0383,-0.0087,0.0269,0.0204,0.0392,-0.0671,0.1072,0.0411,0.0209,0.0926,-0.0147,-0.1057,-0.011,0.043,-0.0247,0.0418,0.049,0.0465,-0.0933,-0.0431,0.0309,-0.0514,-0.0581,-0.0534,0.025,0.0513,-0.0006,-0.0068,0.0063,-0.0283,-0.0598,0.0198,-0.0144,0.0046,0.0467,0.0466,0.0051,-0.0002,0.0596,0.0399,-0.0004,0,0.0191,0.0724,-0.0155,0.0836,0.0328,-0.0402,-0.0028,0.0577,0.0156,0.0068,0.0284,0.0356,0.0463,0.0313,0.0607,-0.0894,-0.017,0.0919,0.0159,0.0094,-0.043,-0.0649,-0.0302,0.0014,0.0574,0.0639,-0.0716,0.0261,-0.025,0.0044,-0.0766,0.025,0.0429,-0.0145,-0.0414,0.0156,-0.0575,-0.088,0.0236,-0.0131,-0.0492,0.0278,-0.0497,0.0034,0.0908,-0.0627,0.0099,0.029,0.0472,-0.0176,-0.0237,0.0611,0.126,0.0207,-0.0216,-0.0801,0.0529,-0.0034,0.0367,0.0347,0.0438,0.0008,-0.0957,0.0142,0.0891,0.0504,-0.0445,0.0206,0.0051,-0.0596,-0.0865,0.0195,0.015,0.0548,-0.0338,-0.0546,-0.0156,-0.0413,0.0027,-0.1005,0.0166,0.0332,0.0014,0.0246,0.0102,0.0011,0.0156,-0.0467,-0.0668,0.132,-0.0476,-0.0331,-0.0473,0.0393,0.0418,0,-0.0651,-0.0897,-0.0375,0.0145,0.0622,-0.0174,0.0112,0.0597,0.0549,-0.0185,0.0083,-0.0412,-0.1025,-0.0323,-0.0789,-0.0159,-0.0673,-0.0835,0.0495,0.0363,0.1602,0.0998,-0.0464,0.0501,-0.0222,0.0689,-0.0495,0.0003,-0.0167,-0.0213,-0.0035,-0.0488,0.0335,0.0536,0.0444,0.0492,-0.02,0.1046,-0.0113,0.0143,0.0623,-0.0032,-0.0326,-0.0101,0.0055,-0.0757,-0.0418,-0.0133,-0.1007,-0.013,-0.0059,0.014,-0.0249,-0.0108,-0.0436,0.0519,0.0638,-0.0921,0.0259,0.0215,-0.0313,0.0065,0.0565,-0.0574,0.0325,-0.0267,-0.0088,-0.0255,-0.0139,-0.0076,-0.0094,-0.0608,-0.075,-0.03,0.0627,-0.0576,-0.0768,-0.0882,0.0108,0.0486,0.0082,-0.0249,0.0397,0.0922,-0.0381,0.0866,-0.0598,0.106,0.0319,-0.0256,-0.081,-0.0285,0.022,0.0342,-0.0354,0,-0.0414,0.0257,0.025,0.0016,0.0474,-0.0939,-0.0344,-0.0141,0.0264,-0.0565,0.0009,-0.0198,-0.0111,0.0834,0.0569,0.0567,-0.0652,0.0599,-0.1183,-0.1145,0.0386,0.0333,0.0227,0.0219,0.0313,-0.0178,-0.077,-0.0004,0.0707,0.0632,0.0037,0.0052,0.1116,0.0277,0.0185,0.0695,0.0593,-0.0316,0.0537,0.0178,-0.0129,0.0213,-0.0724,0.0371,0.0405,-0.0352,-0.122,-0.0133,0.0081,-0.1207,-0.026,-0.0155,-0.0675,0.0724,-0.0109,0.0363,0.035,-0.0147,0.0815,0.0106,-0.011,0.0385,0.0119,0.03]},{"type":"blog","slug":"designing-backends-for-agents","title":"Designing Backends for Agents, Not Just Humans","url":"/blog/designing-backends-for-agents","date":"April 2026","id":"blog:designing-backends-for-agents:section:8","section":"The Part That Actually Matters","text":"The Part That Actually Matters There's a recurring pattern in infrastructure history where a new kind of caller shows up and the systems that adapted their contracts for that caller won, even when the underlying capability looked identical on paper. Mobile traffic in the late 2000s. Programmatic ad bidding in the early 2010s. Serverless event-driven architectures in the late 2010s. Each time, the teams that treated the new caller as a first-class consumer ended up with backends that felt unusually pleasant to build on. The teams that didn't ended up bolting on middleware for the next five year…","embedding":[-0.0909,-0.0454,0.0292,-0.1057,0.0141,-0.0563,-0.0184,0.0466,0.1004,-0.0025,-0.0452,0.1033,0.0075,0.0007,0.0742,-0.0377,0.0192,-0.1527,0.0656,0.039,-0.002,0.0267,-0.0894,-0.027,0.077,-0.08,-0.0422,0.0117,0.0038,0.0013,-0.0542,0.1171,0.04,0.0235,-0.0488,0.0031,-0.0177,-0.0208,-0.0514,-0.0268,0.0361,-0.0368,-0.0802,0.0366,-0.0266,-0.0813,0.0662,0.0056,-0.0256,-0.0252,0.0743,-0.0125,0.034,-0.0324,-0.0491,0.0205,-0.0274,0.1165,0.0107,0.0947,0.0074,0.0221,-0.0887,0.0312,-0.0368,0.0376,-0.0032,-0.0377,-0.0169,-0.0489,0.0222,-0.0544,0.0417,-0.033,0.0809,0.0355,-0.0055,0.0062,0.0453,-0.0741,0.0566,-0.0536,-0.0477,0.0517,0.0183,-0.0134,-0.0232,-0.0244,0.0425,-0.0322,-0.0368,0.054,0.032,0.0259,-0.0544,0.0099,-0.0334,-0.0613,0.009,0.0578,-0.0519,0.0608,0.0417,0.0297,0.0363,-0.0128,-0.0215,-0.0402,0.009,0.0648,-0.0407,0.0078,0.0226,-0.0813,-0.0785,-0.0696,-0.0632,-0.0012,0.0348,-0.0376,-0.0238,-0.0004,-0.0278,-0.0333,0.0657,0.0868,0.0179,0,-0.0124,0.0143,-0.0171,0.0583,0.0056,-0.0164,0.0357,0.0179,0.0177,0.0094,0.0124,0.0882,0.0574,0.0039,0.1569,-0.0248,-0.0611,-0.0277,0.0427,-0.0147,-0.076,0.0641,0.0097,-0.0026,0.0171,-0.0147,-0.0346,-0.028,0.0726,0.0154,0.0194,-0.0502,0.0358,0.0377,0.0071,0.105,-0.054,-0.1041,0.0262,-0.0296,-0.0736,0.0108,-0.1138,-0.03,-0.045,-0.037,-0.0977,-0.039,-0.0158,0.0161,-0.0147,0.0419,0.0234,0.0508,-0.038,-0.0033,0.0457,-0.0224,-0.0161,0.0325,0.0351,-0.0471,-0.0456,0.0635,-0.031,0.0314,0.0842,-0.0522,-0.0194,-0.0008,0.0491,0.0101,-0.0743,0.0463,-0.0059,-0.0023,0.0051,0.0211,0.0398,0.0402,0.037,0.0235,0.039,0.0304,0.0901,0.0462,0.0028,-0.079,-0.0042,0.101,-0.0514,-0.005,-0.0526,0.1157,0.0346,0,-0.1162,0.0371,-0.0318,0.0032,-0.0358,-0.0623,0.0229,0.0188,0.0038,0.0333,0.0371,0.0348,0.0287,-0.0047,0.0003,-0.0066,-0.0264,-0.1227,-0.0087,0.0429,0.1175,0.0482,-0.0654,0.0664,-0.0105,-0.0187,-0.0641,0.0218,0.0202,-0.1213,-0.0206,-0.0512,0.039,0.0071,0.0327,0.0952,0.0429,0.0917,-0.0015,-0.0465,0.0424,-0.0691,-0.001,0.0297,0.0225,-0.0368,-0.0645,0.0049,0.0179,-0.092,-0.0138,0.0658,0.0259,0.0261,-0.0708,0.0301,0.0849,-0.0088,0.0517,0.0286,0.0543,0.002,-0.0056,-0.0505,-0.0159,0.0459,0.0675,-0.0897,-0.0404,-0.0279,-0.001,0.0487,-0.1324,-0.0574,-0.0435,0.0647,-0.122,0.0207,-0.0453,-0.0332,-0.0186,0.1084,-0.0076,0.024,-0.0053,0.0424,0.0752,-0.0654,-0.0578,-0.0037,-0.0247,-0.0472,-0.0811,0.0764,-0.0493,0,0.039,0.1,0.0402,-0.0643,0.0085,-0.0219,-0.0033,-0.0314,0.0668,0.0202,-0.0397,-0.0294,-0.0203,0.1048,0.0708,0.1142,-0.0278,-0.0693,-0.0996,0.0349,-0.0248,0.0448,-0.0182,-0.012,0.0288,-0.0159,-0.0773,0.0507,0.0085,0.043,-0.0057,0.049,-0.0625,-0.0235,-0.0188,0.0024,-0.0359,-0.0532,-0.0022,-0.0443,0.0129,0.006,-0.0305,0.0719,0.0918,0.028,-0.099,-0.0152,0.0676,-0.0906,0.013,0.0062,-0.0384,-0.0328,0.0637,-0.1156,0.0233,-0.0392,0.0564,0.0395,0.0087,-0.0117,-0.0046,0.0552]},{"type":"blog","slug":"software-engineering-is-not-dead","title":"Software Engineering Isn't Dead — But the Old Way of Working Is","url":"/blog/software-engineering-is-not-dead","date":"March 2026","id":"blog:software-engineering-is-not-dead:top","section":"Overview","text":"Software Engineering Isn't Dead — But the Old Way of Working Is — What the 2025-2026 data actually says about AI coding agents, job security, and where to put your energy right now — 157,000 tech layoffs in 2025. Salesforce froze engineering hires. Claude Code in 69% of enterprise teams. I went through the actual research so you don't have to panic-read headlines.","embedding":[-0.0269,-0.0532,0.024,0.0177,0.0052,-0.0407,-0.022,0.0193,-0.0602,-0.0224,-0.0693,0.0795,0.0428,-0.055,-0.0071,0.0934,-0.1118,-0.0926,0.007,-0.087,-0.0431,0.0256,-0.0444,-0.0537,0.0501,0.0201,0.0231,-0.0852,-0.0245,0.0312,-0.055,0.0794,-0.0119,0.0274,0.0351,0.0449,-0.0459,-0.0273,0.0399,0.024,-0.0905,-0.0184,-0.0255,0.0028,-0.0173,-0.0153,0.0173,-0.0933,0.0075,-0.0536,-0.0491,-0.0139,0.1006,-0.0108,0.0027,-0.0502,0.0825,-0.0422,-0.0238,0.0619,0.0694,-0.0322,-0.0048,-0.0119,0.0137,0.0398,-0.0367,-0.0263,-0.0497,0.004,-0.0619,-0.0913,-0.0186,0.018,0.0703,0.0032,0.0831,0.0175,0.1444,-0.0981,0.0245,-0.1107,-0.0727,0.0906,-0.1123,0.0379,0.0726,0.0638,0.0654,0.0504,0.0119,0.0223,0.0737,0.0238,0.0083,0.0439,-0.0086,0.0013,-0.0895,0.0187,-0.0464,0.0093,0.034,-0.076,-0.0787,0.0346,0.079,0.07,0.0733,-0.0397,-0.0093,-0.0054,-0.0352,-0.0156,0.0095,0.0062,-0.0375,0.0664,0.0662,0.0294,0.079,0.0643,-0.056,0.036,0.0053,0.0145,-0.0251,0,-0.0127,-0.0016,-0.0422,0.0923,0.0128,-0.0682,0.0091,0.0572,0.0289,0.0103,-0.0355,-0.0023,-0.0368,0.053,0.05,-0.0436,0.0279,0.028,-0.0031,-0.0013,0.0367,-0.0637,0.0098,0.0119,0.0405,0.0921,-0.0057,-0.025,0.0247,0.0262,-0.0582,0.0839,0.0321,0.0061,-0.018,0.0477,-0.0461,0.0144,0.0223,0.1371,0.0027,0.1083,-0.0016,-0.0246,0.0951,-0.071,0.1057,-0.0302,-0.0011,0.0017,-0.0488,0.0431,0.0474,-0.0136,0.0044,-0.0065,0.0103,-0.0429,0.0677,0.0459,-0.0175,0.032,0.0094,-0.0566,-0.0054,0.0725,0.0205,0.0469,-0.0091,0.0528,-0.021,-0.0156,-0.0389,-0.0387,-0.0381,0.0313,-0.0071,-0.0617,0.0149,0.0181,0.0484,0.0066,0.0227,-0.0334,0.142,0.0608,-0.0049,-0.001,-0.0213,0.081,-0.0591,-0.1193,0.0479,0.0716,-0.0197,0,-0.128,0.0152,-0.096,0.0229,0.0083,-0.0847,0.0231,0.0125,-0.0113,0.0658,0.034,-0.0368,-0.0374,0.0382,0.0082,-0.0427,-0.0099,-0.0684,-0.0529,0.0125,0.0502,-0.0077,-0.1028,0.0216,0.0435,0.084,-0.0567,0.019,0.0409,-0.0295,0.0072,-0.0261,0.0079,0.0523,0.0583,0.011,0.004,-0.0039,0.0029,-0.0326,0.0742,-0.0202,-0.0402,0.0253,0.0138,-0.0074,-0.0043,-0.0252,-0.0101,-0.0453,0.0427,0.0174,-0.0144,-0.0255,-0.0706,-0.0275,0.0169,0.0433,-0.0429,-0.0138,-0.0231,-0.0216,0.1792,0.0218,-0.0143,-0.0022,0.0251,0.0944,-0.1527,-0.1019,0.0742,-0.0236,-0.1638,0.0294,-0.0808,0.0756,-0.013,-0.0489,-0.0577,0.0204,-0.0039,-0.0048,-0.0296,0.0074,0.0168,0.0545,0.0052,-0.0782,-0.0185,-0.0441,-0.1319,-0.0612,-0.0364,-0.0301,-0.0516,0,0.0443,0.0411,0.0366,-0.0753,0.015,-0.0196,-0.0542,0.0366,-0.0064,0.0275,0.0157,0.0003,0.016,0.0615,0.0723,0.066,-0.0918,0.0075,-0.0369,-0.06,0.017,0.0067,0.0139,0.0141,-0.0159,-0.0416,-0.0056,0.0111,0.0045,-0.0067,-0.0437,0.0063,0.0062,-0.019,0.1283,-0.0527,0.0415,-0.0387,-0.0451,-0.0198,-0.0306,0.0047,-0.0194,-0.0029,0.0705,-0.0643,-0.0708,-0.0188,0.0235,-0.006,0.0412,-0.002,-0.1142,0.0771,0.039,-0.0262,-0.0807,-0.0479,-0.1034,0.0043,-0.0303,-0.0363,0.0133,-0.0152]},{"type":"blog","slug":"software-engineering-is-not-dead","title":"Software Engineering Isn't Dead — But the Old Way of Working Is","url":"/blog/software-engineering-is-not-dead","date":"March 2026","id":"blog:software-engineering-is-not-dead:section:0","section":"Read the Numbers, Not the Headlines","text":"Read the Numbers, Not the Headlines 2025 was a rough year on paper. Over 157,000 tech workers were laid off across 587 companies, and a chunk of those cuts were tied directly to AI productivity gains. Salesforce's Marc Benioff said it out loud in January: no net-new software engineers in 2025, because AI tools had already given his teams around 30% more output. Amazon, Microsoft, Google — all cut deeply, and engineering roles were not spared. That's real. I'm not going to pretend it isn't. But BCG's 2025 AI Value Creation report adds a number the headlines skip: only 5% of organizations have a…","embedding":[-0.0409,-0.0669,0.096,0.0172,0.0243,0.0204,-0.063,0.0059,-0.0279,0.0545,-0.0619,0.0383,0.0175,-0.0288,-0.0258,0.0722,-0.073,-0.1519,-0.0142,-0.1103,-0.0027,0.0429,-0.022,-0.0218,0.0578,0.0072,0.0095,-0.0935,-0.0075,0.0593,-0.0481,0.0852,0.0263,-0.0032,-0.0424,0.0013,0.0088,0.0193,0.0998,-0.0317,0.0107,-0.0707,-0.0142,-0.0284,0.0502,0.0298,-0.0231,-0.0697,-0.0255,0.0371,-0.1102,-0.0322,0.0662,-0.0374,-0.0182,-0.0368,0.0014,-0.0619,-0.0002,0.052,0.0357,-0.0827,0.0422,-0.0295,0.055,0.0488,-0.0244,-0.0584,-0.0958,0.0263,0.0212,-0.0357,0.0184,0.01,0.0523,0.0249,0.0435,0.0521,0.1415,-0.076,0.041,-0.0617,-0.0642,0.0678,-0.1466,0.0323,0.0228,0.0052,0.0011,0.0019,0.0149,-0.0386,0.0067,0.0502,0.0066,0.0529,-0.0709,-0.0546,-0.0356,-0.0238,-0.0214,0.0432,0.0317,-0.0917,-0.0596,0.0048,0.0816,-0.0276,0.0131,-0.0294,0.008,0.0226,-0.0294,-0.0252,0.0271,-0.0431,-0.0342,0.0687,0.0863,0.0455,0.0516,0.0354,-0.063,0.0744,-0.014,0.0299,-0.1062,0,0.0105,0.0117,0.0281,0.0553,-0.0089,-0.0331,-0.002,0.049,0.0313,-0.0464,-0.1062,0.0047,-0.0242,0.0175,0.0993,-0.0844,0.0098,0.0057,-0.0304,0.0093,0.058,-0.01,-0.014,-0.01,0.0285,0.0764,-0.0294,-0.0455,0.0278,0.0235,-0.0194,0.08,0.0338,0.006,-0.0078,0.0452,-0.049,0.0517,0.013,0.1164,0.0023,0.0867,-0.0279,-0.0148,0.0408,-0.0496,0.0126,-0.0289,0.0235,-0.0023,-0.0793,0.0677,0.0336,-0.06,0.0515,-0.0521,-0.0078,-0.0086,0.0351,0.0148,-0.0049,0.077,-0.01,0.0039,-0.0526,0.1161,0.1182,0.0951,-0.011,0.0611,0.0276,0.0218,-0.0718,-0.019,-0.0237,0.0654,0.0137,-0.0931,0.0396,0.0291,-0.0266,0.0076,0.0659,-0.0632,0.1116,0.0077,0.0311,0.0601,0.054,-0.0347,-0.0054,-0.0527,0.0036,0.1151,-0.0601,0,-0.0771,0.0261,-0.0704,0.0317,-0.0317,-0.0544,0.0809,0.0116,-0.0134,0.0237,0.0496,0.01,-0.0153,0.0621,-0.019,-0.0713,0.0132,-0.1039,-0.0104,-0.0346,0.0781,-0.0028,-0.034,0.0177,0.0404,0.0757,-0.0411,0.0032,0.0096,-0.0356,-0.0425,-0.039,-0.0283,0.0473,0.071,-0.0167,0.0108,-0.0378,-0.0185,-0.0014,0.0224,-0.0179,-0.0827,0.0429,0.0019,0.0136,0.0296,0.0368,0.0396,-0.0201,0.0465,0.0197,-0.0597,-0.0525,-0.081,-0.0053,-0.0214,0.0129,-0.0555,0.0414,-0.0698,0.0062,0.0715,-0.0199,-0.0333,0.0202,0.0423,0.083,-0.0839,-0.0691,0.0402,-0.0202,-0.1175,-0.0048,-0.0908,0.1015,0.018,-0.0303,-0.017,0.013,0.0017,-0.0067,0.0289,-0.0394,-0.0305,0.0371,-0.008,-0.0532,-0.0721,0.0328,-0.1368,-0.0483,-0.1149,0.027,-0.0577,0,0.0585,0.0802,0.0317,-0.0137,0.0717,-0.0218,-0.0672,0.0432,0.0701,0.0729,-0.003,-0.0384,-0.007,0.0664,0.0317,0.0558,-0.0996,0.0057,0.0246,-0.0806,0.0477,-0.0178,0.0116,-0.06,0.0005,-0.0821,-0.0556,0.007,-0.0613,0.0281,-0.0409,-0.0283,0.0078,-0.0253,0.108,0.0107,0.0139,0.0084,-0.0318,-0.0191,-0.0062,0.0348,-0.0095,0.0169,0.0553,-0.1222,-0.0573,-0.022,0.0515,-0.0505,0.0295,-0.0077,0.0048,0.053,0.0962,-0.0054,-0.0223,-0.0923,-0.0949,0.0109,-0.0105,-0.084,0.0178,0.0504]},{"type":"blog","slug":"software-engineering-is-not-dead","title":"Software Engineering Isn't Dead — But the Old Way of Working Is","url":"/blog/software-engineering-is-not-dead","date":"March 2026","id":"blog:software-engineering-is-not-dead:section:1","section":"Two Years Changed the Tool Market Completely","text":"Two Years Changed the Tool Market Completely In early 2024, this was basically Copilot versus everyone else. By early 2026, it's a different picture. GitHub Copilot still has scale — 20 million total users, 4.7 million paid, 90% of Fortune 100. But the story of 2025 was Claude Code eating into that lead at the enterprise level. The ACTI Index measured Claude Code adoption at 69% among enterprise dev teams by January 2026, up from Copilot's 35% in December 2025. Teams using it were reporting 32–45% more story points per sprint and 39–50% faster PR merges. Heavy users, meaning people using it fo…","embedding":[-0.0595,-0.0823,-0.0687,-0.0103,-0.0273,-0.0286,-0.0389,0.1096,0.0377,0.0374,0.0007,0.122,-0.0108,0.001,0.0148,0.0011,-0.0271,-0.1203,0.0156,-0.0462,-0.0629,-0.0222,0.004,-0.0188,0.0193,-0.0781,-0.1049,-0.043,-0.0204,0.0193,-0.0277,0.1787,0.0659,0.0649,0.0024,0.0115,0.0153,-0.0004,0.0287,-0.0073,-0.0135,-0.0177,-0.0314,0.0102,0.0333,-0.0289,0.0129,0.0234,-0.0468,0.0305,-0.0732,-0.0071,0.0847,-0.1138,0.0066,-0.0787,0.0398,-0.0017,0.0716,-0.0585,-0.0281,0.0233,-0.0862,0.0006,0.0582,-0.0028,-0.0006,-0.0189,0.0196,-0.0499,0.0034,-0.0334,-0.0017,-0.0013,0.0686,0.032,0.0034,0.058,0.0543,-0.1175,0.0635,-0.0498,0.0213,0.0562,-0.046,0.0722,0.0365,0.0099,0.0407,-0.02,0.0523,0.0173,0.0569,0.045,-0.0317,0.0036,-0.0774,-0.0459,-0.0427,0.0203,-0.0484,0.0148,0.0397,-0.1139,-0.0116,0.0147,0.1126,0.0054,0.0287,0.0319,-0.0273,0.0039,-0.0182,-0.0484,0.0802,0.0209,-0.0748,0.0639,0.1048,0.0577,0.0681,0.0788,-0.1037,0.0099,-0.0192,0.078,-0.0328,0,0.001,0.0226,-0.0269,0.0286,-0.0281,-0.0323,0.0046,-0.0307,-0.0269,-0.0115,-0.0206,0.0085,-0.0796,0.106,0.0442,-0.0739,-0.0271,0.0494,-0.0178,0.0346,0.0146,-0.0323,0.0079,0.0255,0.1025,0.0541,-0.025,0.0116,0.0868,0.0265,-0.0219,0.0346,0.0007,-0.0068,-0.014,0.0038,-0.0285,-0.0842,0.0147,0.0743,-0.0147,0.0162,-0.0738,-0.0901,0.0514,-0.033,0.0068,0.0028,0.0245,0.049,-0.0102,0.069,0.0055,0.0363,0.0027,-0.0529,0.038,-0.107,0.094,0.0776,0.0099,0.0505,0.0178,0.0113,0.0052,0.0754,0.0361,0.0478,0.0222,0.0711,-0.0142,-0.0039,-0.0513,-0.0326,0.0227,-0.0245,0.0487,0.0204,0.0654,0.0194,-0.037,0.0331,0.0134,-0.0286,0.0209,0.0599,0.0391,0.03,-0.0425,0.0556,0.041,-0.0797,-0.0443,0.1123,0.003,0,-0.0912,0.0264,-0.0136,0.0079,-0.0556,-0.0769,-0.0156,-0.0474,0.0826,0.0453,-0.0031,-0.0355,-0.005,0.0375,0.0903,0.0201,0.0058,-0.0723,0.0012,0.0041,0.0835,-0.0056,-0.0236,0.0619,0.0206,0.0095,-0.0373,-0.0322,0.0911,-0.1106,-0.0176,-0.0153,-0.033,0.0153,0.0112,-0.0152,-0.0137,0.0568,-0.0124,-0.0174,0.0514,-0.0116,-0.051,-0.0157,-0.0242,0.0627,0.0006,-0.096,-0.0102,-0.0618,0.0274,0.0413,0.0457,-0.0777,-0.0723,0.0068,-0.0157,0.0156,-0.0475,0.0398,0.0462,0.0243,0.0116,0.0027,0.0036,-0.047,-0.0029,-0.0167,-0.1388,-0.0045,0.0751,-0.0225,-0.0938,-0.0701,-0.1154,0.0456,-0.0653,-0.0179,-0.0283,0.0312,-0.0306,0.0167,0.0184,0.0253,-0.0651,0.1106,-0.0061,-0.0118,-0.024,0.0453,-0.0721,-0.0881,-0.0195,-0.0135,0.0011,0,0.0271,0.1149,-0.0125,0.0044,0.0186,-0.03,-0.0519,0.1256,-0.0061,0.1034,0.0256,-0.0321,-0.0136,0.0126,0.0566,0.0507,-0.0904,-0.0533,-0.0115,-0.0126,0.0017,0.047,-0.0407,-0.0673,-0.1025,-0.0274,-0.0289,0.1012,-0.0592,-0.0123,0.0586,0.0087,-0.0523,-0.0352,0.0463,-0.0846,-0.0334,-0.0179,0.0112,0.0269,0.0409,-0.0165,-0.0016,0.053,0.0009,-0.0627,-0.0792,-0.0962,0.0413,-0.1034,0.0208,0.0445,-0.0955,0.0776,0.0815,0.0578,-0.0532,-0.0266,-0.0417,0.0276,-0.0371,-0.1251,-0.0251,0.0296]},{"type":"blog","slug":"software-engineering-is-not-dead","title":"Software Engineering Isn't Dead — But the Old Way of Working Is","url":"/blog/software-engineering-is-not-dead","date":"March 2026","id":"blog:software-engineering-is-not-dead:section:2","section":"Developers Are Using These Tools — But Not Trusting Them","text":"Developers Are Using These Tools — But Not Trusting Them Stack Overflow's 2025 survey put AI tool adoption at 84% of developers — up from 76% in 2024 and 70% the year before. Daily use jumped to 51%. Those numbers are high. What's interesting is the gap: only 33% of developers said they trust the accuracy of what AI tools produce. People are using these things constantly and second-guessing them constantly at the same time. JetBrains saw similar numbers: 85% using AI tools, 62% relying on a coding assistant as a core part of their workflow, 1 in 5 saving more than 8 hours a week. A full workin…","embedding":[-0.0629,-0.0934,0.0391,0.0662,0.042,-0.0691,0.0274,0.0541,0.0628,0.0069,-0.0715,0.0009,-0.0013,-0.0314,-0.0107,0.0697,-0.0115,-0.1141,-0.0638,-0.0775,-0.0745,-0.029,0.0539,-0.0094,0.076,0.0032,-0.0482,-0.0666,0.035,0.0557,-0.0338,0.0507,0.0021,-0.0113,-0.0414,-0.0061,-0.0047,-0.0118,0.0354,-0.0453,-0.0832,-0.0513,0.0184,-0.0188,-0.003,-0.0024,-0.0376,-0.0545,-0.0164,0.0742,-0.0832,-0.0767,0.0727,-0.0643,0.017,-0.0283,0.0716,0.0259,0.0689,0.0323,0.0385,0.0136,-0.0209,-0.0062,0.0083,0.0231,-0.0151,-0.0497,0.0074,-0.0645,-0.0072,0.0668,0.0072,0.0433,0.0806,-0.0427,-0.0061,0.008,0.1218,-0.1343,0.028,0.0161,0.0059,0.1239,0.0002,0.0545,0.0558,0.0439,0.0671,0.0279,0.0486,-0.0402,0.0375,-0.0341,0.0577,0.0059,-0.0516,-0.0456,-0.0943,0.0001,-0.0901,0.0101,0.0128,-0.0704,0.0135,0.0712,0.0661,-0.0413,0.0291,0.0414,-0.0468,-0.0115,0.0021,-0.0133,0.0796,-0.0493,-0.0132,0.0594,0.0155,0.0766,-0.0067,0.0849,0.0101,0.0082,0.0506,0.0548,-0.0589,0,0.041,0.0337,-0.0131,0.021,-0.0524,-0.1135,0.0054,0.0714,-0.0063,-0.0434,-0.0549,0.0477,-0.0787,0.0873,0.1128,-0.0448,0.0282,0.0164,-0.0708,0.0231,0.0142,-0.1123,0.0333,0.075,0.0375,0.0146,0.0489,0.0727,0.0513,0.009,-0.0449,-0.038,0.0133,-0.0115,0.0015,0.0508,0.0034,0.0009,0.025,0.077,-0.0066,0.0374,0.0194,-0.0558,0.0069,-0.0263,-0.0239,-0.0648,0.0179,0.0489,-0.0558,0.1159,0.0685,0.0547,-0.0156,-0.0709,0.0207,-0.0088,0.0337,0.0304,-0.0494,0.0448,-0.0338,-0.0034,0.0014,0.1118,0.1057,0.0848,-0.0078,0.0543,-0.021,0.0243,-0.1208,-0.0823,-0.0177,-0.0619,-0.0079,-0.0564,0.0893,-0.0169,-0.0275,0.0091,0.0119,-0.0472,0.0286,-0.0415,-0.0189,0.012,-0.0405,0.0842,0.0078,-0.043,0.0169,0.0736,-0.0756,0,-0.0807,-0.0343,-0.0344,0.115,-0.0517,-0.0187,-0.0574,-0.0536,0.0257,0.003,-0.0429,-0.0113,-0.0409,-0.0176,0.0792,-0.0715,-0.0315,-0.0474,0.0171,-0.0519,0.0925,0.0219,-0.0288,-0.0175,-0.012,-0.0074,-0.12,0.0117,0.0007,-0.0341,0.0179,0.0269,-0.0251,-0.0343,0.0246,-0.0256,-0.0043,0.0346,0.0278,-0.0025,0.0038,-0.006,-0.0643,-0.0442,-0.0413,0.0857,-0.0462,-0.0031,-0.0497,-0.0376,0.0571,0.0306,-0.0665,-0.0749,-0.056,0.0075,0.0045,-0.0001,-0.0178,0.0679,-0.023,0.0236,0.0454,-0.0031,-0.0261,0.0473,0.0589,0.0697,-0.0765,-0.0503,0.0855,-0.0706,-0.0438,-0.0095,-0.1033,0.0088,-0.0016,-0.0632,0.0003,-0.0161,0.0308,-0.0294,0.0952,0.0051,-0.0699,0.0673,-0.0289,-0.0396,-0.0292,0.0685,-0.0432,0.0006,-0.0975,0.0178,-0.0533,0,0.0451,0.0518,0.053,0.0051,0.0289,0.0259,-0.0591,0.1187,-0.0319,0.0297,0.12,-0.0518,-0.0853,0.0151,0.0911,0.0272,-0.0279,0.0169,-0.0195,-0.0795,0.0984,0.0173,0.007,-0.1021,-0.0467,-0.0758,-0.0416,0.0844,-0.0866,0.0172,-0.0116,0.0263,0.0296,0.0043,0.0857,0.0116,0.0264,-0.0383,0.0048,0.0326,0.0163,0.0416,-0.0081,-0.0356,-0.0576,-0.0369,-0.0533,-0.0425,0.0334,-0.0437,0.0305,-0.0121,-0.0089,0.1245,0.0654,0.0008,-0.0314,-0.0939,-0.0293,0.0318,-0.0064,-0.0303,0.0572,0.0257]},{"type":"blog","slug":"software-engineering-is-not-dead","title":"Software Engineering Isn't Dead — But the Old Way of Working Is","url":"/blog/software-engineering-is-not-dead","date":"March 2026","id":"blog:software-engineering-is-not-dead:section:3","section":"The Part Nobody Puts in the Marketing Deck","text":"The Part Nobody Puts in the Marketing Deck Productivity gains are real. The quality risks are also real, and they're getting buried. CMU studied 807 projects built with Cursor. They found 41% more code complexity, 30% more static analysis warnings, and 1.75× more logic errors compared to human-written baselines. Speed gains held for the first month, then faded by month three as teams spent more time untangling AI-generated code than they'd saved writing it. A 2026 industry analysis across AI-augmented teams found PR volume up 20% — but incidents per PR up 23.5%, and security issues 1.57× more …","embedding":[-0.0334,-0.022,-0.0471,-0.041,0.0451,0.0073,-0.0183,0.0464,-0.0186,0.0338,-0.0196,0.0557,0.0092,-0.0585,0.0293,-0.0022,-0.0051,-0.0773,-0.0343,-0.0293,-0.0756,-0.0335,-0.0334,-0.0195,0.0139,0.027,-0.0343,-0.0256,0.0372,-0.0501,-0.0352,0.1127,0.11,-0.0276,0.0319,0.0032,-0.0314,-0.0044,0.0231,-0.0258,-0.0251,-0.0091,0.0165,0.0161,0.0179,-0.0933,0.0655,-0.034,-0.0434,0.0071,-0.0963,-0.0178,0.0666,-0.1053,-0.0502,-0.0176,-0.0123,-0.0565,-0.0347,0.0257,-0.0205,-0.0495,-0.015,0.0122,0.0568,-0.0316,-0.0276,0.0419,-0.0114,-0.0072,0.0332,0.0022,-0.0335,-0.0518,0.0581,0.0868,0.0251,0.0055,0.117,-0.1154,0.0461,-0.0334,-0.0466,0.0372,-0.0251,-0.0002,0.0986,0.0077,-0.0148,0.0027,0.0653,-0.0261,-0.0129,0.023,-0.0004,0.0643,-0.095,-0.0699,-0.0507,0.0106,-0.0435,0.0942,0.0051,-0.0964,-0.0465,-0.0009,0.0729,0.0825,0.017,0.0605,0.0342,0.0262,-0.0474,-0.0763,0.0649,-0.0003,-0.0535,0.0419,0.0375,0.063,0.051,-0.0183,0.015,0.0533,-0.0017,-0.0216,-0.0486,0,-0.0674,0.0315,0.0033,-0.0104,0.0322,-0.0325,0.0072,0.0695,0.015,-0.0697,-0.0719,0.0723,-0.0052,0.1002,0.0844,-0.096,-0.0101,0.1033,-0.0425,-0.0446,-0.0051,-0.0255,-0.0142,-0.0516,0.0778,0.0793,0.0027,0.0432,0.0421,0.029,0.0067,0.054,-0.0355,0.0147,-0.0307,0.055,-0.0463,-0.0465,0.1261,0.1248,-0.1343,0.085,-0.0003,-0.0555,-0.009,0.003,-0.0167,-0.069,-0.0427,-0.0009,-0.0029,0.0335,0.0216,0.0321,0.0288,-0.0928,0.0223,-0.0116,0.0596,0.0254,-0.0119,0.0588,-0.0505,0.0049,-0.0392,0.1186,0.0502,0.0139,0.0428,0.0639,0.0006,-0.0006,-0.037,-0.0676,0.0191,0.0039,-0.0718,-0.0035,0.0426,0.0378,-0.0591,0.0344,-0.0257,-0.052,0.0636,0.0104,-0.013,0.0758,0.0095,0.0705,0.0512,0.0229,-0.0076,0.0926,-0.0488,0,-0.1142,0.0304,-0.0479,0.0444,-0.0673,-0.0429,-0.0083,-0.0088,0.0146,-0.0258,-0.0402,0.0041,-0.0529,0.0194,0.0185,-0.043,0.0296,0.0139,-0.0079,-0.0174,0.1285,0.0152,-0.0604,0.0884,-0.0207,0.0164,-0.0552,-0.0513,0.0388,-0.0836,0.0261,-0.0105,-0.1163,0.0611,-0.0099,-0.0114,-0.0053,0.0131,0.0367,-0.0097,0.0813,-0.0034,-0.0257,-0.0019,0.0103,0.0127,0.057,-0.0519,0.0044,0.0555,0.037,-0.0116,-0.0031,-0.0705,-0.0963,-0.0733,-0.0123,-0.0857,-0.0112,0.0472,0.029,0.0037,-0.0301,-0.0469,-0.0195,0.0178,0.0321,0.0592,-0.0763,-0.0436,0.0159,0.0128,-0.1162,0.015,-0.1131,0.1367,0.0339,-0.0481,-0.0177,-0.0054,-0.0187,-0.0251,0.0076,-0.0352,-0.0634,0.1278,0.0307,-0.0771,-0.0228,0.0411,-0.1066,-0.0356,0.0014,0.027,-0.0164,0,0.0301,-0.0062,0.0827,0.0064,0.0225,-0.0389,-0.0669,0.0991,0.0247,-0.0138,0.0951,0.0059,-0.0781,0.0636,0.0667,0.1051,-0.0287,0.0156,-0.0154,-0.0901,0.0696,0.0564,0.0301,-0.0052,-0.0645,0.0004,0.0255,0.0779,-0.0463,-0.0309,0.0449,-0.046,-0.0041,0.0724,0.1065,-0.0477,0.0656,-0.0124,0.01,0.0279,-0.0204,0.0113,0.0213,0.0197,0.0206,-0.049,-0.1241,-0.0484,0.0088,-0.1174,0.0325,0.0373,-0.0394,0.0412,0.0395,0.0526,-0.0253,-0.0197,-0.0617,0.0199,0.0678,-0.0532,-0.0385,0.0554]},{"type":"blog","slug":"software-engineering-is-not-dead","title":"Software Engineering Isn't Dead — But the Old Way of Working Is","url":"/blog/software-engineering-is-not-dead","date":"March 2026","id":"blog:software-engineering-is-not-dead:section:4","section":"Agents Are Doing Real Work Now","text":"Agents Are Doing Real Work Now When Devin scored 13.86% on SWE-bench in early 2024, people were shocked. SWE-bench is a set of real, unresolved GitHub issues — not toy problems. The model had to read a codebase, understand a bug report, and generate a patch that passes the tests. 13.86% felt low, but the baseline for a single engineer tackling random issues cold was around 1.96%. It was a genuine signal. By early 2026, multi-agent systems are past 50% on SWE-bench Verified. Agyn hit 72.2% on SWE-bench 500. Auggie at 51.8%, Cursor agents at 50.2%, Claude Code at 49.8%. Claude Opus 4.5 holds the…","embedding":[-0.0837,-0.1064,-0.0587,-0.047,-0.0105,-0.0217,-0.0392,0.0779,-0.0029,0.0418,-0.0421,0.0266,0.0345,-0.015,-0.0079,-0.0307,0.0818,-0.0206,-0.0768,-0.0168,-0.0545,-0.068,-0.0221,-0.0587,0.0617,-0.0682,-0.0393,-0.0466,-0.0144,-0.0744,0.0369,0.0803,-0.0275,0.012,0.0012,0.0323,-0.0259,-0.0572,0.0011,0.0843,0.001,-0.0571,-0.0175,-0.0059,0.0307,-0.0721,0.0034,-0.0229,0.0022,0.02,-0.1224,-0.063,0.0587,0.0185,-0.0323,-0.0105,0.0493,0.009,0.0428,-0.031,0.0579,-0.0462,0.0014,-0.0084,0.0497,0.0353,-0.0447,-0.0159,0.06,-0.0562,-0.0217,-0.0408,-0.0427,-0.0624,0.0511,0.0138,-0.0437,0.0004,0.1413,-0.0696,0.0368,-0.1033,-0.062,0.0245,0.0175,0.0464,0.0924,0.0097,0.0672,0.0351,0.012,-0.0169,0.0416,0.0144,-0.0055,0.0875,0.0049,-0.0569,-0.0506,0.0902,-0.0277,0.0169,0.0419,0.0356,-0.033,-0.0565,0.0934,0.0159,-0.0497,-0.0643,-0.0068,0.0342,0.0255,0.0101,0.0596,0.0009,0.0045,0.1033,0.0088,0.037,0.078,0.0518,-0.0046,0.02,0.0852,0.1553,0.0298,0,0.0473,0.0448,0.0113,0.0116,0.0144,-0.0643,-0.0352,0.104,-0.0267,0.031,0.0106,0.0106,0.0089,0.01,0.0257,-0.0247,-0.0526,0.0124,-0.0777,0.0529,-0.0021,0.0266,0.0129,-0.0202,-0.0008,0.079,-0.0365,-0.0155,0.0318,0.0306,-0.0483,0.0616,-0.0117,0.0432,-0.0522,-0.005,-0.0795,-0.0752,0.0851,0.0091,-0.0453,0.0519,0.0151,-0.1393,0.0211,-0.0627,-0.0323,-0.0588,0.0268,0.0043,-0.0127,0.1065,0.0085,0.0694,0.0088,0.0033,0.0296,0.0333,0.062,0.1088,0.0309,0.0396,0.0457,-0.0233,-0.0281,0.0502,-0.02,0.0364,0.0275,0.0516,-0.013,-0.0177,0.0189,-0.0336,0.0205,-0.0231,0.0601,-0.0055,0.014,-0.0695,-0.0279,0.0344,0.0081,-0.0505,-0.0438,-0.0217,-0.0822,-0.0353,-0.0718,0.0793,-0.0196,-0.0288,-0.0535,0.0519,-0.0416,0,-0.0859,-0.0077,-0.0745,0.0507,-0.0065,-0.0452,-0.041,-0.0505,0.046,0.0592,0.0291,-0.0451,-0.0641,-0.0186,0.0672,-0.0584,0.0175,-0.0525,0.0469,-0.019,0.1511,0.0464,-0.0165,0.0609,0.0713,0.0421,-0.005,0.0101,0.015,-0.0586,0.0336,-0.0019,-0.0434,0.0274,-0.0261,0.0239,0.007,0.0973,-0.0273,-0.0124,0.1562,-0.0235,-0.0837,0.0352,0.0221,0.0415,-0.0624,-0.001,0.0007,-0.0237,0.0042,0.0115,-0.0393,-0.0306,-0.1084,0.0095,0.0259,-0.0263,-0.0221,0.0117,0.0376,0.0247,-0.0144,-0.0353,0.0184,0.0207,-0.0086,0.0512,0.0021,-0.0561,0.0698,-0.0131,-0.0309,-0.0016,0.0446,0.0853,-0.0961,-0.0507,-0.0067,-0.0394,-0.094,0.0005,0.0102,0.0249,-0.0072,0.1431,-0.0337,0.0016,0.0613,-0.0124,-0.0407,0.0283,-0.0384,-0.0051,-0.0187,0,0.0402,0.0085,0.0649,-0.0042,-0.0092,-0.056,-0.0354,0.0797,-0.0237,0.0741,0.0991,-0.0673,-0.0095,-0.0243,0.0899,0.0608,-0.0978,0.0638,-0.0891,-0.0747,0.0516,0.0496,0.0507,-0.0088,-0.0386,-0.0121,-0.0143,0.1185,-0.0538,0.0029,0.0394,-0.0143,0.0997,-0.0636,0.0422,0.063,0.0379,-0.0202,0.041,0.0318,-0.0769,0.0143,-0.0023,-0.0017,0.0262,-0.0452,-0.0907,-0.0387,0.1262,-0.1217,0.0163,-0.0303,-0.0921,0.0778,0.029,0.003,-0.0205,-0.0997,-0.017,-0.0133,0.043,-0.0501,-0.088,0.0132]},{"type":"blog","slug":"software-engineering-is-not-dead","title":"Software Engineering Isn't Dead — But the Old Way of Working Is","url":"/blog/software-engineering-is-not-dead","date":"March 2026","id":"blog:software-engineering-is-not-dead:section:5","section":"Where to Actually Put Your Energy","text":"Where to Actually Put Your Energy I spent a while trying to figure out what separates developers who are thriving in this environment from the ones who are stressed about it. It's not that the thriving ones have better tools. Everyone has the same tools. It's how they're using the time the tools return. Offload the work that was never interesting anyway. Boilerplate, CRUD scaffolding, repetitive tests, dependency upgrades, documentation — let agents handle it. That time should go somewhere real: design discussions, production post-mortems, reading the papers behind the tools you use. Become th…","embedding":[0.0314,0.0223,0.0157,0.0587,0.0533,-0.0772,-0.0338,0.0457,0.0013,0.0353,-0.0883,-0.0106,-0.0348,-0.031,0.0531,0.0451,0.0379,-0.0989,0.0007,-0.0854,-0.0268,-0.0519,0.0119,0.0299,0.0346,0.1164,-0.0158,-0.0193,0.0567,0.0043,-0.0201,-0.0105,-0.0249,0.0017,0.0226,0.1565,0.034,0.0215,0.0464,0.0325,-0.0803,-0.0261,-0.0411,-0.0215,-0.0023,-0.1051,0.0131,-0.1087,-0.0035,-0.0399,0.0028,-0.0854,-0.0164,-0.0276,0.0682,0.027,0.1143,-0.0273,0.0487,0.0019,0.0169,0.0291,-0.0469,0.0071,0.047,-0.0161,0.0243,0.0511,-0.078,-0.0142,-0.051,-0.0364,0.0402,-0.0685,0.0508,0.027,-0.053,0.0214,0.0885,-0.0318,0.0916,0.0065,-0.0139,0.0765,-0.0549,0.0241,0.09,0.0506,0.1264,0.0309,-0.0191,0.0387,0.0813,-0.0033,0.0337,0.0407,0.0299,-0.043,-0.0533,0.0414,-0.0217,0.0442,0.0531,-0.0258,-0.0012,0.0068,-0.0348,0.067,0.0046,-0.0231,0.0041,0.0341,-0.0198,0.0035,0.0799,-0.051,-0.0077,0.023,0.056,0.099,0.0502,0.0327,-0.0048,-0.0115,0.0737,0.0676,-0.0257,0,0.0289,0.0902,-0.0226,0.1075,-0.0528,-0.0006,0.0251,0.0381,-0.0079,-0.0101,0.0782,0.0466,-0.046,0.0437,0.034,-0.1445,-0.0622,-0.0122,-0.0557,0.0169,-0.0806,-0.0916,-0.0096,0.0674,0.0529,-0.0045,0.069,0.0095,-0.0986,-0.0176,0.0018,-0.0378,0.0183,0.0174,-0.0922,0.042,-0.0278,0.0144,0.0817,0.014,-0.1205,0.089,0.0178,-0.0189,0.0793,0.0458,0.0818,-0.0187,-0.0448,-0.0282,-0.0397,0.0567,0.0806,0.0747,-0.0608,-0.0835,0.0504,-0.0986,0.0218,-0.0017,0.0211,0.0282,-0.0636,-0.0067,0.0656,-0.0143,0.0514,0.068,0.0087,-0.0024,-0.0073,0.0213,-0.0059,-0.0784,-0.0034,-0.0333,-0.0605,-0.0518,-0.0886,-0.0405,0.055,0.0404,0,-0.0148,0.0754,-0.0185,-0.0333,-0.0177,-0.0243,0.0741,-0.0085,-0.0184,0.0784,0.009,-0.0058,0,0.0497,-0.0649,-0.0689,0.062,0.011,-0.0131,-0.0986,-0.1053,-0.0291,-0.0086,-0.0296,-0.0274,-0.0656,0.0411,-0.0339,-0.0439,-0.0147,-0.0357,0.0287,-0.0439,0.039,0.0341,-0.0354,0.0285,-0.0097,0.0428,-0.066,-0.0082,-0.0249,-0.038,-0.0367,0.0104,0.0148,-0.0351,-0.0204,0.0408,-0.0512,0.0021,-0.0382,0.0657,0.0192,0.0488,-0.0346,0.0038,-0.0219,0.0545,-0.0576,-0.0998,-0.0534,0.0249,0.0797,-0.0084,-0.079,-0.0594,-0.0301,-0.0654,0.0676,-0.0536,-0.0206,0.0289,-0.0305,0.0254,0.0551,0.0622,-0.0963,-0.0388,0.0372,-0.0075,-0.0707,-0.0066,-0.0925,-0.0133,-0.0994,-0.0352,-0.0369,0.1013,-0.015,-0.0207,-0.0309,-0.0328,0.0118,0.0395,0.0117,-0.0238,-0.0876,0.0727,-0.0089,-0.0643,-0.0293,-0.0088,-0.0922,-0.0388,-0.0955,-0.0051,0.0296,0,0.0509,0.0186,0.0297,-0.0545,0.0184,-0.0102,0.0149,0.128,0.0697,0.0532,0.0871,-0.0704,0.052,0.0842,0.0824,0.0774,0.0054,0.0309,-0.0637,-0.0953,0.0176,0.0061,0.0381,-0.0144,0.0299,-0.063,-0.0216,0.0132,0.0211,0.0553,-0.004,0.034,-0.0399,-0.0719,0.028,-0.0447,0.0015,0.0055,0.06,0.0993,-0.0652,0.0609,0.0096,-0.0267,-0.0773,-0.0554,-0.1288,0.0695,-0.0025,-0.0405,-0.0015,-0.0699,-0.0193,0.0354,0.0241,-0.0123,0.0011,0.0437,-0.0349,0.0164,-0.0064,-0.0093,-0.0143,0.0158]},{"type":"blog","slug":"software-engineering-is-not-dead","title":"Software Engineering Isn't Dead — But the Old Way of Working Is","url":"/blog/software-engineering-is-not-dead","date":"March 2026","id":"blog:software-engineering-is-not-dead:section:6","section":"Who Actually Has Something to Worry About","text":"Who Actually Has Something to Worry About Accenture's 2025 workforce survey: 48% of workers feel secure in their jobs, down from 59% the year before. 82% of C-suite leaders expect more disruption in 2026. That's not noise. The risk is concentrated. Developers whose primary value is throughput — how many tickets closed, how many endpoints written, how many tests committed — are in a genuinely difficult position. An agent can write thousands of lines per minute. If that's the metric by which you're measured, it's not a great benchmark to compete on. Where I see strong job security: engineers who…","embedding":[0.0004,-0.0351,0.0243,0.0038,-0.0602,0.034,0.0162,-0.0196,-0.0136,-0.0055,-0.13,-0.0162,0.0623,-0.0439,-0.1165,-0.0043,0.0387,-0.0877,-0.014,-0.0316,-0.1045,-0.0183,-0.0193,-0.0463,0.0295,-0.0669,0.0069,-0.0076,-0.0512,-0.0004,-0.0636,0.0389,0.0579,0.0344,0.0073,0.0396,-0.002,-0.0306,0.0695,0.0103,-0.0646,-0.0971,-0.0216,0.0133,0.0454,-0.1008,0.0294,-0.0682,-0.039,0.0353,-0.0784,-0.0187,0.0835,-0.0686,-0.0368,0.0119,0.0359,-0.0168,-0.019,0.0531,0.0424,-0.0598,-0.0609,0.0068,0.0163,0.0067,-0.025,0.0083,0.0124,0.0285,-0.0373,-0.0514,-0.0233,-0.0418,0.1275,0.0492,-0.0392,-0.0335,0.0801,-0.0887,0.1052,-0.0997,-0.062,0.0433,-0.0071,0.0326,0.072,-0.0001,0.0196,-0.0019,0.0504,-0.0131,0.0191,0.0586,0.0501,0.0648,-0.0494,0.0077,-0.0764,-0.0101,-0.0486,0.0091,-0.0145,-0.0108,-0.0627,0.0061,0.05,-0.0381,-0.0326,-0.0509,0.0529,0.0567,-0.009,0.0472,0.0457,-0.0158,-0.0903,0.0742,0.0465,0.0968,0.0694,0.0335,-0.0514,-0.0113,-0.0006,0.0182,0.0294,0,0.0756,0.1115,-0.0023,0.0224,-0.0148,-0.0003,-0.0203,0.0214,0.0052,0.0021,-0.0148,-0.0143,0.0241,0.0241,0.0537,-0.0015,-0.0295,0.0586,-0.0921,0.0143,0.0376,-0.0281,-0.0347,-0.001,0.0625,-0.0125,0.0018,-0.0254,0.0184,0.0403,-0.0589,0.0785,-0.0108,0.0171,-0.0431,0.0915,-0.0369,-0.0215,0.0409,0.0403,-0.0518,0.0412,0.0839,-0.0015,0.0679,-0.0155,0.0099,-0.0263,-0.0133,0.0334,-0.0431,0.039,0.0427,0.003,0.0501,-0.049,0.0664,-0.0448,-0.0366,0.0902,-0.0799,0.0694,-0.004,-0.054,-0.021,0.023,-0.0161,0.0336,0.0273,0.0712,0.0109,0.0094,-0.0372,-0.0507,-0.0502,0.0375,0.026,0.0303,0.0493,-0.0376,-0.0028,0.0171,0.0637,-0.0364,0.1266,0.0126,0.0125,0.0149,0.0331,0.0529,0.0231,-0.0519,0.0231,0.075,-0.1255,0,-0.101,0.0002,-0.0508,0.1015,-0.0336,-0.0502,0.074,-0.023,0.0187,0.0323,-0.0104,0.0525,0.0488,0.0192,-0.0212,-0.0803,0.0334,-0.0752,0.0004,-0.0286,0.1148,-0.0464,-0.072,0.0976,0.0109,0.0353,-0.0903,-0.093,0.0096,-0.0427,-0.0362,0.0396,-0.0438,0.011,0.0486,0.0419,-0.0254,0.043,0.0101,0.0725,0.0131,0.0123,-0.0849,-0.089,0.0133,-0.0149,0.0568,-0.0312,-0.0636,0.0384,0.0596,0.0689,-0.0123,0.032,-0.028,-0.006,-0.0242,-0.0348,-0.0216,0.0828,0.0344,0.0675,0.0431,0.012,0.0106,0.0002,-0.0015,0.0354,-0.0454,-0.056,0.0683,-0.0548,-0.0737,0.0287,-0.0981,-0.0242,-0.0059,-0.0476,-0.0306,0.0914,-0.0269,0.022,-0.0088,0.0511,0.0085,0.1188,-0.0024,-0.0756,0.0202,0.0031,-0.0845,-0.0012,-0.1207,-0.097,0.016,0,0.0669,0.0457,0.0483,-0.09,0.0062,-0.0891,-0.046,-0.0025,0.0026,0.0383,0.1272,-0.0859,-0.0236,0.0051,0.0672,0.1091,-0.0062,0.0474,-0.116,-0.0877,0.0166,0.0738,-0.0479,0.001,-0.0492,0,-0.0111,0.033,-0.0145,0.0153,-0.0701,-0.0558,0.0103,-0.0381,0.0102,0.0739,0.0538,-0.0037,0.06,0.0849,-0.0608,0.0222,0.0439,0.0532,0.006,-0.1538,-0.0467,0.0054,0.0501,-0.0449,0.0572,-0.0146,-0.024,0.0683,0.0376,0.0381,-0.0582,-0.0524,-0.0217,0.0538,-0.0523,-0.0765,-0.0004,0.0095]},{"type":"blog","slug":"software-engineering-is-not-dead","title":"Software Engineering Isn't Dead — But the Old Way of Working Is","url":"/blog/software-engineering-is-not-dead","date":"March 2026","id":"blog:software-engineering-is-not-dead:section:7","section":"So Is the Job Dead?","text":"So Is the Job Dead? No. But I understand why it feels like that from the outside. The version of the job that's shrinking is specific: writing boilerplate, closing tickets, implementing features from spec without much need to think about whether the spec is right. That was always the lower end of the work. Automating it is, genuinely, a good thing for anyone who wanted to spend their career thinking about harder problems. What's left — and what's getting more important — is harder to fake and harder to automate. Reasoning about complex systems with incomplete information. Catching errors in ou…","embedding":[-0.0431,0.0368,0.0167,-0.0023,0.0832,-0.066,-0.0673,0.0359,-0.0857,0.0351,-0.0706,0.1055,-0.0408,-0.005,-0.0311,-0.0219,0.0243,-0.0881,-0.075,-0.0143,-0.0578,0.0222,-0.0834,0.0115,0.0271,0.0327,-0.0174,-0.0848,-0.0214,-0.069,-0.0102,0.0723,-0.0269,0.0173,0.1217,0.0548,0.0439,-0.0024,-0.0029,-0.0522,0.0042,-0.0582,-0.11,0.0844,0.0257,-0.032,0.0266,-0.1013,-0.0074,-0.0754,-0.0603,-0.0608,0.116,-0.0187,0.0066,0.0347,0.0809,0.0337,-0.0753,0.056,0.0221,-0.0358,-0.0406,0.021,0.0698,-0.0407,0.0075,-0.1132,-0.0225,0.0043,-0.0445,-0.0235,-0.0371,0.0867,0.1067,0.0121,-0.0233,-0.0386,0.0546,-0.0406,0.061,-0.1052,-0.0806,0.1019,-0.0408,0.0191,0.0207,-0.0431,0.0891,-0.0515,0.014,-0.0807,0.0202,0.0086,0.0083,0.0125,0.0344,0.0498,-0.0417,0.0592,-0.0353,0.0349,0.0145,-0.0672,-0.0231,0.0276,-0.0062,0.0738,-0.0055,-0.0297,-0.0319,-0.0242,-0.0245,0.022,0.0086,0.0126,-0.0709,0.0204,-0.0485,0.0465,0.0456,0.0812,-0.0347,0.1199,0.0506,0.0425,0.0504,0,-0.0222,0.0413,-0.0247,0.0032,0.0253,-0.0491,-0.0133,0.0565,0.0723,0.0583,0.0077,0.0256,-0.0037,-0.0174,0.0346,-0.0352,-0.0517,0.0899,-0.0399,-0.0296,0.026,0.0424,-0.0639,-0.0324,0.0078,0.0435,0.0466,0.0814,-0.0319,0.0222,-0.0786,0.0356,0.0219,0.0171,-0.0048,0.0024,-0.0227,-0.0492,0.0997,-0.0058,-0.0587,0.0278,-0.0333,0.0113,0.0272,-0.0681,0.1038,-0.0149,-0.0172,0.0477,0.0223,-0.0215,0.0741,0.0052,-0.0074,0.0269,0.0292,-0.0851,0.1062,0.0264,-0.0047,0.0281,-0.1123,0.0461,-0.0531,0.0041,0.0143,0.0298,0.0385,0.0221,-0.0089,0.0293,-0.0671,-0.0197,0.0311,-0.01,0.0683,-0.0072,-0.0062,-0.024,0.0858,0.042,0.085,-0.0379,0.1158,0.0059,0.0454,0.0014,0.0047,0.0683,-0.0722,-0.072,-0.0508,0.0578,0.0599,0,-0.0452,-0.0265,-0.0822,0.0885,-0.0374,-0.0664,-0.0286,-0.0193,-0.0622,-0.03,-0.0053,0.0205,-0.0473,0.0368,-0.0359,-0.0405,-0.0522,-0.0803,0.0187,0.0421,0.0436,-0.0233,-0.1324,0.0284,-0.0012,0.0263,-0.0553,-0.0271,-0.0586,0.0248,0.0312,-0.0584,-0.0309,0.0315,0.0206,-0.0042,-0.0142,0.0184,0.0009,0.034,0.0682,-0.0643,-0.0574,-0.0581,-0.0003,-0.0507,0.0259,-0.0092,0.0159,-0.0462,-0.0125,0.034,0.0138,0.0147,-0.0228,0.0074,0.0195,-0.0074,-0.064,0.0108,0.046,0.023,0.1313,-0.0492,0.0579,-0.0337,0.012,-0.0081,-0.1032,0.027,0.0562,-0.0047,-0.1804,0.0723,-0.0033,0.0132,-0.0748,0.0135,-0.0504,0.046,-0.0124,-0.068,0.0101,0.0286,-0.0018,0.0962,-0.0617,0.0272,-0.0214,0.0412,-0.0952,-0.0122,0.0032,0.0207,-0.0874,0,0.014,0.076,0.0626,-0.0472,0.0272,-0.0786,-0.0022,0.0188,0.0502,0.0911,-0.001,-0.0514,-0.0522,0.0422,0.064,0.0351,-0.006,0.0022,-0.0631,-0.0304,0.0477,0.0663,-0.0371,-0.0373,0.0085,0.0404,0.0355,0.1076,0.0117,0.0056,-0.0212,0.0305,0.0085,-0.0027,0.0496,-0.048,0.0992,0.019,-0.036,-0.0684,-0.0792,0.0792,-0.0595,0.0181,0.0922,-0.0255,-0.0005,-0.0023,-0.0606,-0.0607,0.0486,-0.0416,-0.0811,0.0816,0.0308,-0.0359,-0.0172,-0.0682,-0.1029,0.0471,0.0112,-0.0201,-0.0074,0.0443]},{"type":"blog","slug":"ai-models-2022-2025-benchmarks","title":"Three Years of LLMs: What the Benchmarks Actually Show","url":"/blog/ai-models-2022-2025-benchmarks","date":"February 2025","id":"blog:ai-models-2022-2025-benchmarks:top","section":"Overview","text":"Three Years of LLMs: What the Benchmarks Actually Show — GPT-3.5 launched in late 2022 with a 4K context window and struggled with high-school math. Here's how far things moved, and what the numbers mean in practice. — In late 2022, GPT-4 couldn't reliably solve competition math problems. By 2025, reasoning models are outscoring domain-expert PhDs on their own subject matter. I tried to put the full arc into one place.","embedding":[-0.0043,-0.0475,0.0114,-0.0772,0.0463,-0.0457,-0.0739,0.0713,-0.0241,0.0297,-0.088,0.0553,0.0045,0.0737,0.0374,-0.0042,0.0548,-0.0118,-0.0482,-0.1034,-0.0509,-0.0517,0.0848,-0.0058,0.0353,-0.0092,0.0525,-0.1089,-0.0338,0.048,-0.0311,0.0198,-0.0247,-0.0172,-0.0787,0.069,-0.0025,0.001,0.0125,0.0471,0.0093,-0.0872,0.0462,0.0098,0.0934,0.008,-0.0157,-0.0046,-0.0752,-0.0625,-0.0816,-0.0248,-0.0717,-0.0989,-0.0224,0.025,0.0263,0.0182,-0.0221,-0.0058,0.0073,-0.0988,-0.0825,-0.0217,0.056,0.0508,0.0101,0.0284,-0.0107,0.0698,0.0066,0.0666,-0.0465,-0.0066,0.0709,0.0473,0.0425,0.0788,0.0526,-0.0469,0.1243,-0.0598,-0.0389,-0.006,-0.0039,-0.0772,-0.0626,0.0171,0.0364,-0.0272,0.0735,-0.06,0.0139,0.0792,-0.0327,0.038,-0.0629,-0.0456,-0.0172,0.0425,-0.0276,0.1013,-0.0323,-0.0073,0.0154,0.0141,0.0767,0.0593,0.0465,-0.0577,0.076,-0.0279,0.0784,0.0211,-0.0603,-0.0347,0.0084,-0.022,0.0716,0.0174,-0.0843,0.0387,0.0124,-0.066,0.0269,0.0588,-0.1202,0,-0.0013,0.0395,0.0621,0.0229,-0.0494,0.0478,0.0066,-0.0106,0.0273,0.0303,-0.0124,0.0011,-0.069,-0.0099,0.1121,-0.0027,-0.0688,0.0077,-0.0154,0.0083,0.044,0.0049,-0.0447,-0.0442,0.027,0.1137,0.0565,-0.0178,0.0363,0.0258,-0.0449,0.0234,-0.0701,0.0841,0.016,0.0026,-0.0115,-0.0765,0.1088,-0.0169,-0.0547,-0.0001,0.0754,-0.0305,0.0021,0.0237,0.0206,0.0339,-0.0028,0.029,-0.0023,0.0418,-0.0787,-0.0647,-0.0007,-0.0094,-0.0302,-0.0312,-0.0074,0.0765,0.0393,0.0499,-0.0303,-0.0168,-0.0871,0.0726,-0.1374,0.0205,0.0568,0.043,0.0084,-0.0013,-0.0155,-0.0414,0.104,-0.0868,0.0904,-0.0345,0.0466,0.0043,-0.0004,0.0642,0.008,-0.0523,0.0029,-0.0216,0.0119,-0.0717,-0.0144,-0.0212,-0.0381,-0.0567,-0.0119,0.1449,-0.0161,0,-0.0288,0.0455,-0.0155,0.1367,0.0239,-0.0668,0.0199,0.014,0.0077,-0.0063,0.0314,0.0347,0.0445,0.0321,0.0253,-0.0725,-0.0473,-0.1429,-0.0318,-0.0024,0.064,0.0464,-0.1273,0.0464,-0.0057,0.0069,0.0144,-0.0633,-0.0072,0.0046,0.0304,-0.058,-0.0145,-0.02,-0.0585,-0.0099,0.0973,0.0299,-0.0813,0.0266,0.0066,-0.0827,0.0238,0.0349,0.0543,0.1383,0.0309,0.0196,0.0834,0.0238,0.0019,-0.0552,0.0159,-0.0168,-0.0285,-0.0612,-0.0006,-0.0072,-0.0815,0.0673,-0.0277,-0.0091,0.0796,0.0248,-0.0076,0.015,-0.0417,0.0182,-0.043,0.0403,-0.0576,-0.0475,-0.0696,0.0275,-0.0062,0.0665,-0.0417,0.0326,-0.0007,-0.025,0.0457,-0.0178,0.0503,0.0068,-0.0334,-0.0598,0.0906,-0.0365,-0.0242,0.0007,-0.0992,0.0103,-0.0036,0.0191,-0.035,0,0.0408,0.0699,-0.0355,0.0128,-0.0297,0.0053,-0.081,0.0736,-0.0066,0.0382,0.0169,-0.0303,-0.0803,0.0432,0.0526,0.0314,0.0049,-0.0338,-0.044,-0.071,0.017,0.0048,0.0117,-0.0676,0.0201,0.0085,-0.0424,0.0676,0.0111,0.045,-0.016,-0.0633,-0.0172,0.0101,0.0512,-0.0458,-0.0636,0.0693,0.075,-0.0361,-0.0396,0.0011,-0.0378,0.074,0.0256,-0.0203,-0.0238,-0.0402,-0.015,0.084,-0.0291,0.0443,-0.1071,-0.0369,0.0617,0.0322,-0.0051,-0.0714,-0.1247,-0.0208,0.0441,-0.0396,-0.0737,0.1028]},{"type":"blog","slug":"ai-models-2022-2025-benchmarks","title":"Three Years of LLMs: What the Benchmarks Actually Show","url":"/blog/ai-models-2022-2025-benchmarks","date":"February 2025","id":"blog:ai-models-2022-2025-benchmarks:section:0","section":"Where Things Stood in Late 2022","text":"Where Things Stood in Late 2022 ChatGPT launched in November 2022 on GPT-3.5. The context window was 4,096 tokens — roughly three pages. On MMLU, a benchmark covering 57 subjects from physics to law, it scored around 70%, which felt impressive at the time. GPT-4 followed in March 2023 at 86.4% and added the ability to read images. The problem was multi-step reasoning. Ask a model to write a paragraph and it was great. Ask it to solve a competition math problem that required five logical steps in sequence, and it would confidently give you a wrong answer at step three and keep going. GPT-4 scor…","embedding":[-0.0539,-0.0016,0.052,-0.042,0.0321,-0.0194,-0.0097,0.1032,-0.0243,0.0163,-0.0446,0.0131,-0.0442,0.0703,0.0306,-0.0534,-0.0374,-0.0388,-0.0866,-0.0639,-0.002,-0.0158,0.0832,-0.0049,0.0723,0.0466,-0.0294,-0.112,0.0155,0.0692,0.0236,0.0684,0.0174,0.0485,-0.0436,0.0444,-0.0247,-0.022,0.0219,0.0062,-0.0442,-0.0795,0.0252,0.0499,0.1133,-0.0171,-0.0534,-0.0067,-0.0199,0.0257,-0.143,0.0055,-0.0425,-0.0668,-0.005,0.0318,0.0205,0.0334,0.0367,-0.0704,0.0044,-0.0865,-0.1502,-0.0022,0.0581,0.0396,0.0081,-0.0108,0.0671,0.0816,0.0072,0.0445,-0.0117,0.0116,0.0427,0.0758,0.0231,-0.0204,0.0413,-0.019,0.1006,-0.0549,0.011,0.0067,0.0076,-0.0498,0.0098,0.0517,0.0123,-0.013,-0.0001,-0.086,0.0572,0.0908,0.0352,0.0295,-0.0918,-0.0541,0.033,0.0681,-0.017,0.0541,-0.0244,-0.0111,-0.0109,0.0202,0.0813,0.0678,0.0005,-0.0224,0.0263,-0.0288,0.0439,0.027,0.0174,0.0057,0.0239,0.0566,0.0652,0.0643,0.0071,0.024,-0.0292,-0.0613,-0.0435,0.0293,-0.016,0,0.015,-0.0288,0.0554,0.1048,-0.0362,0.0809,-0.0512,-0.0035,-0.0088,-0.0043,-0.0234,-0.0371,-0.0472,0.0071,0.0566,-0.0558,-0.0885,0.0612,0.0037,0.0004,-0.0102,-0.0187,-0.0194,-0.0356,0.0071,0.1173,0.0467,-0.1061,0.0387,0.0371,-0.0149,-0.0071,-0.0852,0.0439,0.0507,0.0037,0.0527,-0.1177,0.0697,0.0293,-0.083,-0.0122,0.1013,-0.089,-0.0261,0.0379,-0.0655,0.0128,0.003,0.0971,-0.0682,0.0778,-0.0395,-0.0369,0.0165,-0.0646,-0.0187,-0.0114,0.0528,0.1006,0.0488,0.0804,0.0085,0.0185,-0.0268,-0.0072,-0.1813,-0.0674,-0.0032,0.0272,-0.0275,0.0113,-0.0112,-0.061,0.0645,0.0062,0.0885,0.0066,-0.0456,-0.0002,-0.0488,0.0377,-0.0009,-0.1101,-0.043,-0.0476,0.0072,-0.1143,-0.0504,-0.0476,-0.0696,-0.0438,-0.0121,0.1082,-0.0317,0,-0.0186,0.0702,0.0212,0.0819,0.0104,-0.0434,0.024,-0.0282,0.0617,0.0489,0.0623,-0.003,0.0286,-0.0222,0.0551,-0.0103,0.0216,-0.1089,-0.0312,0.07,0.1007,0.0597,-0.1076,0.0585,0.0182,0.0598,0.0647,-0.0764,0.0004,-0.0282,0.0142,-0.045,-0.0533,0.0096,-0.0113,-0.0175,0.1226,0.0206,-0.0851,0.0214,0.1209,0.0011,-0.0178,-0.0019,0.0346,0.0453,0.0096,0.0082,0.0226,0.0251,-0.028,-0.0745,0.0205,-0.0306,0.0086,-0.0254,0.0148,0.0072,-0.0687,0.0155,0.0269,-0.0008,0.0616,-0.0417,0.0287,-0.0582,-0.0444,-0.0018,-0.038,0.0055,-0.0722,-0.0237,-0.0323,0.0116,0.0242,0.0524,-0.0158,-0.0002,0.0134,-0.052,0.0204,0.001,0.0514,0.0307,0.0474,0.0351,0.0677,-0.0078,0.0693,0.0398,-0.1112,0.0373,0.0769,0.0729,0.0216,0,-0.0034,0.0014,-0.0578,0.0469,-0.0393,0.0024,-0.0856,0.0252,-0.0315,-0.0032,0.0166,-0.0681,-0.0725,-0.037,0.016,-0.0134,-0.0722,-0.008,-0.0349,-0.0485,0.0696,-0.0271,0.0612,0.0203,-0.0871,0.0395,0.0401,0.0824,0.0033,-0.0457,-0.0103,-0.0293,-0.0488,-0.0128,-0.0501,-0.0298,-0.019,0.0214,0.0511,0.0316,-0.0435,-0.0278,0.0211,0.0563,0.0468,-0.0094,-0.0915,-0.0529,-0.0244,-0.0112,-0.0544,0.036,-0.0808,0.0429,0.0935,0.0006,0.0282,-0.0276,-0.1033,0.0361,0.0222,0.0172,-0.1165,0.0103]},{"type":"blog","slug":"ai-models-2022-2025-benchmarks","title":"Three Years of LLMs: What the Benchmarks Actually Show","url":"/blog/ai-models-2022-2025-benchmarks","date":"February 2025","id":"blog:ai-models-2022-2025-benchmarks:section:1","section":"Context Windows: The Change Nobody Talks About Enough","text":"Context Windows: The Change Nobody Talks About Enough The spec number that changed most dramatically isn't benchmark scores — it's context length. GPT-3 launched with 2,048 tokens. Claude 2, in 2023, went to 100K. Gemini 1.5 Pro in early 2024 hit 1 million tokens — enough for five full novels, around 100 research papers, or a mid-sized codebase all in a single prompt. Epoch AI tracked this and found roughly 30× annual growth in maximum context length since mid-2023. More importantly, effective long-context performance — the model's ability to actually retrieve and use information from deep in …","embedding":[-0.0339,-0.0378,-0.0261,-0.0151,0.0683,-0.0679,0.0007,0.0815,-0.0053,-0.0316,-0.0917,0.0527,-0.0223,-0.0444,0.0339,-0.0454,0.0745,-0.0049,-0.077,-0.0518,-0.0321,-0.0361,0.0476,-0.0242,0.0641,0.0502,-0.0833,-0.0894,0.0669,0.0639,0.0198,0.1379,0.0537,0.0279,-0.0504,0.0162,-0.015,-0.0102,0.0118,-0.0415,0.0442,0.0328,-0.0057,0.092,0.0761,-0.017,-0.0036,0.0229,-0.045,0.0172,-0.0988,0.0255,-0.0163,-0.0703,-0.0205,0.0111,-0.0008,0.0761,-0.0252,0.0797,-0.0183,-0.0744,-0.1151,-0.0293,0.0475,0.0294,0.0185,-0.0418,0.0392,-0.0247,-0.0345,0.0724,-0.0725,0.0464,0.0175,0.0495,0.042,0.0311,0.0282,-0.1434,0.1057,-0.0223,0.0403,-0.032,0.0143,-0.0242,0.044,0.0159,0.0002,0.0619,0.0044,-0.1144,0.0383,0.0404,-0.0165,-0.0114,-0.0732,-0.0712,0.0001,0.0513,-0.0138,0.0349,-0.0382,0.0146,-0.0522,0.0217,0.0281,0.0654,0.008,0.025,0.0571,0.0337,-0.0132,-0.0627,0.0292,-0.046,-0.0194,0.0179,0.0971,0.167,-0.0123,0.0126,-0.0313,-0.0686,-0.167,0.0561,-0.0248,0,-0.0423,0.024,0.0108,0.0958,-0.0503,0.0747,-0.0442,-0.0024,0.0092,-0.0403,0.0243,0.0861,-0.0465,0.0303,0.0853,-0.007,-0.0324,0.0908,-0.0147,-0.0367,0.0103,-0.0508,-0.0509,-0.0644,0.087,0.0491,0.0068,0.0227,0.0204,0.0211,-0.0729,-0.0304,-0.048,0.0544,0.0383,0.0008,0.0296,-0.108,0.066,-0.0257,-0.0598,0.0197,0.0627,-0.0491,-0.0782,-0.0389,-0.0188,0.0262,-0.0347,0.0447,0.0156,0.0944,-0.0449,0.0141,-0.0017,-0.0147,0.0478,-0.004,0.0872,0.1073,0.0376,0.015,-0.0048,0.0616,-0.0026,0.1365,-0.0607,0.0529,-0.003,0.0703,-0.0198,0.0181,-0.0242,-0.0294,0.0458,-0.0519,0.0655,-0.0188,-0.0935,0.0746,-0.0439,0.0666,0.0443,-0.0122,-0.0201,-0.0017,-0.0204,-0.0894,-0.0683,-0.0751,0.0294,-0.0299,-0.0006,0.0482,-0.0764,0,-0.0083,-0.0169,-0.0066,0.0474,-0.0109,-0.1148,-0.0225,0.0674,-0.0619,-0.0073,0.0633,-0.0345,0.0636,0.0045,0.031,-0.0079,-0.0071,-0.0627,0.0214,-0.0046,0.0935,-0.0089,-0.1157,0.0379,-0.026,-0.0513,-0.085,-0.0367,0.0293,-0.05,-0.0257,0.0022,-0.0267,0.0417,-0.0086,0.0158,0.0995,-0.0208,-0.0788,0.0493,0.0742,0.019,0.0217,0.0386,-0.0092,0.1011,-0.0243,-0.0061,0.0372,0.0355,0.0486,-0.0225,0.0015,0.002,-0.0533,-0.0438,0.0401,0.0157,-0.0197,-0.0263,0.0484,-0.0146,-0.0009,0.012,0.0412,-0.039,0.01,-0.0042,-0.0481,-0.0042,-0.0098,-0.0392,-0.0928,0.0243,-0.1187,0.1113,0.0321,-0.0776,0.0056,-0.0046,-0.0167,0.0338,0.0102,0.0107,0.0545,0.0656,0.0071,0.0116,-0.0304,0.0771,-0.0862,0.0045,-0.046,0.0284,-0.0432,0,-0.0096,0.0495,-0.0372,0.0166,0.0386,0.0576,-0.054,0.0909,0.0166,0.0475,-0.0291,-0.0804,-0.0815,-0.0204,0.0519,0.0223,-0.0296,-0.0332,-0.0106,0.0067,0.1056,0.0838,0.0568,-0.0612,-0.0203,-0.0687,0.0139,0.1299,-0.0052,-0.0659,-0.0167,-0.0174,-0.0418,-0.0735,-0.0516,0.0375,-0.0284,0.0473,0.0507,0.0113,0.0279,-0.0297,-0.0129,0.0529,0.0014,0.0094,-0.0249,-0.0406,0.002,-0.0505,0.0308,0.0108,-0.0402,0.0195,0.039,0.0244,-0.1037,-0.016,0.0024,0.0096,-0.0416,-0.0325,-0.0615,0.0399]},{"type":"blog","slug":"ai-models-2022-2025-benchmarks","title":"Three Years of LLMs: What the Benchmarks Actually Show","url":"/blog/ai-models-2022-2025-benchmarks","date":"February 2025","id":"blog:ai-models-2022-2025-benchmarks:section:2","section":"The Benchmark Numbers, 2023–2025","text":"The Benchmark Numbers, 2023–2025 By mid-2024, MMLU was effectively a solved benchmark. The flagship models from all three major labs crossed 90%. The competition shifted to harder evaluations that were harder to game. GPQA Diamond is a benchmark of PhD-level questions in biology, chemistry, and physics. The key design choice: domain experts — actual PhD students in the field — score around 65–70%. In 2025, Claude 3.7 Sonnet with Extended Thinking hit 84.8% on GPQA Diamond. Gemini 2.5 Pro reached around 91%. Models are now outperforming the people who wrote the questions on their own subject ma…","embedding":[-0.035,-0.0295,-0.0505,-0.025,-0.0506,-0.0468,-0.0709,0.0688,-0.087,0.0213,-0.1247,0.0288,-0.0072,-0.0097,-0.0793,0.0002,0.0877,-0.061,-0.0542,-0.0327,-0.0713,-0.0184,0.0935,-0.0101,0.0592,0.0707,-0.0143,0.0147,0.0026,-0.0448,-0.0212,0.0793,0.0113,-0.0022,-0.0555,0.0075,-0.0734,0.0096,-0.0056,-0.0191,-0.0154,-0.0952,0.0261,0.044,0.0909,-0.0694,-0.0461,0.0037,-0.0227,-0.007,-0.0753,-0.1099,-0.0638,-0.0372,0.0319,0.0276,-0.0301,-0.033,-0.0163,-0.0117,-0.0446,-0.0393,-0.0755,0.0258,0.1418,-0.0006,-0.0239,-0.0526,0.0379,0.0144,0.0281,0.037,-0.0462,0.0446,0.1083,0.0947,0.0504,0.0123,0.0739,-0.0289,0.0901,-0.0152,-0.0463,0.0091,0.0059,0.0012,-0.0273,0.0689,-0.0382,-0.0482,0.0428,-0.039,0.0008,0.0334,-0.0585,0.0361,-0.0142,-0.0486,-0.0448,0.0038,0.0537,0.0631,-0.0594,0.0141,-0.0387,0.0296,0.1008,0.0798,0.0427,0,-0.0073,0.0221,-0.0105,-0.0644,-0.018,-0.0251,-0.0029,0.0903,0.1084,0.0085,-0.0908,0.0306,-0.0067,-0.0416,-0.0201,0.0341,-0.1102,0,-0.0293,0.0622,0.0543,0.032,-0.0777,-0.0049,-0.0192,-0.0055,-0.0079,-0.0253,-0.054,0.0547,-0.0395,0.0635,0.0719,0.0022,-0.0263,-0.0012,-0.0386,0.0135,0.0005,-0.0342,-0.0424,-0.0148,0.0509,0.1616,0.0336,0.0252,0.0158,0.0317,-0.0063,0.0053,-0.0854,0.0252,-0.0359,0.0619,0.0171,-0.0467,0.0668,-0.0547,-0.0977,0.0501,0.0187,-0.057,0.0093,0.0059,-0.0095,0.0144,-0.0174,-0.0269,-0.0063,0.0358,-0.0044,0.0587,0.0561,-0.0022,0.0449,0.0106,-0.0033,0.0871,0.0015,0.038,-0.0636,0.0169,-0.0403,0.1075,-0.0978,0.02,0.044,0.0852,-0.0038,0.0249,0.0193,-0.0825,0.0448,0.0275,0.0101,-0.0679,0.0622,0.0227,-0.0716,0.033,-0.0344,-0.0874,-0.0733,0.0044,0.0625,-0.0747,-0.0314,-0.0153,0.007,-0.0608,0.0688,0.0736,-0.0136,0,0.0103,-0.0072,-0.0007,0.0809,0.0971,-0.1038,0.0004,-0.0748,-0.0102,0.0261,0.0712,0.0124,0.0059,0.011,0.0641,-0.0365,-0.0588,-0.1084,0.0221,0.0005,0.0568,0.1342,-0.1135,0.065,-0.0511,-0.004,-0.0143,-0.0974,0.0444,-0.0125,-0.0327,-0.0256,-0.0154,0.0355,0.0018,0.0608,0.0487,0.0023,0.0126,0.0631,0.0182,0.0284,-0.1105,-0.0278,0.0619,0.1204,0.0376,0.0739,0.0415,0.0046,0.0129,0.0144,-0.0149,0.031,-0.016,-0.0037,-0.0161,0.031,0.0899,0.0421,0.041,-0.022,0.0151,0.0065,-0.065,0.0422,0.0134,0.0647,-0.0704,0.0478,-0.0754,-0.039,-0.0041,0.0246,0.0041,0.0073,-0.0315,0.0137,-0.0262,-0.0331,-0.0139,-0.0058,-0.023,0.0657,0.0115,-0.0275,0.0327,-0.0433,-0.059,0.003,-0.0524,0.0349,-0.0248,-0.0196,-0.0541,0,0.0656,0.0492,-0.0058,-0.0188,-0.0113,0.0364,-0.0694,0.051,0.0595,0.0946,0.0073,-0.0443,-0.0696,0.0258,0.0314,0.0561,-0.0155,0.0091,-0.0089,-0.0989,0.0416,0.0673,0.0317,-0.0702,-0.1286,0.0069,0.0003,0.029,-0.0153,0.0189,-0.0184,0.0131,0.0879,-0.0387,0.061,0.0526,0.0091,0.07,0.0666,0.0827,-0.0355,-0.0448,-0.0434,0.0251,0.0048,-0.0459,-0.036,-0.0338,-0.0162,-0.0041,-0.006,-0.0053,-0.0641,-0.0882,-0.0049,0.1014,-0.0396,-0.0296,-0.1037,-0.0526,0.1092,-0.1166,-0.0473,0.0047]},{"type":"blog","slug":"ai-models-2022-2025-benchmarks","title":"Three Years of LLMs: What the Benchmarks Actually Show","url":"/blog/ai-models-2022-2025-benchmarks","date":"February 2025","id":"blog:ai-models-2022-2025-benchmarks:section:3","section":"The Reasoning Model Shift","text":"The Reasoning Model Shift The architecture change that mattered most in 2024 was reasoning models — not generating an answer token by token, but spending compute actually thinking through a problem before responding. OpenAI's o1, out in September 2024, was the first one most people could use. It scored 94.8% on MATH (versus GPT-4o's 76.6%) and 77.3% on GPQA Diamond. The improvement wasn't marginal. Multi-step problems that previous models confidently fumbled, o1 would work through systematically. o3 followed with roughly 20% fewer major errors than o1, 91.6% on AIME 2024 (the American Invitati…","embedding":[-0.0061,-0.0149,0.0057,0.0048,0.0951,-0.0907,-0.0801,0.1143,-0.0004,-0.0106,-0.0701,0.0327,0.011,0.0225,0.0366,0.025,0.0324,-0.0492,-0.0339,-0.0475,-0.0578,-0.008,-0.0008,0.0005,0.018,0.0053,-0.0032,-0.0652,0.0001,0.0057,0.018,0.1065,0.036,0.012,-0.045,0.0332,0.0232,-0.0162,-0.0191,-0.0155,-0.0323,-0.0327,0.0211,-0.0004,0.0943,-0.0448,0.023,0.0028,-0.0553,-0.0133,-0.1003,-0.0376,-0.0721,-0.0962,0.005,-0.0185,-0.0148,0.0321,-0.0126,-0.0411,-0.0419,-0.0938,-0.0434,0.0214,0.0322,0.023,-0.0031,-0.0529,-0.0548,0.0326,0.0382,0.0891,0.0156,-0.0514,0.0702,0.1028,0.0662,0.094,0.0727,-0.0491,0.0909,-0.0407,-0.0574,0.0177,0.0529,0.012,-0.0362,-0.0181,0.0421,-0.0198,0.0651,-0.032,0.0613,0.0328,0.0602,0.0362,0.0029,-0.0586,-0.0167,0.0869,-0.0429,0.142,0.0021,-0.0418,0.0506,-0.0105,0.1188,0.041,-0.0205,-0.0412,0.033,-0.0149,0.0786,-0.0479,-0.0555,-0.0736,-0.059,0.0652,0.0465,0.0396,-0.0302,0.023,-0.0001,0.0181,0.0225,0.0426,-0.0792,0,0.0065,0.0552,0.0346,0.0278,-0.0104,0.0117,-0.0149,0.0181,0.064,-0.0641,0.008,0.0003,-0.0495,0.0128,0.1846,-0.0496,-0.1339,0.05,-0.0511,0.0315,0.0415,-0.0277,0.0138,0.025,0.0169,0.1195,0.0424,-0.074,-0.0569,0.0023,0.0162,-0.006,-0.1031,0.0922,-0.0098,-0.0035,-0.0139,-0.1039,0.058,-0.0525,-0.0752,0.1072,0.0365,-0.0373,0.0307,0.0022,-0.0179,0.0463,0.0178,0.0104,-0.0084,0.0398,-0.0438,-0.0293,-0.0191,-0.1174,-0.0239,-0.0149,0.0362,0.0625,0.0509,0.0026,0.0013,-0.0005,-0.0346,0.1226,-0.0784,0.0263,0.0448,0.0608,0.0016,-0.0044,-0.0425,0.0081,0.0135,-0.0058,0.0406,-0.0731,0.0343,-0.0689,0.0015,0.0674,-0.001,0.0042,0.0117,0.0246,0.0788,0.0474,-0.0107,0.0134,0.0097,-0.0726,0.0359,0.0261,-0.0116,0,-0.0821,0.0025,-0.0008,0.0439,-0.02,-0.0903,-0.0133,-0.0544,0.0407,-0.0094,0.0605,0.0066,0.0746,0.0438,-0.0448,-0.0927,-0.0294,-0.1642,-0.0365,0.0583,0.0603,0.0442,-0.1079,-0.052,0.0294,0.1038,-0.0137,-0.0186,-0.0072,-0.0521,-0.0536,0.0363,0.0217,0.0271,-0.0127,0.0699,0.0585,-0.0335,-0.0416,0.07,0.0027,-0.0492,-0.0631,0.0381,-0.0119,0.1277,-0.028,0.0748,0.0064,-0.0646,0.0247,0.0158,-0.031,-0.0346,0.0031,-0.0035,0.0115,-0.0379,-0.0735,0.0288,-0.0204,0.0058,0.0807,-0.0365,-0.0169,0.017,0.012,0.0086,-0.0722,0.0043,-0.0568,-0.0432,-0.0695,0.044,0.075,0.0589,-0.0605,-0.0009,-0.0114,-0.0466,-0.1108,-0.0382,0.0125,0.0214,-0.0018,-0.0179,0.0914,-0.0237,-0.034,0.0721,-0.1136,0.0242,0.0072,0.0593,-0.0492,0,-0.0003,0.0375,0.0273,0.0945,0.0247,-0.0298,-0.0735,0.0695,-0.0202,0.0669,-0.0147,0.0412,-0.0062,-0.0156,0.0223,0.0692,-0.0202,-0.0714,-0.0608,-0.0731,0.0769,0.0037,-0.0555,-0.0396,-0.0064,-0.0652,-0.0624,0.0938,0.0133,-0.0195,-0.0021,-0.0298,0.0691,-0.0648,0.0332,0.0006,0.0213,0.0487,0.0539,-0.0478,-0.007,0.0426,-0.0762,0.0469,0.0487,0.0093,-0.0753,-0.0396,-0.049,-0.0487,-0.0422,0.0172,-0.0637,0.0259,0.0333,0.0032,-0.0244,-0.0515,-0.075,0.009,0.0601,-0.0357,-0.048,0.0265]},{"type":"blog","slug":"ai-models-2022-2025-benchmarks","title":"Three Years of LLMs: What the Benchmarks Actually Show","url":"/blog/ai-models-2022-2025-benchmarks","date":"February 2025","id":"blog:ai-models-2022-2025-benchmarks:section:4","section":"DeepSeek Changed the Cost Narrative","text":"DeepSeek Changed the Cost Narrative Through 2022 and 2023, frontier capability was in exactly three places: OpenAI, Anthropic, and Google. Meta's LLaMA release in February 2023 started shifting that — the first open-weight model that wasn't embarrassing to use. LLaMA 2 in July 2023 was genuinely useful for commercial applications. By 2024, Llama 3 70B was competitive with GPT-3.5. Then DeepSeek happened. DeepSeek V3 in December 2024, DeepSeek R1 in January 2025. Both open-weight. R1 scored 92.3% on MATH — matching o1. The reported training cost was around $5.6 million. Comparable proprietary m…","embedding":[-0.0887,-0.0318,-0.0201,0.019,-0.0179,-0.0669,-0.154,0.0905,-0.0433,0.0104,-0.1098,0.0184,-0.0042,-0.0179,0.0396,-0.0053,0.0857,0.0129,-0.0372,-0.0508,-0.019,0.0328,0.0242,-0.0373,0.0377,-0.0061,0.0017,-0.019,0.0186,-0.0146,-0.008,0.0388,-0.0112,-0.0345,-0.085,0.0347,-0.0515,-0.0087,-0.1063,-0.0016,0.0273,-0.035,0.0191,0.0254,0.0524,-0.0286,-0.0275,0.0237,-0.0303,0.0089,-0.0291,-0.0798,-0.0421,0.0048,0.0285,-0.0354,-0.0084,-0.0088,-0.0835,0.0338,0.0125,-0.0637,-0.023,-0.0617,0.0596,-0.0388,-0.0409,-0.0059,0.0828,-0.0742,0.0347,0.0339,-0.0025,0.001,-0.0247,0.0652,0.1005,0.0861,0.1006,-0.0625,0.0778,-0.0289,-0.0254,-0.0163,0.0299,-0.0038,-0.0575,0.0339,0.0101,-0.0051,0.0975,-0.0221,-0.0289,0.0477,-0.0394,-0.006,-0.1221,-0.0216,-0.0944,0.057,0.0181,-0.0184,0.01,0.0396,-0.0257,0.0219,0.0924,0.0156,0.0392,-0.0139,0.0501,-0.006,0.0492,0.0118,-0.0821,0.0381,0.0151,-0.0003,-0.0073,0.0602,-0.15,-0.0407,0.0026,-0.1141,-0.0258,-0.007,-0.062,0,-0.0235,0.0021,-0.0107,-0.0623,-0.0548,-0.0434,0.0081,-0.0089,-0.0434,-0.0011,-0.0414,0.0685,-0.0707,0.0929,0.0766,-0.0861,-0.0094,0.0522,0.0229,-0.0344,0.0768,0.025,0.0133,-0.0986,0.0339,0.0462,0.0881,-0.0364,-0.0287,0.0521,-0.0575,-0.0273,0.0188,0.0282,-0.0169,-0.0205,-0.0367,-0.1042,0.0221,-0.0626,0.0332,0.0492,0.0047,-0.0751,-0.0066,0.0084,-0.0042,0.0557,-0.0052,0.0171,-0.0141,0.0319,-0.0958,-0.0221,-0.032,0.0099,0.032,0.0224,0.1107,0.0911,-0.0239,0.0453,0.0001,0.0218,-0.0658,0.0517,0.0267,-0.0084,-0.0619,0.0491,0.0167,-0.016,-0.0139,-0.0366,0.0351,-0.0246,0.0611,-0.0108,0.0445,0.0324,0.0562,0.1491,0.0241,0.012,-0.0516,0.0533,0.0104,-0.0311,0.0068,0.0619,0.0184,-0.0247,-0.0493,0.0554,0.035,0,-0.0865,0.074,-0.0314,0.105,0.0478,-0.0606,-0.0377,-0.0003,-0.0429,0.0335,0.068,0.0348,0.0235,0.0063,0.0551,-0.0527,-0.0412,-0.0497,-0.0073,-0.0869,0.1012,0.0023,-0.0796,0.0036,-0.0132,-0.0159,0.0004,0.0448,-0.0576,-0.0118,0.0003,-0.0098,-0.0619,0.0248,-0.0384,0.027,0.0717,0.0131,-0.0489,-0.0373,0.0504,0.0179,-0.0161,0.0521,-0.0679,-0.0147,-0.0607,-0.0479,0.1299,-0.0628,0.042,-0.0257,0.046,-0.0001,-0.0291,-0.0333,0.0442,0.054,-0.0483,0.0225,-0.0492,-0.0067,-0.02,-0.0409,0.011,0.0253,0.052,0.049,-0.056,0.0004,-0.0122,0.0014,0.0572,-0.0043,-0.0302,0.0989,0.0028,0.0233,-0.0061,-0.0034,-0.0097,-0.0295,0.0372,0.0483,0.0583,0.0639,0.0751,0.0232,-0.0756,0.0743,-0.0826,0.035,-0.0266,0.0277,0.0103,0,-0.0287,0.0021,-0.0002,0.0678,0.0188,0.0137,-0.074,0.124,0.0267,0.1088,0.0341,-0.0172,-0.0407,0.0133,-0.0041,0.084,0.0334,0.0262,-0.0242,-0.0673,0.025,0.0542,0.0877,-0.0832,0.0368,-0.0658,-0.1224,0.054,0.057,0.0522,-0.0093,-0.0281,0.004,-0.0265,0.023,0.0407,-0.0907,0.0562,0.0216,0.035,0.0405,0.0797,0.0342,0.0552,-0.0089,-0.0315,-0.1335,-0.0399,-0.039,-0.0222,0.0341,-0.0061,-0.041,-0.0001,0.0405,0.0387,-0.0897,-0.0766,-0.0608,0.0687,0.053,-0.1753,-0.0682,0.0961]},{"type":"blog","slug":"ai-models-2022-2025-benchmarks","title":"Three Years of LLMs: What the Benchmarks Actually Show","url":"/blog/ai-models-2022-2025-benchmarks","date":"February 2025","id":"blog:ai-models-2022-2025-benchmarks:section:5","section":"LMSYS Arena: What Humans Actually Prefer","text":"LMSYS Arena: What Humans Actually Prefer Benchmarks are one signal. The LMSYS Chatbot Arena is a different one: real people compare two model outputs side-by-side without knowing which model wrote which, and vote for the better one. Millions of votes, head-to-head. As of early 2025, the top of the arena leaderboard was tight. Google (Gemini 2.5 Pro), OpenAI (GPT-4.1, o3), Anthropic (Claude 3.7 Sonnet) — all within a narrow Elo range. What's useful about the arena is that it captures things benchmarks miss: does the response feel useful, is it the right length, does it understand what you were …","embedding":[0.0357,-0.1019,-0.0274,-0.026,0.0816,-0.0373,-0.0442,0.0353,-0.0021,-0.0017,-0.1067,-0.0393,-0.0056,-0.0269,0.0501,-0.0097,0.1478,-0.09,0.0326,-0.0464,-0.0218,-0.028,0.0141,0.0133,0.0379,-0.0279,-0.0549,0.0402,0.0051,-0.0655,0.0443,-0.0142,0.0751,0.0148,-0.0602,0.0392,-0.0707,-0.0831,-0.0277,-0.0062,-0.0277,-0.045,0.0424,-0.0282,0.0198,-0.0099,-0.0249,-0.0075,-0.0403,0.0317,-0.0611,-0.0634,0.0421,0.0001,-0.087,0.1284,-0.1172,0.0575,0.0352,-0.0625,-0.0293,-0.0032,-0.0213,0.0609,0.0199,-0.035,0.0337,-0.0006,0.0638,0.009,0.0297,-0.0372,0.035,-0.0352,0.0719,0.1047,0.011,-0.0249,0.0502,0.0039,0.0393,-0.0117,-0.0465,-0.001,0.0068,-0.0305,0.0255,0.0005,-0.0034,-0.0611,0.0733,-0.0151,0.0342,0.0505,-0.0163,0.055,0.0006,0.0068,-0.0317,0.0865,-0.0161,0.0517,-0.0276,-0.0054,0.0304,-0.0056,0.0496,0.0774,0.0002,-0.022,0.0005,0.0237,0.0933,0.03,0.0574,-0.0096,-0.0163,0.0031,0.0273,0.02,0.0253,-0.1008,0.0797,0.0262,0.0505,0.1441,-0.0817,0,-0.0014,-0.0027,-0.007,-0.0263,0.0159,0.06,0.0045,-0.0272,-0.0313,0.0255,-0.0487,0.0764,0.0058,0.0068,0.0907,-0.014,-0.0743,0.0325,-0.0531,0.0487,-0.0229,0.0172,-0.0008,0.0243,0.1099,0.1347,0.0671,-0.0379,-0.055,0.0372,-0.047,-0.1121,-0.0488,0.0272,0.0601,0.0074,-0.0571,-0.1105,-0.0173,-0.0837,-0.0719,0.0357,-0.0416,-0.0673,-0.0502,0.0228,-0.0404,0.0424,-0.0304,-0.0395,0.0193,0.0491,0.0164,-0.0092,0.0435,-0.0933,0.0299,0.0195,-0.0109,-0.0015,-0.0592,0.0077,-0.0208,-0.028,0.0237,0.0659,-0.0424,-0.0067,0.0516,-0.0456,0.0457,0.0312,0.0041,0.0123,0.0092,0.0031,0.024,-0.0585,0.0301,-0.0493,-0.003,0.0482,-0.0533,-0.0256,0.0312,-0.1053,0.0217,-0.0109,0.006,0.0815,-0.0861,0.0176,0.0151,0.0744,-0.1196,0,-0.0543,-0.0156,-0.0199,0.1038,0.0919,-0.0775,0.0347,-0.0429,0.0416,0.0405,0.0251,-0.0126,0.0252,-0.014,0.1013,-0.028,0.0289,-0.141,0.0127,-0.0399,0.1162,0.073,-0.0531,0.0334,-0.001,0.0329,-0.0833,-0.0453,-0.04,-0.0607,0.0087,-0.0051,-0.0038,-0.0378,0.083,0.0875,0.0677,0.027,0.0075,0.0346,0.0118,0.0331,-0.0679,-0.0519,0.0522,0.0679,-0.061,-0.0128,-0.0508,0.0122,-0.0504,-0.0327,0.0018,-0.0164,-0.0519,-0.0384,-0.0312,0.0176,-0.0211,0.0299,0.0374,-0.0643,-0.0671,0.0648,0.0441,0.0215,0.0077,0.0281,-0.0547,-0.0006,0.0301,-0.0719,-0.043,0.099,-0.0308,0.0822,-0.0416,0.0226,0.0505,-0.0729,-0.049,-0.0122,0.0675,0.0045,0.044,0.1208,0.0383,0.0102,-0.0156,0.0257,0.0271,-0.0234,-0.0109,-0.0052,0.0619,0,-0.0442,-0.0278,-0.0007,0.0434,-0.0381,-0.0313,-0.0449,0.0268,0.0327,0.0724,0.1108,-0.054,-0.0605,0.0253,0.1021,0.0627,-0.0849,0.0246,-0.0787,-0.0243,0.0886,0.0205,-0.0388,-0.0344,-0.0054,-0.0831,-0.0289,0.0986,-0.061,-0.0338,-0.0512,0.0184,0.026,-0.0017,0.0788,0.0502,-0.0754,-0.0022,0.0591,0.0928,-0.0787,0.0439,-0.0414,0.0068,0.0373,0.0076,-0.0186,-0.0802,-0.0259,-0.0848,-0.0332,-0.0314,-0.0357,-0.029,0.09,-0.0199,0.0381,0.0435,0.0457,-0.0402,0.0039,0.0851,-0.0907,-0.0161]},{"type":"blog","slug":"ai-models-2022-2025-benchmarks","title":"Three Years of LLMs: What the Benchmarks Actually Show","url":"/blog/ai-models-2022-2025-benchmarks","date":"February 2025","id":"blog:ai-models-2022-2025-benchmarks:section:6","section":"The Cost Drop — The Number That Changes What You Can Build","text":"The Cost Drop — The Number That Changes What You Can Build GPT-4's API cost $30 per million input tokens when it launched in 2023. By early 2025, GPT-4o was at $2.50 per million — an 8× reduction in 18 months. Claude 3 Haiku runs at $0.25 per million input tokens. Gemini 2.0 Flash is $0.30 per million. That's not just cheaper API calls. It's a different set of use cases that become economically viable. Processing a large codebase on every PR, running AI-assisted test generation across a full repo, building real-time AI features in user-facing products — all of those had a cost structure that m…","embedding":[-0.0451,-0.0461,-0.0152,0.0136,0.0603,-0.0841,-0.0249,0.1083,0.0507,0.0189,-0.084,0.0194,-0.0425,-0.0481,0.0326,-0.0046,0.0376,-0.0582,-0.0268,-0.0837,-0.0709,-0.1026,0.0415,0.0085,0.0219,0.0077,0.0101,-0.1171,0.0239,0.0487,-0.0282,0.0733,-0.0299,-0.018,-0.053,-0.0126,-0.021,-0.0159,-0.0135,-0.0125,0.0288,0.0066,-0.1061,0.0261,0.034,0.0097,0.0011,0.0103,-0.0006,-0.0034,-0.0305,-0.0313,-0.0376,-0.0838,-0.043,-0.0087,-0.0023,-0.0087,0.0484,0.0806,0.0086,-0.0316,-0.0338,-0.0286,0.0399,0.0037,-0.0102,-0.0562,0.0751,-0.0534,0.0109,0.0793,-0.0469,-0.0165,-0.0217,0.0358,0.1067,0.0496,0.0327,-0.0252,0.0793,-0.0509,0.0386,-0.0203,0.0137,0.0071,0.0654,-0.0057,0.0725,0.0019,0.0143,-0.0484,0.0675,0.0015,-0.0462,0.0227,-0.0556,-0.0738,-0.0367,0.0296,-0.059,0.0221,-0.0053,-0.0148,-0.0093,0.033,0.0271,-0.015,0.0548,0.0753,0.0125,-0.0748,0.0007,-0.032,-0.0558,0.0462,-0.0632,-0.0263,0.0749,0.1543,-0.0164,0.0404,0.023,-0.0264,-0.0943,0.0193,-0.1075,0,-0.0594,0.1038,0.0092,-0.0866,-0.0693,0.022,0.0451,0.0397,0.0185,-0.0585,-0.0239,0.0143,-0.027,0.0802,0.1016,-0.0941,-0.0009,0.0013,0.0358,-0.0096,-0.0487,0.0266,-0.004,0.0002,0.0476,0.0606,0.0212,0.0131,0.1029,0.0229,-0.0769,-0.0176,0.0027,0.0466,0.0512,0.0091,0.0086,-0.1053,0.016,0.0111,-0.0615,0.0355,-0.0159,-0.0657,-0.0057,-0.0096,-0.0002,-0.03,-0.0074,-0.0102,-0.0762,0.122,-0.0697,0.0638,-0.0204,-0.1039,0.0101,-0.0663,0.1148,0.0325,-0.0593,-0.0092,0.0178,0.0487,-0.0637,0.0932,-0.0253,0.0429,-0.0207,0.0704,0.0295,-0.0024,0.0562,-0.0907,0.0146,-0.0101,0.0747,-0.0499,0.0218,0.0552,-0.0741,0.0601,0.0624,0.0083,0.0883,-0.0299,0.0372,0.0162,-0.0487,0.0363,-0.0043,0.0131,-0.0859,0.0253,0.0062,0,-0.0764,0.0743,0.0079,0.0943,0.0081,-0.102,0.01,0.0201,0.045,0.07,-0.0893,0.0046,0.0032,0.0345,0.015,-0.0139,-0.0805,-0.0479,0.0905,-0.0081,-0.004,0.0736,-0.0401,0.0577,-0.0288,0.0069,-0.0105,-0.0123,0.0649,-0.0053,-0.035,0.0115,-0.057,0.0368,-0.0249,0.0287,0.097,0.0933,-0.0124,0.024,0.0608,-0.0328,-0.0091,-0.0123,0.036,0.0428,-0.0522,0.0239,0.0143,0.0123,0.0509,-0.0528,-0.0291,0.0147,-0.1217,-0.1013,0.0735,0.101,-0.0579,0.0194,0.0486,-0.0419,0.0746,0.023,0.0091,-0.0155,0.0701,0.0514,-0.0436,-0.0004,0.0311,-0.0014,-0.0078,0.0091,-0.0566,0.1405,-0.0223,-0.035,0.059,-0.0269,-0.0217,0.0292,0.0731,-0.0443,-0.0179,-0.0266,0.0287,-0.0163,-0.0594,0.119,-0.0836,0.0518,0.0596,0.0254,-0.0057,0,0.102,-0.0101,0.0285,0.0521,-0.0047,-0.051,-0.0493,0.08,0.031,0.0565,-0.0198,-0.0736,-0.0469,0.0097,-0.0046,0.0462,-0.0828,-0.0234,-0.0276,-0.0684,0.0125,0.1054,-0.0203,-0.0721,-0.0295,-0.0396,0.025,0.0534,-0.079,-0.0411,-0.0028,-0.0131,0.0411,-0.0592,0.0251,-0.0907,-0.0308,0.0005,0.0206,0.0209,-0.026,0.0049,-0.0154,-0.032,0.0072,-0.036,-0.1349,-0.0795,0.0445,0.0011,0.0295,0.0814,-0.0376,-0.0147,0.0612,0.0145,-0.0946,0.0013,-0.0333,-0.0189,-0.0117,-0.1205,-0.0014,0.0395]},{"type":"blog","slug":"ai-models-2022-2025-benchmarks","title":"Three Years of LLMs: What the Benchmarks Actually Show","url":"/blog/ai-models-2022-2025-benchmarks","date":"February 2025","id":"blog:ai-models-2022-2025-benchmarks:section:7","section":"What's Actually Left to Solve","text":"What's Actually Left to Solve In late 2022, the most capable available model could draft an email well and fail freshman calculus. By early 2025, reasoning models are outscoring domain experts on PhD-level subject matter questions, autonomously patching real production bugs, and working across entire codebases in context. The remaining hard problem isn't capability on individual tasks — it's reliability. Models that ace one problem will fail unpredictably on something that looks simpler. They hallucinate citations, miss edge cases, and have no persistent sense of what they did yesterday. The c…","embedding":[-0.0499,-0.0322,0.0236,-0.0468,0.058,-0.0632,-0.1525,0.0488,-0.0105,0.0177,-0.05,0.0848,-0.0098,0.0658,0.009,0.0489,-0.0161,-0.0762,-0.0121,-0.0444,-0.0782,0.0127,-0.0396,0.0318,-0.018,0.022,0.0071,-0.1397,-0.0625,0.0051,-0.0123,0.0709,-0.0474,-0.016,-0.0231,0.0432,-0.0026,0.0246,0.0959,-0.0452,-0.0684,-0.0852,-0.005,-0.0024,0.0857,-0.1073,-0.0017,-0.0128,-0.0327,-0.0247,-0.0926,-0.0928,-0.0027,-0.0746,0.0052,-0.0241,-0.0053,-0.0136,-0.0008,-0.004,-0.0633,-0.0365,-0.0609,-0.0252,0.0368,0.0054,0.0173,-0.0094,0.0191,0.1031,-0.0564,0.0438,-0.0384,-0.0014,0.1256,-0.0071,0.1009,0.0626,0.1129,-0.0312,0.0013,-0.0643,-0.0675,0.0234,-0.0009,0.0372,-0.0279,0.0457,0.057,-0.0362,0.0063,-0.104,0.0656,0.0607,0.0272,0.0513,0.0328,-0.0684,-0.0408,0.0196,-0.0402,0.1439,0.0602,-0.123,0.0107,-0.0266,0.0844,0.0244,0.0307,-0.0647,0.0311,-0.0469,0.0642,-0.0378,0.0086,-0.0689,0.0334,-0.035,0.0434,0.0335,-0.0433,0.057,-0.0296,-0.0028,0.0204,-0.0224,-0.0842,0,-0.0069,0.0345,0.0259,0.09,0.0121,-0.0035,0.0088,0.0461,0.0136,-0.0561,0.0225,0.0199,-0.0491,0.0079,0.1255,-0.0435,-0.0438,0.0106,-0.0016,0.0071,0.0407,-0.0492,-0.0105,0.004,0.0094,0.0862,0.0749,0.0282,0.027,0.0211,-0.0305,-0.0005,-0.0902,0.111,-0.0148,0.0269,-0.0021,-0.0198,0.0668,-0.0448,-0.0102,0.0875,0.0071,0.0246,0.0148,-0.0145,0.066,0.0077,0.014,-0.0512,-0.033,-0.0095,-0.0317,-0.0684,-0.0263,0.015,-0.0265,-0.0612,-0.0076,0.0157,0.0457,0.0473,-0.0441,-0.0161,-0.0083,0.0501,-0.0881,-0.0119,0.076,-0.0295,-0.0195,-0.0036,-0.0529,-0.0487,0.0688,0.0016,0.0555,-0.0987,0.1307,0.0167,0.0454,0.0059,0.0202,-0.0179,0.0711,-0.0113,0.0056,-0.0037,-0.0092,-0.009,-0.0176,-0.0792,0.0068,0.0928,0.0826,0,-0.0133,-0.0018,-0.0728,0.0737,-0.0147,-0.0375,0.0479,-0.0243,0.0283,-0.0754,-0.0219,0.0053,-0.0246,0.0727,-0.0216,-0.0836,-0.0264,-0.1447,-0.0656,0.0807,-0.0131,0.0371,-0.1409,0.0239,-0.0098,0.0664,0.0026,-0.0507,-0.0367,0.0247,0.0026,-0.0596,0.0156,0.006,-0.0553,-0.0173,0.0116,0.0037,-0.0184,0.039,0.067,-0.0443,-0.0405,-0.0095,0.0558,0.0636,-0.023,0.0692,-0.0007,-0.0059,-0.0188,-0.0421,0.0012,-0.0363,0.0194,0.0056,0.0261,-0.0199,0.0044,0.104,-0.048,-0.0035,0.0945,-0.0491,-0.0071,-0.0282,-0.0307,0.0681,-0.0786,0.0445,0.1091,-0.0082,-0.0944,-0.0206,0.0717,0.0374,-0.0342,-0.0028,-0.0459,-0.0762,0.0337,-0.0127,0.0184,0.017,-0.0186,-0.0537,0.0594,-0.0388,-0.0096,-0.022,-0.077,-0.0143,-0.0589,0.0404,-0.0759,0,-0.001,0.0919,-0.0334,0.0156,0.0207,-0.0027,-0.0437,0.0104,0.0637,0.1085,-0.0252,-0.0023,0.0281,0.0308,0.0117,0.1222,0.0285,-0.0315,-0.0629,-0.0949,0.0448,-0.0219,-0.023,-0.0045,0.0351,-0.0387,-0.0456,0.0798,-0.0329,0.0559,-0.0512,-0.0306,0.012,-0.0181,0.0701,-0.0256,0.0077,-0.018,0.0199,-0.0493,0.0166,0.0168,-0.0704,0.0313,0.0703,-0.0035,-0.0175,0.0003,-0.0197,0.062,-0.013,0.0534,-0.0911,0.003,0.0635,0.0783,0.0085,-0.0644,-0.117,0.0047,0.1181,0.0343,-0.0044,0.0742]},{"id":"project:arcadium","type":"project","slug":"arcadium","title":"Arcadium","url":"/projects/arcadium","section":"20 games. No engine. Just React, Canvas, and raw JavaScript.","text":"Arcadium 20 games. No engine. Just React, Canvas, and raw JavaScript. The constraint came first: no Phaser.js, no Unity WebGL, nothing that abstracts away what the browser is actually doing. I wanted to understand how games work at the level of state machines, collision geometry, and frame-rate-independent physics — not how to configure a game engine. So I started with Snake on a Canvas element and a requestAnimationFrame loop, and kept going from there. The landing page was designed to put you in the right headspace before you pick a game. A boot-style loader with CRT scanlines and terminal t…","embedding":[-0.0852,-0.01,-0.0205,-0.0318,-0.0141,-0.0332,-0.011,0.0296,-0.0587,-0.0328,-0.053,0.0353,0.0103,-0.0251,0.012,-0.0372,0.0684,-0.0361,-0.0084,-0.032,0.055,-0.0895,0.0018,-0.0971,-0.0204,0.0688,0.0021,-0.036,0.0376,-0.0926,0.0433,-0.0043,-0.0569,-0.0418,-0.0521,0.0167,-0.0341,-0.0505,-0.0759,0.0096,-0.0064,0.0727,0.0022,0.0324,0.0612,-0.062,-0.0943,-0.0168,0.0119,0.0359,-0.054,-0.0204,-0.012,-0.0663,-0.063,0.0179,0.0396,0.0498,0.0548,0.0083,0.0314,-0.0467,0.0309,0.0828,0.0639,-0.0148,0.0212,-0.0562,-0.0022,-0.0737,-0.0471,-0.0352,0.023,-0.0131,-0.0009,-0.0447,-0.0108,0.05,0.0028,-0.0052,0.0109,-0.0643,0.0392,0.0422,0.037,0.0915,0.0294,0.0168,0.0621,0.0604,-0.0667,-0.0035,0.0712,0.0936,-0.0061,0.0617,0.077,-0.0355,-0.0671,0.0505,0.0537,-0.0738,0.0919,0.0651,-0.0338,-0.0131,-0.0054,0.0277,-0.0784,0.0213,0.0146,0.0438,0.0358,-0.0046,0.0363,-0.0212,-0.0158,0.0074,0.1327,-0.0283,0.0296,-0.0081,-0.009,-0.045,0.105,-0.0626,-0.0467,0,-0.0363,-0.0439,-0.0139,0.0402,-0.0046,0.0169,-0.0426,0.0018,-0.0505,0.0296,0.0041,0.1099,-0.0435,0.0338,0.0828,-0.1148,-0.0112,0.0216,0.0342,-0.0137,0.014,0.0045,-0.0559,-0.0092,-0.0719,0.1298,-0.1263,0.0036,-0.0584,0.0218,-0.072,-0.0513,-0.0593,0.0638,0.0177,-0.0026,-0.0087,-0.1021,-0.0933,0.0135,-0.0483,-0.0068,-0.0614,-0.0088,-0.0681,-0.0706,0.0107,0.0652,-0.091,0.0547,-0.0811,0.0869,0.1002,-0.0496,-0.004,0.0061,0.0215,-0.0686,0.0157,0.0479,0.0427,-0.0242,-0.0272,-0.0033,-0.0165,0.0378,-0.0089,0.0044,0.0595,-0.0061,-0.0143,0.07,0.1126,0.0344,0.1008,0.0223,-0.0133,-0.024,-0.1275,-0.0505,0.027,0.0292,-0.0076,-0.0223,0.0849,-0.0234,0.0089,-0.0053,-0.0192,0.0224,0.0289,-0.0595,0.0606,0.0449,0.0558,0,-0.0044,-0.0594,-0.0652,0.0633,0.0289,-0.0279,0.0445,0.0093,0.0338,0.003,0.0492,0.0687,0.0266,0.0383,-0.0436,0.0551,0.0551,-0.1149,0.0341,-0.0744,0.0161,0.0435,-0.0637,-0.0299,0.0146,0.0874,-0.051,-0.0455,-0.0445,0.0712,0.0147,0.0049,0.0697,0.0628,0.0243,0.0017,0.0503,0.0103,-0.0238,-0.1075,-0.0133,-0.0252,-0.0597,0.0725,0.0315,0.103,0.0021,0.0615,-0.0349,0.0162,-0.0066,0.0056,0.0431,-0.1128,0.0114,-0.0652,-0.0397,-0.0156,0.029,0.0638,0.0542,-0.0499,-0.1218,-0.0083,-0.0049,0.0356,-0.0791,0.0087,0.0029,-0.0296,-0.0136,0.0167,0.0665,0.0342,0.044,0.0256,0.121,-0.0381,0.051,-0.0443,-0.0619,0.0522,-0.0389,-0.0193,0.0137,0.021,-0.1407,-0.0124,0.014,-0.0182,0.0755,0.0761,0.0505,0.0781,0.0615,0,-0.0559,0.0805,-0.012,-0.0482,0.0359,0.03,0.0308,-0.0667,0.0267,-0.0648,0.0612,-0.0043,0.0285,0.0821,0.071,0.1063,-0.0255,0.0245,-0.0327,-0.0821,0.0132,-0.0609,-0.0114,0.0023,-0.0305,-0.0017,0.0048,0.0181,0.0199,0.0143,-0.103,-0.0058,-0.0406,0.0261,-0.055,0.0626,-0.0195,-0.0181,0.0665,-0.0802,-0.0079,0.0206,-0.0073,-0.001,0.0048,0.0885,-0.0749,-0.0925,-0.0238,-0.0871,-0.0372,0.0143,0.041,-0.049,0.0821,0.0195,0.0768,-0.0161,-0.0081,0.0572,-0.0438,0.0562,0.009,-0.0125]},{"id":"project:legal-casebase","type":"project","slug":"legal-casebase","title":"Mini Legal Casebase Search Engine","url":"/projects/legal-casebase","section":"Structured retrieval over a corpus of judgments — not a chatbot, a casebase.","text":"Mini Legal Casebase Search Engine Structured retrieval over a corpus of judgments — not a chatbot, a casebase. Tools like AustLII and Jade.io solve a problem that looks deceptively simple: given a corpus of judgments, let a practitioner find the right case fast. That's not a chatbot problem — it's a structured retrieval problem. Full-text grep misses legal structure; LLM Q&A hallucinates citations. What's needed is an index that understands cases as cases: a name, a court, a citation, a date, a body of text. The assignment made this distinction explicit, and it's the right one. A legal casebas…","embedding":[-0.0221,0.0604,-0.0307,-0.0856,-0.0233,0.0259,-0.0072,0.057,0.0393,0.0117,0.0093,0.0236,0.0055,0.0256,0.0343,0.0665,0.0662,-0.0029,0.0648,0.0261,-0.021,0.1105,-0.0143,-0.0613,-0.0489,0.0406,-0.0252,-0.0776,0.0144,-0.0381,0.0177,0.128,0.0691,0.0715,0.0184,0.0165,-0.0694,-0.0243,0.0182,0.0061,0.0009,0.008,0.0096,0.0218,0.0368,-0.0252,-0.0545,0.0455,-0.0006,0.053,-0.1543,-0.0143,0.0411,0.1248,0.0052,0.0134,0.0011,0.0756,-0.0308,-0.0998,0.0233,0.0014,-0.0187,-0.0693,0.0228,-0.01,0.0255,-0.0063,-0.0145,-0.0278,0.0438,0.0539,0.0028,0.0919,-0.1304,0.0537,0.0293,-0.01,0.0453,-0.0054,-0.0568,-0.0017,0.0078,-0.0027,-0.0629,-0.0388,0.0416,0.0067,0.0266,0.0097,0.0443,-0.095,0.138,-0.0514,0.0227,-0.0167,0.0165,0.0444,0.1007,0.0095,0.0487,0.0494,-0.0061,-0.0619,-0.046,0.0602,-0.0008,0.0053,0.005,-0.0585,-0.0372,0.0246,0.0556,-0.0508,0.0467,-0.0154,0.0585,0.0381,0.0138,0.0067,-0.0074,0.063,-0.0248,-0.0169,-0.025,0.0312,-0.038,0,0.0067,-0.0288,-0.0764,0.0075,0.0115,-0.0238,-0.0348,0.0395,-0.081,-0.0065,-0.056,0.0384,0.018,-0.0533,-0.0518,0.0123,-0.0785,0.0268,0.0641,-0.022,0.0232,-0.0677,0.0305,0.0884,-0.0464,0.0487,0.0823,-0.1183,0.0273,0.0087,-0.0057,0.0053,0.0166,0.0483,0.1304,0.1023,0.0074,0.0494,0.025,0.0206,-0.1046,-0.0352,0.0579,-0.0581,-0.0395,-0.0342,-0.1533,-0.0416,0.0408,0.0018,0.0486,-0.0283,-0.0015,0.0736,0.0144,0.0519,-0.072,0.0773,0.0135,0.0761,0.0333,0.054,0.0182,0.026,-0.0184,-0.0042,-0.0679,-0.0237,0.0375,0.0028,0.069,0.032,0.0954,0.0337,-0.029,-0.0319,0.0291,-0.0558,-0.0405,-0.0521,-0.0794,0.0146,0.0348,-0.0422,0.003,-0.0753,-0.037,-0.0469,-0.0564,-0.0082,-0.0488,0.0117,-0.0927,0.0453,0.0539,0,0.0009,-0.1281,0.0029,-0.013,-0.0072,-0.0665,-0.0071,-0.0377,0.006,0.0051,-0.0954,-0.065,-0.0059,0.002,-0.011,0.0936,0.0016,-0.1209,-0.0435,0.0148,0.0264,-0.0086,-0.1147,0.0786,-0.0271,0.0368,0.0241,-0.0726,0.0364,0.0173,-0.0378,-0.0462,-0.1141,-0.0132,-0.0721,0.0006,0.0867,-0.0078,0.0004,-0.0042,-0.0162,0.0633,-0.0493,0.0258,0.0605,-0.0245,-0.0816,0.0461,0.1046,-0.0288,0.0348,-0.0519,0.0349,-0.0099,-0.0551,-0.091,-0.0185,-0.0293,-0.0826,0.0231,0.0401,0.0402,-0.0835,0.0447,0.0222,-0.0713,-0.0233,0.0186,-0.0316,-0.0491,0.0681,-0.083,-0.0081,-0.008,0.0951,0.0869,0.0237,0.0101,-0.0042,0.0006,0.0441,0.0163,0.0361,0.1046,0.0043,0.0881,-0.0358,0.0256,-0.0308,0.0137,-0.0453,-0.049,-0.0167,0.0318,0.0446,0,-0.0634,-0.0472,-0.0697,0.0605,-0.0345,0.0437,-0.0281,0.0729,-0.037,-0.0376,-0.0253,-0.0241,-0.0935,-0.0025,0.0082,0.0427,0.0305,-0.0049,-0.0041,0.0387,0.007,0.0302,0.0103,0.0315,-0.0411,-0.0131,-0.0186,0.0174,-0.0603,0.0431,-0.0218,0.1214,-0.03,-0.0846,0.079,-0.039,0.01,0.0176,-0.0505,0.0459,0.0444,0.0255,-0.0436,-0.0373,0.0123,-0.0566,-0.0144,0.0008,0.0913,0.0143,0.037,-0.1271,0.006,0.0208,0.0048,0.0415,0.0886,-0.0006,0.025,-0.0831,0.0918,0.0765,0.0948,0.0201]},{"id":"project:agent-linter","type":"project","slug":"agent-linter","title":"Agent-Readiness Linter","url":"/projects/agent-linter","section":"Score an OpenAPI spec against the patterns LLM agents actually need.","text":"Agent-Readiness Linter Score an OpenAPI spec against the patterns LLM agents actually need. After writing the 'Designing Backends for Agents' post, the obvious next move was to turn its thesis into something a reader could use on their own API. Most teams I've talked to know their spec isn't quite agent-ready but can't point to the specific gaps. A deterministic linter is the shortest path from that feeling to a concrete punch list. The constraint was strict: no AI in the tool itself. The whole point of the blog is that good agent ergonomics is an architectural discipline, not a model capabili…","embedding":[-0.0013,-0.041,-0.0684,-0.0208,0.0884,0.0241,-0.0545,0.0162,-0.0497,0.0215,-0.0493,-0.0578,0.0302,-0.0184,0.0519,0.0275,0.0569,-0.0066,-0.0027,0.0104,0.0314,0.0636,0.0241,-0.0718,-0.0996,-0.0288,0.0207,-0.0802,0.0115,-0.0779,0.059,0.114,0.0393,0.0655,0.0305,0.0323,-0.0522,0.026,0.0345,0.0759,0.0166,-0.0413,-0.0244,-0.0729,0.0262,-0.0543,0.0071,-0.1027,-0.033,-0.0052,-0.0674,-0.0803,0.0268,-0.1057,-0.0138,0.0025,-0.0179,-0.085,-0.0505,-0.0508,0.0702,-0.0491,-0.0286,0.0295,0.0671,0.0404,0.0088,-0.0125,0.0255,-0.0901,-0.0427,-0.0351,-0.0281,0.0337,-0.0044,0.0081,-0.0016,0.0733,0.1098,-0.0297,-0.0716,0.008,0.0048,0.1289,-0.0249,0.0609,0.0487,0.0199,0.0599,0.0046,0.059,0.0056,0.0207,0.0256,0.0731,0.0829,0.0119,-0.104,-0.0589,0.0859,-0.0577,0.05,-0.0309,0.0154,-0.0425,-0.0366,0.0926,-0.0393,-0.0119,-0.0298,0.0576,-0.0501,0.0529,-0.0077,0.0776,-0.0447,-0.0089,0.0077,0.062,0.009,0.0828,-0.0066,-0.0261,0.02,0.0525,0.1108,-0.0238,0,0.0301,0.0527,0.0287,0.0529,0.0268,-0.0258,0.0186,-0.0137,-0.0134,0.0259,-0.0088,0.0861,-0.0802,0.0839,0.1202,-0.0339,-0.0291,0.0416,-0.0157,-0.0286,-0.0053,0.0106,-0.0057,-0.0826,0.031,0.0794,-0.0098,-0.0865,0.0697,0.027,0.0261,0.0998,-0.0322,0.0885,-0.0844,0.0242,-0.1475,-0.046,0.052,-0.0714,-0.0465,0.0656,0.0136,-0.0534,-0.0411,-0.0783,-0.0039,0.0082,0.0806,-0.0236,0.0265,0.0617,0.0107,0.0045,0.0384,0.012,0.0517,-0.0037,-0.023,0.1007,-0.0378,0.017,0.0173,0.0019,0.0421,0.062,-0.0693,0.0477,0.051,-0.0071,-0.0193,0.0578,-0.0219,-0.0128,-0.054,-0.0417,0.0156,-0.0054,0.0169,-0.0798,0.0478,0.0741,-0.0065,-0.0033,0.0021,-0.0244,-0.0028,0.0263,-0.0258,0.1113,-0.0213,-0.0448,-0.0774,0.0753,-0.0437,0,-0.0157,-0.1013,-0.0975,0.0629,0.075,-0.07,-0.0683,-0.0215,0.0229,0.0595,0.0059,0.0171,0.0383,0.0263,0.0739,-0.0737,0.0088,-0.0827,0.0015,-0.0776,0.1174,0.0311,-0.0716,-0.0842,0.0691,0.0485,-0.0812,-0.003,-0.0728,-0.0047,0.0017,-0.0444,-0.0183,0.0121,0.0029,0.0081,-0.0212,0.0914,-0.0385,-0.0079,-0.0003,-0.0841,-0.0447,-0.0652,0.0303,-0.0364,-0.0616,-0.03,0.0322,-0.0424,0.0138,0.0255,0.0332,-0.1001,-0.0746,0.044,0.0243,-0.0907,0.0044,-0.0721,-0.027,0.0411,-0.0092,-0.0071,-0.0129,-0.0386,-0.0722,-0.0156,-0.0271,-0.0762,0.0357,-0.0577,-0.0092,0.0457,0.0428,0.0112,-0.0221,-0.0539,0.0172,-0.0037,-0.0966,0.0302,0.0089,0.0509,0.0014,0.0639,0.0421,-0.0059,0.0529,0.0572,-0.0224,0.0094,-0.006,0.0376,-0.0442,0,-0.0601,-0.0125,0.0106,0.0194,-0.049,-0.0132,-0.0022,-0.0474,-0.0191,0.022,0.1224,0.0335,-0.0503,0.0573,0.0447,0.0535,-0.0152,0.0222,-0.0863,-0.0867,0.0246,0.025,0.0057,-0.0081,0.0022,-0.0339,-0.0715,0.0371,0.0072,0.101,-0.0126,0.0184,0.0766,-0.0136,0.0136,0.1196,-0.0345,-0.032,0.0574,0.0232,0.0094,0.0156,-0.0141,-0.0002,0.075,-0.0321,-0.0563,-0.076,0.0408,-0.0819,-0.0558,-0.0128,-0.0713,0.1042,0.0082,0.0061,-0.0021,-0.0858,0.0064,0.0258,0.0025,-0.0076,0.0292,0.0742]},{"id":"project:atlas-weather","type":"project","slug":"atlas-weather","title":"Atlas","url":"/projects/atlas-weather","section":"A 3D globe that rotates to your city and tells you the weather.","text":"Atlas A 3D globe that rotates to your city and tells you the weather. Every weather app shows you a card with a sun icon and a number. They all look the same because the data is the same — the differentiation has to come from how you present it. The idea here was to make the location feel physical: when you search a city, the Earth actually rotates to put it in frame. The weather is almost secondary to that moment. The API choice was a constraint worth celebrating. Open-Meteo is free, keyless, and covers current conditions, hourly and 7-day forecasts, marine wave data, and AQI — everything in …","embedding":[-0.0127,0.0416,0.0429,0.0039,0.0427,-0.1012,-0.075,-0.0457,0.078,-0.0476,-0.0133,-0.0153,-0.0269,0.0096,0.0716,-0.0718,-0.0554,0.027,0.0086,-0.0104,-0.021,0.0171,-0.0268,0.0501,0.0466,0.045,0.0058,0.0515,0.0061,0.0159,0.043,0.0976,0.031,0.0095,-0.0126,0.0492,0.0066,-0.0434,-0.1289,0.0557,0.0317,-0.0368,0.0603,0.0178,0.0183,0.036,-0.0493,0.0378,0.0697,0.0374,-0.0874,-0.078,-0.0754,-0.0991,-0.0488,0.1076,-0.0056,-0.0364,-0.0106,-0.076,0.062,-0.0077,-0.0591,0.0955,0.079,0.0095,-0.0825,-0.0392,0.0044,-0.1204,0.0127,-0.0085,0.0786,-0.0635,0.0221,-0.0453,-0.0023,-0.1148,0.0105,-0.024,0.0643,0.0409,-0.0424,0.0735,0.0366,0.0141,-0.0168,0.0189,0.0344,-0.0574,0.0058,-0.0654,-0.062,-0.0445,-0.0462,0.0907,0.0367,-0.0128,-0.0511,0.0511,0.069,-0.0813,0.024,0.0726,0.0249,-0.0437,0.0259,-0.0234,-0.1066,0.0266,-0.0493,-0.005,0.0237,-0.1216,-0.0705,0.045,-0.0122,0.0322,0.062,-0.0074,-0.047,-0.063,0.0264,0.0473,0.017,0.0579,0.0763,0,0.0344,0.0453,-0.0196,0.061,0.0233,0.0098,-0.0432,-0.0566,-0.0587,0.0375,-0.0349,0.1229,-0.0014,0.0578,0.0555,0.0012,0.0147,0.0629,-0.0612,0.0683,-0.0322,-0.0162,0.0137,-0.0367,0.0028,-0.0064,-0.0202,0.0678,-0.0042,0.0052,0.0637,0.0208,-0.0186,0.0107,0.0692,0.0092,-0.126,-0.0505,-0.0419,0.0015,-0.0212,0.0298,-0.0827,-0.0341,0.033,0.0658,0.0019,-0.0129,0.0209,-0.003,0.0418,0.0573,-0.0957,-0.0231,0.0168,-0.0176,0.0651,-0.0095,0.0116,0.0381,-0.0739,0.0291,0.0538,-0.043,0.0281,-0.0398,0.0311,0.0961,-0.0197,0.0369,0.072,-0.0025,0.0373,0.0874,0.0307,-0.0001,0.0266,-0.0324,-0.0297,0.0104,-0.0633,-0.0106,0.002,0.0176,-0.0169,0.0141,0.0112,-0.0096,0.0144,-0.0125,-0.0684,0.0095,-0.013,-0.0159,-0.0411,0,-0.0612,-0.0814,-0.0235,-0.0443,-0.0996,-0.0554,-0.0067,0.0356,0.0032,0.0698,-0.0031,-0.0377,0.062,-0.0856,0.0339,0.0106,-0.0019,-0.0193,-0.1099,0.1161,0.0034,0.0015,-0.1068,0.0279,-0.0536,0.0074,0.0209,-0.0343,-0.046,-0.0313,-0.1091,-0.0371,-0.0616,0.0192,-0.056,0.1007,0.0236,-0.0328,-0.0495,0.006,-0.0706,0.0197,0.0633,-0.0273,-0.0312,0.0269,-0.0349,0.0797,-0.0509,-0.0534,0.0168,0.015,-0.0384,0.0426,0.0489,0.0523,-0.031,-0.0357,0.0298,-0.0402,-0.0025,-0.1305,-0.0803,0.0601,-0.0088,-0.0235,-0.0129,-0.0579,-0.0338,0.1195,-0.006,0.0077,-0.0487,-0.029,0.0063,-0.0278,0.0415,0.0704,0.0035,-0.0372,0.0083,-0.0592,0.0284,0.0831,0.0716,0.0187,0.0115,-0.094,-0.0124,0.0998,-0.0553,0.1185,-0.1604,0.0724,-0.0196,0,-0.0108,0.0028,0.0195,0.019,-0.1123,-0.0513,0.1039,-0.015,0.0036,0.0395,-0.0139,0.0074,-0.0732,-0.0043,0.0197,0.0351,-0.0193,0.0402,0.0086,0.0634,0.0577,0.0644,0.014,0.0125,0.0738,0.0195,-0.0124,0.0624,0.0458,-0.0518,0.0176,-0.0565,0.0618,0.027,-0.0388,-0.0162,-0.0433,0.0338,-0.015,0.0023,0.02,0.0647,-0.0739,0.0293,0.0296,0.0318,0.0567,-0.0789,0.016,0.0545,-0.0487,-0.0491,0.0183,0.0114,0.0721,-0.0221,0.032,-0.0323,0.0213,0.0725,-0.0574,0.0095,-0.1339,-0.0259]},{"id":"project:semantic-search","type":"project","slug":"semantic-search","title":"In-Browser Semantic Search","url":"/projects/semantic-search","section":"Search my writing by meaning — the language model runs in your tab.","text":"In-Browser Semantic Search Search my writing by meaning — the language model runs in your tab. Everyone assumes semantic search needs a backend, an embedding API, a vector database. By 2026 transformers.js and quantized small models have made that assumption false for small corpuses. The whole thing fits in a tab. The frame I wanted to prove out was: can a plain Gatsby site on Netlify, with no functions and no keys, still offer the kind of search that usually requires an OpenAI embedding endpoint and a Pinecone instance. For a portfolio's worth of text, the answer turns out to be yes. A Node s…","embedding":[-0.019,-0.0497,-0.024,0.0283,0.056,0.0141,-0.0147,-0.0313,0.0139,-0.0439,0.0053,0.0277,0.0396,0.0324,0.0711,-0.0059,0.0807,0.0573,0.04,-0.0225,0.0169,0.0968,0.0372,-0.1117,-0.0316,-0.0285,-0.0706,-0.0857,0.0503,0.018,0.0464,0.0385,-0.0304,0.13,0.0153,0.0574,-0.0784,-0.0223,0.0169,0.0108,-0.0388,0.0123,-0.0479,-0.0047,0.0558,-0.0235,-0.0487,-0.0883,-0.0449,-0.0786,-0.1455,-0.0502,-0.0441,-0.0404,0.0135,0.0039,-0.0522,-0.1231,-0.0278,0.0141,0.0276,-0.047,0.0371,0.0481,0.0781,0.053,0.003,-0.0194,0.0576,-0.0619,0.0717,0.0057,-0.0538,0.0399,-0.0594,0.0664,0.0354,0.0522,0.0092,0.0185,-0.0387,-0.0479,0.107,0.0713,0.0014,0.0111,0.0414,-0.0376,0.0716,0.0187,0.0356,-0.0881,0.0477,-0.0139,-0.0107,-0.0389,0.0285,-0.0379,-0.0468,0.0082,0.0243,0.0462,0.0624,-0.0798,-0.1008,0.052,0.0298,0.0367,0.028,-0.042,-0.0426,0.0439,0.027,-0.0564,-0.0603,-0.0328,0.0258,-0.0461,0.06,0.022,-0.0545,0.061,-0.0448,-0.004,-0.0613,0.0316,-0.0562,0,0.0682,0.0729,-0.0003,-0.0269,0.0064,0.0552,0.0369,0.0001,-0.1287,-0.0271,-0.0463,0.0813,-0.073,0.0069,0.044,0.0319,-0.0631,0.005,0.0646,-0.0553,-0.0057,-0.001,-0.019,-0.0653,-0.0451,-0.0734,-0.0148,-0.0725,-0.0241,0.0147,-0.0694,-0.0133,-0.0368,0.0272,0.002,-0.0032,-0.0241,-0.0321,0.0301,-0.0454,-0.0176,0.0756,0.0038,-0.0577,-0.0878,-0.0303,-0.0192,0.0252,0.0202,-0.0178,0.0132,0.0558,-0.0632,0.0126,0.0898,0.0806,0.0407,0.075,0.0581,0.0573,0.0141,-0.0982,0.0758,-0.0499,-0.0468,0.0848,-0.0091,-0.0283,0.0583,0.0094,0.0473,-0.0085,0.0655,-0.0087,0.038,-0.0598,-0.0778,-0.0346,0.0161,0.0477,0.0554,-0.0564,0.0272,0.0979,0.0395,-0.0556,0.0497,-0.091,0.0052,-0.0322,0.031,0.0139,-0.0924,-0.0245,0.0277,0,-0.0697,-0.0818,-0.029,0.0526,-0.0521,-0.0977,0.086,-0.0519,0.0082,0.0794,0.0471,-0.015,0.0242,-0.0686,-0.0534,0.0099,0.0047,-0.0386,0.03,0.0561,-0.0216,-0.0155,-0.1367,0.0424,0.1231,0.0775,-0.0084,0.0259,-0.095,-0.0412,0.0311,-0.0214,-0.0989,-0.0143,-0.0633,0.0074,0.0308,0.0327,-0.0597,0.0287,-0.012,0.0142,-0.015,0.0499,-0.0225,-0.0375,-0.079,0.0782,0.0596,0.0036,0.0117,0.0599,-0.0132,-0.0254,-0.0383,-0.0296,-0.0001,0.0282,-0.093,-0.0901,-0.0211,-0.0419,0.01,0.0186,0.0439,-0.0372,-0.0249,0.0742,-0.0022,-0.0786,0.017,-0.055,0.0562,0.0131,0.0447,0.0909,0.0972,-0.0163,0.016,-0.0562,-0.0199,0.0572,0.0619,-0.0394,0.0784,-0.0196,0.0015,0.0566,-0.05,0.0159,-0.0173,-0.0067,-0.0335,0.1043,0.0622,0,-0.1738,0.0516,-0.0822,0.0589,-0.028,-0.0357,0.1008,0.0334,-0.0417,0.0108,0.0113,0.03,-0.0667,0.0499,0.0066,0.0717,0.0475,-0.0469,-0.0159,-0.0059,0.0482,0.0722,0.0358,0.0793,-0.0364,0.0317,-0.0488,0.0377,0.0294,0.0034,-0.0217,0.0086,-0.0464,0.0217,0.0322,0.0208,-0.0777,-0.0536,-0.0468,0.0356,0.0895,-0.009,-0.0127,0.0232,0.0467,0.0552,-0.0053,0.0015,0.0975,0.0287,0.0547,-0.0438,-0.034,0.0102,0.0179,-0.0171,-0.0179,0.0318,-0.0136,-0.0038,-0.0157,-0.0418,0.0664,0.0044]},{"id":"project:portfolio-new","type":"project","slug":"portfolio-new","title":"Portfolio Site","url":"/projects/portfolio-new","section":"A 3D planet, GSAP scroll choreography, and Lenis smooth scroll","text":"Portfolio Site A 3D planet, GSAP scroll choreography, and Lenis smooth scroll I'd rebuilt my portfolio a few times and it always landed in the same place — a page with sections, some scroll animations, a list of projects. Readable, forgettable. I wanted this one to have a physical quality to it, where moving through the page felt like moving through a space rather than reading a document. The 3D planet in the hero was the first decision. Not because it's flashy but because it immediately tells you something is different here before you've read a single word. Everything else in the design had t…","embedding":[-0.0805,-0.055,0.0047,-0.0502,0.0057,-0.0526,-0.0235,-0.036,0.0213,0.0594,-0.0594,0.1395,0.0364,-0.0314,-0.0467,-0.0276,0.0313,0.1066,-0.0301,0.041,-0.0298,0.0009,0.0514,0.0191,-0.0608,0.0657,-0.051,-0.0151,0.0017,-0.0563,-0.0096,0.1037,-0.0325,-0.0208,-0.0133,0.0525,-0.0193,0.0009,-0.0661,0.0233,0.0028,0.0404,0.009,0.0347,0.0911,-0.0644,-0.0261,-0.0683,0.0315,0.0134,-0.0543,-0.1182,0.0051,-0.1161,-0.147,0.0863,-0.0092,-0.0116,0.0293,-0.0489,0.0677,-0.0181,0.0708,0.0503,0.041,-0.0409,-0.0303,0.0199,0.0233,0.0433,-0.0312,-0.0216,0.0018,-0.0426,-0.0272,-0.0123,0.0148,-0.0908,-0.0235,0.031,0.0323,-0.0448,-0.0385,0.1028,-0.0331,-0.0203,-0.0168,-0.0118,-0.0473,-0.0228,0.0766,-0.0228,0.0408,-0.0678,-0.0944,-0.0188,0.0123,-0.0899,0.0244,0.093,-0.028,-0.0219,0.1232,0.0344,-0.0136,0.0113,0.0421,0.0469,-0.0717,0.0292,-0.0428,0.0508,-0.0692,0.021,-0.0441,-0.0011,-0.025,0.0121,0.0618,0.0577,0.0073,0.0151,-0.0106,-0.047,-0.0458,-0.0498,-0.0164,0,0.0182,0.0661,0.0086,0.0186,0.0445,0.0059,-0.0673,-0.0602,-0.0289,0.0318,0.0361,0.0218,0.03,0.0955,-0.0224,-0.0995,-0.0337,0.0418,-0.0078,-0.0257,-0.0372,-0.0367,0.027,-0.0821,-0.0035,0.0865,-0.0172,0.0104,-0.0078,0.033,-0.0052,0.0232,-0.0663,-0.0416,0.0088,-0.0008,-0.0277,-0.1144,0.0364,0.0142,-0.1196,-0.0051,0.0259,-0.0452,-0.076,0.109,0.1029,0.0407,0.0578,0.0883,0.0088,0.0558,-0.024,-0.0058,0.0001,-0.075,0.0794,0.0191,0.0824,0.0952,0.0405,-0.0205,-0.0521,-0.0945,0.0502,0.1074,-0.0391,0.0298,0.0206,-0.0554,-0.0114,0.0239,0.1031,0.0695,0.0293,-0.0121,-0.0668,0.0151,-0.0383,-0.0257,-0.0653,-0.025,-0.0195,0.006,-0.0294,-0.055,0.0348,0.005,-0.0264,0.0034,-0.032,-0.0127,0.0673,-0.0566,0,0,-0.0321,-0.0327,-0.005,0.047,0.0455,0.0104,-0.0602,0.0674,0.0093,-0.0013,0.0192,0.0023,-0.0501,-0.008,0.0462,0.008,0.0627,-0.084,-0.024,0.0311,0.1312,-0.0183,-0.0647,-0.0443,0.051,0.0222,-0.0032,-0.0142,-0.0359,0.0727,-0.0252,-0.016,-0.0418,-0.006,0.0335,0.0402,-0.0416,0.0079,-0.029,-0.0446,-0.0021,-0.0272,0.0958,0.0064,0.0067,-0.0079,-0.0824,0.0784,0.0758,-0.0177,-0.0761,0.0537,0.0462,-0.1239,0.0499,0.0349,-0.036,-0.0477,-0.0224,-0.0734,0.0072,0.0099,-0.1131,-0.0236,0.0297,-0.0344,-0.0012,-0.0651,-0.0602,0.069,-0.0727,-0.0336,0.0107,-0.0394,0.0593,-0.019,0.0966,0.0234,0.0959,0.0006,0.0699,0.0487,0.045,0.0157,0.0595,0.1288,-0.1203,-0.0481,-0.0339,0.0218,-0.0013,0.0393,-0.0151,0.0989,-0.0084,0,-0.0094,0.0137,-0.0061,0.0076,-0.0284,0.0056,-0.0253,0.0319,-0.0549,-0.0251,0.0383,-0.0492,-0.0345,0.0511,0.0082,0.0296,-0.0177,0.0803,-0.0372,-0.0086,-0.0022,0.1265,0.0387,-0.0557,-0.029,0.1272,-0.0015,0.0168,-0.0394,-0.066,0.0614,0.0272,-0.0703,0.0229,-0.0203,-0.0601,-0.0561,0.0244,0.0156,0.0387,-0.0318,0.0723,0.0524,0.0732,0.0703,0.0307,0.0324,-0.0743,-0.0236,-0.02,-0.0611,-0.09,0.007,0.033,0.0729,0.0021,0.0025,0.0653,-0.0647,0.0683,-0.0264,-0.0123,-0.0209,0.05]},{"id":"project:kanbuddy","type":"project","slug":"kanbuddy","title":"KanBuddy","url":"/projects/kanbuddy","section":"Kanban that stays out of your way","text":"KanBuddy Kanban that stays out of your way I kept opening Trello to add a task and spending ten minutes instead updating labels, checking power-ups, and moving things between boards that had multiplied past the point of usefulness. I just wanted somewhere to put tasks and drag them to done. That's it. KanBuddy has no account. No sync. No notifications. It stores everything in localStorage and that's the whole system. I based it loosely on Basecamp's idea of 'calm software' — tools that don't demand your attention, they just wait for it. The whole board serializes to a single JSON blob in local…","embedding":[0.0246,-0.0721,-0.0012,0.0093,0.0121,-0.0151,0.0319,-0.0164,-0.0272,-0.0246,0.0559,0.0046,-0.0296,0.0044,0.0134,0.007,0.0593,-0.0362,0.0111,-0.0399,-0.0539,0.0071,-0.0078,0.0636,0.0014,0.0142,-0.0446,-0.095,-0.0243,-0.0291,0.031,-0.0181,-0.0015,0.0158,0.168,0.0504,0.015,0.0056,-0.0123,-0.1388,0.0044,0.0049,-0.0522,0.0702,-0.0215,0.0051,0.0187,-0.077,-0.0222,0.0314,0.0351,-0.1119,0.0231,-0.0063,-0.01,0.0633,0.064,-0.0065,0.0612,0.0069,0.0354,0.023,0.0267,-0.0279,-0.0332,-0.0026,0.0266,0.0735,0.0299,-0.0216,0.0787,0.0434,-0.0203,0.0285,0.0076,-0.0446,-0.0124,-0.0483,0.0236,-0.0402,-0.0624,-0.0085,0.0394,-0.0225,0.0083,0.0106,0.0217,-0.0095,0.0148,-0.0125,0.0232,-0.0453,0.1089,-0.0746,-0.1026,-0.0461,0.0701,0.0275,-0.044,0.0656,-0.026,0.0672,0.0547,-0.0266,0.031,-0.0138,0.0516,-0.0037,-0.034,-0.0227,-0.0411,0.045,-0.0017,0.029,-0.0184,-0.0169,0.0081,0.06,0.0488,0.0842,0.1328,-0.0194,0.0293,0.034,-0.0667,0.0832,0.0121,0,0.0639,-0.011,0.0032,-0.0096,0.1052,-0.1598,0.0123,-0.0433,-0.0439,-0.0246,-0.0287,0.0507,-0.0271,0.1092,0.0131,-0.0993,-0.1028,0.0606,0.0931,0.0167,-0.0278,-0.0568,-0.0127,-0.0193,0.0302,-0.0279,0.0206,0.0511,0.0782,0.042,-0.0058,-0.0821,0.0237,-0.0121,-0.044,-0.0084,-0.0376,-0.0468,-0.0117,-0.0594,0.0156,-0.0123,-0.1351,-0.0525,-0.012,-0.078,0.0368,0.0284,0.0032,-0.0501,-0.0089,-0.0021,-0.0285,-0.0274,-0.049,-0.0665,0.0639,-0.0572,0.1122,-0.0158,0.0116,-0.0008,-0.0059,-0.0102,0.0484,0.0215,0.0329,0.0181,0.0208,-0.116,-0.0195,0.0093,0.0487,-0.0638,-0.0245,0.0154,-0.0615,-0.0231,-0.185,-0.0212,0.0527,-0.0753,-0.079,-0.0005,0.0904,0.031,0.0081,-0.0604,-0.0902,0.111,-0.0007,0.0348,0.0064,0.013,-0.0374,0,0.0093,-0.0842,0.0027,-0.001,0.0439,-0.0053,-0.0259,-0.0127,0.005,-0.0488,-0.1325,-0.0328,-0.066,-0.0048,-0.0002,0.0819,0.0851,0.0301,-0.0295,-0.0385,-0.0649,0.0806,-0.0308,0.0372,0.0004,0.0665,-0.1022,0.0377,-0.0204,-0.0612,0.0062,-0.0619,0.0641,-0.0902,-0.0406,0.0007,-0.017,0.0918,0.0109,0.0538,0.0664,-0.0073,-0.1091,0.0111,-0.026,0.0482,-0.0526,-0.0048,-0.0787,0.0069,0.0122,-0.0458,-0.0247,-0.0896,0.0451,0.0617,0.0713,-0.0251,-0.0219,-0.0774,-0.0257,-0.1005,0.0753,0.0177,0.0448,-0.0038,0.063,-0.0019,-0.0803,-0.015,-0.0436,0.092,-0.0265,-0.0034,-0.0216,-0.0155,-0.0153,-0.041,-0.0019,-0.0428,-0.0238,0.0374,-0.014,-0.0686,0.0793,-0.0026,-0.0062,0.0948,0.0231,-0.0207,-0.0235,0.022,-0.0101,0.0599,0.0637,0,0.0273,0.0083,-0.0788,0.0715,-0.0049,0.0181,0.0484,0.0739,0.0137,-0.0446,0.0767,-0.01,-0.0718,0.0307,0.0128,-0.0182,0.0782,0.0073,-0.0425,-0.0555,0.0528,0.1098,0.0594,-0.0107,-0.0047,0.021,0.0294,0.0968,0.0595,-0.0798,0.0305,0.0215,-0.0474,0.0331,0.0286,0.0051,-0.0593,0.0614,-0.0423,0.0618,0.0144,0.0126,-0.0549,0.0358,-0.0081,0.03,-0.0944,0.0068,0.0114,-0.0499,-0.0543,-0.0216,0.0177,0.1754,0.0348,0.0673,0.0291,-0.023,0.0232,0.036,0.0076,-0.0038,-0.0465,0.0231]},{"id":"project:weatherapp","type":"project","slug":"weatherapp","title":"Weather App","url":"/projects/weatherapp","section":"7-day forecast as a progressive web app","text":"Weather App 7-day forecast as a progressive web app PWAs had matured enough by 2022 that the gap between a web app and a native app was mostly perception. Offline support, home screen install, smooth animations — it was all there. I wanted to test whether you could build a weather app that someone would install on their phone and not know it wasn't from the App Store. The visual reference was iOS Weather. Not to copy it, but to understand why it works — the way condition is communicated through color and motion, not just a text label. Rain looks like rain. Sun looks warm. OpenWeatherMap for th…","embedding":[-0.0489,0.0386,0.1308,-0.0074,0.0751,-0.0622,-0.0034,-0.0231,-0.018,-0.0257,-0.0128,-0.0501,0.0052,-0.0193,0.0709,0.0069,0.0268,-0.0601,-0.0078,-0.0546,-0.0402,0.0748,-0.0194,-0.005,0.066,0.062,-0.0503,0.092,0.0413,0.0419,-0.0125,0.0603,0.0219,0.0401,-0.0074,-0.0583,0.0188,-0.0274,-0.1369,-0.0231,0.0282,0.0054,-0.0053,0.0409,-0.0122,-0.0089,-0.0144,0.0247,-0.0352,-0.0073,-0.0302,-0.0613,-0.0129,-0.0039,-0.0714,0.0587,-0.0099,-0.0115,0.0507,0.0256,0.017,0.0176,-0.0946,0.0803,0.114,0.0582,-0.0531,0.0129,0.0776,-0.1452,-0.0417,0.1058,0.1284,-0.0265,-0.0876,-0.0098,0.036,-0.0227,-0.0383,-0.082,0.0731,-0.025,0.0431,0.1062,0.0277,0.0483,0.0456,0.0584,-0.0026,0.0062,-0.0243,-0.061,-0.0102,-0.0133,-0.0845,0.0455,-0.0155,-0.0903,-0.084,0.0518,0.0298,-0.1044,0.0085,-0.0098,0.0465,-0.0372,-0.0194,-0.0643,0.0282,0.0668,-0.0549,-0.0236,0.0647,-0.0289,0.0128,-0.0268,-0.0602,0.0709,0.0434,0.0197,-0.0246,0.0151,-0.0132,-0.0128,0.0642,0.0093,0.0735,0,0.0783,0.0211,0.056,0.0079,0.0885,-0.0617,-0.0215,-0.0209,-0.0223,-0.0521,0.0278,0.088,-0.0778,0.0291,0.1254,0.0066,-0.0615,0.0584,0.0265,0.0343,-0.1307,-0.0916,-0.0232,-0.0316,0.0057,0.051,0.1047,0.1065,0.0581,-0.002,0.0509,0.0141,0.0108,0.0198,0.0286,-0.061,-0.0461,-0.0738,0.0303,0.0263,-0.0707,-0.0058,-0.0629,-0.0168,0.0327,-0.05,-0.0027,-0.0511,-0.0687,0.0207,0.0083,0.0392,-0.0405,-0.0559,-0.0622,0.0055,0.0916,-0.0993,0.0216,-0.022,-0.0258,-0.0229,0.0158,-0.0933,-0.0619,0.0491,0.0252,-0.008,-0.0784,-0.0072,0.0213,-0.0139,0.0762,0.0104,-0.0011,0.0064,0.0332,-0.0365,-0.0248,0.015,-0.0066,-0.0714,0.0413,0.0324,-0.0274,-0.0529,-0.0178,-0.0252,-0.0776,0.0997,-0.0173,0.0341,-0.0097,0.0316,0.0382,0,-0.0718,-0.0002,-0.0392,-0.0223,-0.0122,-0.0401,-0.0168,0.0816,0.0461,0.0177,0.0468,0.0682,-0.0382,-0.0452,-0.0354,0.032,0.0118,0.0179,-0.0524,0.0346,-0.0396,-0.0207,-0.0822,0.0476,0.0005,0.0049,0.0612,-0.0235,-0.0127,-0.0502,-0.0129,-0.0336,-0.0693,-0.0233,0.0072,0.0389,0.0263,-0.0902,-0.0353,-0.0261,0.0192,-0.0126,0.0429,-0.117,-0.0353,0.0398,-0.0236,0.0302,-0.0099,-0.0033,0.1207,0.0557,-0.014,-0.0168,-0.0043,-0.0065,0.0448,-0.0812,-0.0451,0.034,0.0329,-0.0899,0.0128,-0.0385,-0.0555,-0.0441,0.0019,0.0062,0.0143,0.0473,0.0188,-0.0918,-0.044,-0.0186,0.0048,0.0176,0.0511,0.0875,-0.0948,-0.0073,0.0106,0.096,0.0303,0.0214,0.0839,-0.0354,0.0029,-0.0982,0.0161,0.0876,-0.0272,0.1302,-0.0883,0.0733,-0.041,0,-0.0065,-0.0916,0.0259,-0.027,-0.0605,-0.0159,0.103,-0.0493,0.0878,-0.0359,-0.0642,0.0005,-0.083,0.1122,-0.0198,-0.0082,0.0322,-0.0104,-0.0348,-0.0055,-0.0074,0.0045,-0.028,0.0806,0.0958,0.005,-0.0372,0.0481,0.0601,0.044,-0.011,0.0137,-0.0074,-0.0655,-0.0022,0.0449,0.0088,0.0126,0.0288,0.0151,0.0176,0.042,0.0075,-0.0057,0.0543,-0.0344,0.015,-0.1091,0.008,0.0522,0.0091,-0.0187,0.0131,-0.0397,0.0411,-0.0391,0.0051,-0.0696,0.001,0.0462,0.0397,-0.0569,-0.0838,0.0898]},{"id":"project:clock","type":"project","slug":"clock","title":"Clock App","url":"/projects/clock","section":"A minimal analog clock, pixel-perfect","text":"Clock App A minimal analog clock, pixel-perfect Found a clock illustration by Renat Muratshin on Dribbble — minimal, clean, good shadows, nothing fussy. I wanted to build it as a working clock without touching SVG or canvas. Just CSS and React. The constraint was the interesting part. No clock library, no SVG hand paths, no canvas. Hand positions calculated from the current time as CSS rotation transforms. If I couldn't pull it off with CSS, the design direction was wrong. Each hand is a div. Its rotation is `(value / max) * 360` degrees, where value is seconds, minutes, or hours from the curr…","embedding":[-0.0867,0.0742,0.0148,-0.0526,-0.0376,-0.0147,0.0101,0.0452,0.0468,-0.061,-0.0395,0.0094,-0.032,0.0104,0.0037,-0.0381,-0.0006,0.0248,0.0539,0.0728,-0.0866,-0.1237,-0.0029,-0.0002,-0.0027,0.0998,0.0209,-0.0205,0.049,-0.0867,-0.0176,0.0649,0.0125,0.0092,-0.0794,0.0377,0.0935,-0.0042,-0.101,-0.0295,0.06,0.0709,0.1264,0.0492,0.0407,0.0793,0.0592,-0.024,-0.0221,0.0274,-0.0363,-0.0127,0.0364,-0.0008,0.0194,0.1386,0.072,-0.0306,0.0676,-0.0024,0.039,0.0625,-0.0247,0.0083,0.0038,-0.0315,-0.0085,-0.0839,-0.0244,0.0121,-0.014,0.0067,0.023,-0.0238,-0.0199,-0.0474,-0.0195,-0.0204,0.0427,-0.0198,0.0036,-0.0516,-0.0169,0.0852,0.0348,-0.0022,0.0219,0.1041,0.0264,-0.0641,-0.0573,0.1188,-0.0556,-0.0234,0.0234,0.0441,0.0931,0.0582,-0.1071,0.0162,0.0213,-0.0407,-0.0206,0.0348,0.037,0.0356,-0.0598,-0.0162,-0.085,0.0069,-0.0257,0.0681,-0.0377,0.0139,0.0637,-0.0107,-0.0686,-0.0048,0.1207,-0.0139,0.0477,0.0473,-0.0853,-0.0516,-0.0115,0.0416,0.0425,0,-0.0389,0.0965,0.058,-0.1068,0.1056,-0.0124,-0.095,0.013,0.0348,0.0328,0.0479,-0.065,-0.0707,0.0395,0.0593,-0.0164,0.0524,-0.0081,-0.0234,-0.0396,-0.0145,-0.0203,-0.0821,-0.0317,-0.0987,0.0602,0.0093,0.0685,0.016,-0.0312,0.0706,-0.0352,-0.0312,0.0192,0.0031,0.0059,0.0136,-0.0137,0.0028,0.091,-0.0144,-0.013,-0.0341,-0.0756,0.0164,0.0497,0.0994,0.0313,0.0053,0.0495,-0.0565,0.0191,-0.0026,-0.1302,-0.0108,-0.039,0.0644,0.0087,-0.0544,0.0847,0.0251,0.022,-0.0297,-0.0611,-0.0945,-0.0172,-0.0099,-0.0224,0.0208,0.0129,-0.0078,-0.042,0.0647,0.0036,0.0147,0.019,0.0718,0.0377,-0.0151,-0.0387,0.0034,-0.0126,0.0692,-0.0567,0.0144,-0.0755,0.0227,0.0388,-0.066,-0.022,-0.046,-0.0853,0.0149,0.0324,-0.0816,0,-0.022,-0.0489,0.0092,0.0808,0.0078,-0.0176,0.0321,0.0477,0.0329,-0.0014,0.0832,0.0056,-0.0056,0.0026,-0.0116,0.0581,0.0351,0.0094,-0.0054,-0.0211,0.0948,0.0967,-0.0112,0.0229,0.0277,0.0281,0.0429,-0.0141,-0.0224,0.0235,-0.0758,-0.0632,0.0746,-0.0287,-0.0168,-0.0562,-0.071,-0.0206,0.0293,-0.0206,0.0013,-0.0098,-0.0085,-0.0049,-0.0103,0.0985,-0.0728,0.0691,-0.0024,0.0797,0.0122,-0.031,0.0012,-0.0841,0.0039,-0.0562,-0.0558,-0.0457,0.1658,0.015,-0.0188,-0.0276,-0.076,-0.1056,0.0306,0.0705,-0.0196,0.0015,-0.0055,-0.0143,0.0195,0.0992,0.0093,-0.0389,-0.0971,0.0283,0.0446,0.0818,-0.0123,-0.0129,-0.0768,0.0005,-0.0085,0.0208,-0.0385,0.0417,-0.0688,-0.0211,0.0119,0.0514,-0.0792,0.0892,0.0164,0.0925,0.0649,0,0.0209,0.0329,-0.0294,-0.0346,-0.0317,-0.0397,0.0693,-0.0975,0.0518,0.0074,-0.0251,-0.056,0.0116,0.026,-0.0415,0.0635,-0.0253,0.0302,-0.0234,-0.0311,0.0452,0.0355,0.0623,0.0053,-0.0727,0.0481,-0.0452,0.0113,0.0749,0.0131,-0.0467,-0.0035,0.0084,-0.0427,-0.0858,-0.0776,-0.1331,-0.0239,0.0572,0.0176,-0.0342,-0.0774,-0.0771,0.0049,-0.0172,-0.0453,0.021,-0.1198,-0.0748,0.0341,0.0255,-0.0198,0.0041,-0.0642,0.0848,0.0457,0.0116,0.0089,-0.0442,0.0282,-0.0439,0.0369,-0.0323,0.0218]},{"id":"project:audio-waves","type":"project","slug":"audio-waves","title":"Audio Waves","url":"/projects/audio-waves","section":"Analog microphone signals visualized as digital waveforms","text":"Audio Waves Analog microphone signals visualized as digital waveforms I was messing around with Android's audio APIs and realized you could get raw PCM data out of the microphone — not processed audio, the actual amplitude values at each sample point. If those are just numbers, and a canvas is just a grid of pixels, then rendering a waveform is just mapping one to the other. The reference I had in mind was an oscilloscope. That line that reacts instantly and honestly to whatever sound is happening. I wanted that on a phone screen. AudioRecord gives you a buffer of 16-bit PCM samples — values b…","embedding":[-0.0451,-0.0535,-0.0526,-0.1232,-0.0784,-0.0479,-0.0042,-0.0401,-0.007,-0.0446,-0.0749,-0.1023,-0.0647,0.0218,-0.0024,-0.0157,0.0442,0.0263,0.05,0.0469,0.0725,0.0268,0.0015,-0.0183,0.1333,0.0458,0.0114,0.0203,0.1114,0.0509,0.0555,0.0448,0.0929,0.0467,-0.0256,-0.0806,0.0503,0.0457,-0.051,-0.0256,0.0732,0.0972,-0.0511,0.0053,-0.0166,-0.0124,-0.0254,-0.0413,-0.0339,0.0464,-0.0447,-0.0349,-0.0533,0.0464,-0.1148,0.0683,0.0682,-0.0177,0.0416,0.0043,-0.0115,0.0141,0.0452,0.0157,-0.0194,0.0588,0.0375,0.0205,0.0923,-0.0131,-0.0527,-0.013,0.0413,-0.053,-0.0344,0.0325,-0.0585,-0.0135,-0.0447,0.0245,0.0492,-0.0406,-0.0486,0.0135,-0.0233,0.079,0.0263,-0.0629,-0.0097,0.0143,-0.1608,-0.0083,-0.0676,0.0103,-0.0686,-0.0417,0.0625,0.0214,0.1175,-0.0074,0.0038,-0.0446,-0.0266,-0.0077,-0.0341,-0.0951,-0.0165,0.0253,0.0275,0.0389,-0.0008,-0.0001,-0.0149,0,0.1368,0.0534,-0.0459,-0.0639,-0.0195,-0.0687,-0.0078,-0.0562,-0.1043,0.0667,0.0721,-0.0227,-0.013,0,0.0433,0.0073,0.0197,-0.0104,0.0432,0.027,-0.0678,-0.0286,0.0733,0.061,-0.0227,0.0098,-0.0124,0.0409,0.0005,-0.0077,-0.0803,0.0089,-0.0358,0.0295,-0.057,0.0239,0.0188,-0.0155,0.0397,0.0782,-0.0462,0.0637,0.0535,-0.0101,-0.0275,-0.0209,-0.0078,-0.1124,0.0072,0.0029,0.0036,0.0348,-0.0066,0.0116,-0.0639,-0.0189,0.0575,-0.0457,0.0132,-0.058,-0.0927,0.0984,-0.0165,-0.0071,0.0121,0.0112,-0.0396,0.0233,-0.0031,-0.0514,0.0242,-0.0017,-0.0409,0.0273,0.0276,-0.0026,0.0171,0.0113,-0.0452,0.0267,0.0072,-0.0135,-0.0131,-0.0047,-0.0004,0.0686,-0.045,-0.0165,-0.0006,0.0752,-0.0032,0.0783,0.008,0.0771,0.0472,0.0021,-0.0098,-0.0401,-0.039,0.0467,0.0397,-0.1647,-0.0745,-0.0505,-0.1219,0.0589,-0.0115,-0.0307,-0.0492,0,-0.013,0.0985,0.0005,0.071,0.0155,0.0486,0.0992,0.0895,0.0196,0.0151,0.0406,-0.0443,-0.0151,0.0619,-0.0485,-0.0185,0.004,-0.0425,-0.0098,-0.0497,0.0474,0.0369,0.0629,0.0419,-0.0324,0.0424,-0.0661,-0.0696,0.0128,0.0091,-0.0089,0.0361,0.0006,-0.0659,0.0004,0.0081,0.1073,-0.0229,0.0231,-0.0566,-0.0007,0.0263,0.0901,-0.0386,-0.0173,0.001,-0.0085,0.0655,-0.0587,0.0275,0.0855,0.1149,0.0383,-0.0073,0.0206,-0.0196,-0.0288,-0.0423,0.0407,-0.0238,-0.0042,-0.0406,-0.1096,-0.1121,0.0504,0.0854,0.0724,-0.0524,-0.0105,0.0162,0.0803,0.0117,0.017,0.0449,0.0234,-0.0472,-0.115,-0.0672,-0.0553,0.012,0.0348,-0.0035,0.08,0.0722,0.0497,0.038,-0.0507,-0.0723,-0.0015,0.1234,-0.0082,0.0502,-0.0405,-0.0054,0.0743,0,0.0297,0.0245,0.0139,-0.058,-0.0547,-0.091,-0.0069,-0.053,0.0561,-0.1157,0.0262,-0.0336,-0.0523,0.0749,-0.0043,-0.0075,-0.0323,-0.019,-0.0247,-0.082,-0.033,0.052,-0.0475,0.0216,0.0173,0.0214,-0.0222,0.0852,-0.0126,0.0228,-0.0458,-0.0103,-0.0268,0.0144,-0.0161,-0.0334,-0.0898,-0.0418,-0.0095,0.0127,-0.1567,-0.0683,0.0014,0.0535,0.0543,-0.0173,0.0277,-0.0943,0.0003,0.0198,-0.016,0.058,0.0777,-0.0871,0.0017,-0.0262,-0.0357,0.0065,-0.0438,0.0136,-0.0515,0.0538,0.0117,0.0073]}]}