Case study · PlusPlusMinus

Planning Woordfees was hard. So we built a guide.

How an unofficial, AI-assisted guide to the Toyota Stellenbosch Woordfees went from a 261-page PDF to a live app in under two days: what we pulled, how we designed it, and everything that fought back.

457programme entries with exact times, venues and prices
366events with a direct ticket link
277reserved-seating sessions checked for free seats
~2¢US cost of an AI answer (a planned day costs 6 to 9¢)

The problemNo clear way to plan

The Toyota Stellenbosch Woordfees runs for nine days in October with hundreds of shows, talks, concerts and films across dozens of venues. It is wonderful, and it is hard to plan for. We kept hitting the same wall:

Three tabs and a spreadsheet to plan a festival.

So we asked a simpler question: what would it take to just ask, in Afrikaans or English, “what’s on, what’s free, what’s still bookable, and can I get from A to B?”

A note on who we are. This is an independent project by PlusPlusMinus. We are not affiliated with the Toyota Stellenbosch Woordfees. We are just here to help people find the amazing things going on.

What we builtAsk it, browse it, plan with it

One page, installable on a phone, in Afrikaans and English. You can chat with the guide, browse the programme by day with live ticket status, and build a plan that warns you about clashes, long walks and sold-out sessions.

The chat answering: what's free tomorrow after 18:00, with event cards underneath
Ask. Plain-language questions, answered from the live programme, with event cards to open.
The Programme tab for Saturday 10 October showing sold out, tickets available and about 8 left badges
Browse. Every session with an honest status: sold out, tickets available, or about N left.
My plan with a sold-out warning and a tight changeover warning showing a 12 minute walk
Plan. A sold-out warning, and a real walking time between two venues (12 minutes, 1 km).

Pulling the dataThree sources, none complete

The first version, built from the PDF alone, had 369 productions, 569 sessions and around 790 people. It was a good start and it went stale within days. The programme only became trustworthy once we treated the live sources as the truth and the PDF as history.

  1. The PDF fast, staleReading two-column pages with a script got us a working index in an afternoon. But it was printed in June, some entries were lost where text columns interleaved, and one section used a broken font encoding.
  2. The festival website the truthThe site’s public listing showed 472 entries, but the listing data carried only titles and descriptions; dates, venues and prices sat on each event page. We read every page once (about 5 minutes) and now only re-read entries whose last-edited stamp changes (about 20 seconds). That gave 457 productions with exact times, venues, prices, languages and age limits. The 15 entries with no session dates are left out.
  3. The ticket platform tickets and places366 events link straight to their ticket page. The platform’s official developer API gave us exact venue coordinates for 430 of the 457 entries, which later made real walking times possible.

Keeping it honest

Everything is read politely: one request at a time where the source throttles quick callers, only what is needed, and never for shows that have already happened. We link out to the festival site and ticket page for every event, because they remain the source of record.

A problem we didn’t expectThe category trap

Everything about the programme is organised by category: twelve of them, from Film Festival to Children’s Festival. It is how the PDF is laid out and how the website filters. But nobody plans a festival by category. People plan by place and time: “what’s on at the Drostdy tonight?”, “what can I do after the film at the Neelsie?”. And at this festival the two don’t line up.

How many different venues each category is spread across

457 entries, 12 categories, 87 venue names (about 70 distinct places). Counted from the live programme on 5 October 2026.

1 of 12categories sits entirely in one venue
6categories under one roof at the Drostdy-teater

What we did about it

We made time and place the structure and demoted category to a label. The programme opens on a day, then times; a venue filter sits beside the category filter; every venue has exact coordinates (430 of 457 entries), so the plan can warn “about 12 minutes on foot (1 km)” between two sessions. Category survives as a colour stripe and a filter, not as the way the page is built.

The hardest questionIs it still bookable?

This is where the data told a comfortable lie. The ticket data we could read said every reserved-seating show was fine. Then someone spotted that one show’s Saturday session was sold out on the ticket site. The ticket data simply had no sold-out signal for reserved seating.

The truth was in the seat map, the same thing a buyer sees: grey seats are taken, coloured seats are free. So we read it the way a visitor does and count the free seats. Across 277 sessions that found around 70 sold out that the ticket data had reported as fine. General-admission shows use the platform’s ticket counts, which are real remaining numbers.

Checking often, but not wastefully

Pulling the designMake it feel like the festival

We didn’t want a generic app. The 2026 poster, “It’s about time”, already had a strong look, so we started there and took its cues apart.

The palette, sampled from the poster

Coral #ef5965
Mint #cfe9dc
Pink #f7c8d0
Sun #f2d90f
Ink #0b0b0b

The paper-cut creatures

The little animal illustrations were lifted out of the programme PDF with their transparency intact, then used as category art and in empty states. The clock-face rings from the cover are rebuilt in plain CSS gradients, with no image at all.

Type and feel

AntonHeadlines: tall, loud, like the poster lettering.
DM SansEverything you read: friendly and clear on small screens.

Thick outlines and offset shadows keep it playful. On a phone the lists run edge to edge, touch targets are at least 40 px, and the input stays above the keyboard. Afrikaans is a tap away, and the headline becomes “Dis hoog tyd”, the festival’s own wording.

On the artwork. The poster, its slogan and the illustrations belong to the festival and its artists. This guide is independent and unofficial. If you are a rights-holder and would like anything changed or removed, contact us and we will.

The AI guideTools, not search

The chat doesn’t “know” the festival. Each question makes it call tools over the structured programme: search by day, time, venue and price; list what’s sold out; look up a person or a show; and check a proposed day for clashes and walking time. If a tool doesn’t return it, the guide doesn’t say it.

We chose tool-calling over embeddings and retrieval on purpose. The whole programme is only about 400 KB, and people ask structured questions (this day, after this time, free, near here), which filters answer exactly and a similarity search does not.

Choosing the model by measuring it

We ran the same four real questions through four configurations and compared speed, cost and correctness.

SetupAvg. timeAvg. cost / answerVerdict
Sonnet 5.5, default effort10.0 s$0.029Correct, slowest
Sonnet 5.5, low effort7.8 s$0.020Correct. Chosen.
Sonnet 5.5, between-tools thinking8.1 s$0.023Fastest first word, failed to finish a plan
Haiku 4.5 (smallest)7.1 s$0.013Cheapest, but said “seats available” on a reserved-seating show it could not see

That last row decided it. The cheapest model confidently claimed the one thing the data couldn’t tell it. For a tool people use to decide where to spend an evening, we’ll pay a little more for one that says “I can’t see which seats are left”.

Guardrails, tested

Shipping itFresh, fast and installable

Why it matters beyond one appMaking events visible

A festival this size has a long tail, and a long tail is where discovery goes to die. Of the 457 entries, 91 have no ticket page at all (free talks, exhibitions, broadcasts, school programmes) and 124 are free. They never show up in a ticket search, and in a 261-page PDF a small free talk on page 180 is competing with the headline acts.

91entries with no ticket page to be found through
124free entries, easy to miss in a printed programme

A guide that answers questions treats every event the same. Ask “something free for kids on Saturday” and a small morning show comes up next to the big concert, because the question, not the layout of a brochure, decides what is found. A few other ways this helps:

Honest caveat. These are the effects we built it to make possible and are now set up to measure. We don’t have results to show yet, and we won’t claim any until we do.

What fought backThe honest list

What we’d ask of any festivalMake planning easy by default

If the data were open, tools like this one wouldn’t need to be built from the outside. They would simply be built on top.