Posts

AI Virtual Team: Five Subagents Built My Growth Plan in Under 90 Minutes

Image
I built MathQuizPrep as a free study tool for my daughter’s math competition prep. Once it existed, one question came up naturally: could this app also earn a little money, without being unfair to the audience, since the users are 10-15 years old? I did not want to research marketing, EU law about minors, SEO, and UI design all by myself. So instead of doing that research alone, I defined a small team of AI specialists and asked them to do it for me, with one of them working as a manager for the other four. Building the team: by prompting, not by writing the files myself Each “team member” is a Markdown file inside .claude/agents/ — a persona with a name, a short job description with a fixed list of tools it is allowed to use. Each agent also got information about which model it should use — the more complex ones (like the manager) got more capable models. I did not write any of these files by hand. I described the team in plain English, and Claude wrote and improved them over a shor...

From PDF Archive to Study App: An LLM-Driven Data Pipeline

Image
  A lot of real-world problems boil down to the same shape: some scattered, unstructured source material exists (PDFs, archives, scanned documents), and what you actually need is a structured, usable product on the other end — categorized, searchable, and packaged for a specific audience. That transformation used to mean writing a pipeline by hand: a parser here, a classification script there, a templating layer to render the final output. With an LLM as a development partner, the same pipeline can be built through conversation — research, extraction, categorization, content generation and packaging, each step still a real, inspectable script or file, but designed and iterated on in natural language rather than written line by line. The part that changed the most for me wasn’t the coding — it was the analysis phase. Reading five years of exam PDFs, working out the syllabus scope, and deciding how to categorize dozens of tasks by topic and difficulty is the kind of manual review tha...

Self-Healing Scrapers: Let One Agent Write Another Agent's Instructions

Image
A scraper usually breaks the moment a website redesigns its layout. This one doesn't — it researches the page itself, and re-researches it when something changes  This article walks through building exactly that, with Claude Code. The business need Let's imagine a situation where parents have three kids in three different schools. None of the schools agree on how to publish a timetable. The formats are different: one puts up clean, per-class HTML pages. Another exports its entire grade level as a single PDF. What the parents want is one combined, printable schedule covering all three kids. Writing an HTML scraper for the first school and a PDF scraper for the second is an afternoon's work. What is more, the timetable structures may change in time. The process The solution I landed on with Claude Code was a self-correcting process based on LLM agents. There are two agents involved. The first, a research agent , studies a school's site and writes plain-English ins...

ASP.NET 5 Beta 8

It's been a while since a wrote something on a blog. Today I would like to share with you a good starting point for ASP.NET 5 and switching to beta 8. Here is a nice article  Upgrading from ASP.NET 5 Beta 7 to Beta 8 And nice tutorial made by the same author  Building a Web App with ASP.NET 5, MVC 6, EF7 and AngularJS

TCExecutor on NuGet

Image
TCExecutor is now awailable on NuGet.org Project page:  TCExecutor From Visual Studo:

Thread safe rotate index.

Sometimes you may need a rotation thread safe index. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections.Concurrent; using System.Threading; namespace ConsoleApplication12 { class Program { static void Main(string[] args) { Console.WriteLine("Init value = Int32.MaxValue - 10"); RotatorIndex.Init = Int32.MaxValue - 10; Thread thread1 = new Thread(new ThreadStart(ThreadMethod)); Thread thread2 = new Thread(new ThreadStart(ThreadMethod)); thread1.Start(); thread2.Start(); thread1.Join(); thread2.Join(); Console.WriteLine("Init value = - 10"); RotatorIndex.Init = - 10; thread1 = new Thread(new ThreadStart(ThreadMethod)); thread2 = new Thread(new ThreadStart(ThreadMethod)); thread1.Start(); thread2.Start(); ...

Localized type conversion

If you need a DateTime or double convertion depending on system localization here are some examples: Date to string DateTime dt = new DateTime(2012, 06, 13, 17, 50, 00); string date_US = dt.ToString(new CultureInfo("en-US").DateTimeFormat); string date_GB = dt.ToString(new CultureInfo("en-GB").DateTimeFormat); string date_PL = dt.ToString(new CultureInfo("pl-PL").DateTimeFormat); string date_RU = dt.ToString(new CultureInfo("ru-RU").DateTimeFormat); Console.WriteLine("date_US = {0}", date_US); Console.WriteLine("date_GB = {0}", date_GB); Console.WriteLine("date_PL = {0}", date_PL); Console.WriteLine("date_RU = {0}", date_RU); /* date_US = 6/13/2012 5:50:00 PM date_GB = 13/06/2012 17:50:00 date_PL = 2012-06-13 17:50:00 date_RU = 13.06.2012 17:50:00 */ String to date date_US = "6/13/2012 5:50:00 PM"; date_GB = "13/06/2012 17:50:00"; date_PL = "2012-06-13 17:50:00"; d...