---
url: /blog/2026/v0.6.5.md
description: >-
  v0.6.5 fixes the root .gitignore that stopped committing the derivation cache,
  static files with spaces in their names, and aliases that answered differently
  in dev and production.
---

A fix release. One fix comes straight out of `v0.6.4` and needs a minute of your time.
The rest are older bugs, found while chasing it.

## The .gitignore

Moving `lib/` into `var/` had a side effect I missed.

Projects created since late August ignore `/var/` as a whole.
That was fine while `var/` held only the Vite cache.
Now it holds `var/lib/` too, and git never reads a `.gitignore` inside an ignored folder.

So the derivation cache, the `cache.json` files `var/lib/.gitignore` is there to keep,
quietly stopped being committed. Every fresh clone and every CI run paid for a full rebuild.

New projects get the right rule out of the box now.
For an existing project, replace the `/var/` line in your root `.gitignore` with these two:

```txt [.gitignore]
/var/*
!/var/lib/
```

Everything else in `var/` stays ignored, and `var/lib/` follows its own rules again.
That's the minute.

## Static files with spaces in their names

`dist/run.js` looked up files by the URL as it arrived, still percent-encoded.
So `public/My Photo.png` was requested as `/My%20Photo.png`, never found,
and answered with `index.html` and a `200`.

Paths are decoded now, so files with spaces or non-ASCII names are served as they should be.

And a missing file under `assets/` is a `404` now, not `index.html`.
That's the hashed chunk a browser still asks for after a deploy,
and it's better reported as missing than parsed as HTML.

## Aliases answer the same everywhere

The dev server, `dist/run.js` and the SSR server each had their own copy
of the rules that decide which folder answers a URL.
Three copies, and in one case they disagreed.
In a client-rendered folder, an alias that sits under the folder's own frontend base,
say `/shop/feed.xml` with pages at `/shop` and the API at `/api`,
reached the backend in dev and got `index.html` in production.

The rules live in one place now, and all three servers use it.
And the rule itself is written down:
an alias names one exact URL, so it wins over any base, the folder's own or another folder's.
[Details ›](/backend/aliases#an-alias-wins-over-any-base)

One behavior change comes with it.
An alias under another folder's longer base used to be answered by that folder.
Now the alias wins there too.

## Deleted routes clean up after themselves

Deleting an API route left its derived files behind in `var/lib/`:
types, schemas, the fetch client, and the derivation cache.
With the cache committed again, those would have stayed in git too.

Now the dev server removes them when the route goes away.
Nested routes keep theirs, and folders left empty are removed.

This happens while the dev server is running.
Routes deleted while it is off, say on a branch switch, still leave their files behind.
Delete `var/lib/` in that case, and the next start rebuilds it.
