Components v1 is deprecated

Hi.

I’m running Penpot 2.6.1 and trying to update to 2.7.1. Everything seems to be starting fine, but as soon as I try to open any project, I have this

And in the backend’s log

[2025-06-04 13:56:01.452] E app.http.errors - hint="restriction error" 
SUMMARY: 
 →  clojure.lang.ExceptionInfo: components v1 is deprecated (features.cljc:219) 
DETAIL: 
 →  clojure.lang.ExceptionInfo: components v1 is deprecated (features.cljc:219) 
    at: app.common.features$check_file_features_BANG_.invokeStatic(features.cljc:219) 
        app.common.features$check_file_features_BANG_.invoke(features.cljc:194) 
        app.http.middleware$wrap_parse_request$fn__60282.invoke(middleware.clj:93) 
        app.rpc.commands.files$sm$get_file.invoke(files.clj:308) 
        clojure.lang.AFn.applyToHelper(AFn.java:156) 
        clojure.lang.AFn.applyTo(AFn.java:144) 
        clojure.core$apply.invokeStatic(core.clj:669) 
        clojure.core$apply.invoke(core.clj:662) 
        app.db$tx_run_BANG_$fn__19054.invoke(db.clj:550) 
        next.jdbc.transaction$transact_STAR_.invokeStatic(transaction.clj:72) 
        next.jdbc.transaction$transact_STAR_.invoke(transaction.clj:51) 
        next.jdbc.transaction$eval18718$fn__18719.invoke(transaction.clj:152) 
        next.jdbc.protocols$eval17010$fn__17011$G__17001__17020.invoke(protocols.clj:58)
        next.jdbc$transact.invokeStatic(jdbc.clj:424) 
        app.http.middleware$wrap_errors$fn__60359.invoke(middleware.clj:200) 
        app.db$transact_BANG_.invokeStatic(db.clj:534) 
        app.db$transact_BANG_.invoke(db.clj:529) 
        app.db$tx_run_BANG_.invokeStatic(db.clj:545) 
        app.db$tx_run_BANG_.doInvoke(db.clj:536) 
        clojure.lang.RestFn.invoke(RestFn.java:445) 
        app.rpc$wrap_db_transaction$fn__35622.invoke(rpc.clj:156) 
        app.rpc.cond$wrap$fn__35242.invoke(cond.clj:66) 
        app.rpc$wrap_metrics$fn__35615.invoke(rpc.clj:135) 
        app.rpc$wrap_params_validation$fn__35635.invoke(rpc.clj:193) 
        app.rpc$wrap_authentication$fn__35618.invoke(rpc.clj:150) 
        clojure.core$partial$fn__5927.invoke(core.clj:2641) 
        app.rpc$rpc_handler.invokeStatic(rpc.clj:125) 
        app.rpc$rpc_handler.invoke(rpc.clj:90) 
        clojure.core$partial$fn__5927.invoke(core.clj:2641) 
        app.http.session$wrap_authz$fn__23462.invoke(session.clj:237) 

So it looks like something was not done when running the v2 migration. I don’t remember at which version I ran it, but I kept the logs and it seems everything was fine

$ ./run.sh app.migrations.v2
+ exec /opt/jdk/bin/java -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Dlog4j2.configurationFile=log4j2.xml -XX:-OmitStackTraceInFastThrow -Dpolyglot.engine.WarnInterpreterOnly=false --enable-preview -jar penpot.jar -m app.migrations.v2
  I app.metrics - action="initialize metrics"
  I app.db - hint="initialize connection pool", name="main", uri="postgresql://127.0.0.1:6432/penpot", read-only=false, with-credentials=true, min-size=0, max-size=60
  I app.migrations - hint="running migrations", module=:app.migrations/migrations
  I app.svgo - hint="initializing svg optimizer pool"
  I app.svgo - hint="stopping svg optimizer pool"

Any idea what can I do to fix this ?

1 Like

Hello @dani, i’m checking this issue with the team

1 Like

Hej :vulcan_salute:, same here. The upgrade from version 2.6.1 to 2.7 broke all projects with components. When I create a new team, I can import them, when no components are used. At the original team I get the same alert like @dani. When I import the projects to a new created team, I get the following alert: “Es scheint eine Nichtübereinstimmung zwischen den aktivierten Funktionen und den Funktionen der Datei zu geben. Die Migrationen für ‘components/v2’ müssen durchgeführt werden, bevor die Datei geöffnet werden kann.”.

Thanks for your work :heart: penpot is a great tool.

Your projects still use components v1, which was removed in 2.7.1. The migration script didn’t run properly before, even if logs seemed fine.

Fix:

  1. Backup everything.

  2. Downgrade to Penpot 2.2.0 (last version where the migration works).

  3. Run: ./run.sh app.migrations.v2 and check that it actually migrates files.

  4. Once done, upgrade again to 2.7.1.

Let me know if you have any questions

with 2.2.0, migration fails

$ ./run.sh app.migrations.v2
+ exec /opt/jdk/bin/java -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Dlog4j2.configurationFile=log4j2.xml -XX:-OmitStackTraceInFastThrow -Dpolyglot.engine.WarnInterpreterOnly=false --enable-preview -jar penpot.jar -m app.migrations.v2
SUMMARY:
 →  clojure.lang.ExceptionInfo: Missing definitions for refs: :app.storage.s3/backend, :app.storage.fs/backend, :app.storage.s3/backend, :app.storage.fs/backend (core.cljc:212)
DETAIL:
 →  clojure.lang.ExceptionInfo: Missing definitions for refs: :app.storage.s3/backend, :app.storage.fs/backend, :app.storage.s3/backend, :app.storage.fs/backend (core.cljc:212)
    at: integrant.core$missing_refs_exception.invokeStatic(core.cljc:212)
        integrant.core$missing_refs_exception.invoke(core.cljc:211)
        integrant.core$build.invokeStatic(core.cljc:336)
        integrant.core$build.invoke(core.cljc:316)
        integrant.core$init.invokeStatic(core.cljc:445)
        integrant.core$init.invoke(core.cljc:437)
        integrant.core$init.invokeStatic(core.cljc:442)
        integrant.core$init.invoke(core.cljc:437)
        app.main$start_custom$fn__47377.invoke(main.clj:569)
        clojure.lang.AFn.applyToHelper(AFn.java:154)
        clojure.lang.AFn.applyTo(AFn.java:144)
        clojure.lang.Var.alterRoot(Var.java:310)
        clojure.core$alter_var_root.invokeStatic(core.clj:5555)
        clojure.core$alter_var_root.doInvoke(core.clj:5550)
        clojure.lang.RestFn.invoke(RestFn.java:428)
        app.main$start_custom.invokeStatic(main.clj:565)
        app.main$start_custom.invoke(main.clj:562)
        clojure.lang.Var.invoke(Var.java:386)
        app.migrations.v2$_main.invokeStatic(v2.clj:96)
        app.migrations.v2$_main.doInvoke(v2.clj:87)
        clojure.lang.RestFn.invoke(RestFn.java:400)
        clojure.lang.AFn.applyToHelper(AFn.java:152)
        clojure.lang.RestFn.applyTo(RestFn.java:135)
        clojure.lang.Var.applyTo(Var.java:707)
        clojure.core$apply.invokeStatic(core.clj:667)
        clojure.main$main_opt.invokeStatic(main.clj:515)
        clojure.main$main_opt.invoke(main.clj:511)
        clojure.main$main.invokeStatic(main.clj:665)
        clojure.main$main.doInvoke(main.clj:617)
        clojure.lang.RestFn.applyTo(RestFn.java:140)
        clojure.lang.Var.applyTo(Var.java:707)
        clojure.main.main(main.java:40)
    dt: {:reason :integrant.core/missing-refs,
         :config
         {:app.storage/storage
          {:app.db/pool #integrant.core.Ref{:key :app.db/pool},
           :app.storage/backends {:s3 #, :fs #, :assets-s3 #, :assets-fs #}},
          :app.db/pool
          {:app.db/max-lifetime 1800000,
           :app.db/validation-timeout 10000,
           :app.db/username "penpot",
           :app.db/uri "postgresql://127.0.0.1:6432/penpot",
           :app.db/name :main,
           :app.db/idle-timeout 120000,
           :app.db/password "b6b2ca31-3cde-d4d5-bb2b-6be30ec431f2",
           :app.db/min-size 0,
           ...},
          :app.setup/props
          {:app.db/pool #integrant.core.Ref{:key :app.db/pool},
           :app.setup/key "+wBekehEqLWRMODD+lu59EQ8It3VGWT/h.j_GrKMXZ5AUpoU/A",
           :app.main/migrations #integrant.core.Ref{:key :app.migrations/migrations}},
          :app.svgo/optimizer {},
          :app.metrics/metrics
          {:default
           {:session-update-total #,
            :audit-http-handler-concurrency #,
            :rpc-climit-queue #,
            :update-file-changes #,
            :rpc-query-timing #,
            :websocket-session-timing #,
            :rpc-climit-timing #,
            :executors-completed-tasks #,
            ...}},
          :app.migrations/migrations #:app.db{:pool #integrant.core.Ref{:key :app.db/pool}},
          :app.http.client/client {}},
         :missing-refs (:app.storage.s3/backend :app.storage.fs/backend :app.storage.s3/backend :app.storage.fs/backend)}

Downgrading to 2.0.0, the migration seems to be OK

penpot@300028d6513c:~/backend$ ./run.sh app.migrations.v2
+ exec /opt/jdk/bin/java -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Dlog4j2.configurationFile=log4j2.xml -XX:-OmitStackTraceInFastThrow -Dpolyglot.engine.WarnInterpreterOnly=false --enable-preview -jar penpot.jar -m app.migrations.v2
[2025-06-05 10:09:38.606] I app.metrics - action="initialize metrics"
[2025-06-05 10:09:38.619] I app.db - hint="initialize connection pool", name="main", uri="postgresql://127.0.0.1:6432/penpot", read-only=false, with-credentials=true, min-size=0, max-size=60
[2025-06-05 10:09:38.647] I app.migrations - hint="running migrations", module=:app.migrations/migrations
[2025-06-05 10:09:39.020] I app.svgo - hint="initializing svg optimizer pool"
[2025-06-05 10:09:39.178] I app.svgo - hint="stopping svg optimizer pool"
penpot@300028d6513c:~/backend$ 

But if I then go back to 2.7.1, I still have the error message from my first post, and can’t open any project

Same here. Downgrading and run the migrate.v2 has no effect. It seems, that the component-handling has an issue. The migration.v2 script was for the upgrade from penpot version 1.x to version 2 as far as I know. The release-infos for penpot version 2.7 announces an update of the assets management, is there the components effected also? The version I has running before upgrading to version 2.7 was 2.5. An update to version 2.6.2 was no problem. The issues showing by upgrading from 2.6.2 to 2.7.0/2.7.1, by no more editing any project of an existing team. When I create a new team and migrate some projects, the projects that are using no components are running. But every project, that uses components are broken and penpot will not working.

I hope the description of the issue helps to find a solution.

Thanks for the feedback, I reported this back to the team