Log

What changed, when, and the numbers. Development entries before September 2026 are reconstructed from the commit history, and list changes without measurements that were not recorded at the time.

2026-09-02
devlog

Zoom tiers, naming against siblings

Constellations computed at three resolutions instead of one; zoom selects between them.

Grouping

  • The community detection runs at three settings instead of one, from a cut that finds a couple of regions to one that finds fifty small figures.
  • Groups per tier: 1 / 12 / 43.
  • Each tier has its own minimum size, maximum spread and coherence bar. A bigger group is a looser group, because it has absorbed its weaker members, so the bars relax as the groups grow.
  • Group position and radius from the coordinate-wise median instead of the mean. Tier 2 median radius 1.9 → 1.24, and two more groups pass the spread test: 46 → 48.

Naming

  • A group below the top tier is scored against its siblings instead of the whole atlas. Previously every tier picked the same top word.
  • The comparison excludes the group itself from the reference pool. Measured against the parent, a group that is half its parent cannot be more than about twice as distinctive however defining its words are, which was below the bar it had to clear. Against its siblings the measure is unbounded and means what it should.
  • Skipped when the parent is most of the atlas. Applied there it produced "teeth, pants, weirded" in place of "teeth".
  • The top tier usually has no distinctive words by construction: a group that is most of the atlas has no words that are rare in the atlas. It is left undrawn rather than given a name, so nothing on the map is a word we chose. At the widest setting one group still names itself.
flying57
linz, fast, fly17
clouds, train, above16
moon8

Seed check

Louvain at resolution 0.2, ten seeds. Two groups every run; 36 dreams in the smaller group under all ten.

seed 1590 / 41 (live, peace, healthy)
seed 4581 / 50 (unnamed)
seed 7593 / 38 (live, peace, healthy)
seed 10593 / 38 (live, peace, healthy)

Rendering

  • Tier visibility follows the zoom, with the bands overlapping so pulling back dissolves the small figures into the large ones rather than switching between them.
  • Spanning trees per tier. The top tier draws none; its tree is 589 lines.
  • Shape styling interpolates with tier strength instead of switching on.
  • Constellation lines are a soft warm tone and the bright gold is kept for the figure under the cursor. When four fifths of the sky belongs to some figure, painting all of it the same colour says nothing.
  • Labels drawn only for the tier in focus, decluttered by screen-space box overlap, larger group wins.
  • Faint stars go genuinely sub-pixel, the way faint stars do. What made that unusable before was not the size but the target, so every star carries an invisible margin a few pixels wide on screen.
  • Constellations are picked by proximity to their stars rather than by one disc each. Forty-eight overlapping discs left any group buried under the pile unreachable.
  • Pinned constellations stay visible past the top of the zoom band, haloes at 0 and pointer events off.
  • Zoom readout on the right edge; follows replay frames.
  • Hover state reapplied after a zoom repaint.
2026-09-01
devlog

Atlas 2.0

Link building, placement, re-layout, preprocessing, constellations, moderation.

Links

  • A fixed similarity cutoff replaced with a per-dream rule: every dream keeps a line to its few closest matches, whatever the absolute score. The floor is a percentile of all pairs rather than a number, so it means the same thing at seven hundred dreams and at seventy thousand.
  • Links below the floor drawn dotted and faint. A dream with no strong match keeps one tether to its best.
links at 690 dreams17,330 → ~2,000
/explore build time15s → 0.08s

Placement

  • New dreams placed from the largest subset of their kNN that agree on a region, instead of the mean of all neighbours.
  • Dreams landing in empty space: 31% → 0%.
  • A de-crowding pass afterwards: 13 overlapping stars became 0, and the median star did not move at all.

Re-layout

  • The layout is warm-started from the current positions with a very small learning rate, so a well-placed star barely moves while a badly placed one migrates. Then it is rotated back onto the previous layout, because the same sky can arrive mirrored and that reads as everything having moved.
  • Rate-limited, and paused around a live exhibition submission.
mean star movement, cold refit3.37
mean star movement, warm start0.99
trustworthiness, cold refit0.852
trustworthiness, warm start0.856

2D capacity ceiling, knn@10 recall with a full rebuild at each size:

690 dreams0.334
1,700 dreams0.198
3,000 dreams0.124

Between 300 and 690 dreams, roughly 79% of links were rewritten with no star moving.

Preprocessing

  • Dream framing found by meaning rather than by a list of phrases: the opening is compared against example framings and example dream sentences, and removed only when it sits clearly nearer the framings and leaves enough dream behind. This is why it works in languages nobody wrote down.
  • Similarity bias between framed dreams: +51% → +13%.
  • Dreams about dreaming keep their opening.

Constellations

  • Louvain communities on the strong-link graph, one maximum spanning tree per group. 860 → 370 lines drawn.
  • OpenAI removed entirely. Naming is word counting: rate inside the group against rate in the atlas.
  • A word seen twice now counts when it is startlingly more common here than in the atlas at large. Three sightings were required before, which threw away "robots" in a group of twelve where it was twenty-two times its usual rate.
  • Names ranked by ratio × share. Ratio alone put "speaking" (2 of 19) above "remember" (13 of 19).
  • The coherence bar was lowered, with a lower one again for groups that have an unmistakable name. It had been set at a round number that sounded right rather than one anything required.
figures27 → 38 → 46
stars in a named figure56% → 79%

Dropped on spread: a 35-dream gun/bomb group, median radius 7.28 against a cap of 6.5.

Storage and moderation

  • Embeddings stored as raw numbers instead of text, 5.5× smaller.
  • Entries that are not dreams (spam, tests) are marked hidden rather than deleted. They leave the atlas and stop affecting anyone's neighbours, and the record of what was submitted is kept.
  • Growth timeline: 698 frames, 2.9 MB, links delta-encoded, appended rather than rebuilt on restart.

Mobile

  • Bottom sheet gesture rewritten. The header above the handle had pointer-events: none, leaving a 40×4px target; move and end events were bound to the drawer, so a drag died when the sheet moved out from under the finger; and positions were computed in vh as if translateY were measured from the top of the viewport.
  • growth.json (2.9 MB) loads on first interaction with the timeline instead of on page load.
  • Search results render below the input rather than above it.
2026-06-03
exhibition

LINZ FMR 26, Schlossberg

The telescope on the Linzer Schlossberg, 3–7 June 2026, with a DreamPicnic performance.
  • LINZ FMR 26, 3–7 June 2026, on the Linzer Schlossberg. The Schlosspark, Schlossmuseum, Rosengarten, Keplerwiese, Schlossbergstollen and Martinskirche turned into roughly five hectares of freely accessible exhibition, with more than twenty works alongside talks, performances and concerts.
  • DreamAtlas by Ahmed Jamal, Emma Silvana Tripaldi and Till Schönwetter, navigated through the repurposed telescope.
  • A DreamPicnic performance as part of the programme.
  • The festival's themes: digital afterlife and immortality, future archaeology and digital artifacts, digital deceleration and the new idyll, and AI societies, power structures and resistance.

linzfmr.at

2026-06-03
devlog

Cyberdeck kiosk and receipts

Kiosk mode, printer encoding, receipt layout, telescope panning.

Kiosk

  • Kiosk mode so visitors cannot exit the terminal.
  • Raspberry Pi setup: autostart on desktop boot, restart on exit, key lockdown.
  • Launcher checks several venv locations, warns if pygame is missing, and waits for the network before launching.

Printer

  • Switched to python-escpos, then back to a dependency-free raw-bytes printer.
  • Encoding fix for non-Latin characters.
  • Feed-motor "song" easter egg, tuned over several passes for tempo and for contrast between long and short feeds.
  • Buzzer probe script.
  • Hold T+E+A for ten seconds for GOOFY MODE.

Receipt

  • Zoomed-crop constellation on the receipt, y-orientation matched to the telescope, auto-fit.
  • Constellation enlarged to 360px with dots and lines scaled to match.
  • Dropped the "YOUR STAR" label and the constellation frame; tightened QR spacing; RA/DEC on one line.
  • Palette settled on amber-gold #e6961e after a rainbow version was reverted.

Telescope

  • Serves the frozen layout by default.
  • Coordinates in the UI.
  • Faster panning when zoomed out, and zooming further out allowed.
2026-05-30
devlog

Exhibition backend: frozen atlas and designations

A frozen layout for the show, a placement API, and a permanent identity for every dream.

Frozen atlas

  • Frozen layout plus a placement API, so a dream submitted at the exhibition is positioned without moving the existing sky.
  • Unfreeze / refreeze controls.
  • The frozen telescope accepts new dreams live, with no refresh.
  • Panning clamped to the constellation bounds.
  • Gentle twinkle for dreams added in the last few hours.

Designations

  • Dreams named by coordinate designation plus catalog number.
  • The unique dream id is embedded in the designation so two stars cannot collide.
  • The reversible star code was replaced by the designation everywhere, and the generated poetic dream_name and its wordlists were removed. The designation is the sole identity.

API and receipts

  • Cyberdeck API returns numeric ra_deg / dec_deg and neighbour x, y.
  • Star code and RA/Dec shown in the telescope preview.
  • Receipt shows the full dream text; multilingual crash fixed.
  • Cyberdeck terminal added to the repository; exhibition and cyberdeck documented in the READMEs.
2026-05-07
exhibition

[FUTURE] TERRITORIES, das LOT Vienna

Third edition of das LOT's annual transmedial exhibition, 7–10 May 2026.
  • [FUTURE] TERRITORIES at das LOT, Absberggasse 31, 1100 Vienna. Vernissage 7 May 2026 at 19:00, running to 10 May 2026.
  • The third edition of das LOT's annual transmedial exhibition, dedicated to interactive, performative and digital artistic practices, co-curated with NODE Media Lab.
  • Programme across the four days: opening performance by Sunggu Hong, guided tours, an open workshop, and an artist brunch.
  • DreamAtlas by Ahmed Jamal, Emma Silvana Tripaldi and Till Schönwetter: visitors contribute dreams anonymously, and dreams sharing emotions or imagery gravitate toward one another into a shared constellation, which is navigated through a repurposed telescope.

lot.wien/futureterritories

2026-05-06
devlog

Live dashboard and /window

GPT analysis wall replaced with a neighbours mini-UMAP; a second display view.
  • The GPT analysis wall on the live dashboard was replaced with a neighbours mini-UMAP.
  • Live dashboard: stats bar, sparkline, themes, smaller constellation, instructions panel. Word counter removed.
  • /window constellation view with a shooting-star animation on new dreams. Reverted once, then reinstated.
  • Admin privacy pass; telescope background fix.
2026-04-06
devlog

Connections: matching and encrypted chat

Match rooms between similar dreamers, anonymous messaging, notifications. Not public, still in testing.

In testing. Connections are built on accounts, which are not rolled out. Nothing here affects an anonymous submission.

Matching and chat

  • Similar-dreamer chat: match rooms, anonymous messaging, AJAX polling, nav links.
  • Accept / decline flow for connections, conversation starters, notification badges with polling.
  • Messages encrypted with Fernet; privacy notice shown.
  • Read status tracked per conversation.

Fixes

  • 404 instead of 403 for unauthorised access, so the existence of a resource is not disclosed.
  • UMAP crash with exactly two dreams (n_neighbors must be ≥ 2).

Profile

  • Personal constellation rewritten to match the main one: zoom, pan, similarity-based links, score-based nodes, tooltips, click to centre.
  • Full-screen constellation, dream modals, bottom sheet.
2026-04-02
devlog

Accounts and profiles

Registration and login, dream export, dependency bumps. Not public. Accounts are still in testing.

In testing. Accounts and everything built on them are not rolled out. The atlas is anonymous and open to anyone without signing in, and that has not changed.

  • User auth: registration, login, profile, encrypted email, deploy script.
  • Profile: delete and export dreams, dream timeline, date picker, own-dream highlighting, database backup on deploy.
  • Personal mini-constellation on the profile page.
  • Every dream guaranteed to have similar dreams; the OpenAI import made optional.
  • Dependencies updated for security fixes.
  • Impressum page; copyright notice.
2026-03-31
devlog

SEO and submission limits

Metadata and structured data; length limits and link blocking.
  • SEO pass: titles, descriptions, canonical URLs, Open Graph and Twitter cards, structured data, sitemap.
  • Minimum and maximum submission length; links rejected.
2026-02-24
devlog

Backend visualisation and UMAP caching

The how-it-works animation, cached layouts, mobile pass.
  • Scroll-driven backend visualisation, which became the how-it-works page.
  • UMAP results cached instead of recomputed per request.
  • Mobile optimisation pass.
  • About and how-it-works pages.
  • Promotional videos.
2025-09-03
exhibition

Ars Electronica Campus Award: Honorary Mention

Shown at the Interface Cultures exhibition at Post City during the Ars Electronica Festival, and given an honorary mention in the Campus Award 2025.
  • DreamAtlas shown during the Ars Electronica Festival 2025 at the Interface Cultures exhibition, Post City, Linz.
  • Honorary mention in the Campus Award 2025, the second edition of the award for outstanding projects in the Campus exhibition.
  • Interface Cultures students Emma Silvana Tripaldi, Ahmed Jamal and Till Schönwetter.
  • The installation ran on the telescope interface; the web version of the dream diary stayed open throughout and afterwards.

ars.electronica.art  ·  kunstuni-linz.at

2025-08-28
devlog

Live dashboard, telescope polish, explore page

A dashboard view with a QR code; smooth telescope movement.
  • /live dashboard page, with a QR code for submissions.
  • Telescope: smooth movement, smooth zoom, dream text, zoom centring, threshold zoom, text flip.
  • Explore page.
2025-08-16
devlog

Mobile pass and the bottom drawer

Mobile navigation, the first bottom sheet, and performance work.

Interface

  • Mobile navigation; JavaScript cleaned up for mobile.
  • First version of the bottom drawer, then elastic scrolling inside it, then duplicate bottom sheets removed.
  • Dream modal.
  • Lines no longer clickable.
  • Constellation visibility fixed on mobile.

Performance

  • Gamepad, arrow-key and DOM handling removed on mobile.
  • Default similarity threshold raised to 0.5 on mobile; 0.3 was very laggy.

Privacy

  • Dream privacy pass.
2025-07-09
devlog

Collapsible toolbar, about page

Toolbar folds away; similar-dream panel fixes.
  • Toolbar made collapsible.
  • Similar-dream panel bug fixed; dream selection fixed.
  • About page added.
2025-05-07
devlog

The telescope

A separate viewing interface, and a new embedding model.
  • Telescope page: a circular viewport onto the atlas.
  • New NLP model for embeddings.
  • Arrow-key and gamepad movement.
  • Dream modal in the telescope.
  • Page-load fix, fonts and styling.
2025-05-04
devlog

Stars, 404, caching fix

Background stars, and an infinite load on cached pages.
  • Background star canvas.
  • Stars on the 404 page.
  • Infinite loading fixed when returning to a cached page.
2025-04-21
devlog

Similarity threshold fix

Most-similar dreams showed nothing when every match fell below the threshold.
  • Most-similar dreams returned nothing when every match fell below the 0.50 threshold. Fixed.
2025-03-10
devlog

First version

Submission, storage, similar dreams.
  • Flask app: submit a dream, store it in SQLite, list all dreams.
  • Similar dreams by embedding similarity.
  • Delete-dream function.
  • The database taken out of version control, so that deploys stop overwriting live data. This took several attempts and recurred later.