Dev log
Version 1.8.0
-
1.8.0
What this is, and a much longer list of places to look
- A page saying what tohode does that comparable services do not, written twice — once for people who build this kind of software and once for everybody else. The switch between them is two radio buttons and a line of CSS, because the page’s own argument is that no third-party script can run here and it would be a poor place to need JavaScript.
- Those claims carry the date they were last checked against other services, and the page says so plainly once that is more than three months old. A claim nobody has rechecked is worse than no claim, because it is still being asserted.
- The venue directory went from 75 places to 325. Probing the 197 new ones with a website found exactly one readable feed, which is the honest yield: venues overwhelmingly publish to Instagram, and the useful part of the exercise is the record of which ones publish nothing so the same dead ends are not tried again.
- The Cave, in Chapel Hill, is that one feed — now read alongside Local 506 up the road.
- The directory is visible on the dashboard, filtered by what probing settled. It had been a file and a table nobody could look at.
- Backups no longer default to writing themselves into the source directory. That file is every account on here, and nothing in .gitignore had covered its name.
-
1.7.0
Counting visitors without following them
- tohode already logged what people did — searched, signed up, posted. It now also counts that a page was served, which answers the blunter question of whether anybody is here and how they arrived.
- No script on the page and no third party, so the content security policy stays at script-src ’self’ and there is nothing to put a cookie banner in front of.
- Paths only, never query strings: tohode’s own URLs carry a latitude and longitude, and keeping them would turn a traffic log into a record of where each visitor was standing. Referrers are kept to the host, never the page somebody was reading. The visitor identifier changes daily, so it can tell one person visiting twenty times from twenty people visiting once and nothing longer.
- Coverage gaps are named as well as plotted: a row reads “Warehouse District, Raleigh” with its coordinates underneath, so it can be read at a glance without losing the precision. Names are resolved from the already-rounded coordinates when the dashboard is opened, so nothing extra is collected and nobody waits on a geocoder to get their search results.
- A contributor agreement and a CONTRIBUTING file, for the first person other than Sam to work on this.
-
1.6.1
Stop promising a location nobody is going to post
- “Location to be confirmed” was printed over every event with no venue, which is a promise the feed never made. It now appears only where a listing actually said it would announce one later, and everything else reads “Location not posted”.
- A venue that only programs one room can name it. Local 506 and Lincoln Theatre print no venue on their listings because there is only one and everyone reading their site knows which — so every one of their events had been arriving unplaced, at addresses that have not moved in thirty years.
-
1.6.0
This page, and one about who is writing it
- A dev log, reconstructed from the commit history back to the first build and kept by hand from here.
- Releases that are written but not yet deployed say so. A changelog that lets you assume everything on it is running is worse than not having one.
- An author page, because a site that collects email addresses should say whose project it is.
- The venue directory is exported to venues.json and version-controlled beside the source list. Knowing that two dozen breweries publish nothing is worth as much as knowing that four venues do.
-
1.5.0
Four venues that had refused to be read
- Cat’s Cradle, Local 506, Lincoln Theatre and The Cary Theater all publish no calendar feed and no structured markup — but all four run the same WordPress events plugin, which renders the whole schedule into the page. One parser reads all of them.
- Lincoln Theatre had been written off in the first round of feed-hunting as unreachable. It was never unreachable, only unreadable: the calendar had been sitting in the HTML the entire time.
- A listing with no readable date produces no event rather than a guess. A listing with no time becomes an all-day entry linking to the venue’s own page, because a venue that does not print a time is usually saying it does not matter.
-
1.4.0
A directory of venues
- Finding feeds is the slow part of this project, and it had been done from memory. Venues are now recorded alongside sources: a source is somewhere tohode can read, a venue is somewhere that might publish.
- Imported 75 Triangle venues and probed every one with a website. The result was zero new sources — and that is the useful part. Those venues genuinely do not publish machine-readable events, and now nobody has to prove it twice.
-
1.3.0
Comedy
- Goodnights Comedy Club, 209 shows. tohode had 18 comedy events before this and all of them came from ticketed rooms.
- Three separate faults were hiding them, any one of which returned nothing. The one that mattered: the parser looked for events nested under “events” and the club writes “Events”. A capital letter was hiding a year of listings.
- A source can now declare its own category, because a comedy club knows what it programs better than a keyword scorer guessing at “Special Event: Bruce Bruce”.
-
1.2.2
Keep the pages that arrived
- One slow response from a university feed used to discard the eight pages that had already come back, taking 900 events off the site until the next hourly run. A page that fails no longer costs the pages that worked.
-
1.2.1
Filter rows that hold their shape
- The filter chips wrapped at one spacing and sat at another, which read as a mistake because it was one. They now share a single rhythm at every width.
- On a phone a category chip is just its icon. Nothing is ever cut off mid-word at the edge of the screen.
-
1.2.0
Filters, and admitting what we don’t know
- Filter by who can attend, whether an event is online and whether it is free.
- Switching the universities to their calendar API took UNC from 27 events to over 300, and brought audience and format data with it.
- Every one of these facts is three-state: yes, no and nobody said. Filters exclude the unknowns — a filter that returned them would not be a filter — and then the page says how many it set aside. Free is only ever asserted, never inferred.
- Universities get their own treatment, because a concert is open to whoever buys a ticket and a departmental seminar is not.
-
1.1.0
Backups that have actually been restored
- Real accounts exist, so the database became the one thing that cannot be rebuilt. Everything else re-ingests; people do not.
- The backup command could previously apply schema migrations to the database it was asked to preserve. It now opens it read-only.
- A backup was restored into a running copy of the app and checked end to end. An untested backup is a rumor.
-
1.0.1
Stop apologizing over a full page
- tohode told Raleigh it was not covered while showing 189 Raleigh events, and did it again to Chapel Hill over 166. Coverage is now decided by whether the search found anything, not by geometry.
-
1.0.0
Live at tohode.com
- First public release. Invite-only, with working email, on a single machine with a single file for a database.
-
0.7.0
Terms, privacy and saying what mail you get
- A real tick-box at sign-up, recorded with the version agreed to. Announcements are opt-in and separate from the mail the service has to send to work at all.
- Data retention on the usage and security logs, third-party attributions and a license.
-
0.6.0
Accounts people can leave
- Email verification, password reset and account deletion that actually deletes.
- A security log, with addresses truncated so it records what happened rather than who was where.
-
0.5.0
Renamed tohode, and made to look like something
- Ten categories with their own colors, a fortnight-long calendar roll, event artwork, distances in miles and a content security policy with no inline script anywhere.
-
0.4.0
Finding feeds without being a nuisance
- Sitemap-driven discovery for venues that hide detail on individual pages, robots.txt honored throughout and a form for testers to suggest a venue.
-
0.3.0
Ticketmaster and the galleries
- Three metro searches through the Discovery API, plus the art museums and galleries.
- Fixed geocoding sending “TBD, TBD” to a firm in Germany and “4-370” to Peru.
-
0.2.0
Ready for other people
- Single-use invite codes, rate limits, admin-gated feed management and a usage dashboard.
-
0.1.0
First build
- Events near a point, in a window, from calendar feeds — plus events people post themselves, visible to everyone, to friends or to one circle.