> ## Documentation Index
> Fetch the complete documentation index at: https://fymo.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Upgrading

> Every breaking change between v0.13 and current Fymo, the exact error each one prints, and the fix.

Fymo ships no compatibility shims before 1.0. When something is removed, the app fails loudly at boot or build time, and the error message is the migration instruction. This page collects those moments in one place, newest first.

## v0.20.0: generators

New surface only, nothing breaking for existing apps. `fymo generate` grew page, remote, resource, component, layout, broadcast, and templates subcommands, and `fymo destroy` reverses the first three. See [Generators](/generators).

The examples in the Fymo repo are now pure generator output, so reading `examples/` is reading what the generators produce.

## v0.19.1: fymo --version tells the truth

`fymo --version` now reports the installed package metadata instead of a stale hardcoded string. It used to print `0.1.0` no matter what was installed; if a script parsed that constant, it was being lied to. The new output is truthful:

```
$ fymo --version
fymo, version 0.20.0
```

## v0.19.0: $fymo/auth renamed to $auth

The client identity store's import specifier changed. One find-and-replace migrates you:

```svelte theme={null}
import { identity } from '$auth';
```

A stale import fails the build with the instruction in the error:

```
app/templates/home/index.svelte:2:25: ERROR: [plugin: fymo-auth]
$fymo/auth was renamed to $auth, update the import (found '$fymo/auth')
```

The generated store module also moved flat, from `dist/client/_fymo/auth.js` to `dist/client/_auth.js`, in case any tooling referenced the old path.

## v0.18.1: console.log during SSR

`console.log` in a component rendered on the server used to corrupt the sidecar's stdout protocol and hang the request, silently. Fixed: component console output during SSR now surfaces in `fymo dev`'s terminal, prefixed `[sidecar]`:

```
[sidecar] hello from SSR
```

No action needed. If you ever worked around this by stripping console.log before SSR, delete the workaround.

## Identity rework (\~v0.18)

Fymo used to own a user model. It doesn't anymore. Identity is now just a `uid` string your app produces through resolvers you write in `app/auth/`.

**Removed:**

* The `User` dataclass, the `UserStore` Protocol, `SqliteUserStore`, `PostgresUserStore`, and both hand-synced DDL files (`fymo/auth/schema.sql`, `schema_postgres.sql`). The `fymo_users` / `fymo_user_oauth_identities` tables are gone.
* Every shipped auth provider (`fymo/auth/providers/`: password, Clerk, OAuth, registry), the built-in signup/login/logout/me remotes (`fymo/auth/remote.py`), plus `fymo/auth/email.py` and `fymo/auth/session.py`.
* `current_user()`, `get_user_store()` / `set_user_store()`, the legacy session-resolver chain, `DECOY_HASH`.
* The `auth:` block in `fymo.yml` (`enabled`, `user_store`, `providers`).
* The `fymo[clerk]` extra, the `pyjwt` dependency, and the `oidc` / `oauth` placeholder extras. (`fymo[postgres]` stays, jobs still use psycopg.)

A `fymo.yml` that still has an `auth:` block fails at boot and in `fymo build`:

```
the `auth:` block was removed, identity now lives in code. Run
`fymo generate auth` (password login, or --clerk / --skeleton) to
scaffold app-owned auth into app/auth/, then delete the auth: block
from fymo.yml. @require_auth still guards remote functions;
route-level `require_auth:` guards pages.
```

**Fix:**

1. Delete the `auth:` block from `fymo.yml`.
2. Run `fymo generate auth` (or `--clerk` / `--skeleton`) and edit the generated code, it's yours now.
3. Remotes keep `@require_auth`; pages use route-level `require_auth:` instead of anything in config.
4. Replace `current_user().email`-style access with `identity_extras()`, or the generated typed accessor, `app/auth/extras.py`'s `current_extras()`.

`examples/blog_app` in the Fymo repo is the reference migration, a real app moved through this exact change. See the [Authentication](/auth) page for the full resolver, guard, and extras API.

<Note>
  This is not the same removal as the reserved-prefix warning below. Identity has nothing to do with `/dist/` or `/static/`, those only matter for `storage.expose` collisions, covered next.
</Note>

## media: removed

Top-level `media:` in `fymo.yml` is gone. Exposure now lives nested under `storage:`, as an `expose` list.

<Warning>
  A top-level `media:` key is a hard error, at boot and in `fymo build`:

  ```
  top-level `media:` was removed, exposure now lives under `storage.expose`.
  Move each media entry under storage: unchanged (prefix/dir/extensions
  keep their meaning).
  ```
</Warning>

**Fix:** move each entry under `storage.expose`. The keys don't change.

```yaml fymo.yml theme={null}
storage:
  provider: local
  root: data
  expose:
    - prefix: /media/videos/
      dir: videos
      extensions: [webm]
```

Reserved prefixes for `storage.expose` collision warnings are `/dist/` and `/static/`, not `/assets/`. Overlapping one of those only prints a warning, it doesn't fail the build. See [Storage and media](/storage-and-media) for the full expose pipeline.

## /assets/ -> /static/

The URL prefix that served files out of `app/static/` moved. It used to be `/assets/`, it's `/static/` now. The old prefix isn't redirected and doesn't dual-serve, it simply falls through to routing and returns a clean 404.

**Fix:** grep your app for `/assets/` and change it to `/static/`. That's the whole migration.

```
grep -r "/assets/" app/
```

## \_global.css removed

The old magic auto-injected `app/templates/_global.css` file is gone. Any project still shipping it fails the build.

<Warning>
  ```
  Error: _global.css is no longer auto-injected. Move it to app/assets/app.css
  and add `import '../assets/app.css'` to app/templates/_layout.svelte.
  ```
</Warning>

**Fix:** move the file to `app/assets/app.css`, then import it explicitly:

```svelte app/templates/_layout.svelte theme={null}
<script>
  import '../assets/app.css';
</script>
```

Any other loose `.css` file under `app/templates/` (outside a component's own `<style>` block) hits a similar hygiene error at build time, naming the offending path. Stylesheets live in `app/assets/` now.

## remote.mode replaces old flags

`remote.explicit_optin` and `remote.allow_implicit` still work, for one deprecation cycle, but they're deprecated in favor of a single `remote.mode` key. Nothing breaks today if your `fymo.yml` still has the old booleans, but plan to move off them.

```yaml fymo.yml theme={null}
remote:
  mode: strict
```

`strict` only dispatches `@remote`-decorated functions. `implicit-legacy` dispatches every public, type-annotated function in `app/remote/*.py`, the old default behavior, kept around for projects migrating off it gradually. See [Remote functions](/remote-functions) for the full picture.
