<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kalle Tolonen</title>
    <description>The latest articles on DEV Community by Kalle Tolonen (@kalletolonen).</description>
    <link>https://dev.to/kalletolonen</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4118528%2F835a0591-0db8-4b74-b02b-c78b31812d1a.jpg</url>
      <title>DEV Community: Kalle Tolonen</title>
      <link>https://dev.to/kalletolonen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kalletolonen"/>
    <language>en</language>
    <item>
      <title>Kids these days - where do you take them?</title>
      <dc:creator>Kalle Tolonen</dc:creator>
      <pubDate>Thu, 01 Oct 2026 06:11:03 +0000</pubDate>
      <link>https://dev.to/kalletolonen/kids-these-days-where-do-you-take-them-h4e</link>
      <guid>https://dev.to/kalletolonen/kids-these-days-where-do-you-take-them-h4e</guid>
      <description>&lt;p&gt;My son is about to turn into a toddler. One of the questions I have pain answering is "what to do this weekend or today to keep him entertained?". The information exists and you could just ask AI like a sane person. So naturally I built a serverless side project.&lt;/p&gt;

&lt;p&gt;It has a selected list of playgrounds nationally and LLM-curated events in the 15 biggest cities, on a map with travel times shown as an isochrone map per mode of transport. So, we're basicly answering the question "What current or future fun thing can I reach with my kid in 5/15/30 minutes by walking/biking/driving". &lt;/p&gt;

&lt;p&gt;I do realize that there's serious overlap with &lt;a href="https://www.leikkipuistot.com" rel="noopener noreferrer"&gt;Leikkipuistot.com&lt;/a&gt;, but we throw isochrones and events on top, and we're not using cookies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmcdk4vn1drrrzv6279m4.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmcdk4vn1drrrzv6279m4.webp" alt="This week in Turku within 15 minutes of driving" width="535" height="1080"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;This week in Turku within 15 minutes of driving&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Try it out at: &lt;a href="https://www.muksukartta.com" rel="noopener noreferrer"&gt;Muksukartta&lt;/a&gt; (iPhone location perms hss been buggy, and hard to fix without an actual iPhone, so sorry if it still has problems!)&lt;/p&gt;

&lt;h3&gt;
  
  
  But why?
&lt;/h3&gt;

&lt;p&gt;A simple AI query does kinda do this kind of thing, but AI is still not great at showing things on a map. And sometimes I just prefer to do my own thinking like a caveman. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Architectural and "Business" Decisions
&lt;/h3&gt;

&lt;p&gt;Going with my &lt;a href="https://www.kalletolonen.com/article/app-factory" rel="noopener noreferrer"&gt;app-forge&lt;/a&gt;-solution, as that's scalable and serverless if there's any real demand. Isochrone is the bottleneck, as they have the lowest quota, but I'll bring it to Cloudflare too, if we ever run out. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Outcome
&lt;/h3&gt;

&lt;p&gt;My time spent looking for things to do with my toddler goes to near zero instead of x minutes a week. Also answers quickly what nice kid things I can reach within 15 minutes with diff modes of transport. I have actually used the app, so that is a win.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data harvesting plan
&lt;/h3&gt;

&lt;p&gt;GIS-data is scattered, so I sent out my bot team to harvest data from open endpoints, and also mark it as unavailable to a csv-file, so we can keep track of our integrations and have a sane ETL (Extract, Transform &amp;amp; Load) process. I needed to do a bit more prompting to get all (we have a curated set online) the playground locations in Finland from open sources and events were harder. Event data is really messy, so I use a classifier + an llm batch job to make it less likely to offer squirrel striptease for the users.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foscldaacdx37bu9y3vtz.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foscldaacdx37bu9y3vtz.webp" alt="ETL-process" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;ETL-process&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Iteration steps
&lt;/h3&gt;

&lt;p&gt;First I made the dev/prod env via my app-forge, and added quality gates for pushing. Then I made a ROADMAP.md with the help of a bot research group that combined my personal weekend events harvesting prompt for kids to GIS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3kivxkt77tpgywykxusp.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3kivxkt77tpgywykxusp.webp" alt="First production deployment had just the Turku area kindergartens and playgrounds as GIS-assets" width="800" height="562"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;First production deployment had just the Turku area kindergartens and playgrounds as GIS-assets&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Next step was making the map mobile first, since that's what most parents are using on the go anyway.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fazhssrdxan56h7t13a6p.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fazhssrdxan56h7t13a6p.webp" alt="Added GPS-coords from current location so that you can see with one tap where's the nearest POI" width="531" height="1080"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Added GPS-coords from current location so that you can see with one tap where's the nearest POI&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faees8ay5u0zxcw37fqm9.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faees8ay5u0zxcw37fqm9.webp" alt="Isochrone map bounding box as provided by Openrouteservice" width="568" height="1080"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Isochrone map bounding box as provided by Openrouteservice&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After ingesting a lot of events I kinda overdid the automated QA with user stories, or so I thought. Later when I looked into it, that wasn't the culprit, but just insane spamming of requests with buggy map rendering cycles. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foeijzvzlin4d9l07o48u.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foeijzvzlin4d9l07o48u.webp" alt="So, that need some dialing down to be reasonable on any scale. Cloudflare is really generous on free tier, but this is too much." width="766" height="382"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;So, that need some dialing down to be reasonable on any scale. Cloudflare is really generous on free tier, but this is too much.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I automated the integration of new, validated, tos-compliant api's for BIG-15 cities to commence when the Cloudflare limits would lift.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agentic project management
&lt;/h3&gt;

&lt;p&gt;Since this has proven to be a project of larger than expected size (like every project), I made some light project management tools. Just a basic csv that's easy on an LLM's context window and token use, so we see what's the current status of integrations and we can keep track of what's done.&lt;/p&gt;

&lt;p&gt;Later on I used that as a basis for an admin view.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flnf4707uwjcx2v3wfclw.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flnf4707uwjcx2v3wfclw.webp" alt="Project management in plaintext" width="800" height="296"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Project management in plaintext&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Midway trough the project I had switched tools multiple times, since that's the real point of all this - evolving ones way of working and producing solutions at a faster pace. Current setup is running Antigravity CLI (free for students!) &amp;amp; Cursor CLI harnesses controlled by herdr on a dedicated minipc that I control over ssh from a vpn. On top of that I use Cursor in cloud on desktop and mobile, so that there's a device available for commencing/iterating on stuff when I have the time required to make decisions that shape the end product. &lt;/p&gt;

&lt;h3&gt;
  
  
  Future feats
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Adding realtime weather forecasts, so that it's good for Finland's rainy season (365 days per year).&lt;/li&gt;
&lt;li&gt;Events for smaller cities&lt;/li&gt;
&lt;li&gt;hiking routes&lt;/li&gt;
&lt;li&gt;other kids POI's&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Lessons learned
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need a dev server when you launch, before that you can make do with a dev-is-prod approach&lt;/li&gt;
&lt;li&gt;CI and 1 server from day 1 is a must for speed&lt;/li&gt;
&lt;li&gt;Cloudflare is super nice&lt;/li&gt;
&lt;li&gt;UX needs a lot of steering still (a thing I will learn by doing more of it)&lt;/li&gt;
&lt;li&gt;You can dev real products while pushing a sleepung baby on a stroller in the woods easily&lt;/li&gt;
&lt;li&gt;Github Mobile is nice for diffs and Actions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cost
&lt;/h3&gt;

&lt;p&gt;About 30€ in tokens and 10€ for domain.&lt;/p&gt;

</description>
      <category>gis</category>
      <category>kids</category>
      <category>projectmanagement</category>
    </item>
    <item>
      <title>Taste is not the err in human input</title>
      <dc:creator>Kalle Tolonen</dc:creator>
      <pubDate>Tue, 22 Sep 2026 06:02:05 +0000</pubDate>
      <link>https://dev.to/kalletolonen/taste-is-not-the-err-in-human-input-1m3j</link>
      <guid>https://dev.to/kalletolonen/taste-is-not-the-err-in-human-input-1m3j</guid>
      <description>&lt;p&gt;Agents and swarms of agents are quite nifty nowdays. My current setup is simple. It runs a coordinator that I communicate with, and that delegates work to a others. The flow is generally: "Hey, I need this feature from roadmap. Ask questions if needed, if I don't answer in due time, make the best call with our north star." -&amp;gt; Coordinator makes a plan for dev/qa -&amp;gt; dev devs -&amp;gt; pushes to branch when tests are green -&amp;gt; qa verifies results on dev server -&amp;gt; loopy-loop until obvious bugs are fixed. Review bot makes review for PR. Later on I test the feat to see if it's anything like I wanted and correct, then merge when good and pool to releases that are gated. Currently working on trying to get the agents to know what is good in my opinion.&lt;/p&gt;

&lt;p&gt;I think the current killer combo is the ability to be creative and have some propriatory data, as that's something that can't be accessed by competition.  The cost of iteration is low. So low that I see no point in using a wireframe demo for the ui, as simple paper sketches can be read by AI to close enough for live iteration for actually working software. And most rigid general UI's are going away too in favor of agents generating a personalized UX on the fly, so this is just temporary. Omarchy is the beacon for this, a machine that is ever evolving to your needs.&lt;/p&gt;

&lt;p&gt;The stuff that stays valuable is hard to automate - having taste, accountability, human relationships and even defining what is good. No one knows what the future will be, but it will be awesome.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvbnz0x8pqwkyeg1yvlao.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvbnz0x8pqwkyeg1yvlao.webp" alt="Futurama" width="727" height="1080"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Futurama&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The human input
&lt;/h3&gt;

&lt;p&gt;We can now think big. In early 2026 I was chatting at work that a greenfield project that needed 10 devs, would be 1 dev by year end. It's not year end and I'm pretty sure I could handle the dev load of similar proportions, given enough access to tokens, naturally. &lt;/p&gt;

&lt;p&gt;Software is being eaten up by inference. Why have rigid structures, if they can bend instead? We need some structure for serving and transforming data, combining private and public data for now, but once inference becomes cheap enough, I think that moat of rigidness will succumb too. I even have positive experiences in data-analysis that's fast to do with agents, so on the fly generated dynamic dashboards only need a good research question. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftmhlji1jgkux1s7c3ggg.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftmhlji1jgkux1s7c3ggg.webp" alt="Finnish elderly home care business potential" width="800" height="440"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Finnish elderly home care business potential&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This particular case would also benefit from gis-analysis, as the distances in rural Finland are larger, so the costs for service providers are also bigger. So one more round of polish needed to gain valuable insight on where the potential customers are.&lt;/p&gt;

&lt;p&gt;There is still quite a lot of taste needed for course correction and agile is the right way to go, and we're in the endless march of 9's for producing quality sw. I was perfectly happy with earlier models, that is something you need to remember - you will always lust for more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Process thoughts
&lt;/h3&gt;

&lt;p&gt;We still need a good hunch on what we're aiming for in the big picture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how many users and who they are&lt;/li&gt;
&lt;li&gt;what security measures (derived from above points - internal sw used by 3 people with only GET-api's is different than a public bank)&lt;/li&gt;
&lt;li&gt;what tools are allowed&lt;/li&gt;
&lt;li&gt;general design vibe&lt;/li&gt;
&lt;li&gt;what platforms (mobile/pwa, native apps, web, desktop ui/cli)&lt;/li&gt;
&lt;li&gt;now we can decide tech platforms (security and use case dictate this)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then we build the env's needed, those are dictated by the needs of the project. Less is more, and we should opt for cloud computing in every step of the way to keep cadence up, since the days of "my env is broken" are really fucking expensive, when you're doing work that used to take 10 people a year ago, even as the cost curve is coming down. Comp set isn't sitting still worrying about your docker hell. On the other hand - agents are really good at configuring too now days - just try &lt;a href="https://omarchy.org/" rel="noopener noreferrer"&gt;Omarchy&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills needed for sw dev in 2026
&lt;/h3&gt;

&lt;p&gt;Not in any particular order.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;People skills&lt;/li&gt;
&lt;li&gt;Project management skills, steering with right-sized inputs (not token-wise, but concept-wise)&lt;/li&gt;
&lt;li&gt;a level of tech understanding, so that you can steer a team/horde of ultra capable robots (or better, know how to outsource that)&lt;/li&gt;
&lt;li&gt;Creativity&lt;/li&gt;
&lt;li&gt;Having a hunch of what the agents can and can't do (graphics still mostly suck)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Details matter, but in a different way than before
&lt;/h3&gt;

&lt;p&gt;There used to be a day and age, when writing code that was eloquant, efficient and beautiful was really meaningful. I've written some, but honestly most of it was not that spectacular. And that's true for the most of the code I've reviewed. People who have worked at legacy projects know this.&lt;/p&gt;

&lt;p&gt;You should get some people skills, as everything done by you, can be done by a computer, and if it can be done by a computer, it can be automated. Only enough chaos and noise brings (digital) job safety. But you can't outsource the taste still. What we are building and why.&lt;/p&gt;

&lt;p&gt;it's increasingly clear that you need to keep running at an accelerating phase and find your place where you can produce some value that someone is willing to pay for to earn you keep. That has been the story of humanity, and the pace is accelerating. Last year I thought that AI is pretty good and this year the harnesses and running the agents on their computer have made the switch to amazing for me.&lt;/p&gt;

</description>
      <category>human</category>
      <category>agents</category>
      <category>process</category>
      <category>agile</category>
    </item>
    <item>
      <title>Building an MCP bridge</title>
      <dc:creator>Kalle Tolonen</dc:creator>
      <pubDate>Wed, 16 Sep 2026 06:42:03 +0000</pubDate>
      <link>https://dev.to/kalletolonen/building-an-mcp-bridge-52l6</link>
      <guid>https://dev.to/kalletolonen/building-an-mcp-bridge-52l6</guid>
      <description>&lt;p&gt;MCP was not clicking for me, so the best way to learn was to build a thing with it. I have a plethora of notes everywhere and now I have a machine that drops rough ideas into my publishing backlog. &lt;/p&gt;

&lt;p&gt;MCP is basicly an api for AI that tells agents how it's supposed to be used.&lt;/p&gt;

&lt;h3&gt;
  
  
  What agents do
&lt;/h3&gt;

&lt;p&gt;Assistants can fill out ideas for backlog. Humans should still do the writing that isn't, for example, tech specs.&lt;/p&gt;

&lt;h3&gt;
  
  
  The problem
&lt;/h3&gt;

&lt;p&gt;I need tech notes that are accessible for the tools that do the implementation. Publishing is a bonus that comes with minimal extra effort. I can go for a walk and talk with an AI and then ask it to post the summarized convo to my ideas. &lt;/p&gt;

&lt;h3&gt;
  
  
  10k view
&lt;/h3&gt;

&lt;p&gt;Two routes to idea backlog:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lane A:&lt;/strong&gt; assistants → suggest and organize → site MCP (&lt;code&gt;ktcom-ideas&lt;/code&gt;) → backlog&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lane B:&lt;/strong&gt; author → review / edit / promote → backlog&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Idea backlog&lt;/strong&gt; → promote to draft → write in markdownx → publish (human)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What the MCP actually exposes
&lt;/h3&gt;

&lt;p&gt;The MCP-endpoint is auth protected. Tools under the hood:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;create_article_idea&lt;/code&gt; / &lt;code&gt;update_article_idea&lt;/code&gt; / &lt;code&gt;list_article_ideas&lt;/code&gt; — backlog capture (title, notes→lead, optional text→body, tags, priority)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;promote_article_idea&lt;/code&gt; — turn an idea into a dashboard draft (idempotent if already promoted)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;list_draft_articles&lt;/code&gt; / &lt;code&gt;get_draft_article&lt;/code&gt; / &lt;code&gt;update_draft_article&lt;/code&gt; — read and patch drafts and scheduled posts (status &lt;code&gt;draft&lt;/code&gt; | &lt;code&gt;scheduled&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_article_authoring_guidelines&lt;/code&gt; — field limits, promote mapping, Markdown conventions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  who does what
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Human&lt;/strong&gt; — review, edit, promote, write, publish&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ideator bot&lt;/strong&gt; — problem, shape, tradeoffs, outline, patch small corrections&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Handoff rules
&lt;/h3&gt;

&lt;p&gt;Rough idea → &lt;code&gt;create_article_idea&lt;/code&gt; (or update) → optional &lt;code&gt;promote_article_idea&lt;/code&gt; → human writes and edits in the dashboard. &lt;/p&gt;

&lt;h3&gt;
  
  
  Is it in use?
&lt;/h3&gt;

&lt;p&gt;Real examples already sitting as published items or drafts on the site:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Postgres + files → Cloudflare R2 backup you can restore on free tier&lt;/li&gt;
&lt;li&gt;Garmin FIT multisport-trailer vs solo classifier&lt;/li&gt;
&lt;li&gt;App factory scaffolding on Cloudflare free tier&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tradeoffs
&lt;/h3&gt;

&lt;p&gt;More moving parts (assistants, MCP, backlog, dashboard) vs a simple todo. Probably useful to only me, since this is an accentric niche blog.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>agents</category>
      <category>workflow</category>
    </item>
    <item>
      <title>I didn't know what to build, so I made scaffolding</title>
      <dc:creator>Kalle Tolonen</dc:creator>
      <pubDate>Tue, 15 Sep 2026 09:15:03 +0000</pubDate>
      <link>https://dev.to/kalletolonen/i-didnt-know-what-to-build-so-i-made-scaffolding-4jd5</link>
      <guid>https://dev.to/kalletolonen/i-didnt-know-what-to-build-so-i-made-scaffolding-4jd5</guid>
      <description>&lt;p&gt;&lt;a href="/media/markdownx/c6865bec-057b-481b-8798-d3450b1cc558.webp" class="article-body-image-wrapper"&gt;&lt;img src="/media/markdownx/c6865bec-057b-481b-8798-d3450b1cc558.webp"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building an app factory, that utilizes Cloudflare's free tier resources to have quick and dirty apps to demo.&lt;/p&gt;

&lt;h3&gt;
  
  
  What (and mostly, why)?
&lt;/h3&gt;

&lt;p&gt;I built a system, that lets you iterate on ideas on a demo server. It comes with a stock CRUD-flow, since that's enough of a real app to demo an idea without standing up a VPS or expensive infra. It creates records, reads records, updates records and deletes them. We also did an auth-system, so that you'll be able to just use plain email-login and quickly demo your stuff to whoever you'd like to. You could ofc take this and add a password or invites to keep things under the blankets. &lt;/p&gt;

&lt;p&gt;&lt;a href="/media/markdownx/5433c4b7-e7de-4140-842a-b9fc91130306.webp" class="article-body-image-wrapper"&gt;&lt;img src="/media/markdownx/5433c4b7-e7de-4140-842a-b9fc91130306.webp"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="Records-list"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building a crud-factory feels a bit deja-vu, since when I started my developer journey, I did a bunch of CRUD-apps in Django. One of the project back then was to actually automatize this kind of thing for scaffolding a crud-app with Salt, so that I had a basic app running with 1 command. Bringing it online is kinda the same deal. &lt;/p&gt;

&lt;p&gt;&lt;a href="/media/markdownx/70bc997a-34ee-4e10-9e4c-dc79af85568a.webp" class="article-body-image-wrapper"&gt;&lt;img src="/media/markdownx/70bc997a-34ee-4e10-9e4c-dc79af85568a.webp"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="Create/Update-view"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;&lt;a href="/media/markdownx/c3d7d3ad-9397-4fb8-b403-0341162d27d4.webp" class="article-body-image-wrapper"&gt;&lt;img src="/media/markdownx/c3d7d3ad-9397-4fb8-b403-0341162d27d4.webp"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="The basic idea"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Next
&lt;/h3&gt;

&lt;p&gt;So, now I can demo things without hosting them on a lecagy system but just have a low maintenance and low cost throwaway system for demoing. The hard part of what should you actually care enough about to build it is still open.&lt;/p&gt;

</description>
      <category>crud</category>
      <category>factory</category>
      <category>cloudflare</category>
    </item>
    <item>
      <title>Agentic hangover</title>
      <dc:creator>Kalle Tolonen</dc:creator>
      <pubDate>Fri, 11 Sep 2026 05:48:03 +0000</pubDate>
      <link>https://dev.to/kalletolonen/agentic-hangover-ppa</link>
      <guid>https://dev.to/kalletolonen/agentic-hangover-ppa</guid>
      <description>&lt;p&gt;When you can do whatever you want to do, what do you want to do? I'm personally not so sure, since most of the problems in my world have been solved. On the other hand, you don't know what you don't know.&lt;/p&gt;

&lt;h3&gt;
  
  
  Anything could be done - but what should?
&lt;/h3&gt;

&lt;p&gt;It has dawned on me earlier too - I'm just boring. I do realize what the gist of a great idea is, when I see it. But rarely come up with anything that elequant myself. I even tried making a network of bots to ideate with, and still we're off by a country mile on anything that's novel. &lt;/p&gt;

&lt;h3&gt;
  
  
  Creativity is still hard
&lt;/h3&gt;

&lt;p&gt;The problem of implementation has largely been solved in the IT realm and cost curve is coming down hard. I bough 60 dollars worth of AI credits and I feel like I can do anything. But figuring out what exactly to do is the hard part now. I went hard into the busywork kinda direction, and have implemented an AI bot swarm that tries to do that for me, but haven't been successful.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>existentialdread</category>
    </item>
    <item>
      <title>FFMPEG to the rescue, again</title>
      <dc:creator>Kalle Tolonen</dc:creator>
      <pubDate>Thu, 10 Sep 2026 05:03:35 +0000</pubDate>
      <link>https://dev.to/kalletolonen/ffmpeg-to-the-rescue-again-641</link>
      <guid>https://dev.to/kalletolonen/ffmpeg-to-the-rescue-again-641</guid>
      <description>&lt;p&gt;LinkedIn is going to be one of my direct integrations, if it's possible, so that I can write an article once and publish it on my own platform and do external distribution. Who has a non-svg logo available in 2026? I don't so I need to fix it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better and smarter ways exist, but we're Linux-neckbeards
&lt;/h3&gt;

&lt;p&gt;It would be easy to use some ad-ridden page to convert my svg-logo to a png for LinkedIn's consumption, but no, we're not doing that. We're doing it the only way we should, which is via cli.&lt;/p&gt;

&lt;p&gt;1st we encountered an esoteric err:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; logo.svg &lt;span class="nt"&gt;-width&lt;/span&gt; 1920 logo.png
ffmpeg version 8.1 Copyright &lt;span class="o"&gt;(&lt;/span&gt;c&lt;span class="o"&gt;)&lt;/span&gt; 2000-2026 the FFmpeg developers
  built with Apple clang version 17.0.0 &lt;span class="o"&gt;(&lt;/span&gt;clang-1700.6.4.2&lt;span class="o"&gt;)&lt;/span&gt;
  configuration: &lt;span class="nt"&gt;--prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/opt/homebrew/Cellar/ffmpeg/8.1_1 &lt;span class="nt"&gt;--enable-shared&lt;/span&gt; &lt;span class="nt"&gt;--enable-pthreads&lt;/span&gt; &lt;span class="nt"&gt;--enable-version3&lt;/span&gt; &lt;span class="nt"&gt;--cc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;clang &lt;span class="nt"&gt;--host-cflags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;--host-ldflags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;--enable-ffplay&lt;/span&gt; &lt;span class="nt"&gt;--enable-gpl&lt;/span&gt; &lt;span class="nt"&gt;--enable-libsvtav1&lt;/span&gt; &lt;span class="nt"&gt;--enable-libopus&lt;/span&gt; &lt;span class="nt"&gt;--enable-libx264&lt;/span&gt; &lt;span class="nt"&gt;--enable-libmp3lame&lt;/span&gt; &lt;span class="nt"&gt;--enable-libdav1d&lt;/span&gt; &lt;span class="nt"&gt;--enable-libvmaf&lt;/span&gt; &lt;span class="nt"&gt;--enable-libvpx&lt;/span&gt; &lt;span class="nt"&gt;--enable-libx265&lt;/span&gt; &lt;span class="nt"&gt;--enable-openssl&lt;/span&gt; &lt;span class="nt"&gt;--enable-videotoolbox&lt;/span&gt; &lt;span class="nt"&gt;--enable-audiotoolbox&lt;/span&gt; &lt;span class="nt"&gt;--enable-neon&lt;/span&gt;
  libavutil      60. 26.100 / 60. 26.100
  libavcodec     62. 28.100 / 62. 28.100
  libavformat    62. 12.100 / 62. 12.100
  libavdevice    62.  3.100 / 62.  3.100
  libavfilter    11. 14.100 / 11. 14.100
  libswscale      9.  5.100 /  9.  5.100
  libswresample   6.  3.100 /  6.  3.100
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="c"&gt;#0/svg_pipe @ 0x825014000] Could not find codec parameters for stream 0 (Video: svg, none): unspecified size&lt;/span&gt;
Consider increasing the value &lt;span class="k"&gt;for &lt;/span&gt;the &lt;span class="s1"&gt;'analyzeduration'&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt; and &lt;span class="s1"&gt;'probesize'&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;5000000&lt;span class="o"&gt;)&lt;/span&gt; options
Input &lt;span class="c"&gt;#0, svg_pipe, from 'logo.svg':&lt;/span&gt;
  Duration: N/A, bitrate: N/A
  Stream &lt;span class="c"&gt;#0:0: Video: svg, none, 25 fps, 25 tbr, 25 tbn&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;vist#0:0/svg @ 0x824c1c180] Decoding requested, but no decoder found &lt;span class="k"&gt;for&lt;/span&gt;: svg
Error opening output file logo.png.
Error opening output files: Invalid argument
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So that told us that we're missing a decoder, which means we'll need to install said codec.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew uninstall ffmpeg
brew tap homebrew-ffmpeg/ffmpeg
brew &lt;span class="nb"&gt;install &lt;/span&gt;homebrew-ffmpeg/ffmpeg/ffmpeg &lt;span class="nt"&gt;--with-librsvg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running brew made it feel like it's the 1990's all over again with a package manager that's moar sluggish than Linux running on a 386.&lt;/p&gt;

&lt;p&gt;Ffmpeg did do this chore like a boss, and we we're done in 30 minutes for a 5 second job.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; logo.svg &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"scale=1920:-1"&lt;/span&gt; logo.png
ffmpeg version 9.0.1 Copyright &lt;span class="o"&gt;(&lt;/span&gt;c&lt;span class="o"&gt;)&lt;/span&gt; 2000-2026 the FFmpeg developers
  built with Apple clang version 21.0.0 &lt;span class="o"&gt;(&lt;/span&gt;clang-2100.1.1.101&lt;span class="o"&gt;)&lt;/span&gt;
  configuration: &lt;span class="nt"&gt;--prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/opt/homebrew/Cellar/ffmpeg/9.0.1 &lt;span class="nt"&gt;--enable-shared&lt;/span&gt; &lt;span class="nt"&gt;--cc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;clang &lt;span class="nt"&gt;--host-cflags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;--host-ldflags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;--enable-gpl&lt;/span&gt; &lt;span class="nt"&gt;--enable-libaom&lt;/span&gt; &lt;span class="nt"&gt;--enable-libdav1d&lt;/span&gt; &lt;span class="nt"&gt;--enable-libharfbuzz&lt;/span&gt; &lt;span class="nt"&gt;--enable-libmp3lame&lt;/span&gt; &lt;span class="nt"&gt;--enable-libopus&lt;/span&gt; &lt;span class="nt"&gt;--enable-libsnappy&lt;/span&gt; &lt;span class="nt"&gt;--enable-libsvtav1&lt;/span&gt; &lt;span class="nt"&gt;--enable-libtheora&lt;/span&gt; &lt;span class="nt"&gt;--enable-libvorbis&lt;/span&gt; &lt;span class="nt"&gt;--enable-libvpx&lt;/span&gt; &lt;span class="nt"&gt;--enable-libx264&lt;/span&gt; &lt;span class="nt"&gt;--enable-libx265&lt;/span&gt; &lt;span class="nt"&gt;--enable-libfontconfig&lt;/span&gt; &lt;span class="nt"&gt;--enable-libfreetype&lt;/span&gt; &lt;span class="nt"&gt;--enable-frei0r&lt;/span&gt; &lt;span class="nt"&gt;--enable-libass&lt;/span&gt; &lt;span class="nt"&gt;--enable-demuxer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dash &lt;span class="nt"&gt;--enable-neon&lt;/span&gt; &lt;span class="nt"&gt;--enable-opencl&lt;/span&gt; &lt;span class="nt"&gt;--enable-audiotoolbox&lt;/span&gt; &lt;span class="nt"&gt;--enable-videotoolbox&lt;/span&gt; &lt;span class="nt"&gt;--disable-htmlpages&lt;/span&gt; &lt;span class="nt"&gt;--enable-librsvg&lt;/span&gt;
  libavutil      61.  1.101 / 61.  1.101
  libavcodec     63.  1.101 / 63.  1.101
  libavformat    63.  1.101 / 63.  1.101
  libavdevice    63.  1.101 / 63.  1.101
  libavfilter    12.  1.101 / 12.  1.101
  libswscale     10.  1.101 / 10.  1.101
  libswresample   7.  1.101 /  7.  1.101
Input &lt;span class="c"&gt;#0, svg_pipe, from 'logo.svg':&lt;/span&gt;
  Duration: N/A, bitrate: N/A
  Stream &lt;span class="c"&gt;#0:0: Video: svg (librsvg), bgra, 100x100, 25 fps, 25 tbr, 25 tbn&lt;/span&gt;
Stream mapping:
  Stream &lt;span class="c"&gt;#0:0 -&amp;gt; #0:0 (svg (librsvg) -&amp;gt; png (native))&lt;/span&gt;
Press &lt;span class="o"&gt;[&lt;/span&gt;q] to stop, &lt;span class="o"&gt;[&lt;/span&gt;?] &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;help
&lt;/span&gt;Output &lt;span class="c"&gt;#0, image2, to 'logo.png':&lt;/span&gt;
  Metadata:
    encoder         : Lavf63.1.101
  Stream &lt;span class="c"&gt;#0:0: Video: png, rgba(pc, gbr/unknown/unknown, progressive), 1920x1920, q=2-31, 200 kb/s, 25 fps, 25 tbn&lt;/span&gt;
    Metadata:
      encoder         : Lavc63.1.101 png
&lt;span class="o"&gt;[&lt;/span&gt;image2 @ 0x9fe804280] The specified filename &lt;span class="s1"&gt;'logo.png'&lt;/span&gt; does not contain an image sequence pattern or a pattern is invalid.
&lt;span class="o"&gt;[&lt;/span&gt;image2 @ 0x9fe804280] Use a pattern such as %03d &lt;span class="k"&gt;for &lt;/span&gt;an image sequence or use the &lt;span class="nt"&gt;-update&lt;/span&gt; option &lt;span class="o"&gt;(&lt;/span&gt;with &lt;span class="nt"&gt;-frames&lt;/span&gt;:v 1 &lt;span class="k"&gt;if &lt;/span&gt;needed&lt;span class="o"&gt;)&lt;/span&gt; to write a single image.
&lt;span class="o"&gt;[&lt;/span&gt;out#0/image2 @ 0x9fec0c780] video:140KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown
&lt;span class="nv"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;    1 &lt;span class="nv"&gt;fps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.0 &lt;span class="nv"&gt;q&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;-0&lt;/span&gt;.0 &lt;span class="nv"&gt;Lsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;N/A &lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;00:00:00.04 &lt;span class="nv"&gt;bitrate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;N/A &lt;span class="nv"&gt;speed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.478x &lt;span class="nv"&gt;elapsed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0:00:00.08    
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>cli</category>
      <category>ffmpeg</category>
      <category>svg</category>
    </item>
  </channel>
</rss>
