Milanese parents plan a summer across municipal summer centres, sports campuses, neighbourhood community centres and private providers. That supply is published as a PDF once a year, as tables on four different sites, and as Instagram posts — with registration windows that open and close inside three weeks. Finding one activity is a search problem. Covering seven weeks for two children inside a budget is not.
This service does both: one catalogue that stays true because every record carries where it came from and when it was last checked, and a planner that composes the whole summer under real constraints — budget, distance, working hours, two children who cannot be in the same place — and says plainly which weeks it cannot cover.
Seven weeks, two children, fourteen child-weeks to cover, and one child the municipal centre cannot take. Every screen of the journey in order, with what the parent does at each step and what the product does back.
Twenty screens wired together with real Milan data: search and map, the activity page with its provenance, the planner, the calendar, the provider portal and the municipal scan console. Every link works.
Open the prototype →Their age is all we need. No name, no school, no photo.
Skip, I will search myself
1.01Onboarding1.02Search and mapComune di Milano · Education Directorate · Mixed activities · 1.2 km from home
| A · 10–19 Jun | 8 days | €169.36 |
| B · 22 Jun – 3 Jul | 10 days | €211.70 |
| C · 6–21 Jul | 12 days | €254.04 |
You can book one period or several, and they need not be consecutive.
This is not first come, first served — places go by score. Two working parents are worth 10 points; a sibling aged 0–14 adds 1.2.
Alert me when it opensGo to the Comune website ↗editor:giulia.mReport an error on this listing
1.03Activity pageMunicipal Summer Centre — Casa del Sole Comune di Milano · Education Directorate City of Milan ISEE Opens soon | Multisport Campus — Mincio Centre Milanosport S.p.A. Milanosport ISEE | English Summer Camp Pingu's English Milano Città Studi Private | |
| Normalised price | €105.85 /week/child cheapest | €194.00 /week/child | €285.00 /week/child |
| Comune: period B fee €211.70 ÷ 2 weeks. Pingu's: €230 + €35 lunch + €20 after-camp, because you asked for meals and cover until 17:00. | |||
| Hours | 8:30–16:30 covers until 18:00 | 8:30–17:30 covers until 17:30 | 9:00–16:00 until 16:00 — after-camp costs extra |
| Meals | Lunch + snack in the price | Lunch included in the price | Lunch included +€35 a week |
| Distance from home | 1.2 km | 2.9 km | 1.6 km |
| Registration deadline | 7 April, 12:00 opens 19 March · SPID required | 5 June registration open | 15 June registration open |
| Eligible ages | 6–11 years primary school only — Child 2, aged 13, is not eligible | 5–14 years | 4–10 years |
| Concessions | ISEE — 21 bands, free below €3,000 | ISEE below €20,000 → −16% | none |
1.04ComparisonFor a 13-year-old within 2 km, with lunch included, the catalogue has nothing today. That is not a bug: it is a gap in supply, and we are tracking it.
1.05No resultsThese decide what the planner may bend when no perfect summer exists.
7 weeks × 2 children = 14 child-weeks to cover. Tap any chip to change it.
2.01Constraints15 June – 31 July · 2 children · €1,300 budget · within 8 km
2.02Three plansJunior Sailing — weekly course for Child 2, week of 29 June.
actual value: 9.4 km
Junior Sailing is at the Idroscalo, 9.4 km from home — beyond the 8 km limit you set.
actual value: €1,307.74
Dropping Child 2's week W3 (−€194.00) and adding the sailing course (+€260.00) takes the total from €1,241.74 to €1,307.74 — over the €1,300.00 budget.
2.03Conflicts“Most variety” plan · €1,243.74 · 8 weeks of 14
| Child 1 · 8 | Child 2 · 13 | |
|---|---|---|
| 15–19 Jun | SwimCamp€154.00 · 8:30 | Multisport Campus€194.00 · 8:30 |
| 22–26 Jun | Municipal Summer Centre€211.70 / 2 wks · 8:30 | Summer Lab Teens€215.00 · 9:00 |
| 29 Jun – 3 Jul | Municipal Summer Centre€211.70 / 2 wks · 8:30 | Summer Lab Teens€215.00 · 9:00 |
| 6–10 Jul | Municipal Summer Centre€254.04 / 2 wks · 8:30 | uncovered |
| 13–17 Jul | Municipal Summer Centre€254.04 / 2 wks · 8:30 | uncovered |
| 20–24 Jul | Grandparents, Sestri Levanteyours · no booking | Grandparents, Sestri Levanteyours · no booking |
| 27–31 Jul | Family holidayyours · no booking | Family holidayyours · no booking |
2.04CalendarThe other child keeps everything already agreed.
| Week | Was | Becomes | Cost |
|---|---|---|---|
| 15–19 Jun | Multisport Campus €194.00 | SmartCamp €164.00 | −€30.00 |
| 22–26 Jun | Summer Lab Teens €215.00 | SmartCamp €164.00 | −€51.00 |
| 29 Jun – 3 Jul | Summer Lab Teens €215.00 | SmartCamp €164.00 | −€51.00 |
| 6–10 Jul | nothing — | SmartCamp €164.00 | +€164.00 |
2.05Change one childFor the weeks nobody sells you: the grandparents, the holiday, the fortnight you take off. The plan needs to know about them.
2.06Add your ownTwo children, seven weeks, one budget.
Cancel and change a constraint
2.07Solver workingOrdered by urgency, not by date. Two of them close this week.
3.01AlertsLast sent on 12 March · you saved 2 activities from it.
The account belongs to an adult. Of the children we keep only an age band and interests. No name, no photo, no school, no exact address.
3.02PreferencesUnpublished draft · last edited today at 09:55
Enter a start time.
Families filter on this field.
This is the field that generates alerts.
No commission on registrations. Registration happens on your own site.
Last confirmed: today, 09:55 by you.
Families see this date on the public listing. After 30 days without confirmation the listing is flagged for review.
4.01Listing editorOnly from channels you connect yourself. We do not scrape your site without an agreement, and every automatic extraction passes through your confirmation.
Extracted from your own posts. Until you confirm them, families do not see them.
ageRange 9–14confidence 0.99 | weeks W7confidence 0.98 | price €260 / weekconfidence 0.97 | hours 9:00–17:00confidence 0.99 | meals lunch includedconfidence 0.95 |
ageRange 8–16confidence 0.71 | weeks one-off eventconfidence 0.80 | price free?confidence 0.35 | hours not statedconfidence 0.22 | meals noneconfidence 0.78 |
4.02Connected sourcesOne page, kept honest. You can change any of it without asking us.
4.03Municipality consoleNothing extracted automatically goes public without passing through here. Auto-publish threshold: confidence ≥ 0.90 on every required field.
ageRange 6–130.91 | weeks W2–W60.74 | price €45 / week0.48 | hours not stated0.20 | meals not stated0.20 |
ageRange 12–160.99 | weeks W50.98 | price €215 / week0.97 | hours 9:00–17:300.99 | meals lunch included0.95 |
ageRange 6–110.99 | weeks A, B, C0.94 | price 21 ISEE bands0.86 | hours 8:30–16:300.99 | meals lunch + snack0.93 |
ageRange 11–150.55 | weeks n/a — year-long course0.60 | price not stated0.15 | hours Wednesday afternoon0.44 | meals none0.80 |
5.01ModerationChecked at 10:00 · 14 published activities · 11 complete · 2 awaiting confirmation · 1 to re-verify
| Source | Type | Records | Last fetch | Last human check | Cadence | Health | |
|---|---|---|---|---|---|---|---|
| Comune di Milano — Centri Estivi 2026 (comunicato di servizio) Public document — CAD art. 52 / D.Lgs. 36/2006, attribution | 32 | 2026-03-17 08:12 | 2026-03-17 09:40 editor:giulia.m | daily | ok | Open run | |
| Milanosport — Campus Estivi 2026 Public body website — editorial import, attributed | Web page | 40 | 2026-03-16 06:05 | 2026-03-16 11:20 editor:giulia.m | daily | ok | Re-run |
| Case di Quartiere — calendario estate 2026 Host returns 403 to non-browser agents; only 2 of 42 rows are for children. Public body website — editorial import, attributed | Web page | 42 of which 2 for children | 2026-03-15 07:30 | 2026-03-15 10:05 editor:paolo.r | weekly | watch | Re-run |
| dati.comune.milano.it — Municipi and NIL polygons CC BY 4.0 | Open data | 97 | 2026-03-01 03:00 | 2026-03-01 03:00 system | monthly | ok | Re-run |
| Provider ICS feeds (3 connected) Provider-supplied under listing agreement | ICS feed | 18 | 2026-03-17 06:00 | 2026-03-17 06:00 provider | hourly | ok | Re-run |
| Provider Instagram Business (2 connected) 2 extracted posts awaiting provider confirmation for 26h. Provider-consented, Instagram Login (own account) | 11 | 2026-03-17 05:30 | 2026-03-16 18:02 provider | daily | watch | Re-run | |
| Provider portal (self-listed) Provider-supplied under listing agreement | Portal | 63 | 2026-03-17 09:55 | 2026-03-17 09:55 provider | live | ok | Re-run |
Municipio 3 is covered because it is the pilot district. Municipi 6, 7 and northern 9 are at zero: that is where acquisition goes next.
The 15–17 band has a single activity. It is the same gap the zero-result searches have been reporting for two weeks.
See the zero-result searches5.02Source freshnessComune di Milano — Centri Estivi 2026 (comunicato di servizio)
scan-2026-03-17-0812| HTTP status | 200 |
| Size | 1.24 MB |
| SHA-256 | a41f…9e02 |
| Snapshot | stored, replayable |
| User agent | browser UA — this host answers 403 to bots |
| Parser | Docling (MIT) |
| Pages | 16 |
| Tables found | 4 |
| Table rows | 32 sites + 21 fee bands |
| Text layer | native, no OCR needed |
| Records | 32 summer centres |
| Fields per record | 9 |
| Mean confidence | 0.94 |
| Below threshold | 2 records |
| Model | strict JSON schema, two independent prompts |
| New sites | 3 |
| Removed | 1 |
| Changed | 4 |
| Unchanged | 25 |
| Fee table | all 21 bands changed — expected, annual revision |
| Schema errors | 2 |
| Missing required field | hours on 2 records |
| Date sanity | 3 periods, all inside the school year |
| Fee monotonic across ISEE bands | yes |
| Auto-publishable | 26 of 32 |
| To an editor | 4 |
| Blocked | 2 — missing hours |
| Nothing published yet | correct |
| Site | What changed | Confidence | Route | |
|---|---|---|---|---|
| new | Scuola Rinnovata Pizzigoni Municipio 8 | Not in the 2025 edition. Address needs a human check against the school register. | 0.88 | To an editor |
| new | Scuola Primaria Cavalieri Municipio 2 | New site, address parsed cleanly and geocoded to Via Anemoni. | 0.96 | auto |
| new | Scuola Primaria Trilussa Municipio 6 | New site, matches an existing school record in the open-data register. | 0.97 | auto |
| removed | Scuola Primaria Pini Municipio 4 | Present in 2025, absent in 2026. Unpublish rather than delete, with the reason recorded. | 1.00 | To an editor |
| changed | Casa del Sole Municipio 3 | Period C extended by two days; fee for the top ISEE band moves 249.10 → 254.04. | 0.99 | auto |
| changed | Scuola Primaria Muzio Municipio 9 | Address line differs from 2025 and the two extractions disagree on the house number. | 0.61 | To an editor |
5.03Municipal scanUC.1Composing the summer for two childrenParent2.01 → 2.07 → 2.02 → 2.03 → 2.04UC.2A first visit that turns into a plan for both childrenParent1.02 → 1.03 → 1.04 → 1.01 → 1.02 → 2.01 → 2.07 → 2.02UC.3A returning parent the product already knowsParent3.01 → 1.02 → 1.04 → 1.03 → 2.04 → 3.02UC.4Securing a place at the municipal summer centreParent1.01 → 1.02 → 1.04 → 1.03 → 3.01 → 3.02UC.5Revising one child's summer, and adding what we already knewParent2.05 → 2.06 → 2.04UC.6A provider joins the catalogue and keeps it trueProvider4.01 → 4.02 → 5.01 → 1.03UC.7The scanning administrator's morningEditorial operator5.02 → 5.03 → 5.01 → 4.03UC.8A gap becomes an acquisition targetParent, then editorial team — two sides of the same event1.02 → 1.05 → 5.02 → 5.01UC.9A municipality lets us read, and watches us do itComune di Milano4.03 → 5.03 → 5.01 → 1.03
Every part of the service priced one by one, each with the reason it exists. The recommended first step is two weeks of planning at €4,000, and it is the only thing that needs a decision now.
See the costing → Features What the system doesEight branches of functionality, from finding an activity to knowing whether the product works. Each can be moved between stages, cut or deferred without breaking the others.
See the features → Architecture Six components and one ingestion engineHow the sources are read under consent, what happens at each of the six stages of a municipal scan, and which parts of the system are already running in one of our own products.
See the architecture → What we reuse Over half of it is already builtWhich parts start from something we have already built and which are designed from nothing — including, for each one, where the reuse stops being free.
See the reuse report →Six stages. Each is separately fundable, each delivers something you can use or judge on its own, and each ends at a gate you can decline to pass. Prices round up to the nearest hundred euros and time up to whole weeks, so every figure here is the pessimistic one; elapsed time assumes the stages run in sequence, because a gate is only a decision point if the next stage has not already started.
S0Planning and product focusingfixed price, two weeksA detailed architecture of the service, a stage-by-stage timeline, and a budget for building it — the three documents this estimate is a draft of, made specific to the decisions you have taken by then.
That the product is focused enough to cost properly: what is in the first release, what is deliberately out, and which assumptions the price depends on.
S1Evidence and interviewsbefore any product codeNo product. A measured answer to whether Milan has enough true, maintainable supply, the clickable prototype you are reading, and a hand-labelled evaluation set no vendor sells.
Whether the MVP is worth commissioning at all.
S2Catalogue livethe supply engine and the public catalogueSearch, map, activity pages with provenance, the whole ingestion pipeline, the municipal scan console, the municipality's own consent monitor, moderation and the freshness ledger.
That a stranger can find a real Milan activity, and that the catalogue stays true without heroics.
S3Householdaccounts, saving, alerts, the digestOnboarding, favourites and collections, comparison, the family calendar with your own entries, deadline alerts, the weekly digest and the preference centre.
That families come back — the only thing that makes a catalogue a product.
S4Plannerthe feature nobody else hasThe constraint solver, three objectives, explained infeasibility, revising one child's weeks while the other's stay as they are, and the AI layer that reads intent and writes the explanation.
That the distinctive claim survives contact with real catalogue density.
S5Supply self-servicethe providers maintain it, not usThe provider portal, listing validation, consented ingestion from ICS, Instagram, Telegram and forwarded newsletters, and provider-side analytics.
That editorial cost stops growing with the catalogue.
Eight branches of functionality. Together they are the product; separately they are what can be moved between stages, cut or deferred without breaking the others. Each one is visible in the prototype, and each one is priced in the estimate.
Pick a delivery stage above to see which of these are working by the end of it.
One catalogue for a city whose supply is scattered across four kinds of publisher.
Four providers quote four different units. Comparison is impossible until they are reduced to one.
The feature no competitor offers: not one activity, but seven weeks for every child inside one budget.
The cheapest places in Milan have the tightest windows. Deadlines are data here, not sentences inside a description.
The hardest part of the product, and the one that decides whether it is still useful in a year.
A municipality is a consenting publisher, not a target. A provider is the only person who knows their own prices.
A product for households with children, designed so that most of the data simply is not collected.
The measurements that tell you whether to fund the next stage.
Six components, four surfaces, one ingestion engine. The colour on each box says where the code comes from: most of the plumbing is already running in one of our own products, the operator surfaces are our own studio kernel, and the genuinely new work is concentrated in two places — the constraint solver and everything that makes a municipal document trustworthy.
A municipality is a consenting publisher, so the pipeline is built to be inspected by two different people: our editor, who needs to know what each stage did, and the Comune's own staff, who need to know what we read and what we could not. Every run is an object with a snapshot, named stages and a diff against the previous edition — which is the shape our prefabricated pipeline already uses for its alert stages, with the stages renamed and another language's assumptions removed.
What transfers. The service skeleton, taken as a template and stripped to one pair of modules; the ingest, normalise and emit shape, and with it the idea our catalogue calls source ratification as data — which source is trusted, who ratified it, when — which becomes the municipal consent record; language-model snippet extraction with semantic de-duplication into a vector index, which becomes activity extraction and cross-source de-duplication; the deterministic pipeline whose stages are individually nameable, which is what makes the scan console possible at all; and the corpus layout with dated result manifests, which becomes the Milan evaluation set.
What does not. The source adapters are specific to the product they were built for and are replaced by a PDF stage, an HTML table adapter and an open-data reader. The language normalisation runs through the whole corpus and has to come out; Italian temporal expressions have no maintained library, so that is new work with its own evaluation set. The trend detection and clustering solve a problem this product does not have. And the service topology is far too much operational surface for a team this size — our own catalogue's advice is to take the template and delete the rest.
| Component | S0 | S1 | S2 | S3 | S4 | S5 | Modules |
|---|---|---|---|---|---|---|---|
| C.0 Platform and data model The activity schema, the database, geography, identity, scheduling and deployment. Nothing user-facing lives here and everything depends on it. | — | — | 73% | 100% | 100% | 100% | 15 |
| C.1 Discovery Everything a parent touches while looking: search, filters, the map, the activity page, comparison and the honest dead end. | — | — | 64% | 100% | 100% | 100% | 14 |
| C.2 Planner The constraint solver and everything around it: objectives, infeasibility, revision, the calendar and the family's own entries. | — | — | — | 27% | 100% | 100% | 15 |
| C.3 Notifications Deadlines as data, the alert types built on them, and the weekly digest that carries them. | — | — | 12% | 100% | 100% | 100% | 8 |
| C.4 Publishers and providers The supply side: the light provider portal, consented ingestion channels, and the municipality's own consent monitor. | — | — | 21% | 21% | 21% | 100% | 14 |
| C.5 Ingestion and trust Where the product lives or dies: adapters, extraction, de-duplication, the municipal scan console, moderation and the freshness ledger. | — | — | 100% | 100% | 100% | 100% | 19 |
Read by row. C.5 is finished at
S1 because a catalogue that is not true is not worth shipping. C.2
waits for S3 because a planner over a thin catalogue produces trivial plans.
C.4 splits: the municipality console ships in S1, before we read a
single document, while the commercial provider portal waits until there are families to justify
it.
Every module in the estimate was checked against our own library before it was priced. For 47 of 85 we have a prefabricated metacomponent that covers the same problem; the remaining 38 are built for this product on open-source foundations. This page is that check, component by component and source by source — including the part usually left out, which is where each piece of reuse stops being free.
A prefabricated metacomponent halves what a piece costs. Where the library already covers the problem, the work is adaptation and integration; where it does not, the piece is assembled on open-source components and priced accordingly. That makes this page load-bearing rather than reassuring: a quarter of the engagement rests on these verdicts being right, and anything whose metacomponent turns out to cover less than our catalogue claims is repriced as an open-source build. The catalogue reads structure, not runtime, so the metacomponents carrying the most weight are the ones we verify first.
The shape of that chart is the argument for this team on this project. Ingestion and the platform are where we have the most depth, and they are also where a family activity portal usually dies — not on the search box, but on the data going stale three weeks after launch. The planner is where the library covers nothing at all, and it is the feature no competitor offers. We are strongest exactly where the risk is, and we say plainly that we are weakest exactly where the differentiation is.
A two-sided marketplace we run in production: a staged matcher that returns a handful of matches with written reasons, a profile wizard, a slot calendar, a services catalogue, five-role access control, consent logging with export and deletion, an internationalised progressive web app and its single-server operations.
The ingestion engine behind a live news product: an aggregator that records which source is trusted and who ratified it, language-model extraction with semantic de-duplication into a vector index, a pipeline whose stages are individually nameable, a scheduler, and a corpus layout for evaluation sets.
The kernel behind our operator surfaces: navigator, tabs, document-type registry and design tokens, used as a studio for managing materials rather than a bespoke admin panel. Plus the proactive digest design.
Hybrid retrieval — vector and fuzzy lexical search in one database — a model router with a versioned prompt registry, and an extract, plan, retrieve and verify pipeline.
A virtualised feed with a template registry and a declarative filter model, plus the product analytics service with guest-to-account stitching that answers the brief's KPI list.
Human-in-the-loop moderation: flagged items to a moderator surface with five inline decisions, every decision logged and fed back.
Multi-source collection: feeds, general web scraping, concurrency, exponential backoff, language detection and storage adapters.
A working, Ansible-deployed crawler container and the outbound mail server we operate.
A self-hosted change-detection service watching the municipal pages that republish without notice.
No metacomponent in our library covers these, so each is assembled on open-source components rather than written from nothing. Four are adopt-and-integrate decisions, small against the whole. The fifth is the product itself: a constraint solver on OR-Tools, built against fifty hand-solved households before a single line of the AI layer is written.
No metacomponent in our library covers optimisation or scheduling. Assembled on OR-Tools CP-SAT, and built against fifty hand-solved households before the AI layer.
No metacomponent of ours parses documents. The Comune publishes a Word-to-PDF communiqué once a year carrying thirty-two sites and every fee band.
No metacomponent in our library geocodes an address or answers a distance query.
No map metacomponent exists in our library; the prototype's map is drawn, not live.
Our library specifies this metacomponent but has not built it: the digest design exists, the sending of it does not.
The figure is not a judgement about how long a product like this usually takes. It is an inventory of every part of the service, written out one by one and priced against what we have already built, plus the design, QA and evidence work that ships no feature. Shown here in full, so you can disagree with a line rather than with a total. Every price on this page is rounded up to the nearest hundred euros and every duration up to whole weeks.
Before any of the build below is commissioned, two weeks of work with your team to turn this proposal into a plan: what is in the first release and what is deliberately out, the architecture of the service in detail, the stage-by-stage timeline, and the budget for building it. Fixed price, no dependency on the rest.
You end it holding three documents you own outright — and if they say the product should not be built, you have learned that for €4,000 rather than after the first build invoice.
Stage by stage, with what each one delivers and what it costs, is on the stages page.
The service is six components, each decomposed into the individual pieces of backend and frontend work it needs. That list is the argument. If something in it does not belong, take it out and the total moves with it. The full list, piece by piece with the reason for each, is at the foot of the architecture.
| 18% | C.0 Platform and data model |
| 16% | C.1 Discovery |
| 18% | C.2 Planner |
| 9% | C.3 Notifications |
| 16% | C.4 Publishers and providers |
| 22% | C.5 Ingestion and trust |
Ingestion and the platform carry the most, which is where a catalogue product actually lives. The planner carries the most work that has never been built before.
| Every anchor holds — the estimate | €66,700 | — |
| Half of them need a full build | €76,500 | +8% |
| None of them hold; everything is built from nothing | €86,400 | +22% |
The single assumption the figure turns on. Anything a prefabricated metacomponent covers is priced at half of an open-source build, so these verdicts carry real money. We verify the heaviest of them before committing to a fixed scope.
Design and QA have their own budgets here rather than hiding inside a build figure, because that is how both get cut first and missed last. Design is this prototype carried into built screens — twenty screens and nine journeys exist, so what remains is state coverage, responsive behaviour and handover. QA is the harness: browser automation, the vision-model checks and the CI wiring. Testing each piece of the build sits inside that piece.
| Category | S0 | S1 | S2 | S3 | S4 | S5 | Total |
|---|---|---|---|---|---|---|---|
| Design | — | — | €1,600 | €1,200 | €800 | — | €3,500 |
| QA harness | — | — | €2,300 | €800 | — | €800 | €3,900 |
| Evidence and research | — | €3,500 | — | — | — | — | €3,500 |
| Architecture and contracts | — | €2,000 | — | — | — | — | €2,000 |
| Solver test fixtures | — | — | — | — | €1,200 | — | €1,200 |
| All of it | — | €5,400 | €3,900 | €2,000 | €2,000 | €800 | €13,800 |
The estimate assumes you hold the interviews, record them and have them transcribed, in Italian and with your own contacts. We read the transcripts and revise the requirements, which is ours whoever holds them. Two other splits are priced, because “you run them, we attend” is a real option and it is not free.
| Who holds the interviews | Stage 0 | Total | Against the default |
|---|---|---|---|
| Client runs them, we read the transcripts | €5,900 | €70,700 | the default |
| We attend half the sessions | €8,200 | €73,000 | +€2,400 |
| We run all of them | €11,800 | €76,500 | +€5,900 |
If the budget allows one addition we would argue for the middle row. A transcript flattens hesitation, and hesitation is the finding when you ask a provider whether they would pay €29 a month.
An independent top-down read of our component library, made a day earlier by a different method, sized the MVP build at eleven to fourteen weeks. This piece-by-piece inventory lands inside that range. Two methods that disagreed would mean one of them was wrong.
Every screen in the clickable prototype maps to at least one piece of frontend work, and every product requirement to at least one piece of backend work. Anything with no screen and no requirement behind it was removed.
This is what the work costs to do. It carries no margin, no contingency, and no licence or infrastructure line, and it is not a quotation.
Read left to right. Each screen is the one the person is looking at; the dashed note under it is the action that takes them to the next. Scroll the strip sideways, and any single screen inside its own frame.
Giulia states the constraints once: two children, 15 June to 31 July, €1,300, 8 km, cover until 17:00, lunch where possible. She also chooses how clashes between the two children are settled — her decision, not the model's.
These decide what the planner may bend when no perfect summer exists.
7 weeks × 2 children = 14 child-weeks to cover. Tap any chip to change it.
The wait is two seconds and the product spends them explaining itself: four named steps tick past, and a note says that €1,300 will cover 8 or 9 of the 14 child-weeks. Giulia meets the shortfall here, not as a disappointment on the next screen.
Two children, seven weeks, one budget.
Three complete plans come back in two seconds. The cheapest costs €1,241.74 and covers 8 of the 14 child-weeks. The grid shows who goes where each week, and uncovered cells are marked rather than left blank.
15 June – 31 July · 2 children · €1,300 budget · within 8 km
The sailing week does not fit, and the product says exactly why: 9.4 km against an 8 km limit, and €1,307.74 against a €1,300 budget. Three ways out, each with its price. None is applied on its own.
Junior Sailing — weekly course for Child 2, week of 29 June.
actual value: 9.4 km
Junior Sailing is at the Idroscalo, 9.4 km from home — beyond the 8 km limit you set.
actual value: €1,307.74
Dropping Child 2's week W3 (−€194.00) and adding the sailing course (+€260.00) takes the total from €1,241.74 to €1,307.74 — over the €1,300.00 budget.
The plan becomes a calendar. One week is outlined in red: both children start at 8:30 at different centres. Below it, the plan's deadlines in order of urgency.
“Most variety” plan · €1,243.74 · 8 weeks of 14
| Child 1 · 8 | Child 2 · 13 | |
|---|---|---|
| 15–19 Jun | SwimCamp€154.00 · 8:30 | Multisport Campus€194.00 · 8:30 |
| 22–26 Jun | Municipal Summer Centre€211.70 / 2 wks · 8:30 | Summer Lab Teens€215.00 · 9:00 |
| 29 Jun – 3 Jul | Municipal Summer Centre€211.70 / 2 wks · 8:30 | Summer Lab Teens€215.00 · 9:00 |
| 6–10 Jul | Municipal Summer Centre€254.04 / 2 wks · 8:30 | uncovered |
| 13–17 Jul | Municipal Summer Centre€254.04 / 2 wks · 8:30 | uncovered |
| 20–24 Jul | Grandparents, Sestri Levanteyours · no booking | Grandparents, Sestri Levanteyours · no booking |
| 27–31 Jul | Family holidayyours · no booking | Family holidayyours · no booking |
Giulia has a complete plan, knows what it costs, knows which six child-weeks stay uncovered, and knows one week has a clash to resolve. She would have discovered none of that until June.
Read left to right. Each screen is the one the person is looking at; the dashed note under it is the action that takes them to the next. Scroll the strip sideways, and any single screen inside its own frame.
No account and nothing stored. The filters on screen are the ones typed into this search — an age, some dates, a distance — not a profile the product kept, and every one of them is removable. Public and private supply come back in one list. The product is useful before it is personal.
One listing, read properly: the normalised weekly price, what it includes, the hours against a working day, the registration window — and at the foot, where this came from and when it was last checked. The age range is 6–11, which is the moment the parent notices it does not cover the older child.
Comune di Milano · Education Directorate · Mixed activities · 1.2 km from home
| A · 10–19 Jun | 8 days | €169.36 |
| B · 22 Jun – 3 Jul | 10 days | €211.70 |
| C · 6–21 Jul | 12 days | €254.04 |
You can book one period or several, and they need not be consecutive.
This is not first come, first served — places go by score. Two working parents are worth 10 points; a sibling aged 0–14 adds 1.2.
Alert me when it opensGo to the Comune website ↗editor:giulia.mThree activities side by side, three price units reduced to one comparable number. The comparison makes the second problem obvious: these are answers for one child, and there are two.
Municipal Summer Centre — Casa del Sole Comune di Milano · Education Directorate City of Milan ISEE Opens soon | Multisport Campus — Mincio Centre Milanosport S.p.A. Milanosport ISEE | English Summer Camp Pingu's English Milano Città Studi Private | |
| Normalised price | €105.85 /week/child cheapest | €194.00 /week/child | €285.00 /week/child |
| Comune: period B fee €211.70 ÷ 2 weeks. Pingu's: €230 + €35 lunch + €20 after-camp, because you asked for meals and cover until 17:00. | |||
| Hours | 8:30–16:30 covers until 18:00 | 8:30–17:30 covers until 17:30 | 9:00–16:00 until 16:00 — after-camp costs extra |
| Meals | Lunch + snack in the price | Lunch included in the price | Lunch included +€35 a week |
| Distance from home | 1.2 km | 2.9 km | 1.6 km |
| Registration deadline | 7 April, 12:00 opens 19 March · SPID required | 5 June registration open | 15 June registration open |
| Eligible ages | 6–11 years primary school only — Child 2, aged 13, is not eligible | 5–14 years | 4–10 years |
| Concessions | ISEE — 21 bands, free below €3,000 | ISEE below €20,000 → −16% | none |
Only now does the product ask for anything, and it asks for very little: an age per child and a starting neighbourhood. No name, no school, no photo, with a line on the screen saying why it needs so little.
Their age is all we need. No name, no school, no photo.
The same search, now doing two jobs at once: the age chip is one per child rather than one in total, and what suits neither is gone. The parent has changed nothing about how they search; the product has changed what it returns.
The step a search box cannot take: seven weeks, two children, one budget, a distance limit and a working day, stated once. Hard constraints and preferences marked apart, and the rule for settling clashes between siblings chosen by the parent.
These decide what the planner may bend when no perfect summer exists.
7 weeks × 2 children = 14 child-weeks to cover. Tap any chip to change it.
Two seconds with the work named rather than a spinner, and an honest warning before the result: at this budget roughly 8 or 9 of the 14 child-weeks can be covered.
Two children, seven weeks, one budget.
Three complete summers, each a different compromise, with the uncovered weeks stated child by child rather than hidden. Forty seconds ago this was one camp for one child.
15 June – 31 July · 2 children · €1,300 budget · within 8 km
A parent who arrived for one camp leaves with three costed plans for two children, having given the product two ages and nothing else. Nothing was asked before it was useful.
Read left to right. Each screen is the one the person is looking at; the dashed note under it is the action that takes them to the next. Scroll the strip sideways, and any single screen inside its own frame.
The product opens on what is urgent rather than on a search box, because it already knows who this family is: three deadlines ordered by how soon they close, each naming which child it concerns and what happens if it is missed.
Ordered by urgency, not by date. Two of them close this week.
Search comes back already filtered from the stored profile — two age bands, the same 8 km, lunch where possible — and the ages have moved on a year without anyone being asked to update anything.
Two autumn courses side by side on the axes that decide it for a working parent: normalised monthly price, the hour the day ends, the distance, and the registration deadline.
Municipal Summer Centre — Casa del Sole Comune di Milano · Education Directorate City of Milan ISEE Opens soon | Multisport Campus — Mincio Centre Milanosport S.p.A. Milanosport ISEE | English Summer Camp Pingu's English Milano Città Studi Private | |
| Normalised price | €105.85 /week/child cheapest | €194.00 /week/child | €285.00 /week/child |
| Comune: period B fee €211.70 ÷ 2 weeks. Pingu's: €230 + €35 lunch + €20 after-camp, because you asked for meals and cover until 17:00. | |||
| Hours | 8:30–16:30 covers until 18:00 | 8:30–17:30 covers until 17:30 | 9:00–16:00 until 16:00 — after-camp costs extra |
| Meals | Lunch + snack in the price | Lunch included in the price | Lunch included +€35 a week |
| Distance from home | 1.2 km | 2.9 km | 1.6 km |
| Registration deadline | 7 April, 12:00 opens 19 March · SPID required | 5 June registration open | 15 June registration open |
| Eligible ages | 6–11 years primary school only — Child 2, aged 13, is not eligible | 5–14 years | 4–10 years |
| Concessions | ISEE — 21 bands, free below €3,000 | ISEE below €20,000 → −16% | none |
The listing, and the one line that matters to someone who has been let down before: who verified this and when. The registration link goes to the provider's own page; nothing is booked here.
Comune di Milano · Education Directorate · Mixed activities · 1.2 km from home
| A · 10–19 Jun | 8 days | €169.36 |
| B · 22 Jun – 3 Jul | 10 days | €211.70 |
| C · 6–21 Jul | 12 days | €254.04 |
You can book one period or several, and they need not be consecutive.
This is not first come, first served — places go by score. Two working parents are worth 10 points; a sibling aged 0–14 adds 1.2.
Alert me when it opensGo to the Comune website ↗editor:giulia.mIt lands in a calendar that already holds both children, and the calendar does the thing only a calendar can: it shows that the new Tuesday collides with the older child's existing course.
“Most variety” plan · €1,243.74 · 8 weeks of 14
| Child 1 · 8 | Child 2 · 13 | |
|---|---|---|
| 15–19 Jun | SwimCamp€154.00 · 8:30 | Multisport Campus€194.00 · 8:30 |
| 22–26 Jun | Municipal Summer Centre€211.70 / 2 wks · 8:30 | Summer Lab Teens€215.00 · 9:00 |
| 29 Jun – 3 Jul | Municipal Summer Centre€211.70 / 2 wks · 8:30 | Summer Lab Teens€215.00 · 9:00 |
| 6–10 Jul | Municipal Summer Centre€254.04 / 2 wks · 8:30 | uncovered |
| 13–17 Jul | Municipal Summer Centre€254.04 / 2 wks · 8:30 | uncovered |
| 20–24 Jul | Grandparents, Sestri Levanteyours · no booking | Grandparents, Sestri Levanteyours · no booking |
| 27–31 Jul | Family holidayyours · no booking | Family holidayyours · no booking |
Four minutes in, the parent narrows what they hear about: Thursday mornings, autumn courses and free municipal activities only. Behavioural profiling stays off, because it was never on.
Last sent on 12 March · you saved 2 activities from it.
The account belongs to an adult. Of the children we keep only an age band and interests. No name, no photo, no school, no exact address.
A parent who opened an email finished four minutes later with an autumn course booked into a calendar that already knew both children, and a digest tuned to the only two things they want to hear about.
Read left to right. Each screen is the one the person is looking at; the dashed note under it is the action that takes them to the next. Scroll the strip sideways, and any single screen inside its own frame.
Giulia opens the product for the first time and states her area, her children's ages, their interests and a budget. Nothing about the children is asked beyond age.
Their age is all we need. No name, no school, no photo.
Search is already filtered by her answers: age 8, 15 June to 31 July, within 8 km, lunch included. Public and private supply in one list; the municipal centre is the first result and opens in two days.
Three prices in three different units become one price per week per child: €105.85 municipal, €194 Milanosport, €285 for the private camp once lunch and after-camp are counted. The cheapest also has the nearest deadline.
Municipal Summer Centre — Casa del Sole Comune di Milano · Education Directorate City of Milan ISEE Opens soon | Multisport Campus — Mincio Centre Milanosport S.p.A. Milanosport ISEE | English Summer Camp Pingu's English Milano Città Studi Private | |
| Normalised price | €105.85 /week/child cheapest | €194.00 /week/child | €285.00 /week/child |
| Comune: period B fee €211.70 ÷ 2 weeks. Pingu's: €230 + €35 lunch + €20 after-camp, because you asked for meals and cover until 17:00. | |||
| Hours | 8:30–16:30 covers until 18:00 | 8:30–17:30 covers until 17:30 | 9:00–16:00 until 16:00 — after-camp costs extra |
| Meals | Lunch + snack in the price | Lunch included in the price | Lunch included +€35 a week |
| Distance from home | 1.2 km | 2.9 km | 1.6 km |
| Registration deadline | 7 April, 12:00 opens 19 March · SPID required | 5 June registration open | 15 June registration open |
| Eligible ages | 6–11 years primary school only — Child 2, aged 13, is not eligible | 5–14 years | 4–10 years |
| Concessions | ISEE — 21 bands, free below €3,000 | ISEE below €20,000 → −16% | none |
The listing explains what that price really means: 21 ISEE bands, from €0 to €254.04, meals included. And it explains the rule that decides everything: places go by score, not by arrival. At the foot, where the data came from and who verified it.
Comune di Milano · Education Directorate · Mixed activities · 1.2 km from home
| A · 10–19 Jun | 8 days | €169.36 |
| B · 22 Jun – 3 Jul | 10 days | €211.70 |
| C · 6–21 Jul | 12 days | €254.04 |
You can book one period or several, and they need not be consecutive.
This is not first come, first served — places go by score. Two working parents are worth 10 points; a sibling aged 0–14 adds 1.2.
Alert me when it opensGo to the Comune website ↗editor:giulia.mThe alert is set. On the same screen Giulia finds two deadlines she did not know she had: the regional Dote Sport voucher closes tomorrow, and Estate Vacanza opens the same day.
Ordered by urgency, not by date. Two of them close this week.
She sets the digest for Thursday morning, limited to summer centres, free activities and concessions. Behavioural profiling stays off, as it was.
Last sent on 12 March · you saved 2 activities from it.
The account belongs to an adult. Of the children we keep only an age band and interests. No name, no photo, no school, no exact address.
Giulia knows she needs her SPID ready at 12:00 on 19 March, that places go by score rather than by arrival, and that this centre covers only her 8-year-old. Her 13-year-old's summer is still unsolved — that is UC.2.
Read left to right. Each screen is the one the person is looking at; the dashed note under it is the action that takes them to the next. Scroll the strip sideways, and any single screen inside its own frame.
Giulia keeps Child 1's weeks as they are — five weeks, €619.74, two municipal periods already applied for — and asks the planner to work only on Child 2 inside the €680.26 that is left. The answer comes back as a diff, not as a new plan: three weeks swapped, one week added, €32.00 more, every centre now inside 1.8 km.
The other child keeps everything already agreed.
| Week | Was | Becomes | Cost |
|---|---|---|---|
| 15–19 Jun | Multisport Campus €194.00 | SmartCamp €164.00 | −€30.00 |
| 22–26 Jun | Summer Lab Teens €215.00 | SmartCamp €164.00 | −€51.00 |
| 29 Jun – 3 Jul | Summer Lab Teens €215.00 | SmartCamp €164.00 | −€51.00 |
| 6–10 Jul | nothing — | SmartCamp €164.00 | +€164.00 |
One week needs no activity at all: the grandparents are taking both children to Sestri Levante. Giulia records it herself, with the children it covers and the week it fills. The preview says what it will do before she saves — uncovered weeks fall from six to four — and a standing note says the entry is private, never published and never shown to a provider.
For the weeks nobody sells you: the grandparents, the holiday, the fortnight you take off. The plan needs to know about them.
The calendar now tells the whole truth. Municipal and private weeks in green and blue, the two weeks the family owns in violet, and only two genuine gaps left. The deadlines below it are unchanged, because revising a plan never revises the calendar the Comune keeps.
“Most variety” plan · €1,243.74 · 8 weeks of 14
| Child 1 · 8 | Child 2 · 13 | |
|---|---|---|
| 15–19 Jun | SwimCamp€154.00 · 8:30 | Multisport Campus€194.00 · 8:30 |
| 22–26 Jun | Municipal Summer Centre€211.70 / 2 wks · 8:30 | Summer Lab Teens€215.00 · 9:00 |
| 29 Jun – 3 Jul | Municipal Summer Centre€211.70 / 2 wks · 8:30 | Summer Lab Teens€215.00 · 9:00 |
| 6–10 Jul | Municipal Summer Centre€254.04 / 2 wks · 8:30 | uncovered |
| 13–17 Jul | Municipal Summer Centre€254.04 / 2 wks · 8:30 | uncovered |
| 20–24 Jul | Grandparents, Sestri Levanteyours · no booking | Grandparents, Sestri Levanteyours · no booking |
| 27–31 Jul | Family holidayyours · no booking | Family holidayyours · no booking |
Child 1's summer never moved, Child 2 gained a week for €32.00, and two weeks the catalogue could never have known about are on the calendar as cover rather than as gaps. Six uncovered weeks became two, and only one of those needs solving.
Read left to right. Each screen is the one the person is looking at; the dashed note under it is the action that takes them to the next. Scroll the strip sideways, and any single screen inside its own frame.
The editor refuses to publish: hours and deadline are missing. Validation explains the consequence in the provider's own interest — without hours it never appears in the working-day filter, without a deadline it generates no alerts.
Unpublished draft · last edited today at 09:55
Enter a start time.
Families filter on this field.
This is the field that generates alerts.
No commission on registrations. Registration happens on your own site.
Last confirmed: today, 09:55 by you.
Families see this date on the public listing. After 30 days without confirmation the listing is flagged for review.
Four channels, each stating in one line what we read and what we do not: an ICS feed, the club's own Instagram Business account, a Telegram channel, newsletter forwarding. Two extractions wait for the provider to confirm them.
Only from channels you connect yourself. We do not scrape your site without an agreement, and every automatic extraction passes through your confirmation.
Extracted from your own posts. Until you confirm them, families do not see them.
ageRange 9–14confidence 0.99 | weeks W7confidence 0.98 | price €260 / weekconfidence 0.97 | hours 9:00–17:00confidence 0.99 | meals lunch includedconfidence 0.95 |
ageRange 8–16confidence 0.71 | weeks one-off eventconfidence 0.80 | price free?confidence 0.35 | hours not statedconfidence 0.22 | meals noneconfidence 0.78 |
Whatever the provider does not confirm lands in the editorial queue, with confidence per field and the reason it was flagged. Below 0.70 nothing is published.
Nothing extracted automatically goes public without passing through here. Auto-publish threshold: confidence ≥ 0.90 on every required field.
ageRange 6–130.91 | weeks W2–W60.74 | price €45 / week0.48 | hours not stated0.20 | meals not stated0.20 |
ageRange 12–160.99 | weeks W50.98 | price €215 / week0.97 | hours 9:00–17:300.99 | meals lunch included0.95 |
ageRange 6–110.99 | weeks A, B, C0.94 | price 21 ISEE bands0.86 | hours 8:30–16:300.99 | meals lunch + snack0.93 |
ageRange 11–150.55 | weeks n/a — year-long course0.60 | price not stated0.15 | hours Wednesday afternoon0.44 | meals none0.80 |
The listing is public, and at its foot it carries its provenance: source, licence, when it was fetched, when it was verified and by whom. That is the fact a parent can check.
Comune di Milano · Education Directorate · Mixed activities · 1.2 km from home
| A · 10–19 Jun | 8 days | €169.36 |
| B · 22 Jun – 3 Jul | 10 days | €211.70 |
| C · 6–21 Jul | 12 days | €254.04 |
You can book one period or several, and they need not be consecutive.
This is not first come, first served — places go by score. Two working parents are worth 10 points; a sibling aged 0–14 adds 1.2.
Alert me when it opensGo to the Comune website ↗editor:giulia.mThe club published without typing anything twice, the public listing carries a dated “verified by the provider” stamp, and the editorial team worked only on what the automation could not settle.
Read left to right. Each screen is the one the person is looking at; the dashed note under it is the action that takes them to the next. Scroll the strip sideways, and any single screen inside its own frame.
The morning starts on the ledger, not in a log file: every source with when it was last fetched, when a human last verified it, under what licence, and whether it is healthy. Two rows are amber and both say why in a sentence rather than in a status code.
Checked at 10:00 · 14 published activities · 11 complete · 2 awaiting confirmation · 1 to re-verify
| Source | Type | Records | Last fetch | Last human check | Cadence | Health | |
|---|---|---|---|---|---|---|---|
| Comune di Milano — Centri Estivi 2026 (comunicato di servizio) Public document — CAD art. 52 / D.Lgs. 36/2006, attribution | 32 | 2026-03-17 08:12 | 2026-03-17 09:40 editor:giulia.m | daily | ok | Open run | |
| Milanosport — Campus Estivi 2026 Public body website — editorial import, attributed | Web page | 40 | 2026-03-16 06:05 | 2026-03-16 11:20 editor:giulia.m | daily | ok | Re-run |
| Case di Quartiere — calendario estate 2026 Host returns 403 to non-browser agents; only 2 of 42 rows are for children. Public body website — editorial import, attributed | Web page | 42 of which 2 for children | 2026-03-15 07:30 | 2026-03-15 10:05 editor:paolo.r | weekly | watch | Re-run |
| dati.comune.milano.it — Municipi and NIL polygons CC BY 4.0 | Open data | 97 | 2026-03-01 03:00 | 2026-03-01 03:00 system | monthly | ok | Re-run |
| Provider ICS feeds (3 connected) Provider-supplied under listing agreement | ICS feed | 18 | 2026-03-17 06:00 | 2026-03-17 06:00 provider | hourly | ok | Re-run |
| Provider Instagram Business (2 connected) 2 extracted posts awaiting provider confirmation for 26h. Provider-consented, Instagram Login (own account) | 11 | 2026-03-17 05:30 | 2026-03-16 18:02 provider | daily | watch | Re-run | |
| Provider portal (self-listed) Provider-supplied under listing agreement | Portal | 63 | 2026-03-17 09:55 | 2026-03-17 09:55 provider | live | ok | Re-run |
Municipio 3 is covered because it is the pilot district. Municipi 6, 7 and northern 9 are at zero: that is where acquisition goes next.
The 15–17 band has a single activity. It is the same gap the zero-result searches have been reporting for two weeks.
See the zero-result searchesOne run, six named stages. The fetch kept the bytes so a re-parse can be judged against the same input; the extract ran two independent prompts and flagged where they disagreed; the diff compared against last year's edition rather than against nothing, which turns thirty-two records into three new sites and one removal.
Comune di Milano — Centri Estivi 2026 (comunicato di servizio)
scan-2026-03-17-0812| HTTP status | 200 |
| Size | 1.24 MB |
| SHA-256 | a41f…9e02 |
| Snapshot | stored, replayable |
| User agent | browser UA — this host answers 403 to bots |
| Parser | Docling (MIT) |
| Pages | 16 |
| Tables found | 4 |
| Table rows | 32 sites + 21 fee bands |
| Text layer | native, no OCR needed |
| Records | 32 summer centres |
| Fields per record | 9 |
| Mean confidence | 0.94 |
| Below threshold | 2 records |
| Model | strict JSON schema, two independent prompts |
| New sites | 3 |
| Removed | 1 |
| Changed | 4 |
| Unchanged | 25 |
| Fee table | all 21 bands changed — expected, annual revision |
| Schema errors | 2 |
| Missing required field | hours on 2 records |
| Date sanity | 3 periods, all inside the school year |
| Fee monotonic across ISEE bands | yes |
| Auto-publishable | 26 of 32 |
| To an editor | 4 |
| Blocked | 2 — missing hours |
| Nothing published yet | correct |
| Site | What changed | Confidence | Route | |
|---|---|---|---|---|
| new | Scuola Rinnovata Pizzigoni Municipio 8 | Not in the 2025 edition. Address needs a human check against the school register. | 0.88 | To an editor |
| new | Scuola Primaria Cavalieri Municipio 2 | New site, address parsed cleanly and geocoded to Via Anemoni. | 0.96 | auto |
| new | Scuola Primaria Trilussa Municipio 6 | New site, matches an existing school record in the open-data register. | 0.97 | auto |
| removed | Scuola Primaria Pini Municipio 4 | Present in 2025, absent in 2026. Unpublish rather than delete, with the reason recorded. | 1.00 | To an editor |
| changed | Casa del Sole Municipio 3 | Period C extended by two days; fee for the top ISEE band moves 249.10 → 254.04. | 0.99 | auto |
| changed | Scuola Primaria Muzio Municipio 9 | Address line differs from 2025 and the two extractions disagree on the house number. | 0.61 | To an editor |
Four records reach a person with the evidence beside them and per-field confidence: a new site whose address needs checking, and one where the two extractions disagree on a house number. Five inline decisions, every one logged and fed back into the evaluation set.
Nothing extracted automatically goes public without passing through here. Auto-publish threshold: confidence ≥ 0.90 on every required field.
ageRange 6–130.91 | weeks W2–W60.74 | price €45 / week0.48 | hours not stated0.20 | meals not stated0.20 |
ageRange 12–160.99 | weeks W50.98 | price €215 / week0.97 | hours 9:00–17:300.99 | meals lunch included0.95 |
ageRange 6–110.99 | weeks A, B, C0.94 | price 21 ISEE bands0.86 | hours 8:30–16:300.99 | meals lunch + snack0.93 |
ageRange 11–150.55 | weeks n/a — year-long course0.60 | price not stated0.15 | hours Wednesday afternoon0.44 | meals none0.80 |
Two of the problems are not ours to fix: an annex published as a scanned image, and two records with no hours at all. They go back to the publisher in their own console, stated as what it costs them rather than as a complaint.
One page, kept honest. You can change any of it without asking us.
Eleven sources reviewed, one municipal republication absorbed, four uncertain records settled by a person, and two problems only the publisher can fix sent back to them — inside an hour, with every decision logged.
Read left to right. Each screen is the one the person is looking at; the dashed note under it is the action that takes them to the next. Scroll the strip sideways, and any single screen inside its own frame.
Giulia tightens the filters: age 13, within 2 km, lunch included. These are the real constraints of someone with no car and a job.
No results — and the product does not merely say so. It proposes the two smallest changes that would work, with how many results each would return, and offers to alert her if something appears.
For a 13-year-old within 2 km, with lunch included, the catalogue has nothing today. That is not a bug: it is a gap in supply, and we are tracking it.
On the other side, the same search shows up in coverage: the 15–17 band has one activity, and Municipi 6, 7 and northern 9 are at zero. The gap is not an opinion, it is a bar.
Checked at 10:00 · 14 published activities · 11 complete · 2 awaiting confirmation · 1 to re-verify
| Source | Type | Records | Last fetch | Last human check | Cadence | Health | |
|---|---|---|---|---|---|---|---|
| Comune di Milano — Centri Estivi 2026 (comunicato di servizio) Public document — CAD art. 52 / D.Lgs. 36/2006, attribution | 32 | 2026-03-17 08:12 | 2026-03-17 09:40 editor:giulia.m | daily | ok | Open run | |
| Milanosport — Campus Estivi 2026 Public body website — editorial import, attributed | Web page | 40 | 2026-03-16 06:05 | 2026-03-16 11:20 editor:giulia.m | daily | ok | Re-run |
| Case di Quartiere — calendario estate 2026 Host returns 403 to non-browser agents; only 2 of 42 rows are for children. Public body website — editorial import, attributed | Web page | 42 of which 2 for children | 2026-03-15 07:30 | 2026-03-15 10:05 editor:paolo.r | weekly | watch | Re-run |
| dati.comune.milano.it — Municipi and NIL polygons CC BY 4.0 | Open data | 97 | 2026-03-01 03:00 | 2026-03-01 03:00 system | monthly | ok | Re-run |
| Provider ICS feeds (3 connected) Provider-supplied under listing agreement | ICS feed | 18 | 2026-03-17 06:00 | 2026-03-17 06:00 provider | hourly | ok | Re-run |
| Provider Instagram Business (2 connected) 2 extracted posts awaiting provider confirmation for 26h. Provider-consented, Instagram Login (own account) | 11 | 2026-03-17 05:30 | 2026-03-16 18:02 provider | daily | watch | Re-run | |
| Provider portal (self-listed) Provider-supplied under listing agreement | Portal | 63 | 2026-03-17 09:55 | 2026-03-17 09:55 provider | live | ok | Re-run |
Municipio 3 is covered because it is the pilot district. Municipi 6, 7 and northern 9 are at zero: that is where acquisition goes next.
The 15–17 band has a single activity. It is the same gap the zero-result searches have been reporting for two weeks.
See the zero-result searchesA suggested provider enters the queue with its fields and its confidence scores. If it clears the gate, the gap closes and the parent who generated it gets the alert.
Nothing extracted automatically goes public without passing through here. Auto-publish threshold: confidence ≥ 0.90 on every required field.
ageRange 6–130.91 | weeks W2–W60.74 | price €45 / week0.48 | hours not stated0.20 | meals not stated0.20 |
ageRange 12–160.99 | weeks W50.98 | price €215 / week0.97 | hours 9:00–17:300.99 | meals lunch included0.95 |
ageRange 6–110.99 | weeks A, B, C0.94 | price 21 ISEE bands0.86 | hours 8:30–16:300.99 | meals lunch + snack0.93 |
ageRange 11–150.55 | weeks n/a — year-long course0.60 | price not stated0.15 | hours Wednesday afternoon0.44 | meals none0.80 |
One parent's empty search has become a line on an acquisition list with a number beside it. No competitor in Milan closes this loop.
Read left to right. Each screen is the one the person is looking at; the dashed note under it is the action that takes them to the next. Scroll the strip sideways, and any single screen inside its own frame.
The Comune's own console states what was agreed on 24 February: three documents in scope, anything behind a login explicitly out of it, daily reads during registration windows. It reports what that produced — 32 activities live, 1,842 families, 263 clicks sent back to the Comune's own pages — and two things only they can fix.
One page, kept honest. You can change any of it without asking us.
Behind that summary sits one run. Six named stages: the fetch kept the bytes, the parse found last year's table layout intact, the extract ran two prompts and flagged where they disagreed, the diff compared against the 2025 edition rather than against nothing. Two records fail validation for missing hours and nothing is published yet.
Comune di Milano — Centri Estivi 2026 (comunicato di servizio)
scan-2026-03-17-0812| HTTP status | 200 |
| Size | 1.24 MB |
| SHA-256 | a41f…9e02 |
| Snapshot | stored, replayable |
| User agent | browser UA — this host answers 403 to bots |
| Parser | Docling (MIT) |
| Pages | 16 |
| Tables found | 4 |
| Table rows | 32 sites + 21 fee bands |
| Text layer | native, no OCR needed |
| Records | 32 summer centres |
| Fields per record | 9 |
| Mean confidence | 0.94 |
| Below threshold | 2 records |
| Model | strict JSON schema, two independent prompts |
| New sites | 3 |
| Removed | 1 |
| Changed | 4 |
| Unchanged | 25 |
| Fee table | all 21 bands changed — expected, annual revision |
| Schema errors | 2 |
| Missing required field | hours on 2 records |
| Date sanity | 3 periods, all inside the school year |
| Fee monotonic across ISEE bands | yes |
| Auto-publishable | 26 of 32 |
| To an editor | 4 |
| Blocked | 2 — missing hours |
| Nothing published yet | correct |
| Site | What changed | Confidence | Route | |
|---|---|---|---|---|
| new | Scuola Rinnovata Pizzigoni Municipio 8 | Not in the 2025 edition. Address needs a human check against the school register. | 0.88 | To an editor |
| new | Scuola Primaria Cavalieri Municipio 2 | New site, address parsed cleanly and geocoded to Via Anemoni. | 0.96 | auto |
| new | Scuola Primaria Trilussa Municipio 6 | New site, matches an existing school record in the open-data register. | 0.97 | auto |
| removed | Scuola Primaria Pini Municipio 4 | Present in 2025, absent in 2026. Unpublish rather than delete, with the reason recorded. | 1.00 | To an editor |
| changed | Casa del Sole Municipio 3 | Period C extended by two days; fee for the top ISEE band moves 249.10 → 254.04. | 0.99 | auto |
| changed | Scuola Primaria Muzio Municipio 9 | Address line differs from 2025 and the two extractions disagree on the house number. | 0.61 | To an editor |
The four records the run could not settle reach an editor with per-field confidence and the reason each was flagged. A new site whose address needs checking against the school register, and one where the two extractions disagree on a house number.
Nothing extracted automatically goes public without passing through here. Auto-publish threshold: confidence ≥ 0.90 on every required field.
ageRange 6–130.91 | weeks W2–W60.74 | price €45 / week0.48 | hours not stated0.20 | meals not stated0.20 |
ageRange 12–160.99 | weeks W50.98 | price €215 / week0.97 | hours 9:00–17:300.99 | meals lunch included0.95 |
ageRange 6–110.99 | weeks A, B, C0.94 | price 21 ISEE bands0.86 | hours 8:30–16:300.99 | meals lunch + snack0.93 |
ageRange 11–150.55 | weeks n/a — year-long course0.60 | price not stated0.15 | hours Wednesday afternoon0.44 | meals none0.80 |
What a parent finally sees: the fee table across 21 ISEE bands, the registration window, the points rule — and at the foot, the source document, its licence, when it was read and who verified it. The whole chain is inspectable from the public page backwards.
Comune di Milano · Education Directorate · Mixed activities · 1.2 km from home
| A · 10–19 Jun | 8 days | €169.36 |
| B · 22 Jun – 3 Jul | 10 days | €211.70 |
| C · 6–21 Jul | 12 days | €254.04 |
You can book one period or several, and they need not be consecutive.
This is not first come, first served — places go by score. Two working parents are worth 10 points; a sibling aged 0–14 adds 1.2.
Alert me when it opensGo to the Comune website ↗editor:giulia.mThirty-two sites are published carrying their source, licence and verification date; four uncertain records were settled by a human; two things only the Comune can fix were sent back to them; and the Comune can see all of it and switch us off whenever it likes.
S3 ships in stage 3Their age is all we need. No name, no school, no photo.
S2 ships in stage 2S2 ships in stage 2Comune di Milano · Education Directorate · Mixed activities · 1.2 km from home
| A · 10–19 Jun | 8 days | €169.36 |
| B · 22 Jun – 3 Jul | 10 days | €211.70 |
| C · 6–21 Jul | 12 days | €254.04 |
You can book one period or several, and they need not be consecutive.
This is not first come, first served — places go by score. Two working parents are worth 10 points; a sibling aged 0–14 adds 1.2.
Alert me when it opensGo to the Comune website ↗editor:giulia.mS3 ships in stage 3Municipal Summer Centre — Casa del Sole Comune di Milano · Education Directorate City of Milan ISEE Opens soon | Multisport Campus — Mincio Centre Milanosport S.p.A. Milanosport ISEE | English Summer Camp Pingu's English Milano Città Studi Private | |
| Normalised price | €105.85 /week/child cheapest | €194.00 /week/child | €285.00 /week/child |
| Comune: period B fee €211.70 ÷ 2 weeks. Pingu's: €230 + €35 lunch + €20 after-camp, because you asked for meals and cover until 17:00. | |||
| Hours | 8:30–16:30 covers until 18:00 | 8:30–17:30 covers until 17:30 | 9:00–16:00 until 16:00 — after-camp costs extra |
| Meals | Lunch + snack in the price | Lunch included in the price | Lunch included +€35 a week |
| Distance from home | 1.2 km | 2.9 km | 1.6 km |
| Registration deadline | 7 April, 12:00 opens 19 March · SPID required | 5 June registration open | 15 June registration open |
| Eligible ages | 6–11 years primary school only — Child 2, aged 13, is not eligible | 5–14 years | 4–10 years |
| Concessions | ISEE — 21 bands, free below €3,000 | ISEE below €20,000 → −16% | none |
S2 ships in stage 2For a 13-year-old within 2 km, with lunch included, the catalogue has nothing today. That is not a bug: it is a gap in supply, and we are tracking it.
S4 ships in stage 4These decide what the planner may bend when no perfect summer exists.
7 weeks × 2 children = 14 child-weeks to cover. Tap any chip to change it.
S4 ships in stage 415 June – 31 July · 2 children · €1,300 budget · within 8 km
S4 ships in stage 4Junior Sailing — weekly course for Child 2, week of 29 June.
actual value: 9.4 km
Junior Sailing is at the Idroscalo, 9.4 km from home — beyond the 8 km limit you set.
actual value: €1,307.74
Dropping Child 2's week W3 (−€194.00) and adding the sailing course (+€260.00) takes the total from €1,241.74 to €1,307.74 — over the €1,300.00 budget.
S3 ships in stage 3“Most variety” plan · €1,243.74 · 8 weeks of 14
| Child 1 · 8 | Child 2 · 13 | |
|---|---|---|
| 15–19 Jun | SwimCamp€154.00 · 8:30 | Multisport Campus€194.00 · 8:30 |
| 22–26 Jun | Municipal Summer Centre€211.70 / 2 wks · 8:30 | Summer Lab Teens€215.00 · 9:00 |
| 29 Jun – 3 Jul | Municipal Summer Centre€211.70 / 2 wks · 8:30 | Summer Lab Teens€215.00 · 9:00 |
| 6–10 Jul | Municipal Summer Centre€254.04 / 2 wks · 8:30 | uncovered |
| 13–17 Jul | Municipal Summer Centre€254.04 / 2 wks · 8:30 | uncovered |
| 20–24 Jul | Grandparents, Sestri Levanteyours · no booking | Grandparents, Sestri Levanteyours · no booking |
| 27–31 Jul | Family holidayyours · no booking | Family holidayyours · no booking |
S4 ships in stage 4The other child keeps everything already agreed.
| Week | Was | Becomes | Cost |
|---|---|---|---|
| 15–19 Jun | Multisport Campus €194.00 | SmartCamp €164.00 | −€30.00 |
| 22–26 Jun | Summer Lab Teens €215.00 | SmartCamp €164.00 | −€51.00 |
| 29 Jun – 3 Jul | Summer Lab Teens €215.00 | SmartCamp €164.00 | −€51.00 |
| 6–10 Jul | nothing — | SmartCamp €164.00 | +€164.00 |
S3 ships in stage 3For the weeks nobody sells you: the grandparents, the holiday, the fortnight you take off. The plan needs to know about them.
S4 ships in stage 4Two children, seven weeks, one budget.
S3 ships in stage 3Ordered by urgency, not by date. Two of them close this week.
S3 ships in stage 3Last sent on 12 March · you saved 2 activities from it.
The account belongs to an adult. Of the children we keep only an age band and interests. No name, no photo, no school, no exact address.
S5 ships in stage 5Unpublished draft · last edited today at 09:55
Enter a start time.
Families filter on this field.
This is the field that generates alerts.
No commission on registrations. Registration happens on your own site.
Last confirmed: today, 09:55 by you.
Families see this date on the public listing. After 30 days without confirmation the listing is flagged for review.
S5 ships in stage 5Only from channels you connect yourself. We do not scrape your site without an agreement, and every automatic extraction passes through your confirmation.
Extracted from your own posts. Until you confirm them, families do not see them.
ageRange 9–14confidence 0.99 | weeks W7confidence 0.98 | price €260 / weekconfidence 0.97 | hours 9:00–17:00confidence 0.99 | meals lunch includedconfidence 0.95 |
ageRange 8–16confidence 0.71 | weeks one-off eventconfidence 0.80 | price free?confidence 0.35 | hours not statedconfidence 0.22 | meals noneconfidence 0.78 |
S2 ships in stage 2One page, kept honest. You can change any of it without asking us.
S2 ships in stage 2Nothing extracted automatically goes public without passing through here. Auto-publish threshold: confidence ≥ 0.90 on every required field.
ageRange 6–130.91 | weeks W2–W60.74 | price €45 / week0.48 | hours not stated0.20 | meals not stated0.20 |
ageRange 12–160.99 | weeks W50.98 | price €215 / week0.97 | hours 9:00–17:300.99 | meals lunch included0.95 |
ageRange 6–110.99 | weeks A, B, C0.94 | price 21 ISEE bands0.86 | hours 8:30–16:300.99 | meals lunch + snack0.93 |
ageRange 11–150.55 | weeks n/a — year-long course0.60 | price not stated0.15 | hours Wednesday afternoon0.44 | meals none0.80 |
S2 ships in stage 2Checked at 10:00 · 14 published activities · 11 complete · 2 awaiting confirmation · 1 to re-verify
| Source | Type | Records | Last fetch | Last human check | Cadence | Health | |
|---|---|---|---|---|---|---|---|
| Comune di Milano — Centri Estivi 2026 (comunicato di servizio) Public document — CAD art. 52 / D.Lgs. 36/2006, attribution | 32 | 2026-03-17 08:12 | 2026-03-17 09:40 editor:giulia.m | daily | ok | Open run | |
| Milanosport — Campus Estivi 2026 Public body website — editorial import, attributed | Web page | 40 | 2026-03-16 06:05 | 2026-03-16 11:20 editor:giulia.m | daily | ok | Re-run |
| Case di Quartiere — calendario estate 2026 Host returns 403 to non-browser agents; only 2 of 42 rows are for children. Public body website — editorial import, attributed | Web page | 42 of which 2 for children | 2026-03-15 07:30 | 2026-03-15 10:05 editor:paolo.r | weekly | watch | Re-run |
| dati.comune.milano.it — Municipi and NIL polygons CC BY 4.0 | Open data | 97 | 2026-03-01 03:00 | 2026-03-01 03:00 system | monthly | ok | Re-run |
| Provider ICS feeds (3 connected) Provider-supplied under listing agreement | ICS feed | 18 | 2026-03-17 06:00 | 2026-03-17 06:00 provider | hourly | ok | Re-run |
| Provider Instagram Business (2 connected) 2 extracted posts awaiting provider confirmation for 26h. Provider-consented, Instagram Login (own account) | 11 | 2026-03-17 05:30 | 2026-03-16 18:02 provider | daily | watch | Re-run | |
| Provider portal (self-listed) Provider-supplied under listing agreement | Portal | 63 | 2026-03-17 09:55 | 2026-03-17 09:55 provider | live | ok | Re-run |
Municipio 3 is covered because it is the pilot district. Municipi 6, 7 and northern 9 are at zero: that is where acquisition goes next.
The 15–17 band has a single activity. It is the same gap the zero-result searches have been reporting for two weeks.
See the zero-result searchesS2 ships in stage 2Comune di Milano — Centri Estivi 2026 (comunicato di servizio)
scan-2026-03-17-0812| HTTP status | 200 |
| Size | 1.24 MB |
| SHA-256 | a41f…9e02 |
| Snapshot | stored, replayable |
| User agent | browser UA — this host answers 403 to bots |
| Parser | Docling (MIT) |
| Pages | 16 |
| Tables found | 4 |
| Table rows | 32 sites + 21 fee bands |
| Text layer | native, no OCR needed |
| Records | 32 summer centres |
| Fields per record | 9 |
| Mean confidence | 0.94 |
| Below threshold | 2 records |
| Model | strict JSON schema, two independent prompts |
| New sites | 3 |
| Removed | 1 |
| Changed | 4 |
| Unchanged | 25 |
| Fee table | all 21 bands changed — expected, annual revision |
| Schema errors | 2 |
| Missing required field | hours on 2 records |
| Date sanity | 3 periods, all inside the school year |
| Fee monotonic across ISEE bands | yes |
| Auto-publishable | 26 of 32 |
| To an editor | 4 |
| Blocked | 2 — missing hours |
| Nothing published yet | correct |
| Site | What changed | Confidence | Route | |
|---|---|---|---|---|
| new | Scuola Rinnovata Pizzigoni Municipio 8 | Not in the 2025 edition. Address needs a human check against the school register. | 0.88 | To an editor |
| new | Scuola Primaria Cavalieri Municipio 2 | New site, address parsed cleanly and geocoded to Via Anemoni. | 0.96 | auto |
| new | Scuola Primaria Trilussa Municipio 6 | New site, matches an existing school record in the open-data register. | 0.97 | auto |
| removed | Scuola Primaria Pini Municipio 4 | Present in 2025, absent in 2026. Unpublish rather than delete, with the reason recorded. | 1.00 | To an editor |
| changed | Casa del Sole Municipio 3 | Period C extended by two days; fee for the top ISEE band moves 249.10 → 254.04. | 0.99 | auto |
| changed | Scuola Primaria Muzio Municipio 9 | Address line differs from 2025 and the two extractions disagree on the house number. | 0.61 | To an editor |