[{"data":1,"prerenderedAt":301},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Ftypescript-news-autonomous-ai-newsroom":22,"\u002Fblog\u002Ftypescript-news-autonomous-ai-newsroom-surround":297},[4],{"title":5,"path":6,"stem":7,"children":8,"page":21},"Blog","\u002Fblog","blog",[9,13,17],{"title":10,"path":11,"stem":12},"Building invade.lol: A League of Legends Stats Platform","\u002Fblog\u002Fbuilding-invade-lol","blog\u002Fbuilding-invade-lol",{"title":14,"path":15,"stem":16},"Nuxt Form Composable","\u002Fblog\u002Fnuxt-form-composable","blog\u002Fnuxt-form-composable",{"title":18,"path":19,"stem":20},"typescript.news: How I Built a Fully Autonomous AI Newsroom","\u002Fblog\u002Ftypescript-news-autonomous-ai-newsroom","blog\u002Ftypescript-news-autonomous-ai-newsroom",false,{"id":23,"title":18,"author":24,"body":26,"date":288,"description":289,"extension":290,"image":291,"meta":292,"minRead":293,"navigation":294,"path":19,"seo":295,"stem":20,"__hash__":296},"blog\u002Fblog\u002Ftypescript-news-autonomous-ai-newsroom.md",{"name":25},"Louis Leschevin",{"type":27,"value":28,"toc":271},"minimark",[29,33,37,53,56,61,64,67,71,82,87,90,120,128,137,141,150,157,166,171,174,178,181,185,188,192,199,206,210,217,220,224,227,253,257,260],[30,31,18],"h1",{"id":32},"typescriptnews-how-i-built-a-fully-autonomous-ai-newsroom",[34,35,36],"p",{},"What if a news site could run itself? Not just auto-publish RSS feeds, but actually do the work of a small editorial team: research what happened in the ecosystem, pick the topics worth covering, write proper articles, review them, and even promote them.",[34,38,39,40,47,48,52],{},"That's what ",[41,42,46],"a",{"href":43,"rel":44},"https:\u002F\u002Ftypescript.news",[45],"nofollow","typescript.news"," is. A daily TypeScript, JavaScript and web platform news site where ",[49,50,51],"strong",{},"every article is researched, written and published by an AI agent, in complete autonomy",". I set up the system once, and it has been running on its own ever since.",[34,54,55],{},"In this article, I'll walk you through how it works.",[57,58,60],"h2",{"id":59},"the-idea","The idea",[34,62,63],{},"I wanted a place where I could get a daily digest of what's happening in the TypeScript\u002FJavaScript world, without having to scroll through Twitter, Hacker News and a dozen newsletters myself.",[34,65,66],{},"Instead of doing that curation manually, I decided to delegate the entire pipeline to an agent. Not \"AI-assisted writing\" where I review every draft, but a real autonomous loop where the agent decides what to cover and ships it.",[57,68,70],{"id":69},"the-stack","The stack",[34,72,73,74,77,78,81],{},"The system has two halves: the ",[49,75,76],{},"website"," that readers see, and the ",[49,79,80],{},"newsroom"," that produces the content.",[83,84,86],"h3",{"id":85},"the-website","The website",[34,88,89],{},"The site itself is intentionally simple:",[91,92,93,100,106,112],"ul",{},[94,95,96,99],"li",{},[49,97,98],{},"Nuxt 4"," for the application",[94,101,102,105],{},[49,103,104],{},"Nuxt Content 3"," as a file-based content layer: every article is a Markdown file with frontmatter (title, description, tags, reading time)",[94,107,108,111],{},[49,109,110],{},"Nuxt UI 4"," for the components and Tailwind CSS theming",[94,113,114,115,119],{},"Server routes that auto-generate the ",[116,117,118],"code",{},"sitemap.xml"," and the RSS feed",[34,121,122,123,127],{},"This is the key design decision: because articles are just Markdown files in a Git repository, ",[124,125,126],"em",{},"publishing an article means committing a file",". No CMS, no database, no admin panel. An agent that can write files and push commits can run the whole site.",[34,129,130,131,136],{},"The code is open source: ",[41,132,135],{"href":133,"rel":134},"https:\u002F\u002Fgithub.com\u002Fjeffrey1420\u002Fts.news",[45],"github.com\u002Fjeffrey1420\u002Fts.news",".",[83,138,140],{"id":139},"the-newsroom-openclaw-searxng","The newsroom: OpenClaw + SearXNG",[34,142,143,144,149],{},"The editorial team is an ",[41,145,148],{"href":146,"rel":147},"https:\u002F\u002Fopenclaw.ai",[45],"OpenClaw"," agent running on my own server.",[34,151,152],{},[153,154],"img",{"alt":155,"src":156},"OpenClaw logo","https:\u002F\u002Fopenclaw.ai\u002Flogo.png",[34,158,159,160,165],{},"For research, I didn't want the agent to depend on a commercial search API. So I self-hosted a ",[41,161,164],{"href":162,"rel":163},"https:\u002F\u002Fdocs.searxng.org",[45],"SearXNG"," instance, an open source metasearch engine that aggregates results from dozens of search engines, with no tracking and no API key required.",[34,167,168],{},[153,169],{"alt":164,"src":170},"https:\u002F\u002Fdocs.searxng.org\u002F_static\u002Fsearxng-wordmark.svg",[34,172,173],{},"The agent queries this SearXNG instance every day to find what's new: framework releases, TC39 updates, interesting blog posts, ecosystem drama, and anything else a TypeScript developer would want to know about.",[57,175,177],{"id":176},"three-cron-jobs-three-roles","Three cron jobs, three roles",[34,179,180],{},"The autonomy comes from a small set of scheduled jobs I configured on the agent. Each cron gives the agent a different \"hat\":",[83,182,184],{"id":183},"_1-the-researcher","1. The researcher",[34,186,187],{},"The research cron runs on a regular schedule. Its job is to query SearXNG for tech news, follow the interesting results, and build up notes on what's worth covering. It filters out the noise and keeps a shortlist of topics with sources.",[83,189,191],{"id":190},"_2-the-writer","2. The writer",[34,193,194,195,198],{},"The writing cron takes the researcher's findings and turns them into articles. The writer has its own ",[49,196,197],{},"skill",", a document that defines exactly how an article should be written: structure, tone, frontmatter schema, how to cite sources, how long an article should be. This is what keeps the output consistent from one day to the next, even though no human reads the drafts before they go live.",[34,200,201,202,205],{},"When the article is ready, the agent writes the Markdown file into ",[116,203,204],{},"content\u002Farticles\u002F"," and pushes it. Deployment is automatic from there.",[83,207,209],{"id":208},"_3-the-reviewer-and-the-linkedin-cron","3. The reviewer (and the LinkedIn cron)",[34,211,212,213,216],{},"A third job acts as an editor-in-chief. It comes by periodically, re-reads recent articles, and checks that they conform to the writing skill. It also does something a human editor would do: it adds ",[49,214,215],{},"internal links between related articles",", so the site builds an actual content graph over time instead of a pile of isolated posts.",[34,218,219],{},"Finally, a LinkedIn cron handles distribution, sharing the published articles so the site doesn't just write into the void.",[57,221,223],{"id":222},"what-i-learned","What I learned",[34,225,226],{},"A few takeaways from running this system:",[91,228,229,235,241,247],{},[94,230,231,234],{},[49,232,233],{},"Skills are the real product."," The quality of the output is almost entirely determined by the writing skill. Vague instructions produce vague articles. The more precise the skill (structure, tone, what to avoid), the more the output looks like it was written by one consistent author.",[94,236,237,240],{},[49,238,239],{},"Separate the roles."," Having distinct research, writing and review jobs works much better than one giant \"do everything\" prompt. Each cron has a narrow job and does it well. It's basically the single-responsibility principle applied to an agent.",[94,242,243,246],{},[49,244,245],{},"Markdown + Git is the perfect interface for agents."," No API to integrate, no CMS permissions to manage. The agent works with files, and Nuxt Content turns those files into a website.",[94,248,249,252],{},[49,250,251],{},"Self-hosting the search matters."," With SearXNG, the research loop has no rate limits, no per-query costs, and no dependency on a third-party search product changing its pricing.",[57,254,256],{"id":255},"conclusion","Conclusion",[34,258,259],{},"typescript.news has been my favorite kind of side project: build the machine, then watch the machine work. The combination of an OpenClaw agent for the editorial work, SearXNG for free unrestricted research, and Nuxt Content for file-based publishing makes a fully autonomous newsroom surprisingly achievable.",[34,261,262,263,266,267,136],{},"If you want to see the output, the site is live at ",[41,264,46],{"href":43,"rel":265},[45],", and the code is on ",[41,268,270],{"href":133,"rel":269},[45],"GitHub",{"title":272,"searchDepth":273,"depth":273,"links":274},"",2,[275,276,281,286,287],{"id":59,"depth":273,"text":60},{"id":69,"depth":273,"text":70,"children":277},[278,280],{"id":85,"depth":279,"text":86},3,{"id":139,"depth":279,"text":140},{"id":176,"depth":273,"text":177,"children":282},[283,284,285],{"id":183,"depth":279,"text":184},{"id":190,"depth":279,"text":191},{"id":208,"depth":279,"text":209},{"id":222,"depth":273,"text":223},{"id":255,"depth":273,"text":256},"2026-06-10","A tech news site that researches, writes and publishes its articles on its own. Here is how I wired an OpenClaw agent, a self-hosted SearXNG instance and a few cron jobs into an autonomous newsroom built on Nuxt.","md","\u002Fimg\u002Ftypescript-news.png",{},7,true,{"title":18,"description":289},"dZP117GWo4M_gbtMc3o-e0vZxVc3XL7bTyXsRaWqBEg",[298,300],{"title":14,"path":15,"stem":16,"description":299,"children":-1},"Découvrez comment gérer facilement vos formulaires dans Nuxt grâce au module Nuxt Form. Soumissions, transformations et validation simplifiées",null,1781123525057]