# ZopDay Hardens Auth Before Shipping Its IDP Install Link

> Getting a teammate to install a specific app used to start with a conversation, not a click: open ZopDay, find Starter Templates, search the catalog, find the right chart, then start the flow. Every…

Source: https://zop.dev/resources/blogs/shareable-install-link-zopday
Published: 2026-08-12 · Author: riya-mittal · Tags: platformengineering, devops, selfservice

---

Getting a teammate to install a specific app used to start with a conversation, not a click: open ZopDay, find [Starter Templates](https://zop.dev/resources/blogs/self-service-terraform-8-modules-60-percent-platform-tickets), search the catalog, find the right chart, then start the flow. Every step was a place someone could pick the [wrong thing](https://zop.dev/resources/blogs/why-your-ai-ops-agent-fixes-the-wrong-thing-first), or give up before finding it. A platform team recommending "just install WordPress from the catalog" was really asking someone to complete a four-step scavenger hunt correctly on the first try. That scavenger hunt is the same tax [platform teams](https://zop.dev/resources/blogs/the-idp-tax-how-much-developer-time-your-platform-actually-costs) already pay for every unclear self-service path, just paid again per app instead of once per platform.

ZopDay can now skip straight to the destination. A link like `https://zop.dev/zopday/app/deploy?install=wordpress` opens the app directly into the Starter Templates drawer with WordPress already selected. No searching, no catalog browsing, just the install flow for the exact app the link named.

## One Query Param, the Right Drawer Already Open

A new hook, `useInstallFromUrl`, reads the `install` query parameter off the URL. The deploy page's drawer component opens Starter Templates preset to whichever chart that parameter names, matched case-insensitively against the catalog so `wordpress`, `WordPress`, and `WORDPRESS` all resolve to the same chart. That match only happens once the catalog has actually finished loading, not against a guess at what the catalog will eventually contain. Once the preset is applied, the parameter gets stripped from the URL, so refreshing the page doesn't reopen the same drawer by accident.

<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIGRhdGEtZDItdmVyc2lvbj0iMC43LjEiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWluIG1lZXQiIHZpZXdCb3g9IjAgMCA1MDcgOTMyIiB3aWR0aD0iNTA3IiBoZWlnaHQ9IjkzMiI+PHN2ZyBjbGFzcz0iZDItMTI0ODUyNDQ3IGQyLXN2ZyIgd2lkdGg9IjUwNyIgaGVpZ2h0PSI5MzIiIHZpZXdCb3g9Ii0xMDEgLTEwMSA1MDcgOTMyIj48cmVjdCB4PSItMTAxLjAwMDAwMCIgeT0iLTEwMS4wMDAwMDAiIHdpZHRoPSI1MDcuMDAwMDAwIiBoZWlnaHQ9IjkzMi4wMDAwMDAiIHJ4PSIwLjAwMDAwMCIgZmlsbD0iI0ZGRkZGRiIgY2xhc3M9IiBmaWxsLU43IiBzdHJva2Utd2lkdGg9IjAiIC8+PHN0eWxlIHR5cGU9InRleHQvY3NzIj48IVtDREFUQVsKLmQyLTEyNDg1MjQ0NyAudGV4dC1ib2xkIHsKCWZvbnQtZmFtaWx5OiAiZDItMTI0ODUyNDQ3LWZvbnQtYm9sZCI7Cn0KQGZvbnQtZmFjZSB7Cglmb250LWZhbWlseTogZDItMTI0ODUyNDQ3LWZvbnQtYm9sZDsKCXNyYzogdXJsKCJkYXRhOmFwcGxpY2F0aW9uL2ZvbnQtd29mZjtiYXNlNjQsZDA5R1JnQUJBQUFBQUE1UUFBb0FBQUFBRmN3QUFndUZBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJQVXk4eUFBQUE5QUFBQUdBQUFBQmdYeEhYcm1OdFlYQUFBQUZVQUFBQXBBQUFBTjREdkFVWVoyeDVaZ0FBQWZnQUFBZTRBQUFLUER4cmd1cG9aV0ZrQUFBSnNBQUFBRFlBQUFBMkczOGUxR2hvWldFQUFBbm9BQUFBSkFBQUFDUUtmd1hqYUcxMGVBQUFDZ3dBQUFDUUFBQUFrRVorQmpWc2IyTmhBQUFLbkFBQUFFb0FBQUJLTVhZdlZHMWhlSEFBQUFyb0FBQUFJQUFBQUNBQVBBRDNibUZ0WlFBQUN3Z0FBQU1vQUFBSUtnandWa0Z3YjNOMEFBQU9NQUFBQUIwQUFBQWcvOUVBTWdBREFpb0N2QUFGQUFBQ2lnSllBQUFBU3dLS0FsZ0FBQUZlQURJQktRQUFBZ3NIQXdNRUF3SUNCR0FBQXZjQUFBQURBQUFBQUFBQUFBQkJSRUpQQUNBQUlQLy9BdTcvQmdBQUE5Z0JFU0FBQVo4QUFBQUFBZkFDbEFBQUFDQUFBM2ljZk0yNVNRUUJBSVhoYjV6eEh1LzduZ1lzUVV4RUVEUVVZekVTRXpFUisvRktOUlBSSW14QXhBNjJnYmZzc05uQ3Z1UWxIL3dvbEFyVUtqOW9OS3IyOXgwNGRPVFlpVFBuTGx5NmR1dmVReklnVHZ2aXlvMjduc2hmT3ZuUGI3N3psYzk4NUQxdmVjMUxudk9VeDdZNWZJVTlqVjBqU3BWUlk4Wk5tRFJsV20zR3JEbnpGaXhhc216RnFqWHJObXphc20ySExnQUFBUC8vQVFBQS8vOUMzeXE4ZUp4a1ZsbHMyL1laLy81L1VhUkZ5NGNPa3JvdmlxUWtXM0lraXFKdldiRmlKNjRVMncxeXRYR2NCc1BpenJtUUtJc2JwTXREZyt4U0Zpd3kycUhCMWk1SXNRUHBnS0lZMEhid2hnMVl0NkFCK3BCMjNjT09MaHV5b1ErdGtCbEZDOWpVUUVxT0hleEIraE1TK1IyLzQvc0lacGdCd0VmeE1wakFBbDFnQndaQXRvVnRnaXhKUEtYS3FzcHpKbFZDTm1vRzI3WFhia2x4SWg0bkVxRWZCQy9NejZQeVlieThmdnpwOHRHam44OFBEV2svZXZzZDdTbzYrdzRBaGpJQUx1RXEwTTJJY29abEdTZEo4cEtjeWVXVXJDanlmUG10cjF5Zm5ibDJKT25yMzVOSzdlbjM0V3J4MnVuVDF5ZlB4dzd0M24xUUFBQ2t4MEgvd1ZXd0dIVXhZVVptZUthTWJtaGYzTCtQcXhkZnVyZ09HL2ZCeDdnS0ppT2JyVnpEMWZWSzYvbjd1QXJtNXU5aHBseERHRmZYNnhjZlBZZGZ4MVVJR3Y4N1dKYVRjem5WSWR0NEpadkxxVHhGOFpMRUJ6RERsSC84TEcybkNkcEdIM3YxQ21VeEVjcmM3RnlXSU5vb1hOWCs1aHNOQkVaOUtMSmUrU3cwUFJPODhlV1hONEl6MDZIUDlCeTdHcXQ0R2xmQkJtQ09pSXBOdGpsWk9aTXpMa2kwKzlLVjVVRlZIZjdlQzlZWGI2SERXdTFJcVhRRW5kQnUzbm9SRUhRQ21FSzRDbUVBMmJTbHZzMHJFMjhTUllrblNjcjB6ZWRlU3BLZEpFRTc2SW5uSjJnSFRWQWRWUEpxNWUyeHRnNHpRWGEwamVDcTlyNThMSnM5SnFPMDluNTZRVkdPWlZCNnZZSmlZamthTFl2YW53RkRvckdLUGtCcjRBWWVnSXVJU2phbmlpSWZJU2twbDVNekxHUGo5WHhxSnFjcUpNazQyVjhYWnk3WE1COFBqa1dWdnNYQithOHUwVVJ3c3MwdE9IWVBCNjM3ODdzUGRJVWxGL09NUDNyeWpQWXYyY2VmNFJ6NzZSNi9pek00aURaVzBRcGFBNCtCajU1T3o4SlJla3JHZ0VybFNCSzVkNXdxN1B4Nk1UWHAyOEdIbEh4K215dmxHQlQyV1VmT1BibW5NaExnNXYybHdsaVo2VG9TOHVyY1lwQWFxMmdOcjRBRFFodDlHSUVsUmQ3U2dkaEs4L0RRcWFINWJMemZUZGFXYU1JemdWMlMzZEhqNUhOOTF1OCtOM3R1MU9jcS9XeDlQTzNobDV6dTkreWQ0NU83ZGdBMmF2OEhXZ09YcnFBdDFldHFwOElzSzJmMDJrMXlWcytDZ3BObnRvOGZINXFjNnlPdzloRTlrVlp5YWZId3kyOUt2WkdjZGJUeTVHd2xuMThzT2dSTFRnNGY5QVRRWUZ6cGErclVCWUFxK0k1KzZ0cFVOMEV5eXRkdFlYdHErL2JvekhndzIrM3Q4Rmk5Z1lNSDBmTW56RjVsWDlaS0hqZWJ3MkxnclBZQ2dBa2lqU1NtMEJyMHdSQk1HY2lJU2xZSFFpZGEyV2lCa3htK1pkcUlaUENnVSs4a1NWTkdOM0FUTkVmem1vK0l4aTBQQncvM1R6cThJWmNuUG5oWTZRMy9jcHF5WkErby9xQTlFcDg1OUV6eDRwUmZrdngrU1lwbnhpUkJkb2V0M3BGN252N2U0UmpSRVF0Nk05MkV2ZGd6UEIyekxyWkhuQU5UVWJxTGRkaUh4dVhaRkxxVGlFdnhXQ3llMEdwUk45ZHRNcm5jUG44VG00Sk9ObDRCcCtGaGh0b1FxYzJva3JJVmFwVHZpY3pzcnBvLzVJdTU4TXJ0Zys2ZXhUbnRMZ3JuWW01T2V3TWFEVkFCNEsvNEhoWjFwd0VGRWZqT285Z0J2QUxXNXZ5UVZabHk4QkxGRks0UlAzejFGNzk2NVhRZXIyZ25mMzlYKzh0dkp5L285emRXa1IydlFGZFRjUnRlMTBYd3g5SlF6V1l4VTZUZEtsaWZmZ0x6Nng5eGRvUk9tS2xtSHBNZnJSayt0OG02dFhWMkgrdUVlblFXZEg5TnBKV0NJenlWbm5taTVnOEoyL1N2UGxRZkN5WjdZcEgwUm52YnREZGF4d1pPYUsyRlV5dkhWcHlXYUNKVWZnUVVxdWNEeWNkd2F1cmQwRTRYZVA5UDc2UzBSUm1Jelo4cUZrL2w4eWVMeFpQNVpDcVZUQ1dUTGErT1ZQWThlVzdrZkhtc1VOSXRxOGN0TkhaaUZxMkJBd0lBM0daMWh2eEVpV01NcGZFUmltRlp2VTcvTHVtcGhlSDVYR2pZWTU0V2MvdDZFczdZVy9pbmFRLy83Yk43bC9KZTkvVDNVWFNpZENYNW5yMnp4U082aHRiQS9oaStUZmMwTy9lV1JNWkh1enJjM2I0Uko2cnZ6NlRONWtzRUVjOW9Id01DcHJHS1hrRnJJQm04U2lwclRQQ3NLRW9wckdRM2d6Rk9sZ3RneGtuZVN4OFR0MGZ5d1hEQW4vSUVobUxQN2gzWUg5enV5WG9HQnNUUVNIekJLZ1lQdWIyY3c4WTZhR3QwSUw1am4rUTY0R1FsbDd1em5SOUlqYzgxdFcxcnJLS1R1QUpjYzNjb3ZLS3FzckVFTndjakhKb3VsbXdYenAvbi9WWTN6VGxVNjlmMjNUbEJYcjU4OWc4SmdTUVdTV3N6MW5CakZYMkI2anIvajJuVDFocUhmNXJkVlF1RWZDSmJXMm8zQmFlc2kzTW9xLzFkaVh2OGFLZld2VVBvQmFUN0FEVlFIVHFNZmNTMXRwQXFtOTc4eWZLWXZuRXNEcnB3OVNhcWZ5S1VKYWtzZktKMWI4d3ZYRWYxMWg3YmZHNUxCRjVxN1RGcStlTDFiU1JORWxTSFJiM1ViK21pQ01wQzlYM3IvTzBrMVVFUlZEdlZpK29QaEoyaU9NVS9NTTZkd2dPdCsxMStJaGFiNE44MThsa2JvMmdkMVhXVmJ2S2xxbytWM0ltWDJIQ1hoN0szQ1RHYStzM3laTHVkSnRwc2x1R3J0N24rNmQrUnhHbGtqdm85Nko4ZlJpWUVmcEwvVUdzZjNadG83cFo0WXhXOWhuOE9IaEFCVkhIVTFCUithME95akxQVHhGSEd5bW1xK0dXU2xSSitJZURyY2M3eVJ3ZHplek9CM29TSEtJaVpqQ2pLOHIvakJTWFp3d1pESHVkVVBCTXREUWtEMi9yVTZIOFZLYVlvTVVreGV1cUJPeWlNMHZvN2pxcklUTS9uZHhZVzlOa1ZnWnZvVS9RUWk4QkRCVWpnb2JveHUrQURWTjk0SnlyVVVGM3JCdFI0SFEvQUhud1AyZ0ZzVzBvVVVpbEJTS1h3UUlMbkUvcEhqeEZCTFBvVWZVT1A0VkRDVEFUZFJlekNBZ0Q4RHdBQS8vOEJBQUQvL3lXK0daMEFBUUFBQUFJTGhSbEdEdzlmRHp6MUFBRUQ2QUFBQUFEWVhhQ0VBQUFBQU4xbUx6YitOLzdFQ0cwRDhRQUJBQU1BQWdBQUFBQUFBQUFCQUFBRDJQN3ZBQUFJbVA0My9qY0liUUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFKQUt5QUZBQXlBQUFBbnNBVFFJTUFFMEJMUUJOQWdZQVRRTDZBRTBDbVFCSkF5MEFEZ0lQQUNvQjB3QWtBajBBSndJR0FDUUJWUUFZQWhZQUlnSTdBRUVCRkFBM0FpUUFRUUVlQUVFRFdRQkJBandBUVFJckFDUUNQUUJCQVk0QVFRRzdBQlVCZndBUkFqZ0FQQUlMQUF3RENBQVlBZ2tBREFIUEFDa0JUQUFyQWhBQUlnRVVBRUVBQVArdEFoQUFJZ0FBQUN3QUxBQlFBR1FBY0FDQUFMSUEwQUVLQVVJQmJnR2dBZFFCK2dKaUFvUUNrQUtvQXNRQzlnTVlBMFFEZEFPVUE5QUQ5Z1FZQkRRRWJBU2NCTllFNGdUdUJQb0ZFQVVlQUFBQUFRQUFBQ1FBa0FBTUFHTUFCd0FCQUFBQUFBQUFBQUFBQUFBQUFBUUFBM2ljbkpUUGJodFZGTVovVG16VENzRUNSVlc2aWU2Q1JaSG8yRlJKMVRZcmg5U0tSUlFIand0Q1FrZ1R6L2lQTXA0WmVTWU80UWxZOHhhOFJWYzhCTStCV0tQNWZPellCZEVtaXBKOGQrNzU4NTF6dm5PQkhmNW1tMHIxSWZCSFBURmNZYTkrYm5pTEIvVVR3OXUwNjF1R3F6eXAvV200UmxpYkc2N3plYTFuK0NQZVZuOHovSUQ5NmsrR0g3SmJiUnYrbUdmVkhjT2ZiRHYrTXZ3cCs3eGQ0QXE4NEZmREZYYkpERyt4dzQrR3QzbUV4YXhVZVVUVGNJM1AyRE5jWncvb002RWdaa0xDQ01lUUNTT3VtQkdSNHhNeFk4S1FpQkJIaHhZeGhiNG1CRUtPMFg5K0RmQXBtQkVvNHBnQ1I0eFBURURPMkNMK0lxK1VjMlVjNmpTenV4WUZZd0l1NUhGSlFJSWpaVVJLUXNTbDRoUVVaTHlpUVlPY2dmaG1GT1I0NUV5SThVaVpNYUpCbHphbjlCa3pJY2ZSVnFTU21VL0trSUpyQXVWM1psRjJaa0JFUW02c3JrZ0l4ZE9KWHlUdkRxYzR1bVN5WFk5OHVoSGhTeHpmeWJ2a2xzcjJLeno5dWpWbW0zbVhiQUxtNm1lc3JzUzZ1ZFlFeDdvdDg3YjRWcmpnRmU1ZS9kbGs4djRlaGZwZktQSUZWNXAvcUVrbFlwTGczQzR0ZkNuSWQ0OXhIT25jd1ZkSHZxZERueE82dktHdmM0c2VQVnFjMGFmRGEvbDI2ZUg0bWk1bkhNdWpJN3k0YTBzeFoveUE0eHM2c2lsalI5YWZ4Y1FpZmlZemRlZmlPRk1kVXpMMXZHVHVxZFpJRmQ1OXd1VU9wUnZxeU9VejBCNlZsazd6UzdSbkFTTlRSU2FHVS9WeXFZM2MraGVhSXFhcXBaenQ3WDI1RFhQYnZlVVczNUJxaDB1MUxqaVZrMXN3ZXQ5VXZYYzBjNjBmajRDUWxBdFpERWlaMHFEZ1JyelBDYmdpeG5HczdwMW9Td3BhSzU4eXo0MVVFakVWZ3c2SjRzekk5RGN3M2ZqR2ZiQ2hlMmR2U1NqL2t1bmxxcXI3WkhIcTFlMk0zcWg3eXp2ZnVoeXRUYUJoVTAzWDFEUVExOFMwSDJtbjF2bjc4czMxdXFVODVZaVVtUEJmTDhBelBKcnNjOEFoWTJVWTZHWnVyME5UTDBTVGx4eXEra3NpV1EybDU4Z2lIT0R4bkFNT2VNbnpkL3E0Wk9LTWkxdHhXYy9kNHBnanVoeCtVQlVMK3k1SHZGNTkrLytzdjR0cFU3VTRucTVPTCs0OXhTZDNVT3NYMnJQYjk3S25pWldUbUZ1MDI2MDRJMkJhY25HNzZ6VzV4M2ovQUFBQS8vOEJBQUQvLy9TM1QxRjRuR0pnWmdDRC8rY1lqQml3QUFBQUFBRC8vd0VBQVAvL0x3RUNBd0FBQUE9PSIpOwp9XV0+PC9zdHlsZT48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWy5zaGFwZSB7CiAgc2hhcGUtcmVuZGVyaW5nOiBnZW9tZXRyaWNQcmVjaXNpb247CiAgc3Ryb2tlLWxpbmVqb2luOiByb3VuZDsKfQouY29ubmVjdGlvbiB7CiAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kOwogIHN0cm9rZS1saW5lam9pbjogcm91bmQ7Cn0KLmJsZW5kIHsKICBtaXgtYmxlbmQtbW9kZTogbXVsdGlwbHk7CiAgb3BhY2l0eTogMC41Owp9CgoJCS5kMi0xMjQ4NTI0NDcgLmZpbGwtTjF7ZmlsbDojMEEwRjI1O30KCQkuZDItMTI0ODUyNDQ3IC5maWxsLU4ye2ZpbGw6IzY3NkM3RTt9CgkJLmQyLTEyNDg1MjQ0NyAuZmlsbC1OM3tmaWxsOiM5NDk5QUI7fQoJCS5kMi0xMjQ4NTI0NDcgLmZpbGwtTjR7ZmlsbDojQ0ZEMkREO30KCQkuZDItMTI0ODUyNDQ3IC5maWxsLU41e2ZpbGw6I0RFRTFFQjt9CgkJLmQyLTEyNDg1MjQ0NyAuZmlsbC1ONntmaWxsOiNFRUYxRjg7fQoJCS5kMi0xMjQ4NTI0NDcgLmZpbGwtTjd7ZmlsbDojRkZGRkZGO30KCQkuZDItMTI0ODUyNDQ3IC5maWxsLUIxe2ZpbGw6IzBEMzJCMjt9CgkJLmQyLTEyNDg1MjQ0NyAuZmlsbC1CMntmaWxsOiMwRDMyQjI7fQoJCS5kMi0xMjQ4NTI0NDcgLmZpbGwtQjN7ZmlsbDojRTNFOUZEO30KCQkuZDItMTI0ODUyNDQ3IC5maWxsLUI0e2ZpbGw6I0UzRTlGRDt9CgkJLmQyLTEyNDg1MjQ0NyAuZmlsbC1CNXtmaWxsOiNFREYwRkQ7fQoJCS5kMi0xMjQ4NTI0NDcgLmZpbGwtQjZ7ZmlsbDojRjdGOEZFO30KCQkuZDItMTI0ODUyNDQ3IC5maWxsLUFBMntmaWxsOiM0QTZGRjM7fQoJCS5kMi0xMjQ4NTI0NDcgLmZpbGwtQUE0e2ZpbGw6I0VERjBGRDt9CgkJLmQyLTEyNDg1MjQ0NyAuZmlsbC1BQTV7ZmlsbDojRjdGOEZFO30KCQkuZDItMTI0ODUyNDQ3IC5maWxsLUFCNHtmaWxsOiNFREYwRkQ7fQoJCS5kMi0xMjQ4NTI0NDcgLmZpbGwtQUI1e2ZpbGw6I0Y3RjhGRTt9CgkJLmQyLTEyNDg1MjQ0NyAuc3Ryb2tlLU4xe3N0cm9rZTojMEEwRjI1O30KCQkuZDItMTI0ODUyNDQ3IC5zdHJva2UtTjJ7c3Ryb2tlOiM2NzZDN0U7fQoJCS5kMi0xMjQ4NTI0NDcgLnN0cm9rZS1OM3tzdHJva2U6Izk0OTlBQjt9CgkJLmQyLTEyNDg1MjQ0NyAuc3Ryb2tlLU40e3N0cm9rZTojQ0ZEMkREO30KCQkuZDItMTI0ODUyNDQ3IC5zdHJva2UtTjV7c3Ryb2tlOiNERUUxRUI7fQoJCS5kMi0xMjQ4NTI0NDcgLnN0cm9rZS1ONntzdHJva2U6I0VFRjFGODt9CgkJLmQyLTEyNDg1MjQ0NyAuc3Ryb2tlLU43e3N0cm9rZTojRkZGRkZGO30KCQkuZDItMTI0ODUyNDQ3IC5zdHJva2UtQjF7c3Ryb2tlOiMwRDMyQjI7fQoJCS5kMi0xMjQ4NTI0NDcgLnN0cm9rZS1CMntzdHJva2U6IzBEMzJCMjt9CgkJLmQyLTEyNDg1MjQ0NyAuc3Ryb2tlLUIze3N0cm9rZTojRTNFOUZEO30KCQkuZDItMTI0ODUyNDQ3IC5zdHJva2UtQjR7c3Ryb2tlOiNFM0U5RkQ7fQoJCS5kMi0xMjQ4NTI0NDcgLnN0cm9rZS1CNXtzdHJva2U6I0VERjBGRDt9CgkJLmQyLTEyNDg1MjQ0NyAuc3Ryb2tlLUI2e3N0cm9rZTojRjdGOEZFO30KCQkuZDItMTI0ODUyNDQ3IC5zdHJva2UtQUEye3N0cm9rZTojNEE2RkYzO30KCQkuZDItMTI0ODUyNDQ3IC5zdHJva2UtQUE0e3N0cm9rZTojRURGMEZEO30KCQkuZDItMTI0ODUyNDQ3IC5zdHJva2UtQUE1e3N0cm9rZTojRjdGOEZFO30KCQkuZDItMTI0ODUyNDQ3IC5zdHJva2UtQUI0e3N0cm9rZTojRURGMEZEO30KCQkuZDItMTI0ODUyNDQ3IC5zdHJva2UtQUI1e3N0cm9rZTojRjdGOEZFO30KCQkuZDItMTI0ODUyNDQ3IC5iYWNrZ3JvdW5kLWNvbG9yLU4xe2JhY2tncm91bmQtY29sb3I6IzBBMEYyNTt9CgkJLmQyLTEyNDg1MjQ0NyAuYmFja2dyb3VuZC1jb2xvci1OMntiYWNrZ3JvdW5kLWNvbG9yOiM2NzZDN0U7fQoJCS5kMi0xMjQ4NTI0NDcgLmJhY2tncm91bmQtY29sb3ItTjN7YmFja2dyb3VuZC1jb2xvcjojOTQ5OUFCO30KCQkuZDItMTI0ODUyNDQ3IC5iYWNrZ3JvdW5kLWNvbG9yLU40e2JhY2tncm91bmQtY29sb3I6I0NGRDJERDt9CgkJLmQyLTEyNDg1MjQ0NyAuYmFja2dyb3VuZC1jb2xvci1ONXtiYWNrZ3JvdW5kLWNvbG9yOiNERUUxRUI7fQoJCS5kMi0xMjQ4NTI0NDcgLmJhY2tncm91bmQtY29sb3ItTjZ7YmFja2dyb3VuZC1jb2xvcjojRUVGMUY4O30KCQkuZDItMTI0ODUyNDQ3IC5iYWNrZ3JvdW5kLWNvbG9yLU43e2JhY2tncm91bmQtY29sb3I6I0ZGRkZGRjt9CgkJLmQyLTEyNDg1MjQ0NyAuYmFja2dyb3VuZC1jb2xvci1CMXtiYWNrZ3JvdW5kLWNvbG9yOiMwRDMyQjI7fQoJCS5kMi0xMjQ4NTI0NDcgLmJhY2tncm91bmQtY29sb3ItQjJ7YmFja2dyb3VuZC1jb2xvcjojMEQzMkIyO30KCQkuZDItMTI0ODUyNDQ3IC5iYWNrZ3JvdW5kLWNvbG9yLUIze2JhY2tncm91bmQtY29sb3I6I0UzRTlGRDt9CgkJLmQyLTEyNDg1MjQ0NyAuYmFja2dyb3VuZC1jb2xvci1CNHtiYWNrZ3JvdW5kLWNvbG9yOiNFM0U5RkQ7fQoJCS5kMi0xMjQ4NTI0NDcgLmJhY2tncm91bmQtY29sb3ItQjV7YmFja2dyb3VuZC1jb2xvcjojRURGMEZEO30KCQkuZDItMTI0ODUyNDQ3IC5iYWNrZ3JvdW5kLWNvbG9yLUI2e2JhY2tncm91bmQtY29sb3I6I0Y3RjhGRTt9CgkJLmQyLTEyNDg1MjQ0NyAuYmFja2dyb3VuZC1jb2xvci1BQTJ7YmFja2dyb3VuZC1jb2xvcjojNEE2RkYzO30KCQkuZDItMTI0ODUyNDQ3IC5iYWNrZ3JvdW5kLWNvbG9yLUFBNHtiYWNrZ3JvdW5kLWNvbG9yOiNFREYwRkQ7fQoJCS5kMi0xMjQ4NTI0NDcgLmJhY2tncm91bmQtY29sb3ItQUE1e2JhY2tncm91bmQtY29sb3I6I0Y3RjhGRTt9CgkJLmQyLTEyNDg1MjQ0NyAuYmFja2dyb3VuZC1jb2xvci1BQjR7YmFja2dyb3VuZC1jb2xvcjojRURGMEZEO30KCQkuZDItMTI0ODUyNDQ3IC5iYWNrZ3JvdW5kLWNvbG9yLUFCNXtiYWNrZ3JvdW5kLWNvbG9yOiNGN0Y4RkU7fQoJCS5kMi0xMjQ4NTI0NDcgLmNvbG9yLU4xe2NvbG9yOiMwQTBGMjU7fQoJCS5kMi0xMjQ4NTI0NDcgLmNvbG9yLU4ye2NvbG9yOiM2NzZDN0U7fQoJCS5kMi0xMjQ4NTI0NDcgLmNvbG9yLU4ze2NvbG9yOiM5NDk5QUI7fQoJCS5kMi0xMjQ4NTI0NDcgLmNvbG9yLU40e2NvbG9yOiNDRkQyREQ7fQoJCS5kMi0xMjQ4NTI0NDcgLmNvbG9yLU41e2NvbG9yOiNERUUxRUI7fQoJCS5kMi0xMjQ4NTI0NDcgLmNvbG9yLU42e2NvbG9yOiNFRUYxRjg7fQoJCS5kMi0xMjQ4NTI0NDcgLmNvbG9yLU43e2NvbG9yOiNGRkZGRkY7fQoJCS5kMi0xMjQ4NTI0NDcgLmNvbG9yLUIxe2NvbG9yOiMwRDMyQjI7fQoJCS5kMi0xMjQ4NTI0NDcgLmNvbG9yLUIye2NvbG9yOiMwRDMyQjI7fQoJCS5kMi0xMjQ4NTI0NDcgLmNvbG9yLUIze2NvbG9yOiNFM0U5RkQ7fQoJCS5kMi0xMjQ4NTI0NDcgLmNvbG9yLUI0e2NvbG9yOiNFM0U5RkQ7fQoJCS5kMi0xMjQ4NTI0NDcgLmNvbG9yLUI1e2NvbG9yOiNFREYwRkQ7fQoJCS5kMi0xMjQ4NTI0NDcgLmNvbG9yLUI2e2NvbG9yOiNGN0Y4RkU7fQoJCS5kMi0xMjQ4NTI0NDcgLmNvbG9yLUFBMntjb2xvcjojNEE2RkYzO30KCQkuZDItMTI0ODUyNDQ3IC5jb2xvci1BQTR7Y29sb3I6I0VERjBGRDt9CgkJLmQyLTEyNDg1MjQ0NyAuY29sb3ItQUE1e2NvbG9yOiNGN0Y4RkU7fQoJCS5kMi0xMjQ4NTI0NDcgLmNvbG9yLUFCNHtjb2xvcjojRURGMEZEO30KCQkuZDItMTI0ODUyNDQ3IC5jb2xvci1BQjV7Y29sb3I6I0Y3RjhGRTt9LmFwcGVuZGl4IHRleHQudGV4dHtmaWxsOiMwQTBGMjV9Lm1key0tY29sb3ItZmctZGVmYXVsdDojMEEwRjI1Oy0tY29sb3ItZmctbXV0ZWQ6IzY3NkM3RTstLWNvbG9yLWZnLXN1YnRsZTojOTQ5OUFCOy0tY29sb3ItY2FudmFzLWRlZmF1bHQ6I0ZGRkZGRjstLWNvbG9yLWNhbnZhcy1zdWJ0bGU6I0VFRjFGODstLWNvbG9yLWJvcmRlci1kZWZhdWx0OiMwRDMyQjI7LS1jb2xvci1ib3JkZXItbXV0ZWQ6IzBEMzJCMjstLWNvbG9yLW5ldXRyYWwtbXV0ZWQ6I0VFRjFGODstLWNvbG9yLWFjY2VudC1mZzojMEQzMkIyOy0tY29sb3ItYWNjZW50LWVtcGhhc2lzOiMwRDMyQjI7LS1jb2xvci1hdHRlbnRpb24tc3VidGxlOiM2NzZDN0U7LS1jb2xvci1kYW5nZXItZmc6cmVkO30uc2tldGNoLW92ZXJsYXktQjF7ZmlsbDp1cmwoI3N0cmVha3MtZGFya2VyLWQyLTEyNDg1MjQ0Nyk7bWl4LWJsZW5kLW1vZGU6bGlnaHRlbn0uc2tldGNoLW92ZXJsYXktQjJ7ZmlsbDp1cmwoI3N0cmVha3MtZGFya2VyLWQyLTEyNDg1MjQ0Nyk7bWl4LWJsZW5kLW1vZGU6bGlnaHRlbn0uc2tldGNoLW92ZXJsYXktQjN7ZmlsbDp1cmwoI3N0cmVha3MtYnJpZ2h0LWQyLTEyNDg1MjQ0Nyk7bWl4LWJsZW5kLW1vZGU6ZGFya2VufS5za2V0Y2gtb3ZlcmxheS1CNHtmaWxsOnVybCgjc3RyZWFrcy1icmlnaHQtZDItMTI0ODUyNDQ3KTttaXgtYmxlbmQtbW9kZTpkYXJrZW59LnNrZXRjaC1vdmVybGF5LUI1e2ZpbGw6dXJsKCNzdHJlYWtzLWJyaWdodC1kMi0xMjQ4NTI0NDcpO21peC1ibGVuZC1tb2RlOmRhcmtlbn0uc2tldGNoLW92ZXJsYXktQjZ7ZmlsbDp1cmwoI3N0cmVha3MtYnJpZ2h0LWQyLTEyNDg1MjQ0Nyk7bWl4LWJsZW5kLW1vZGU6ZGFya2VufS5za2V0Y2gtb3ZlcmxheS1BQTJ7ZmlsbDp1cmwoI3N0cmVha3MtZGFyay1kMi0xMjQ4NTI0NDcpO21peC1ibGVuZC1tb2RlOm92ZXJsYXl9LnNrZXRjaC1vdmVybGF5LUFBNHtmaWxsOnVybCgjc3RyZWFrcy1icmlnaHQtZDItMTI0ODUyNDQ3KTttaXgtYmxlbmQtbW9kZTpkYXJrZW59LnNrZXRjaC1vdmVybGF5LUFBNXtmaWxsOnVybCgjc3RyZWFrcy1icmlnaHQtZDItMTI0ODUyNDQ3KTttaXgtYmxlbmQtbW9kZTpkYXJrZW59LnNrZXRjaC1vdmVybGF5LUFCNHtmaWxsOnVybCgjc3RyZWFrcy1icmlnaHQtZDItMTI0ODUyNDQ3KTttaXgtYmxlbmQtbW9kZTpkYXJrZW59LnNrZXRjaC1vdmVybGF5LUFCNXtmaWxsOnVybCgjc3RyZWFrcy1icmlnaHQtZDItMTI0ODUyNDQ3KTttaXgtYmxlbmQtbW9kZTpkYXJrZW59LnNrZXRjaC1vdmVybGF5LU4xe2ZpbGw6dXJsKCNzdHJlYWtzLWRhcmtlci1kMi0xMjQ4NTI0NDcpO21peC1ibGVuZC1tb2RlOmxpZ2h0ZW59LnNrZXRjaC1vdmVybGF5LU4ye2ZpbGw6dXJsKCNzdHJlYWtzLWRhcmstZDItMTI0ODUyNDQ3KTttaXgtYmxlbmQtbW9kZTpvdmVybGF5fS5za2V0Y2gtb3ZlcmxheS1OM3tmaWxsOnVybCgjc3RyZWFrcy1ub3JtYWwtZDItMTI0ODUyNDQ3KTttaXgtYmxlbmQtbW9kZTpjb2xvci1idXJufS5za2V0Y2gtb3ZlcmxheS1ONHtmaWxsOnVybCgjc3RyZWFrcy1ub3JtYWwtZDItMTI0ODUyNDQ3KTttaXgtYmxlbmQtbW9kZTpjb2xvci1idXJufS5za2V0Y2gtb3ZlcmxheS1ONXtmaWxsOnVybCgjc3RyZWFrcy1icmlnaHQtZDItMTI0ODUyNDQ3KTttaXgtYmxlbmQtbW9kZTpkYXJrZW59LnNrZXRjaC1vdmVybGF5LU42e2ZpbGw6dXJsKCNzdHJlYWtzLWJyaWdodC1kMi0xMjQ4NTI0NDcpO21peC1ibGVuZC1tb2RlOmRhcmtlbn0uc2tldGNoLW92ZXJsYXktTjd7ZmlsbDp1cmwoI3N0cmVha3MtYnJpZ2h0LWQyLTEyNDg1MjQ0Nyk7bWl4LWJsZW5kLW1vZGU6ZGFya2VufS5saWdodC1jb2Rle2Rpc3BsYXk6IGJsb2NrfS5kYXJrLWNvZGV7ZGlzcGxheTogbm9uZX1dXT48L3N0eWxlPjxnIGNsYXNzPSJiM0JsYm1WayI+PGcgY2xhc3M9InNoYXBlIiA+PHJlY3QgeD0iMC4wMDAwMDAiIHk9IjAuMDAwMDAwIiB3aWR0aD0iMzA1LjAwMDAwMCIgaGVpZ2h0PSI2Ni4wMDAwMDAiIHN0cm9rZT0iIzBEMzJCMiIgZmlsbD0iI0Y3RjhGRSIgY2xhc3M9IiBzdHJva2UtQjEgZmlsbC1CNiIgc3R5bGU9InN0cm9rZS13aWR0aDoyOyIgLz48L2c+PHRleHQgeD0iMTUyLjUwMDAwMCIgeT0iMzguNTAwMDAwIiBmaWxsPSIjMEEwRjI1IiBjbGFzcz0idGV4dC1ib2xkIGZpbGwtTjEiIHN0eWxlPSJ0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE2cHgiPkxpbmsgb3BlbmVkIHdpdGggP2luc3RhbGw9d29yZHByZXNzPC90ZXh0PjwvZz48ZyBjbGFzcz0iY21WaFpITT0iPjxnIGNsYXNzPSJzaGFwZSIgPjxyZWN0IHg9IjcuMDAwMDAwIiB5PSIxNjYuMDAwMDAwIiB3aWR0aD0iMjkyLjAwMDAwMCIgaGVpZ2h0PSI2Ni4wMDAwMDAiIHN0cm9rZT0iIzBEMzJCMiIgZmlsbD0iI0Y3RjhGRSIgY2xhc3M9IiBzdHJva2UtQjEgZmlsbC1CNiIgc3R5bGU9InN0cm9rZS13aWR0aDoyOyIgLz48L2c+PHRleHQgeD0iMTUzLjAwMDAwMCIgeT0iMjA0LjUwMDAwMCIgZmlsbD0iIzBBMEYyNSIgY2xhc3M9InRleHQtYm9sZCBmaWxsLU4xIiBzdHlsZT0idGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtc2l6ZToxNnB4Ij51c2VJbnN0YWxsRnJvbVVybCByZWFkcyB0aGUgcGFyYW08L3RleHQ+PC9nPjxnIGNsYXNzPSJkMkZwZEhNPSI+PGcgY2xhc3M9InNoYXBlIiA+PHJlY3QgeD0iMTIuMDAwMDAwIiB5PSIzMzIuMDAwMDAwIiB3aWR0aD0iMjgyLjAwMDAwMCIgaGVpZ2h0PSI2Ni4wMDAwMDAiIHN0cm9rZT0iIzBEMzJCMiIgZmlsbD0iI0Y3RjhGRSIgY2xhc3M9IiBzdHJva2UtQjEgZmlsbC1CNiIgc3R5bGU9InN0cm9rZS13aWR0aDoyOyIgLz48L2c+PHRleHQgeD0iMTUzLjAwMDAwMCIgeT0iMzcwLjUwMDAwMCIgZmlsbD0iIzBBMEYyNSIgY2xhc3M9InRleHQtYm9sZCBmaWxsLU4xIiBzdHlsZT0idGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtc2l6ZToxNnB4Ij5XYWl0cyBmb3IgY2F0YWxvZyB0byBmaW5pc2ggbG9hZGluZzwvdGV4dD48L2c+PGcgY2xhc3M9ImJXRjBZMmhsWkE9PSI+PGcgY2xhc3M9InNoYXBlIiA+PHJlY3QgeD0iMTYuMDAwMDAwIiB5PSI0OTguMDAwMDAwIiB3aWR0aD0iMjc0LjAwMDAwMCIgaGVpZ2h0PSI2Ni4wMDAwMDAiIHN0cm9rZT0iIzBEMzJCMiIgZmlsbD0iI0Y3RjhGRSIgY2xhc3M9IiBzdHJva2UtQjEgZmlsbC1CNiIgc3R5bGU9InN0cm9rZS13aWR0aDoyOyIgLz48L2c+PHRleHQgeD0iMTUzLjAwMDAwMCIgeT0iNTM2LjUwMDAwMCIgZmlsbD0iIzBBMEYyNSIgY2xhc3M9InRleHQtYm9sZCBmaWxsLU4xIiBzdHlsZT0idGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtc2l6ZToxNnB4Ij5NYXRjaGVzIGNoYXJ0IGNhc2UtaW5zZW5zaXRpdmVseTwvdGV4dD48L2c+PGcgY2xhc3M9IlpISmhkMlZ5Ij48ZyBjbGFzcz0ic2hhcGUiID48cmVjdCB4PSIxMS4wMDAwMDAiIHk9IjY2NC4wMDAwMDAiIHdpZHRoPSIyODMuMDAwMDAwIiBoZWlnaHQ9IjY2LjAwMDAwMCIgc3Ryb2tlPSIjMEQzMkIyIiBmaWxsPSIjRjdGOEZFIiBjbGFzcz0iIHN0cm9rZS1CMSBmaWxsLUI2IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjI7IiAvPjwvZz48dGV4dCB4PSIxNTIuNTAwMDAwIiB5PSI3MDIuNTAwMDAwIiBmaWxsPSIjMEEwRjI1IiBjbGFzcz0idGV4dC1ib2xkIGZpbGwtTjEiIHN0eWxlPSJ0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE2cHgiPkRyYXdlciBvcGVucyBwcmVzZXQgdG8gdGhhdCBjaGFydDwvdGV4dD48L2c+PGcgY2xhc3M9IktHOXdaVzVsWkNBdEptZDBPeUJ5WldGa2N5bGJNRjA9Ij48bWFya2VyIGlkPSJtay1kMi0xMjQ4NTI0NDctMzQ4ODM3ODEzNCIgbWFya2VyV2lkdGg9IjEwLjAwMDAwMCIgbWFya2VySGVpZ2h0PSIxMi4wMDAwMDAiIHJlZlg9IjcuMDAwMDAwIiByZWZZPSI2LjAwMDAwMCIgdmlld0JveD0iMC4wMDAwMDAgMC4wMDAwMDAgMTAuMDAwMDAwIDEyLjAwMDAwMCIgb3JpZW50PSJhdXRvIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiPiA8cG9seWdvbiBwb2ludHM9IjAuMDAwMDAwLDAuMDAwMDAwIDEwLjAwMDAwMCw2LjAwMDAwMCAwLjAwMDAwMCwxMi4wMDAwMDAiIGZpbGw9IiMwRDMyQjIiIGNsYXNzPSJjb25uZWN0aW9uIGZpbGwtQjEiIHN0cm9rZS13aWR0aD0iMiIgLz4gPC9tYXJrZXI+PHBhdGggZD0iTSAxNTIuNTAwMDAwIDY4LjAwMDAwMCBDIDE1Mi41MDAwMDAgMTA2LjAwMDAwMCAxNTIuNTAwMDAwIDEyNi4wMDAwMDAgMTUyLjUwMDAwMCAxNjIuMDAwMDAwIiBzdHJva2U9IiMwRDMyQjIiIGZpbGw9Im5vbmUiIGNsYXNzPSJjb25uZWN0aW9uIHN0cm9rZS1CMSIgc3R5bGU9InN0cm9rZS13aWR0aDoyOyIgbWFya2VyLWVuZD0idXJsKCNtay1kMi0xMjQ4NTI0NDctMzQ4ODM3ODEzNCkiIG1hc2s9InVybCgjZDItMTI0ODUyNDQ3KSIgLz48L2c+PGcgY2xhc3M9IktISmxZV1J6SUMwbVozUTdJSGRoYVhSektWc3dYUT09Ij48cGF0aCBkPSJNIDE1Mi41MDAwMDAgMjM0LjAwMDAwMCBDIDE1Mi41MDAwMDAgMjcyLjAwMDAwMCAxNTIuNTAwMDAwIDI5Mi4wMDAwMDAgMTUyLjUwMDAwMCAzMjguMDAwMDAwIiBzdHJva2U9IiMwRDMyQjIiIGZpbGw9Im5vbmUiIGNsYXNzPSJjb25uZWN0aW9uIHN0cm9rZS1CMSIgc3R5bGU9InN0cm9rZS13aWR0aDoyOyIgbWFya2VyLWVuZD0idXJsKCNtay1kMi0xMjQ4NTI0NDctMzQ4ODM3ODEzNCkiIG1hc2s9InVybCgjZDItMTI0ODUyNDQ3KSIgLz48L2c+PGcgY2xhc3M9IktIZGhhWFJ6SUMwbVozUTdJRzFoZEdOb1pXUXBXekJkIj48cGF0aCBkPSJNIDE1Mi41MDAwMDAgNDAwLjAwMDAwMCBDIDE1Mi41MDAwMDAgNDM4LjAwMDAwMCAxNTIuNTAwMDAwIDQ1OC4wMDAwMDAgMTUyLjUwMDAwMCA0OTQuMDAwMDAwIiBzdHJva2U9IiMwRDMyQjIiIGZpbGw9Im5vbmUiIGNsYXNzPSJjb25uZWN0aW9uIHN0cm9rZS1CMSIgc3R5bGU9InN0cm9rZS13aWR0aDoyOyIgbWFya2VyLWVuZD0idXJsKCNtay1kMi0xMjQ4NTI0NDctMzQ4ODM3ODEzNCkiIG1hc2s9InVybCgjZDItMTI0ODUyNDQ3KSIgLz48L2c+PGcgY2xhc3M9IktHMWhkR05vWldRZ0xTWm5kRHNnWkhKaGQyVnlLVnN3WFE9PSI+PHBhdGggZD0iTSAxNTIuNTAwMDAwIDU2Ni4wMDAwMDAgQyAxNTIuNTAwMDAwIDYwNC4wMDAwMDAgMTUyLjUwMDAwMCA2MjQuMDAwMDAwIDE1Mi41MDAwMDAgNjYwLjAwMDAwMCIgc3Ryb2tlPSIjMEQzMkIyIiBmaWxsPSJub25lIiBjbGFzcz0iY29ubmVjdGlvbiBzdHJva2UtQjEiIHN0eWxlPSJzdHJva2Utd2lkdGg6MjsiIG1hcmtlci1lbmQ9InVybCgjbWstZDItMTI0ODUyNDQ3LTM0ODgzNzgxMzQpIiBtYXNrPSJ1cmwoI2QyLTEyNDg1MjQ0NykiIC8+PC9nPjxtYXNrIGlkPSJkMi0xMjQ4NTI0NDciIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9Ii0xMDEiIHk9Ii0xMDEiIHdpZHRoPSI1MDciIGhlaWdodD0iOTMyIj4KPHJlY3QgeD0iLTEwMSIgeT0iLTEwMSIgd2lkdGg9IjUwNyIgaGVpZ2h0PSI5MzIiIGZpbGw9IndoaXRlIj48L3JlY3Q+Cgo8L21hc2s+PC9zdmc+PC9zdmc+Cg==" alt="Architecture diagram" style={{maxWidth:"100%",height:"auto",display:"block",margin:"2em auto"}} />

That sequencing matters more than it looks. A preset applied before the catalog loads has nothing real to match against, which is exactly the kind of race condition that would make the feature work in a demo and fail intermittently for an actual teammate on a slower connection.

## The Permission Check Happens Before the Drawer, Not After

Not everyone who receives a link is supposed to be able to install anything. A user who opens the link without `PROJECT_CREATE` permission gets a permission-denied toast instead of landing inside a drawer they can look at but can't use. Failing at the permission check, before the drawer ever opens, keeps the error honest: the problem is stated as what it is, a missing permission, rather than surfacing as a drawer that mysteriously won't let anything through.

## A Shareable Link Is Also a New Redirect Target

Any link designed to be forwarded and clicked by someone else is also, structurally, a place an attacker would want to insert a different destination. This is a well-documented risk category: [open redirects](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) get used to make a phishing link resemble something on a trusted domain. Before this feature could ship, the underlying redirect handling needed hardening. A new `safeReturnTo` helper now threads the intended destination through login, signup, OTP verification, and the GitHub, Google, and SAML OAuth callbacks. It only allows redirect targets that are same-origin and path-relative.

| Redirect target | Allowed by safeReturnTo |
|---|---|
| `/zopday/app/deploy?install=wordpress` (same-origin, path-relative) | Yes |
| `https://attacker-site.example/phish` (off-site) | No |
| `//attacker-site.example` (protocol-relative, off-site) | No |

This works because an install link is exactly the kind of URL people forward without inspecting closely. That makes the login flow a natural target for a redirect that quietly points somewhere else after authentication. Blocking that redirect doesn't cost the convenience: a legitimate install link still carries a user straight through login to the drawer that was preset for them, because that destination is same-origin and path-relative like the table above describes.

## Zero-Org Users Skip a Form They'd Otherwise Have to Fill Out

A brand-new user with no org yet used to hit a manual create-org form before doing anything else, including following an install link. That form is now skipped for a zero-org user opening an install link: an org gets created automatically, and they land back on the exact install the link pointed to. Connecting a cloud account, previously a trip out to Settings and back, now renders inline inside the drawer itself, so the whole path from link to running app stays in one place.

This ships as a frontend-only change in ZopDay, with no new backend configuration required. Rollback is a plain revert, with one caveat: because the change touches shared authentication files used by every login, signup, and OAuth path, a revert should be paired with a run of the auth test suite, not applied on its own and assumed safe.

Try building one yourself: swap `wordpress` in `https://zop.dev/zopday/app/deploy?install=wordpress` for any [chart in the App Catalog](https://zop.dev/resources/blogs/the-idp-tax-180k-year-in-duplicate-tooling) and send the link to a teammate instead of a set of instructions.
