post: drop standalone br lines in the series, paragraphs already have their own spacing
All checks were successful
Deploy to OVH VPS / deploy (push) Successful in 1m10s

This commit is contained in:
Lorenzo Iovino 2026-09-29 17:33:58 +02:00
parent 68f6156271
commit 8d66e8d92c
5 changed files with 17 additions and 17 deletions

View file

@ -44,7 +44,7 @@ So now a past event doesn't say "it's over, bye". It says "we'll tell you when i
## Should I put ads?
The classic question. I did the math: around 18,000 page views per month would make **20 to 50 euros**.
<br/>
Not worth it, not worth the cookie banner, not worth the image with the towns I talk to.
The real value is the data. So now I sell the event feed to portals and tourism operators, per region.

View file

@ -29,7 +29,7 @@ The good news is that vendors are few compared to towns. When you understand one
## Who owns the notice board?
One number surprised me: **67.6%** of Italian municipalities publish their notice board on a domain they don't own. It's the vendor's domain.
<br/>
The official record of what a town decided lives on a `.com` of a private company.
It works, most of the time. But if the vendor changes, closes or forgets to renew something, the history of that town moves or disappears with it.
@ -39,7 +39,7 @@ It works, most of the time. But if the vendor changes, closes or forgets to rene
And then there is my favorite discovery.
Some public bodies were closed years ago (mountain communities, old consortiums) and nobody renewed their domain. Somebody else bought it.
<br/>
One of them, still listed as "official website" in the national registry of public administrations, today is an **online pharmacy selling Viagra without prescription**. In Italian. 🙃
For a crawler this is a real problem, not only a funny story: the domain answers `200 OK`, the page loads, everything looks alive. You must look at *what* the page says, not only *if* it answers.
@ -65,7 +65,7 @@ Cheaper, faster and, surprise, easier to test.
These acts are full of personal data. Names, addresses, health situations of people who asked the town for help.
The law says they must stay public for 15 days. That doesn't mean "republish forever on a search engine".
<br/>
So nothing goes online before a privacy filter checks it. Whole categories of acts are never shown at all. Personal data is the part to handle with the most care, not the least.
## What I learned

View file

@ -13,7 +13,7 @@ Last post of the series that started with [six months reading every Italian muni
[Welance](https://welance.com) is an international collective that has been around for about 15 years. Today I'm its co-CTO.
It's a different job. Less code, more decisions.
<br/>
More "should we do this at all?" and less "how do I do this?".
## 9 nodes, 2 needed
@ -29,7 +29,7 @@ I looked at it. Some things I found:
- the apps **asked** for about 3 times the CPU they really used. Kubernetes believes what the apps ask, so the nodes looked full while they were mostly sleeping
The proposal I wrote brings it to **2 bigger nodes**, around half of the cost.
<br/>
Same philosophy of [removing code](/blog/learning-to-remove-code), just with servers. 🔥
The funny part: before removing nodes you must fix the fake CPU requests. If you don't, the pods on the new small cluster just stay "Pending", because on paper they don't fit. First you tell the truth, then you cut.
@ -39,7 +39,7 @@ The funny part: before removing nodes you must fix the fake CPU requests. If you
The other side is bringing the products inside the company story.
The albo pretorio crawler, [Piazza in Festa](https://piazzainfesta.it) and [RadarPA](https://radarpa.it) are three ways of reading the same public data. I want them to become something bigger than my side projects. That's also why RadarPA's first customer is Welance itself.
<br/>
How exactly all of this fits together is still work in progress. I'm ok to say it.
## What I learned (so far)

View file

@ -19,7 +19,7 @@ All of this is written in the acts I was already reading. So I built [RadarPA](h
## Building was the easy part
I built it fast: signals from the acts, a "heat" score for how close a tender is, a shop, payments, a nice UI.
<br/>
And nobody bought it.
Not "few people". Nobody. The site had no traffic, the UI didn't make clear what you do with it. And keeping the LLM running on every sector was costing money while the data got old.
@ -31,7 +31,7 @@ On September 3rd I stopped. Not the product, the way I was using it.
I realized I was trying to sell something to strangers without having closed a full loop even once, with one real customer.
So the first customer became... us. Welance. One sector turned on (digitalization, what we actually do). Every day I use RadarPA to find leads for the agency.
<br/>
If it works for us, then I can sell it with a straight face.
A nice side effect: with one sector instead of all of them, the queue of acts to analyze went from about 800,000 to 184,000. Less cost, fresher data.
@ -41,7 +41,7 @@ A nice side effect: with one sector instead of all of them, the queue of acts to
Using it every day, I found what I think is the real killer feature.
A signal is not useful by itself. What you want is to **follow** it: from the first act until the tender is out, with the documents in the same place and an assistant that reads them with you.
<br/>
From "there is an interesting decision in this town" to "this is the tender, this is where you download the documents, this is what's missing".
I would never have designed this from a whiteboard. It came from being annoyed as a user.

View file

@ -7,7 +7,7 @@ tags: ["rust", "side-projects", "open-data", "public-administration", "ai"]
---
On April 1st I opened a new Rust workspace.
<br/>
No, it was not a joke, even if the date was suspicious 😄
The plan was very small: learn Rust by scraping the public notice board of **one** municipality, Scicli, a town 15 minutes from my house. One town, one website, one crate, that's it.
@ -27,7 +27,7 @@ So... something went a bit out of control 😅 and there are too many things for
In Italy every public body has an *albo pretorio*, an online notice board where they must publish their acts: council decisions, spending approvals, tenders, public works, the money for the town festival... everything.
It's public by law and anyone can read it, at least in theory.
<br/>
In practice every municipality buys its website from a vendor and every vendor built its own notice board, in its own way and with its own bugs, so there is no standard and no API. If you want to know what happened in 7,896 towns you have to open 7,896 websites, one by one, every day. Good luck! 🙃
So I built albopretorio.io, a crawler that does it for you and one place where you can search everything.
@ -35,9 +35,9 @@ So I built albopretorio.io, a crawler that does it for you and one place where y
## About Rust (and about honesty)
The original idea was a strict "learning mode". I wrote a file with the rules for Claude: be my Rust tutor, explain the compiler errors and **do not write code for me**. It even says which HTTP client to use (`ureq` and NOT `reqwest`, to avoid async at the start) and that `.unwrap()` is fine "for now".
<br/>
The funny part? That file is still in the repo and it still says that we are in "Phase 1" and that "Lorenzo is writing the crawler" for Scicli 😁
<br/><br/>
The truth is that the Scicli scraper was already committed on day one and on day three there was an LLM reading the PDFs of the acts... so, let's say the rule didn't last long.
When the project became bigger than a toy I switched to the same way of working I described in the [Astro migration post](/blog/from-angular-to-astro): I decide what to build, the agent writes a lot of it, I review, I test and I fix what it doesn't see.
@ -49,15 +49,15 @@ What I would say to anyone doing the same is that the agent is great at adding t
## What I learned (so far)
Starting with one town was the right call, Scicli was small enough to understand every page of it. The second town taught me more than the first, because it looked the same and it wasn't.
<br/><br/>
About numbers... it happened again while writing this post! The first draft said 1.7 million acts, taken from notes of July without checking, today they are 5.1 million. Same story with visitors, empty municipalities and costs: every number I shared too fast was wrong.
<br/><br/>
And the infra is almost boring: some Rust binaries, one Postgres and a couple of machines on OVH, nothing fancy. It holds 5 million acts anyway 🤓
## Closing
Six months ago I wanted to learn a programming language.
<br/>
Now I know which vendor runs the notice board of a town of 300 people in the Alps, how many *sagre* there are in Puglia in August and which public domains are selling pills 💊
Not what I planned, but I'm happy it went this way.