From cdfdbf9adc419093d6be14c2f2abd9683199a7a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Valderrama?= Date: Fri, 28 Aug 2026 09:49:13 +0200 Subject: [PATCH 1/8] :bug: Fix labels for teams navigation and personal files section (#11398) --- frontend/src/app/main/ui/dashboard/sidebar.cljs | 10 +++++----- frontend/translations/en.po | 8 ++++---- frontend/translations/es.po | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frontend/src/app/main/ui/dashboard/sidebar.cljs b/frontend/src/app/main/ui/dashboard/sidebar.cljs index ed39edaaf1..3036dad42c 100644 --- a/frontend/src/app/main/ui/dashboard/sidebar.cljs +++ b/frontend/src/app/main/ui/dashboard/sidebar.cljs @@ -371,8 +371,8 @@ [:span {:class (stl/css :my-teams-icon)} [:> raw-svg* {:id penpot-logo-icon-subtle}]] [:span {:class (stl/css :team-text) - :title (tr "dashboard.my-teams")} - (tr "dashboard.my-teams")] + :title (tr "dashboard.other-teams")} + (tr "dashboard.other-teams")] (when (= default-team-id (:default-team-id organization)) tick-icon)] (when (seq organizations) @@ -438,7 +438,7 @@ (when-not (contains? cf/flags :admin-console) [:span {:class (stl/css :penpot-icon)} deprecated-icon/logo-icon]) - [:span {:class (stl/css :team-text)} (if (contains? cf/flags :admin-console) (tr "dashboard.my-files") (tr "dashboard.your-penpot"))] + [:span {:class (stl/css :team-text)} (if (contains? cf/flags :admin-console) (tr "dashboard.personal-projects") (tr "dashboard.your-penpot"))] (when (= default-team-id (:id team)) tick-icon)] @@ -835,7 +835,7 @@ [:span {:class (stl/css :my-teams-icon-xxxl)} [:> raw-svg* {:id penpot-logo-icon-subtle}]] [:span {:class (stl/css :team-text)} - (tr "dashboard.my-teams")]] + (tr "dashboard.other-teams")]] [:* [:> organization-avatar* {:organization current-organization :size "xxxl"}] [:span {:class (stl/css :team-text)} @@ -972,7 +972,7 @@ :team-name-no-logo nitrate?)} (when-not nitrate? [:span {:class (stl/css :penpot-icon)} deprecated-icon/logo-icon]) - [:span {:class (stl/css :team-text)} (if nitrate? (tr "dashboard.my-files") (tr "dashboard.default-team-name"))]] + [:span {:class (stl/css :team-text)} (if nitrate? (tr "dashboard.personal-projects") (tr "dashboard.default-team-name"))]] (and (contains? cf/flags :subscriptions) (not is-default?) diff --git a/frontend/translations/en.po b/frontend/translations/en.po index d4b5f28d2c..50bf6b331e 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -875,8 +875,8 @@ msgid "dashboard.move-to-other-team" msgstr "Move to other team" #: src/app/main/ui/dashboard/sidebar.cljs:348, src/app/main/ui/dashboard/sidebar.cljs:349, src/app/main/ui/dashboard/sidebar.cljs:761 -msgid "dashboard.my-teams" -msgstr "My Teams" +msgid "dashboard.other-teams" +msgstr "Other teams" #: src/app/main/ui/dashboard/files.cljs:106, src/app/main/ui/dashboard/projects.cljs:253, src/app/main/ui/dashboard/projects.cljs:254 msgid "dashboard.new-file" @@ -1440,8 +1440,8 @@ msgstr "Your name" msgid "dashboard.your-penpot" msgstr "Your Penpot" -msgid "dashboard.my-files" -msgstr "My Files" +msgid "dashboard.personal-projects" +msgstr "Personal Projects" #: src/app/main/ui/alert.cljs:36 msgid "ds.alert-ok" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index d9421628a4..4ff509285e 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -879,8 +879,8 @@ msgid "dashboard.move-to-other-team" msgstr "Mover a otro equipo" #: src/app/main/ui/dashboard/sidebar.cljs:348, src/app/main/ui/dashboard/sidebar.cljs:349, src/app/main/ui/dashboard/sidebar.cljs:761 -msgid "dashboard.my-teams" -msgstr "Mis Equipos" +msgid "dashboard.other-teams" +msgstr "Otros equipos" #: src/app/main/ui/dashboard/files.cljs:106, src/app/main/ui/dashboard/projects.cljs:253, src/app/main/ui/dashboard/projects.cljs:254 msgid "dashboard.new-file" @@ -1447,8 +1447,8 @@ msgstr "Tu nombre" msgid "dashboard.your-penpot" msgstr "Tu Penpot" -msgid "dashboard.my-files" -msgstr "Mis Archivos" +msgid "dashboard.personal-projects" +msgstr "Proyectos Personales" #: src/app/main/ui/alert.cljs:36 msgid "ds.alert-ok" From 18ebf5a92d6eb2752b010b5e69861a82b9c3fad9 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Fri, 28 Aug 2026 10:40:25 +0200 Subject: [PATCH 2/8] :books: Add highlights file (#11406) --- .gitignore | 1 + HIGHLIGHTS.md | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 HIGHLIGHTS.md diff --git a/.gitignore b/.gitignore index 382b89c92f..ec067552ff 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ opencode.json !AGENTS.md !CODE_OF_CONDUCT.md !SECURITY.md +!HIGHLIGHTS.md /*.png /*.svg /*.sql diff --git a/HIGHLIGHTS.md b/HIGHLIGHTS.md new file mode 100644 index 0000000000..e66b4b4497 --- /dev/null +++ b/HIGHLIGHTS.md @@ -0,0 +1,26 @@ +# HIGHLIGHTS + +## 2.17.0 + +- Background blur is here +- WebGL rendering gets stronger +- MCP connection status and more +- Design tokens: more visible, more user-friendly + + +## 2.16.0 + +- Design tokens in the design panel +- Major community contributions +- WebGL rendering (beta) + + +## 2.15.0 + +- AI connected to real design context +- Multi-directional workflow +- Your stack, your model, your decision + + + + From eb0c51ed7440a8f55bb8531836db25070d242bfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Valderrama?= Date: Fri, 28 Aug 2026 10:41:25 +0200 Subject: [PATCH 3/8] :books: Rename personal space label from Your Penpot to Personal Projects (#11399) --- docs/img/teams/team-selector-projects.webp | Bin 10182 -> 6850 bytes docs/img/teams/team-selector.webp | Bin 2484 -> 1256 bytes .../account-teams/projects-files.njk | 2 +- docs/user-guide/account-teams/teams.njk | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/img/teams/team-selector-projects.webp b/docs/img/teams/team-selector-projects.webp index e1696680ec94df5c4e26675fd21e40f2e50b1581..c7ba762604210316ba1bac82687a5a1f1206db3c 100644 GIT binary patch literal 6850 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 literal 10182 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 SbkqQuaS(t20000000016eRK5y literal 2484 zcmaKuc{tQ-8^<3}3`#=Ts%BVH^`7^=pX&JBbB99+{sc&a-C?|? zxh}-+5F@<)#;$*3H-G$&J`U1o`d$v&*=xskPRHxvXJr9BxgZw@fxsM~fzHnPp*du@ zJOI?b0>Ga1E9VMzuPO!r;SaxZ(o_KWq5-Jv{+0XH6Mq-H%a7M_KyjC+CjhJW0oZE? zfWR97xG(-#gTnu)4Gt}dLv`Vx;RP-O4*&-k;0N4*B1FFdC2$g)hQ2Voo)Z9nHIU7A zoW*trX#1*AFa?r%5)ydBh={#pAHVS+EOUh4JT7T*^z6}ZBqc5Nt6;{HHM=pjh`yK4 zoGG(e>&EhphYxLZH8f5328mUoR!O2c*Sc^DjO4G%Yfk-J3rityDJjU6tcfx9732)+ zQ=M4&(>1ZWB}xv*GqA;+t6-v;NQH3IF!t~hEc&);S(%x7uAkRXCS#gZ^WQ*G{9NSL zrrEHkr7%%=bxZ6(x+WU)bjvST82zf~+?J5=#1Iz1f_nZ`LFc|-hCqJzXY zSR(skc#T{d$;EEf2Qf|}; z9L$*~Xe8V5v#|egENQvui02Yd4eeHssv3Wo_qCgbx&$WosgG*tVMNhsU1u4KMj(IkUHl-+bI%pab`9sw#IXGF zdyZ#}@%LRnCX`a|s8}#0NgiCwrXA_podQITW(iqBwafhcnNs-P2D`B&rXb-4%thA! zs?uxhTfvVQ`m8&HW?G#@1NRTzaCf}tcWO_R%;DWY#VFyfcP%R5{Z#z+?DyIIHLdTY z<{INmH)c50N55H(3%`zvz!{f!WH1o>j>nuZv#FrG%nTEA`RMT>^)5TzcG%-C~|3x1kAXaR8yELBXB!y z#EL%7mEg<%I%2U{kfcn`%1)7=c5LoL|I5hQ@HdxO``m$nty`A)19n-T2OCtmM%ysN zZ;2Rgc>0k1C+Aw<@X@tKELKPxc^mN8u4SP1Wzxn#>o83E5XlgCghTz>(8KmG^e58k zccKllNHG25IsuF`Ab07p{?f3~b${y#4cbs}>~%ezI26yZR1Hd~rW{Mr;f0loEn6>R zA~Yf{I2YrC^$WT@81;UHMK8-W4xYJ54!b7zOb{^tXmqM|eD?kDZO!w2R-uz;lZc8P zCIKcnbA22^08X>JbM>JVO-x0bev#lfi#wH`5B8f4{g5aIjJUghjm`>?aVI=%e88t{i9VIP9d;^r<=Ift9V388xnSs#juN9P+!e{cj|;2d%i z)^H46FCn=JjGKAC>QS$E)x(v)-)~{ogv9V}R;=@hf2o!`EG@Duhmfn~3L%#X5o;cN z5sdd(x%Z4;M;F#;x*dFjA{u;`mv(H`gdDPE+-$>hZgj=a*%e0r(Q!fDzC(fL`6 zyR2QUDR)vl)?ra^Mp&;br*AqO6Tv;v{p?p6cSho7)k)MBgL6ft7kyL{2nXkfe0I6A zY|g%|TGWdh+309ex65XZ3C1Utlz(lodY=?7?4mAhFRAt-Lp2@^$8-0j20R@zcg8ec zl-?lDZHzaHAZGS46$D$zZN&AQChvVzB{h;MDn(+6O?Nm*ad+v0ov7XK6Gp!8#mM6B zOwTzX50gYBQx>;iE!!e;x@)#cg`fV=Oy=2!=zNk(*UW1ZmFGg-dEipkae`pm1dheqS>KXLoryUD|bEqEM_l(K-`;Ol0-&IE})6{_PsWg zdXsKL(WP78DXVB=1cippZgJ?&Ug5lbc}&4>mFCY44|D26Wb04?;1qG5B`ic`)o&Q* ZX_1c9D?t~SAlV$r<^tUg{sPr(DY^gv diff --git a/docs/user-guide/account-teams/projects-files.njk b/docs/user-guide/account-teams/projects-files.njk index 9345cd4f45..02f1afd38c 100644 --- a/docs/user-guide/account-teams/projects-files.njk +++ b/docs/user-guide/account-teams/projects-files.njk @@ -10,7 +10,7 @@ desc: Learn how to organize your work in Penpot. Create, manage and organize pro

Projects

Projects are containers that help you organize and group related design files together. Think of them as folders in a file system. You can create as many projects as you need to organize your work by client, product, feature, or any other structure that fits your workflow.

-

If you're working with others, projects should be created inside a team so that team members can collaborate on the files within them. Projects created in your personal space ("Your Penpot") remain private to you.

+

If you're working with others, projects should be created inside a team so that team members can collaborate on the files within them. Projects created in your personal space ("Personal Projects") remain private to you.

Projects view in dashboard
diff --git a/docs/user-guide/account-teams/teams.njk b/docs/user-guide/account-teams/teams.njk index 67fbc78187..550cf81390 100644 --- a/docs/user-guide/account-teams/teams.njk +++ b/docs/user-guide/account-teams/teams.njk @@ -16,7 +16,7 @@ member is allowed to do depends on their permissions.

Select team

At the top left of the dashboard you can find the team selector.

-

"Your Penpot" is the name of your personal space at Penpot. It is like any other team but in which no members can be invited so that you will always have your own private dashboard. Create or join other teams to collaborate with other Penpot users.

+

"Personal Projects" is the name of your personal space at Penpot. It is like any other team but in which no members can be invited so that you will always have your own private dashboard. Create or join other teams to collaborate with other Penpot users.

Teams selector

Create teams

From f06d1df5bed8bc7ea5db2d12df10df139f98522e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20L=C3=B3pez?= Date: Fri, 28 Aug 2026 11:54:02 +0200 Subject: [PATCH 4/8] :bug: Align management API with payments service (#11414) --- backend/src/app/http/management.clj | 2 +- backend/src/app/nitrate.clj | 2 +- backend/src/app/srepl/cli.clj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/app/http/management.clj b/backend/src/app/http/management.clj index 507a518e5c..f72c4b6d14 100644 --- a/backend/src/app/http/management.clj +++ b/backend/src/app/http/management.clj @@ -209,7 +209,7 @@ [:enum "customer_service" "low_quality" - "missing_feature" + "missing_features" "other" "switched_service" "too_complex" diff --git a/backend/src/app/nitrate.clj b/backend/src/app/nitrate.clj index 2d7c4e22f7..a189116458 100644 --- a/backend/src/app/nitrate.clj +++ b/backend/src/app/nitrate.clj @@ -245,7 +245,7 @@ [:enum "customer_service" "low_quality" - "missing_feature" + "missing_features" "other" "switched_service" "too_complex" diff --git a/backend/src/app/srepl/cli.clj b/backend/src/app/srepl/cli.clj index dc44047e32..c47043cbad 100644 --- a/backend/src/app/srepl/cli.clj +++ b/backend/src/app/srepl/cli.clj @@ -232,7 +232,7 @@ [:enum "customer_service" "low_quality" - "missing_feature" + "missing_features" "other" "switched_service" "too_complex" From 10e40e62a249f6f28d778244768eff5e5bf9c309 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Fri, 28 Aug 2026 13:58:18 +0200 Subject: [PATCH 5/8] :sparkles: Add airgapped check to nitrate (#11421) --- frontend/src/app/main/data/nitrate.cljs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/data/nitrate.cljs b/frontend/src/app/main/data/nitrate.cljs index 2addcc0429..4be62a2cbf 100644 --- a/frontend/src/app/main/data/nitrate.cljs +++ b/frontend/src/app/main/data/nitrate.cljs @@ -43,15 +43,25 @@ (swap! storage/storage dissoc nitrate-entry-pending-popup-key))) +(def ^:private offline-connectivity + {:licenses false}) + +(defn- air-gapped? + [] + (contains? cf/flags :air-gapped-conf)) + (defn show-nitrate-popup ([popup-type] (show-nitrate-popup popup-type {})) ([popup-type extra-props] (ptk/reify ::show-nitrate-popup ptk/WatchEvent (watch [_ _ _] - (->> (rp/cmd! ::get-nitrate-connectivity {}) - (rx/map (fn [connectivity] - (modal/show popup-type (merge (or connectivity {}) extra-props))))))))) + (if (air-gapped?) + (rx/of (modal/show popup-type (merge offline-connectivity extra-props))) + (->> (rp/cmd! ::get-nitrate-connectivity {}) + (rx/map (fn [connectivity] + (modal/show popup-type + (merge (or connectivity {}) extra-props)))))))))) (defn build-admin-console-url ([path] From c01306734a8433905e8e0cebabe9132adb63bc4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Valderrama?= Date: Fri, 28 Aug 2026 14:04:56 +0200 Subject: [PATCH 6/8] :bug: Fix default team and UI labels to use Personal Projects (#11418) * :bug: Fix default team and UI labels to use Personal Projects * :paperclip: Code review --- .../email/request-file-access-yourpenpot-view/en.html | 2 +- .../email/request-file-access-yourpenpot-view/en.txt | 2 +- .../app/email/request-file-access-yourpenpot/en.html | 2 +- .../app/email/request-file-access-yourpenpot/en.txt | 2 +- backend/src/app/email.clj | 4 ++-- backend/src/app/rpc/commands/nitrate.clj | 2 +- backend/src/app/rpc/commands/profile.clj | 2 +- backend/src/app/rpc/commands/teams.clj | 4 ++-- backend/src/app/rpc/management/nitrate.clj | 10 +++++----- .../test/backend_tests/rpc_management_nitrate_test.clj | 2 +- frontend/playwright/ui/pages/DashboardPage.js | 2 +- frontend/playwright/ui/pages/OnboardingPage.js | 2 +- frontend/src/app/main/ui/dashboard/file_menu.cljs | 2 +- frontend/src/app/main/ui/dashboard/fonts.cljs | 2 +- frontend/src/app/main/ui/dashboard/libraries.cljs | 2 +- frontend/src/app/main/ui/dashboard/projects.cljs | 2 +- frontend/src/app/main/ui/dashboard/search.cljs | 2 +- frontend/src/app/main/ui/dashboard/sidebar.cljs | 6 +++--- frontend/src/app/main/ui/dashboard/team.cljs | 8 ++++---- frontend/translations/en.po | 7 ++----- frontend/translations/es.po | 7 ++----- 21 files changed, 34 insertions(+), 40 deletions(-) diff --git a/backend/resources/app/email/request-file-access-yourpenpot-view/en.html b/backend/resources/app/email/request-file-access-yourpenpot-view/en.html index 57f0bbb781..f26a4b65da 100644 --- a/backend/resources/app/email/request-file-access-yourpenpot-view/en.html +++ b/backend/resources/app/email/request-file-access-yourpenpot-view/en.html @@ -191,7 +191,7 @@ file named “{{file-name|abbreviate:25}}”.

- Since this file is in your Penpot team, you can provide access by sending a view-only link. + Since this file is in your Personal Projects, you can provide access by sending a view-only link. This will allow {{requested-by|abbreviate:25}} to view the content without making any changes.

To proceed, please click the button below to generate and send the view-only link:

diff --git a/backend/resources/app/email/request-file-access-yourpenpot-view/en.txt b/backend/resources/app/email/request-file-access-yourpenpot-view/en.txt index 397f3c821d..c52649dd37 100644 --- a/backend/resources/app/email/request-file-access-yourpenpot-view/en.txt +++ b/backend/resources/app/email/request-file-access-yourpenpot-view/en.txt @@ -2,7 +2,7 @@ Hello! {{requested-by|abbreviate:25}} ({{requested-by-email}}) wants to have view-only access to the file named “{{file-name|abbreviate:25}}”. -Since this file is in your Penpot team, you can provide access by sending a view-only link. This will allow {{requested-by|abbreviate:25}} to view the content without making any changes. +Since this file is in your Personal Projects, you can provide access by sending a view-only link. This will allow {{requested-by|abbreviate:25}} to view the content without making any changes. To proceed, please click the link below to generate and send the view-only link: diff --git a/backend/resources/app/email/request-file-access-yourpenpot/en.html b/backend/resources/app/email/request-file-access-yourpenpot/en.html index ca0b00ee27..cf3161a6b6 100644 --- a/backend/resources/app/email/request-file-access-yourpenpot/en.html +++ b/backend/resources/app/email/request-file-access-yourpenpot/en.html @@ -191,7 +191,7 @@ “{{file-name|abbreviate:25}}”.

- Please note that the file is currently in Your Penpot 's team, so direct access cannot be + Please note that the file is currently in Personal Projects, so direct access cannot be granted. However, you have two options to provide the requested access:

    diff --git a/backend/resources/app/email/request-file-access-yourpenpot/en.txt b/backend/resources/app/email/request-file-access-yourpenpot/en.txt index 81f5d5c72e..e33a0bf80a 100644 --- a/backend/resources/app/email/request-file-access-yourpenpot/en.txt +++ b/backend/resources/app/email/request-file-access-yourpenpot/en.txt @@ -5,7 +5,7 @@ Hello! {{requested-by|abbreviate:25}} ({{requested-by-email}}) has requested access to the file named “{{file-name|abbreviate:25}}”. -Please note that the file is currently in Your Penpot 's team, so direct access cannot be granted. However, you have two options to provide the requested access: +Please note that the file is currently in Personal Projects, so direct access cannot be granted. However, you have two options to provide the requested access: - Move the File to Another Team: diff --git a/backend/src/app/email.clj b/backend/src/app/email.clj index e069b2908b..120b721781 100644 --- a/backend/src/app/email.clj +++ b/backend/src/app/email.clj @@ -505,13 +505,13 @@ :schema schema:request-file-access)) (def request-file-access-yourpenpot - "File access on Your Penpot request email." + "File access on Personal Projects request email." (template-factory :id ::request-file-access-yourpenpot :schema schema:request-file-access)) (def request-file-access-yourpenpot-view - "File access on Your Penpot view mode request email." + "File access on Personal Projects view mode request email." (template-factory :id ::request-file-access-yourpenpot-view :schema schema:request-file-access)) diff --git a/backend/src/app/rpc/commands/nitrate.clj b/backend/src/app/rpc/commands/nitrate.clj index 8714c5c841..2ca0032949 100644 --- a/backend/src/app/rpc/commands/nitrate.clj +++ b/backend/src/app/rpc/commands/nitrate.clj @@ -336,7 +336,7 @@ (doseq [{:keys [id reassign-to]} teams-to-leave] (teams/leave-team cfg {:profile-id profile-id :id id :reassign-to reassign-to})) - ;; Process organization "Your Penpot" team: keep with prefix if needed, otherwise delete. + ;; Process organization "Personal Projects" team: keep with prefix if needed, otherwise delete. (when default-team-id (if keep-default-team? (db/exec! conn [sql:prefix-team-name-and-unset-default organization-prefix default-team-id]) diff --git a/backend/src/app/rpc/commands/profile.clj b/backend/src/app/rpc/commands/profile.clj index 114f07be3e..4027efc6a4 100644 --- a/backend/src/app/rpc/commands/profile.clj +++ b/backend/src/app/rpc/commands/profile.clj @@ -524,7 +524,7 @@ ;; Penpot back through two paths: ::notify-user-organizations-deletion ;; (during delete-owned-organizations) and ::notify-organization-deletion. ;; Both preserve organization teams unchanged and only prefix or delete - ;; imported "Your Penpot" teams according to whether they still have files. + ;; imported "Personal Projects" teams according to whether they still have files. ;; Let Nitrate clean up the data associated with the deleted Penpot user: ;; owned organizations, remaining memberships, and subscription cancellation. (when (contains? cf/flags :admin-console) diff --git a/backend/src/app/rpc/commands/teams.clj b/backend/src/app/rpc/commands/teams.clj index ab2a0628a5..17f23fcf9c 100644 --- a/backend/src/app/rpc/commands/teams.clj +++ b/backend/src/app/rpc/commands/teams.clj @@ -575,7 +575,7 @@ (set/difference cfeat/frontend-only-features) (set/difference cfeat/no-team-inheritable-features)) params {:profile-id profile-id - :name "Your Penpot" + :name "Personal Projects" :features features :organization-id organization-id :is-default true} @@ -829,7 +829,7 @@ :code :only-owner-can-delete-team)) ;; Protect the user's personal default team from deletion. - ;; Organization-scoped default teams ("Your Penpot") are allowed to be deleted when they have no files. + ;; Organization-scoped default teams ("Personal Projects") are allowed to be deleted when they have no files. (when (and (:is-default team) (not in-organization?)) (ex/raise :type :validation :code :non-deletable-team diff --git a/backend/src/app/rpc/management/nitrate.clj b/backend/src/app/rpc/management/nitrate.clj index 5df54b7e7f..9dc140ba4a 100644 --- a/backend/src/app/rpc/management/nitrate.clj +++ b/backend/src/app/rpc/management/nitrate.clj @@ -318,7 +318,7 @@ RETURNING id, deleted_at;") (defn manage-deleted-organization-teams "For a deleted organization, preserve organization teams unchanged and only prefix or - delete member Your Penpot teams depending on whether they still contain files." + delete member Personal Projects teams depending on whether they still contain files." [cfg {:keys [organization-id organization-name teams]}] (let [all-team-ids (->> teams (map :id) @@ -347,13 +347,13 @@ RETURNING id, deleted_at;") teams-to-delete (->> your-penpot-team-ids (remove teams-with-files) (into []))] ;; Organization teams move to the fallback organization unchanged. Only imported - ;; Your Penpot teams keep the organization prefix when they still have files. + ;; Personal Projects teams keep the organization prefix when they still have files. (when (seq teams-to-prefix) (db/exec! conn [sql:prefix-teams-name-and-unset-default organization-prefix (db/create-array conn "uuid" teams-to-prefix)])) - ;; Empty imported Your Penpot teams disappear entirely. + ;; Empty imported Personal Projects teams disappear entirely. (soft-delete-teams! cfg teams-to-delete) (notifications/notify-organization-deletion cfg organization-id organization-name all-team-ids teams-to-delete) @@ -362,7 +362,7 @@ RETURNING id, deleted_at;") (sv/defmethod ::notify-organization-deletion "For a deleted organization, preserve organization teams and only prefix or delete - imported Your Penpot teams before notifying connected users." + imported Personal Projects before notifying connected users." {::doc/added "2.18" ::sm/params schema:notify-organization-deletion ::rpc/auth false} @@ -382,7 +382,7 @@ RETURNING id, deleted_at;") (sv/defmethod ::notify-user-organizations-deletion "For a given user, find all owned organizations and apply the deleted-organization - transfer rules to their imported Your Penpot teams." + transfer rules to their imported Personal Projects teams." {::doc/added "2.18" ::sm/params schema:notify-user-organizations-deletion ::nitrate/sso false} diff --git a/backend/test/backend_tests/rpc_management_nitrate_test.clj b/backend/test/backend_tests/rpc_management_nitrate_test.clj index 455f875fd3..aabf58f31d 100644 --- a/backend/test/backend_tests/rpc_management_nitrate_test.clj +++ b/backend/test/backend_tests/rpc_management_nitrate_test.clj @@ -268,7 +268,7 @@ new-team (th/db-get :team {:id new-team-id})] (t/is (th/success? out)) (t/is (= 1 (count (set/difference after-teams before-teams)))) - (t/is (= "Your Penpot" (:name new-team))) + (t/is (= "Personal Projects" (:name new-team))) (t/is (true? (:is-default new-team)))))) (t/deftest get-managed-profiles-returns-unique-members-for-owned-teams diff --git a/frontend/playwright/ui/pages/DashboardPage.js b/frontend/playwright/ui/pages/DashboardPage.js index 4dee04f18e..eb4bea0b9f 100644 --- a/frontend/playwright/ui/pages/DashboardPage.js +++ b/frontend/playwright/ui/pages/DashboardPage.js @@ -86,7 +86,7 @@ export class DashboardPage extends BaseWebSocketPage { this.searchInput = page.getByPlaceholder("Search…"); this.teamDropdown = this.sidebar.getByRole("button", { - name: "Your Penpot", + name: "Personal Projects", }); this.userAccount = this.sidebar.getByRole("button", { name: /Princesa Leia/, diff --git a/frontend/playwright/ui/pages/OnboardingPage.js b/frontend/playwright/ui/pages/OnboardingPage.js index bbf59bbab6..0fe447463e 100644 --- a/frontend/playwright/ui/pages/OnboardingPage.js +++ b/frontend/playwright/ui/pages/OnboardingPage.js @@ -7,7 +7,7 @@ export class OnboardingPage extends BaseWebSocketPage { } async fillOnboardingInputsStep1() { - await this.page.getByText("Personal").click(); + await this.page.getByText("Personal", { exact: true }).click(); await this.page.getByText("Select option").click(); await this.page.getByText("Product Management").click(); diff --git a/frontend/src/app/main/ui/dashboard/file_menu.cljs b/frontend/src/app/main/ui/dashboard/file_menu.cljs index c3d466e3d3..bbd38efed2 100644 --- a/frontend/src/app/main/ui/dashboard/file_menu.cljs +++ b/frontend/src/app/main/ui/dashboard/file_menu.cljs @@ -37,7 +37,7 @@ (defn- get-team-name [team] (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))) (defn- group-by-team diff --git a/frontend/src/app/main/ui/dashboard/fonts.cljs b/frontend/src/app/main/ui/dashboard/fonts.cljs index 6c248beb04..b5795a69ac 100644 --- a/frontend/src/app/main/ui/dashboard/fonts.cljs +++ b/frontend/src/app/main/ui/dashboard/fonts.cljs @@ -43,7 +43,7 @@ (mf/with-effect [team] (when team (let [tname (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))] (case section :fonts (dom/set-html-title (tr "title.dashboard.fonts" tname)) diff --git a/frontend/src/app/main/ui/dashboard/libraries.cljs b/frontend/src/app/main/ui/dashboard/libraries.cljs index f907d04b53..c5443b7bca 100644 --- a/frontend/src/app/main/ui/dashboard/libraries.cljs +++ b/frontend/src/app/main/ui/dashboard/libraries.cljs @@ -52,7 +52,7 @@ (mf/with-effect [team] (let [tname (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))] (dom/set-html-title (tr "title.dashboard.shared-libraries" tname)))) diff --git a/frontend/src/app/main/ui/dashboard/projects.cljs b/frontend/src/app/main/ui/dashboard/projects.cljs index 441bf5cc5c..521a20cd55 100644 --- a/frontend/src/app/main/ui/dashboard/projects.cljs +++ b/frontend/src/app/main/ui/dashboard/projects.cljs @@ -357,7 +357,7 @@ (mf/with-effect [team] (let [tname (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))] (dom/set-html-title (tr "title.dashboard.projects" tname)))) diff --git a/frontend/src/app/main/ui/dashboard/search.cljs b/frontend/src/app/main/ui/dashboard/search.cljs index bd52a5fa57..01ad54548e 100644 --- a/frontend/src/app/main/ui/dashboard/search.cljs +++ b/frontend/src/app/main/ui/dashboard/search.cljs @@ -44,7 +44,7 @@ (mf/with-effect [team] (when team (let [tname (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))] (dom/set-html-title (tr "title.dashboard.search" tname))))) diff --git a/frontend/src/app/main/ui/dashboard/sidebar.cljs b/frontend/src/app/main/ui/dashboard/sidebar.cljs index 3036dad42c..1767ce9e23 100644 --- a/frontend/src/app/main/ui/dashboard/sidebar.cljs +++ b/frontend/src/app/main/ui/dashboard/sidebar.cljs @@ -438,7 +438,7 @@ (when-not (contains? cf/flags :admin-console) [:span {:class (stl/css :penpot-icon)} deprecated-icon/logo-icon]) - [:span {:class (stl/css :team-text)} (if (contains? cf/flags :admin-console) (tr "dashboard.personal-projects") (tr "dashboard.your-penpot"))] + [:span {:class (stl/css :team-text)} (tr "dashboard.personal-projects")] (when (= default-team-id (:id team)) tick-icon)] @@ -725,7 +725,7 @@ current-organization (dtm/team->organization team) - ;; Find the "your-penpot" teams, and transform them in organizations. When + ;; Find the "personal-projects" teams, and transform them in organizations. When ;; the selected team is directly accessible but not listed in ;; membership teams, include only its organization so the organization selector can ;; show the current selection without leaking the team into the @@ -972,7 +972,7 @@ :team-name-no-logo nitrate?)} (when-not nitrate? [:span {:class (stl/css :penpot-icon)} deprecated-icon/logo-icon]) - [:span {:class (stl/css :team-text)} (if nitrate? (tr "dashboard.personal-projects") (tr "dashboard.default-team-name"))]] + [:span {:class (stl/css :team-text)} (tr "dashboard.personal-projects")]] (and (contains? cf/flags :subscriptions) (not is-default?) diff --git a/frontend/src/app/main/ui/dashboard/team.cljs b/frontend/src/app/main/ui/dashboard/team.cljs index a39b5eb9be..df94f26837 100644 --- a/frontend/src/app/main/ui/dashboard/team.cljs +++ b/frontend/src/app/main/ui/dashboard/team.cljs @@ -644,7 +644,7 @@ (dom/set-html-title (tr "title.team-members" (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))))) (mf/with-effect [(:id team)] @@ -1248,7 +1248,7 @@ (dom/set-html-title (tr "title.team-invitations" (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))))) (mf/with-effect [(:id team)] @@ -1528,7 +1528,7 @@ (dom/set-html-title (tr "title.team-webhooks" (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))))) (mf/with-effect [] @@ -1635,7 +1635,7 @@ (mf/with-effect [team] (dom/set-html-title (tr "title.team-settings" (if (:is-default team) - (tr "dashboard.your-penpot") + (tr "dashboard.personal-projects") (:name team))))) (mf/with-effect [] diff --git a/frontend/translations/en.po b/frontend/translations/en.po index 50bf6b331e..3254e20103 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -413,7 +413,7 @@ msgstr "Pin this version" #: src/app/main/ui/components/context_menu_a11y.cljs:300, src/app/main/ui/dashboard/sidebar.cljs:882 msgid "dashboard.default-team-name" -msgstr "Your Penpot" +msgstr "Personal Projects" #: src/app/main/ui/dashboard/deleted.cljs:265 msgid "dashboard.delete-all-forever-confirmation.description" @@ -1437,9 +1437,6 @@ msgid "dashboard.your-name" msgstr "Your name" #: src/app/main/ui/dashboard/file_menu.cljs:40, src/app/main/ui/dashboard/fonts.cljs:46, src/app/main/ui/dashboard/libraries.cljs:55, src/app/main/ui/dashboard/projects.cljs:352, src/app/main/ui/dashboard/search.cljs:47, src/app/main/ui/dashboard/sidebar.cljs:411, src/app/main/ui/dashboard/team.cljs:616, src/app/main/ui/dashboard/team.cljs:1191, src/app/main/ui/dashboard/team.cljs:1471, src/app/main/ui/dashboard/team.cljs:1577 -msgid "dashboard.your-penpot" -msgstr "Your Penpot" - msgid "dashboard.personal-projects" msgstr "Personal Projects" @@ -4631,7 +4628,7 @@ msgstr "You don't have access to this file." #: src/app/main/ui/static.cljs:62, src/app/main/ui/static.cljs:265, src/app/main/ui/static.cljs:271, src/app/main/ui/static.cljs:277, src/app/main/ui/static.cljs:283, src/app/main/ui/static.cljs:292, src/app/main/ui/static.cljs:301 msgid "not-found.no-permission.go-dashboard" -msgstr "Go to your Penpot" +msgstr "Go to Personal Projects" #: src/app/main/ui/static.cljs:289, src/app/main/ui/static.cljs:298 msgid "not-found.no-permission.if-approves" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 4ff509285e..146a4b72e3 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -420,7 +420,7 @@ msgstr "Guardar esta versión" #: src/app/main/ui/components/context_menu_a11y.cljs:300, src/app/main/ui/dashboard/sidebar.cljs:882 msgid "dashboard.default-team-name" -msgstr "Tu Penpot" +msgstr "Proyectos Personales" #: src/app/main/ui/dashboard/deleted.cljs:265 msgid "dashboard.delete-all-forever-confirmation.description" @@ -1444,9 +1444,6 @@ msgid "dashboard.your-name" msgstr "Tu nombre" #: src/app/main/ui/dashboard/file_menu.cljs:40, src/app/main/ui/dashboard/fonts.cljs:46, src/app/main/ui/dashboard/libraries.cljs:55, src/app/main/ui/dashboard/projects.cljs:352, src/app/main/ui/dashboard/search.cljs:47, src/app/main/ui/dashboard/sidebar.cljs:411, src/app/main/ui/dashboard/team.cljs:616, src/app/main/ui/dashboard/team.cljs:1191, src/app/main/ui/dashboard/team.cljs:1471, src/app/main/ui/dashboard/team.cljs:1577 -msgid "dashboard.your-penpot" -msgstr "Tu Penpot" - msgid "dashboard.personal-projects" msgstr "Proyectos Personales" @@ -4503,7 +4500,7 @@ msgstr "No tienes permiso para acceder a este archivo." #: src/app/main/ui/static.cljs:62, src/app/main/ui/static.cljs:265, src/app/main/ui/static.cljs:271, src/app/main/ui/static.cljs:277, src/app/main/ui/static.cljs:283, src/app/main/ui/static.cljs:292, src/app/main/ui/static.cljs:301 msgid "not-found.no-permission.go-dashboard" -msgstr "Ir a tu Penpot" +msgstr "Ir a tus Proyectos Personales" #: src/app/main/ui/static.cljs:289, src/app/main/ui/static.cljs:298 msgid "not-found.no-permission.if-approves" From 4c9aeab65e10515e459c5032d68e8f52eef8d2ad Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 28 Aug 2026 14:55:30 +0000 Subject: [PATCH 7/8] :books: Add issue/PR CLI auto-trigger to agent guide When an issue or PR is mentioned in conversation, fetch details via gh CLI or scripts/gh.py instead of WebFetch. Use gh issue view for issues, gh pr view for single PRs, and scripts/gh.py prs for multiple PRs. AI-assisted-by: glm-5.3-flash --- AGENTS.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index d4d1e238e7..69d33e7eba 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -40,6 +40,15 @@ Skipping this step is the #1 cause of incorrect or incomplete work. `github.com/penpot/penpot/security/advisories/GHSA-*`, extract the GHSA ID from the URL and run `python3 scripts/gh.py advisories ` to fetch full advisory details before proceeding. +- **Issue or PR mentioned** — When the user mentions a penpot/penpot issue or + PR (URL like `github.com/penpot/penpot/issues/` / `.../pull/`, or a + bare `#` when context clearly refers to this repo), fetch details via CLI + instead of WebFetch: + - Issue → `gh issue view --repo penpot/penpot` (add `--comments` when + discussion context matters). + - Single PR → `gh pr view --repo penpot/penpot`. + - Multiple PRs (list, file, or milestone) → `python3 scripts/gh.py prs ...`. + Do this before proceeding. Only use WebFetch if the CLI fails. ## Writing Rules From 995a5460e5b37c74415bcc21f242f8fff8ea9d4d Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 28 Aug 2026 21:20:17 +0200 Subject: [PATCH 8/8] :paperclip: Update agents and opencode on devenv --- AGENTS.md | 10 +++++++++- docker/devenv/Dockerfile | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 69d33e7eba..06507f18d1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -52,7 +52,15 @@ Skipping this step is the #1 cause of incorrect or incomplete work. ## Writing Rules -Use the `ste` skill when the user explicitly requests STE, `/ste`, or ASD-STE100. +Writing rules, from Orwell, 1946. These govern prose: docs, PR text, messages. Never touch code or technical terms; swap in everyday words only where precision survives. + +1. Never use a metaphor, simile or other figure of speech which you are used to seeing in print. +2. Never use a long word where a short one will do. +3. If it is possible to cut a word out, always cut it out. +4. Never use the passive where you can use the active. +5. Never use a foreign phrase, a scientific word or a jargon word if you can think of an everyday English equivalent. +6. Break any of these rules sooner than say anything outright barbarous. +Review every prose output against these rules before delivering. --- diff --git a/docker/devenv/Dockerfile b/docker/devenv/Dockerfile index 450cff5b5a..5a493a862f 100644 --- a/docker/devenv/Dockerfile +++ b/docker/devenv/Dockerfile @@ -100,7 +100,7 @@ RUN set -eux; \ FROM base AS setup-opencode -ENV OPENCODE_VERSION=1.18.19 +ENV OPENCODE_VERSION=1.18.25 RUN set -ex; \ ARCH="$(dpkg --print-architecture)"; \