Skip to main content
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. 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:

v0.19.0: fymo/authrenamedtofymo/auth renamed to auth

The client identity store’s import specifier changed. One find-and-replace migrates you:
A stale import fails the build with the instruction in the error:
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]:
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:
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 page for the full resolver, guard, and extras API.
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.

media: removed

Top-level media: in fymo.yml is gone. Exposure now lives nested under storage:, as an expose list.
A top-level media: key is a hard error, at boot and in fymo build:
Fix: move each entry under storage.expose. The keys don’t change.
fymo.yml
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 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.

_global.css removed

The old magic auto-injected app/templates/_global.css file is gone. Any project still shipping it fails the build.
Fix: move the file to app/assets/app.css, then import it explicitly:
app/templates/_layout.svelte
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.
fymo.yml
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 for the full picture.