Kiste
DE

Changelog

What changed in each version of Kiste — new features, improvements and bug fixes.

0.9.38 19 July 2026 Crisp pixels and the program's own folder

New

  • New umgebung.programm_ordner(): the folder your built program lives in. With it, an installed program reliably finds the files shipped alongside it — icons, example images, templates — no matter which folder it was launched from. Before, there was only the working directory, and a shortcut often points that elsewhere. For reading bundled files; for the user's own data the home folder is still the right place.

Fixed

  • Images you draw from a file with gui.bild_an are now scaled crisply (nearest-neighbor) instead of blurry when enlarged — pixel art stays razor-sharp, as it already did when drawing from memory (gui.leinwand_bild). Before, Kiste smoothed such images when stretching them, which smeared small pixels into mush.
0.9.37 18 July 2026 Pack and ship — ZIP on board, overlay images, animated GIF

New

  • Kiste can now pack: nutze pack gives you ZIP archives and gzip. Several files are bundled into one .zip (pack.zip_erstelle), a whole folder with a single call (pack.zip_aus_ordner), and unpacked again with pack.zip_entpacke — including protection against an archive placing files outside the target folder. Archives can also be built entirely in memory (pack.zip_von_bytes), and the compression level (0–9) is selectable. Plus gzip for single files. Everything is built into Kiste, no external program needed. The new chapter 37 in the handbook walks you through it.
  • New bild.zeichne_auf: draw one image onto another, with transparency — see-through edges stay see-through. This lets you assemble sprites or overlay images without losing transparency (unlike plain pixel-setting, which always paints opaque).
  • Animated GIF are hardened: they now loop endlessly, transparent edges no longer show through, and earlier frames do not ghost — even when the individual frames differ in size. The list of images may now also be built up step by step, not only as a fixed [a, b].
  • Three GUI helpers: gui.zeige_im_ordner opens the file manager and selects a file; gui.strg_beim_klick and gui.umschalt_beim_klick tell a click handler whether Ctrl or Shift was held — the basis for multi-selection.

Changed

  • The native „Save as" dialog no longer freezes the interface. When a program opened it right after another window (first a question, then Save), the first window stayed visibly stuck until everything was closed. The Save dialog now runs concurrently and the interface keeps redrawing cleanly — as it already did on Linux.
0.9.36 17 July 2026 Workshop polish — real OS dialogs and three silent traps

Changed

  • File dialogs with an extension filter — for example when a program only lets you pick images — now show your operating system’s usual window instead of a foreign-looking stand-in. On Windows that is the Explorer dialog, on Linux zenity or kdialog. The extension filter is passed along. (The unfiltered file picker was already native; now the filtered one follows.)
  • The text-entry dialog (such as „Wie soll die Sammlung heißen?") now puts the question above the text field, which gets the full width. Previously the question and the field sat on the same line, and with a longer question only a few characters of field were left. You can now confirm with Enter.

Fixed

  • A function that returns nothing silently handed back a 0 instead of „nichts" in a built program — wrong data without a warning, and different from running it with kiste run. Conversely gib nichts was rejected, even though the very same function with no gib at all passed without complaint. Both are fixed: „returns nothing" now behaves the same across all three ways of running a program. If you accidentally take the return value of such a function (nimm x = tuwas()), you now get the same clear message everywhere instead of an invented 0.
  • A global empty list — declared at the very top of the program — was invisible from inside functions: the program aborted with „unknown variable", even though the list sat visibly two lines above. It is now visible everywhere, as expected.
  • xs = [] (emptying a list) ran when interpreted but was rejected in a built program. An everyday pattern — it now works in both.
0.9.35 16 July 2026 A database on board — SQLite

New

  • Kiste now has a database: nutze db gives you SQLite — a full database that lives as a single file on your disk. No server, no installation, nothing to set up; it is already inside Kiste. This lets you ask questions such as „all works from 2020 on, sorted by year" or „how many are there anyway?" instead of loading an entire file and walking through it yourself.
  • Eleven functions: db.öffne (file) and db.öffne_speicher (memory only, ideal for practising), db.ausführe, db.abfrage, db.eine_zeile, db.ein_wert, db.letzte_id, db.schließe — plus db.beginne, db.bestätige and db.rolle_zurück for changes that belong together.
  • Values are passed as parameters, either by name (:titel plus a map) or in order (? plus a list) — never as glued-together text. That is both more convenient and safer.
  • db.abfrage returns a list of maps: one map per row, with the column name as the key. The new chapter 36 in the learning book walks you through it; no prior SQL knowledge needed.

Changed

  • Now written down: lists and maps are references. Passing a list or a map passes the same one — not a copy; changes are visible through every reference. That was always the intent, but it was never stated anywhere. It is now part of the language description and proven across all three ways of running a program.
  • The learning book now shows in 22.4b how to read values back out of a list of maps — until now it only showed how to build one.

Fixed

  • A map inside a list silently returned „nichts" instead of the value in a built program: given nimm werke = [{"titel": "Sonne"}], the expression werke[0]["titel"] returned nothing — with no error, and differently from running it with kiste run. Wrong data without a warning is worse than a crash, so this had priority. The odd part: mixed maps such as {"titel": "Sonne", "jahr": 2026} worked and uniform ones broke — which is exactly why it went unnoticed for so long.
  • A call inside string interpolation never worked: sag "{begrüßung(name)}" failed with „erwartet text, bekam Ganz". The same applied inside list and map literals, and in text.länge(begrüßung(name)). An everyday pattern — it works now.
  • wiederhole over a global list inside a function inferred the wrong parameter types — which is the most common layout of all: the data sits at the top of the program and a function walks through it.
  • A double-click on the canvas did nothing: the handler was accepted and never run. The canvas now really supports double-click (maus_x/maus_y give the position, and the single click still fires without delay). Widgets that cannot do a double-click now say so instead of silently ignoring it.
  • Mixed maps can now also be written to (m["titel"] = "Mond"), not just created.
0.9.34 15 July 2026 Big GUI expansion — professional interfaces

New

  • Scrollable areas, a wrapping tile grid and saveable splitter positions — long content no longer bursts the window.
  • Full-featured forms with input validation, a password field, a free-type combo box, a date field and a fine-grained slider. The submit button stays disabled until every field is valid.
  • Many new dialogs: enter text, pick a colour, show progress/please-wait, choose a folder, and file dialogs with an extension filter — plus right-click context menus on any element.
  • Formatted text via Markdown, clickable links, titled cards, icons, separators, collapsible sections (accordion) and custom icons from image files.
  • A tree widget for file and folder views, and sortable tables (click a column header).
  • App integration: desktop notifications, reading the clipboard, a “really close?” prompt when closing a window, and full tab control including tabs with an icon.
  • The GUI designer in the IDE knows all the new building blocks and properties — you can still assemble interfaces by drag-and-drop.
0.9.29 12 July 2026 Centre text neatly

New

  • Graphical programs can now measure the pixel width of a text (gui.text_breite) in a given font size. That makes it easy to centre text exactly — half the width to the left of the middle — instead of guessing a position. Handy for menus, scores and game-over screens.
0.9.28 11 July 2026 Walking through big images — now really fast

New

  • Graphical programs can now read all pixels of an image in ONE step (bild.hole_puffer) — the counterpart to setting them fast with bild.setze_puffer. Going through a large image pixel by pixel (to recolour it or convert its colours, say) used to be slowed down by thousands of individual lookups; a single bulk read now makes it many times faster.
0.9.27 11 July 2026 Windows at a fixed size

New

  • A window can now be pinned to its content size (gui.fenster_fest): the maximize button is disabled and the size can no longer be changed. Handy for small dialog and help windows that would only show empty space when maximized.
0.9.26 10 July 2026 Open links, copy text, your own icon

New

  • gui.öffne_url opens a web address in the default browser; if it starts with mailto:, the mail program opens instead.
  • gui.kopiere_text puts any text on the clipboard — useful, for example, to offer an address to copy instead of having it typed out.
  • gui.setze_app_icon turns your own logo (from a PNG file) into the program’s window and taskbar icon — instead of the neutral default.
0.9.25 10 July 2026 Table columns as wide as you like

New

  • Table column widths can now be set freely (gui.spalten_breite). Previously the width followed the content only and was capped — too narrow for reference tables with longer text, which got cut off. Now every text stays fully visible.
0.9.24 10 July 2026 The right mouse button — and one silent bug less

New

  • Graphical programs now listen to the right mouse button: gui.bei_maus_rechts reports the right click, and gui.maus_taste tells you in every mouse event which button is involved. Dragging with the right button held down works too. That gives a paint program the familiar setup: draw with left, erase with right.

Fixed

  • In a built program, json.erzeugt only handled values that came from json.geparst. A map you wrote yourself, such as {"name": "hero"}, silently turned text values into null, and numbers aborted the program. Now json.erzeugt writes every map and every list correctly — identically in the interpreter and in the built program.
  • Lists are now allowed wherever any value is accepted: json.erzeugt([1, 2, 3]) works, as do lists of maps and lists as a value inside a map.
0.9.23 July 9, 2026 Huge images in a flash

New

  • Graphical programs can now set a whole image in ONE step (bild.setze_puffer) instead of pixel by pixel. Large images are built dramatically faster — a full 1500×1000-pixel redraw dropped from several seconds to a fraction of a second.
  • Large drawing surfaces stay smooth: an image can sit on the canvas as a standing layer and is only re-applied when it has actually changed (gui.leinwand_bild_fest). So dragging shapes and panning no longer stutters, even on very large canvases.
0.9.22 July 9, 2026 Mouse cursor changes instantly

Fixed

  • A mouse cursor switched via a keyboard shortcut now appears immediately — previously the new cursor only showed once you moved the mouse.
0.9.21 July 8, 2026 Animated GIFs with a per-frame duration

New

  • Animated GIFs can now have an individual display duration for each frame (bild.schreibe_gif_animiert_dauern) — no longer just one fixed rate for all frames. Perfect for animations with frames of different lengths.
0.9.20 July 8, 2026 Rounded graphics

New

  • Graphical programs can now draw rounded, bordered shapes: rounded colour fills or plain outlines on the canvas (gui.rechteck_rund), and softly bordered “cards” around controls (gui.karte). This gives interfaces a soft, modern look.
0.9.19 July 8, 2026 Your own image as the mouse cursor

New

  • The mouse cursor over a canvas can now be your own image — an SVG or PNG file (gui.setze_cursor_bild). So in a paint program each tool can show its own recognizable cursor.
0.9.18 July 8, 2026 A cursor per tool

New

  • A canvas can change its mouse cursor (gui.setze_cursor): crosshair, hand, text or an eyedropper symbol — matching the active tool.
0.9.17 July 7, 2026 Tooltips follow the language

Changed

  • A tooltip on a control can now be changed at any time and takes effect immediately — handy when a program switches language and the tooltips should follow.
0.9.16 July 7, 2026 Open a second window

New

  • A program can now open a second window at runtime (gui.zeige after start) and close it again (gui.fenster_schließe) — ideal for dialogs or a separate tool/settings window while the main window keeps running.
0.9.15 July 7, 2026 Draw pixel graphics smoothly

New

  • An image you assembled in memory can now be drawn onto the canvas as a single, crisply scaled object (gui.leinwand_bild) — ideal for pixel graphics. Drawing stays smooth even for large areas, instead of being built from thousands of individual rectangles.
0.9.14 July 6, 2026 Windows open centered

Fixed

  • A program window now opens centered and fully visible on screen — previously it could run off the bottom or right edge depending on its size.
0.9.13 July 6, 2026 Maximize a window

New

  • A window can now be maximized from within the program (gui.maximiere): it fills the current monitor but keeps its title bar and the minimize and close buttons — unlike borderless fullscreen mode.
0.9.12 July 6, 2026 Query the screen size

New

  • Programs can now query the size of the screen work area (gui.bildschirm_breite and gui.bildschirm_höhe) — handy for adapting the window size to the monitor before the window is even opened.
0.9.11 July 6, 2026 Ctrl keyboard shortcuts work reliably

Fixed

  • The shortcuts Ctrl+Z, Ctrl+Y, Ctrl+C, Ctrl+V, Ctrl+X and Ctrl+A now fire reliably when you register them in your own program with gui.taste — previously the GUI system intercepted exactly these six, so they never arrived.
0.9.10 July 6, 2026 Relabel menus and checkboxes at runtime

New

  • A window’s menu bar can now be rebuilt at runtime (gui.menü_anwenden). Together with gui.setze_text this lets you change menu titles and entries while the program runs — for example a language switch that translates the whole interface at the press of a button.
  • gui.setze_text now also works on checkboxes, so their label can be changed while the program runs too.
0.9.9 July 5, 2026 Dialogs work in fullscreen too

Fixed

  • Yes/No and info dialogs (gui.dialog_frage, gui.dialog_info) are now real operating-system windows on Windows — just like the file dialogs already were. As a result they also respond when the program is running in fullscreen (previously the dialog appeared but could not be clicked).
0.9.8 July 5, 2026 A canvas that grows with the window & fullscreen

New

  • A drawing canvas can now grow with the window (gui.leinwand_elastisch): it fills the available space and adapts when you enlarge the window or switch to fullscreen. Query its current size with gui.leinwand_breite and gui.leinwand_höhe, and react to changes with gui.bei_größe.
  • Also new is gui.vollbild, to switch a window into fullscreen mode and back.
0.9.7 July 4, 2026 Native file dialogs & mouse wheel

New

  • Open and Save dialogs now use your system’s native file dialog instead of a custom window — the Explorer dialog on Windows, and zenity or kdialog on Linux (falling back to the previous dialog if neither is installed).
  • The canvas now has a mouse-wheel event (gui.bei_maus_rad, with gui.rad_dy / gui.rad_dx): use it to build things like zoom and pan in a drawing program.

Fixed

  • A tooltip on a control near the edge is no longer clipped past the window border — it moves back inside the window.
0.9.6 July 3, 2026 Nested lists of objects & tooltips

New

  • An object can now hold a list of objects, and you can address it in a nested way — for example frames[f].layers[e]…: a frame’s image, a layer within it, a pixel within that.
  • You can now add to and remove from a list of objects at runtime (list.append / list.remove) — they all have to belong to the same class.
  • Icon buttons can now have a tooltip: hover over a symbol for a moment and a small text appears explaining what it does (gui.setze_tooltip). This keeps interfaces with many symbols understandable.
0.9.5 July 2, 2026 Smoother drawing & lists of objects

New

  • A list of objects can now be used fully from inside functions too: address the element at a position directly (list[i].method()), read and change its fields, and reorder elements. Previously this only worked at the top level.

Changed

  • GUI programs that draw a lot now run noticeably smoother: the canvas updates the screen in one batch — once per frame instead of after every single stroke. This is most noticeable when a filled area is redrawn, for example while dragging out a line or a rectangle.
0.9.4 July 1, 2026 Save and load images

New

  • Kiste can now work with images: the new bild module lets you create an image, paint pixels or whole blocks into it, and save it as PNG, JPEG, GIF, BMP or TIFF — even as an animated GIF. Load existing images (including WEBP) with bild.lade.
  • The save dialog (gui.dialog_speichern) is now the real operating-system “Save as” dialog on Windows — a normal-sized window instead of a small box inside the program.
  • Drop-down lists (gui.auswahl_box) can now have an initial value: gui.setze_wert(list, "…") preselects it.
0.9.3 June 30, 2026 Centering layout, mouse release, icons and Swiss spelling

New

  • Toolbars and controls can now be centered and distributed cleanly: gui.zentriert(widget) places something in the middle of the available space, and gui.dehnbar() is a stretching spacer. Use it to center a group in a bar or push elements to the two edges — with no pixel arithmetic.
  • In addition to click and drag there is now also releasing the mouse button: gui.bei_maus_los calls your function as soon as you release the button after a drag. This lets you build tools you drag open — press, drag (with preview), release, done (for example line and rectangle).
  • Buttons can now also use the Undo and Redo arrow icons: gui.knopf_icon("", "rückgängig") or "wiederholen".
  • Kiste now also understands the Swiss spelling without ß: you may write built-in functions with “ss” instead of “ß” — text.grossgeschrieben works like text.großgeschrieben, gui.feste_grösse like gui.feste_größe. Both spellings work.
0.9.2 June 2026 Classes from functions, clearer operators

New

  • Class objects you create at the top level can now also be used from inside functions — calling methods and reading fields. Previously only simple values and lists were visible there.

Changed

  • In the Kiste IDE and on the website the comparison signs != <= >= now appear exactly as you type them — previously they were merged into ≠ ≤ ≥.
0.9.1 June 2026 Multi-line expressions

New

  • Long expressions can now span multiple lines — inside parentheses or with an operator at the end of a line. Nested conditions and calculations stay readable.
0.9.0 June 2026 First public release

New

  • The complete Kiste language, with German keywords and clear German error messages.
  • Native programs: your code becomes a standalone file that runs without installation (an .exe on Windows).
  • The Kiste IDE — an editor with syntax colours, errors flagged as you type, run with F5, auto-complete and a GUI designer for assembling windows by drag and drop.
  • Graphical interfaces (gui) and sound/music (klang) for your own programs and games.
  • 19 built-in modules — from text, lists and math to files, time, networking, JSON and CSV.
  • One-click installer for Windows; a Linux version in beta.
  • Tab completion in the IDE and an update check on startup.