panel: redesign web UI and make syncing responsive #1
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "agent/panel-ui-improve"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
{base64}IyMgV2h5CgpUaGUgcGFuZWwgd29ya2VkLCBidXQgdXNpbmcgaXQgd2FzIGNsdW5reToKCi0gKipUaGUgQVBJIGhhbmRsZWQgb25lIHJlcXVlc3QgYXQgYSB0aW1lLioqIFdoaWxlIGEgZGVwbG95IG9yIGdpdCBwdWxsIHJhbiwgc3RhdHVzLCBsb2dzIGFuZCBldmVyeXRoaW5nIGVsc2UgaHVuZy4KLSAqKkV2ZXJ5IGFjdGlvbiByZWJ1aWx0IHRoZSB3aG9sZSBhcHAgbGlzdC4qKiBUaGF0IGNsb3NlZCB0YWJzLCBkcm9wcGVkIHVuc2F2ZWQgY29tcG9zZSBlZGl0cyBhbmQgcmVzZXQgdGhlIGZpbGUgYnJvd3Nlci4gU3RhdHVzIGFsc28gY29zdCBvbmUgcmVxdWVzdCBwZXIgYXBwLgotICoqR2l0IHN5bmMgd2FzIGZyYWdpbGUuKiogSXQgZGlkIGBnaXQgcHVsbGA7IGlmIHRoYXQgZmFpbGVkLCBpdCBkZWxldGVkIHRoZSByZXBvIGFuZCByZS1jbG9uZWQgKip3aXRob3V0IHRoZSB0b2tlbioqLCB3aGljaCBicmVha3MgcHJpdmF0ZSByZXBvcy4gT25seSBgZ2l0aHViLmNvbWAgVVJMcyB3ZXJlIGFjY2VwdGVkLCBnaXQgaGFkIG5vIHRpbWVvdXQsIGFuZCBlcnJvciBtZXNzYWdlcyBjb3VsZCBsZWFrIHRoZSB0b2tlbi4KLSAqKkZhaWxlZCBkZXBsb3lzIG9ubHkgc2FpZCBgY29tcG9zZSB1cCBmYWlsZWRgLioqIFRoZSBjb21wb3NlIG91dHB1dCB3ZW50IHRvIHRoZSBqb3VybmFsIG9ubHkuCi0gKipUaGUgcmVtb3ZlIHByb21wdCB3YXMgYSB0cmFwOioqICJPSyA9IGtlZXAgdm9sdW1lcywgQ2FuY2VsID0gZGVsZXRlIGV2ZXJ5dGhpbmciLgotICoqVGhlIGZpbGUgYnJvd3NlciBmYWlsZWQgZm9yIGFwcHMgd2l0aG91dCBuYW1lZCBwb2RtYW4gdm9sdW1lcy4qKiBgcGFuZWxjdGwgaW5zcGVjdC12b2x1bWVzYCBleGl0ZWQgMSBiZWNhdXNlIG9mIGBncmVwYCArIGBwaXBlZmFpbGAuCgojIyBXaGF0IGNoYW5nZWQKCiMjIyBXZWIgVUkgKGBwYW5lbC9mcm9udGVuZC9pbmRleC5odG1sYCwgcmV3cml0dGVuKQotICoqU3luY2luZzoqKgogIC0gT25lIGAvc3RhdHVzYCBwb2xsIHVwZGF0ZXMgY2FyZHMgaW4gcGxhY2U6IGV2ZXJ5IDhzLCAyLjVzIHdoaWxlIGFuIG9wZXJhdGlvbiBpcyBydW5uaW5nLCBwYXVzZWQgaW4gaGlkZGVuIHRhYnMuCiAgLSBBIGhlYWRlciBpbmRpY2F0b3Igc2hvd3Mgd2hlbiB0aGUgcGFuZWwgbGFzdCBzeW5jZWQgKCJMaXZlIMK3IDNzIGFnbyIpIGFuZCBzaG93cyBhIGJhbm5lciB3aGVuIHRoZSBBdXRoZWxpYSBzZXNzaW9uIGhhcyBleHBpcmVkLgogIC0gVGhlIGJ1c3kgc3RhdGUgKCJEZXBsb3lpbmfigKYiKSBpcyBzaGFyZWQgYmV0d2VlbiBicm93c2Vycy4KLSAqKkNhcmRzOioqCiAgLSBBIHN0YXR1cyBwaWxsIChydW5uaW5nIC8gcGFydGlhbCAvIHN0b3BwZWQpLgogIC0gRG9tYWlucyBhcmUgY2xpY2thYmxlIGxpbmtzLCB3aXRoIGJhZGdlcyBmb3IgcHJvdGVjdGVkIGFuZCBnaXQgYXBwcy4KICAtIEEgRGVwbG95IGJ1dHRvbiBwbHVzIGFuIG92ZXJmbG93IG1lbnUgKHJlc3RhcnQsIHN0b3AsIHN5bmMsIGxvZ3MsIHJlbW92ZSkuCi0gKipUYWJzOioqCiAgLSAqKk92ZXJ2aWV3OioqIGNvbnRhaW5lcnMgYW5kIHJvdXRlcy4KICAtICoqQ29tcG9zZToqKiB0aGUgZWRpdG9yIHRyYWNrcyB1bnNhdmVkIGNoYW5nZXM7IEN0cmwrUyBzYXZlczsgYWxzbyBzYXZlICYgZGVwbG95LCBhbmQgdmFsaWRhdGUuCiAgLSAqKkxvZ3M6KiogYSBmb2xsb3cgbW9kZS4KICAtICoqUm91dGVzOioqIGFuIGVkaXRvciB0aGF0IHZhbGlkYXRlcyBlbnRyaWVzIGJlZm9yZSBzYXZpbmcuCiAgLSAqKkZpbGVzOioqIGRyYWctYW5kLWRyb3AgdXBsb2FkLgogIC0gKipCYWNrdXBzOioqIHJlc3RvcmUsIHdpdGggYW4gb3B0aW9uYWwgcmVkZXBsb3kgYWZ0ZXJ3YXJkcy4KICAtICoqU291cmNlKiogKGdpdCBhcHBzKTogdGhlIGRlcGxveWVkIGNvbW1pdCwgKipDaGVjayBmb3IgdXBkYXRlcyoqIChzaG93cyBob3cgbWFueSBjb21taXRzIGJlaGluZCkgYW5kICoqU3luYyAmIGRlcGxveSoqLgotICoqTmV3LWFwcCBkaWFsb2c6Kiogc3RhcnRlciwgY29tcG9zZSBvciBnaXQgc291cmNlLiBJdCBzdWdnZXN0cyB0aGUgbmV4dCBmcmVlIHBvcnQgYW5kIGZpbGxzIHRoZSBkb21haW4gaW4gZnJvbSB0aGUgYXBwIG5hbWUuCi0gKipGZWVkYmFjazoqKiBjb25maXJtIGRpYWxvZ3MgKGRlbGV0aW5nIGRhdGEgcmVxdWlyZXMgdHlwaW5nIHRoZSBhcHAgbmFtZSksIHRvYXN0cywgYW5kIGFuICoqQWN0aXZpdHkqKiBkcmF3ZXIgd2l0aCBlYWNoIG9wZXJhdGlvbidzIG91dHB1dC4KLSAqKk90aGVyOioqIHNlYXJjaCwgc3RhdHVzIGZpbHRlcnMsIGtleWJvYXJkIHNob3J0Y3V0cyAoYC9gLCBgTmAsIGBFc2NgKSwgZGVlcCBsaW5rcyAoYCMvYXBwL3RhYmApLCBkYXJrIG1vZGUsIG1vYmlsZSBsYXlvdXQuIE5vIGV4dGVybmFsIGZvbnRzIGFyZSBsb2FkZWQuCgojIyMgQVBJIChgcGFuZWwvcGFuZWwtYXBpLnB5YCkKLSBgVGhyZWFkaW5nSFRUUFNlcnZlcmAsIHdpdGggYSBwZXItYXBwIG9wZXJhdGlvbiBsb2NrOiBhIHNlY29uZCB3cml0ZSB0byB0aGUgc2FtZSBhcHAgZ2V0cyBgNDA5YCB3aXRoIGBidXN5YC4KLSBgR0VUIC9zdGF0dXNgIHJldHVybnMgYWxsIGFwcHMsIHRoZWlyIHJvdXRlcyBhbmQgY29udGFpbmVyIHN0YXR1cyBpbiBvbmUgcmVxdWVzdCwgd2l0aCBzdGF0dXNlcyBjb2xsZWN0ZWQgaW4gcGFyYWxsZWwuCi0gR2l0OgogIC0gU3luYyBpcyBgZmV0Y2hgICsgYHJlc2V0IC0taGFyZCBGRVRDSF9IRUFEYCwgdGhlbiByZWRlcGxveS4gSXQga2VlcHMgdGhlIHRva2VuIGFuZCByZXBvcnRzIHRoZSBjb21taXRzIGJlZm9yZSBhbmQgYWZ0ZXIuCiAgLSBOZXcgZW5kcG9pbnQ6IGBHRVQgL2FwcHMvPG4+L3JlcG9bP2ZldGNoPTFdYC4KICAtIEFueSBodHRwKHMpIGhvc3Qgd29ya3MgKGUuZy4gdGhpcyBGb3JnZWpvKS4KICAtIEFuIGVtcHR5IGJyYW5jaCBtZWFucyB0aGUgcmVwbydzIGRlZmF1bHQgYnJhbmNoLgogIC0gR2l0IGNvbW1hbmRzIGhhdmUgdGltZW91dHMgYW5kIG5ldmVyIHdhaXQgZm9yIGEgY3JlZGVudGlhbCBwcm9tcHQuCiAgLSBUb2tlbnMgYXJlIHJlbW92ZWQgZnJvbSBlcnJvciBtZXNzYWdlcy4KICAtIFRoZSBVUkwgYW5kIGJyYW5jaCBhcmUgdmFsaWRhdGVkIGJlZm9yZSBiZWluZyB3cml0dGVuIHRvIHRoZSBtYW5pZmVzdCwgd2hpY2ggYmFzaCBzb3VyY2VzLgoKIyMjIHBhbmVsY3RsCi0gYGZsb2NrYCBhcm91bmQgcmV3cml0ZXMgb2YgYHJvdXRlcy5jYWRkeWA7IGB1dGlsLWxpbnV4YCBhZGRlZCB0byB0aGUgc2VydmljZSBwYXRoIGluIGBwYW5lbC5uaXhgLgotIGBkZXBsb3lgIHJldHVybnMgdGhlIGNvbXBvc2Ugb3V0cHV0LgotIGBpbnNwZWN0LXZvbHVtZXNgIGZpeGVkLgoKIyMgQmVoYXZpb3VyIGNoYW5nZSB0byBub3RlClN5bmNpbmcgYSBnaXQgYXBwIG5vdyAqKmhhcmQtcmVzZXRzKiogdGhlIGNoZWNrb3V0IHRvIHRoZSByZW1vdGUgYnJhbmNoLiBDb21wb3NlIGVkaXRzIG1hZGUgaW4gdGhlIHBhbmVsIG9uIGEgZ2l0IGFwcCBhcmUgZGlzY2FyZGVkIG9uIHRoZSBuZXh0IHN5bmMuIFRoZSBDb21wb3NlIGFuZCBTb3VyY2UgdGFicyBib3RoIHdhcm4gYWJvdXQgdGhpcy4gQmVmb3JlLCBhIGNvbmZsaWN0aW5nIGBnaXQgcHVsbGAgcmUtY2xvbmVkIHRoZSByZXBvIGFueXdheSwgc28gdGhvc2UgZWRpdHMgd2VyZSBsb3N0IGluIHRoYXQgY2FzZSB0b28uCgojIyBUZXN0aW5nCkkgdGVzdGVkIGFnYWluc3QgYSBoYXJuZXNzOiB0aGUgcmVhbCBgcGFuZWxjdGxgICh3aXRoIHRoZSBgaW5zdGFsbCAtbyByZXVkeWAgb3duZXIgZmxhZ3MgcmVtb3ZlZCBzbyBpdCBydW5zIHVucHJpdmlsZWdlZCksIGEgZmFrZSBgcG9kbWFuLWNvbXBvc2VgLCBhbmQgYSBsb2NhbCBnaXQgcmVwbyBzZXJ2ZWQgb3ZlciBIVFRQLgotICoqQVBJOioqCiAgLSBDcmVhdGluZyBlYWNoIHNvdXJjZSB0eXBlLgogIC0gQSBiYWQgcmVwb3NpdG9yeSBVUkwgaXMgcmVqZWN0ZWQgYmVmb3JlIGFueXRoaW5nIGlzIGNyZWF0ZWQuCiAgLSBBIGNvbmN1cnJlbnQgZGVwbG95IGdldHMgNDA5LCB3aGlsZSBgL3N0YXR1c2Agc3RpbGwgYW5zd2VycyBpbiBhYm91dCAwLjFzLgogIC0gQSBmYWlsZWQgZGVwbG95IHJldHVybnMgdGhlIGNvbXBvc2UgZXJyb3IuCiAgLSBDaGVjayBmb3IgdXBkYXRlcyByZXBvcnRzIDEgbmV3IGNvbW1pdDsgc3luYyB0aGVuIHJlc2V0cyBhIGRpcnR5IGNoZWNrb3V0LgogIC0gUm91dGVzIHVwZGF0ZS4KICAtIDQ1IHBhcmFsbGVsIGByZW5kZXItcm91dGVgIGNhbGxzIGxlYXZlIGV2ZXJ5IHJvdXRlIGJsb2NrIGludGFjdC4KLSAqKlVJOioqIGEgaGVhZGxlc3MgQ2hyb21pdW0gKFBsYXl3cmlnaHQpIHdhbGt0aHJvdWdoIG9mIGV2ZXJ5IHRhYiBhbmQgZGlhbG9nLiBJdCBjaGVja3MgdGhhdCBlZGl0cyBzdXJ2aXZlIHBvbGxpbmcsIGFuZCBjb3ZlcnMgdGhlIGVycm9yIHRvYXN0IGFuZCBvdXRwdXQsIHN5bmMsIHRoZSBuZXctYXBwIGZsb3csIHNlYXJjaCwgZGVlcCBsaW5rcywgZGFyayBtb2RlLCBhbmQgbW9iaWxlIGF0IDM5MHB4IChubyBob3Jpem9udGFsIHNjcm9sbCkuIE5vIGNvbnNvbGUgZXJyb3JzIG90aGVyIHRoYW4gdGhlIGludGVudGlvbmFsbHkgZmFpbGVkIGRlcGxveS4KLSAqKk5vdCB0ZXN0ZWQ6Kiogb24gdGhlIHJlYWwgaG9zdCAoUG9kbWFuLCBDYWRkeSwgQXV0aGVsaWEpLiBBZnRlciBgbml4b3MtcmVidWlsZCBzd2l0Y2hgLCBwbGVhc2UgY2hlY2sgdGhhdCB0aGUgc2Vzc2lvbi1leHBpcnkgYmFubmVyIGFuZCB0aGUgRmlsZXMgdGFiIHdvcmsgYmVoaW5kIEF1dGhlbGlhLgoK8J+kliBHZW5lcmF0ZWQgd2l0aCBbQ2xhdWRlIENvZGVdKGh0dHBzOi8vY2xhdWRlLmNvbS9jbGF1ZGUtY29kZSkK
Forgejo: - panel.nix passes the local Forgejo's public, API and ssh URLs (derived from forgejo.nix) to panel-api. - Settings dialog: connect a Forgejo access token (verified against /api/v1/user, stored 0600 in state/panel/forgejo-token). - New-app dialog gets a Forgejo repository picker with search and a branch dropdown; private repos are cloned over https with the stored token, or over ssh with the deploy key when no token is connected. The app name and domain are filled in from the repository name. - Commit and compare links in the Source tab point at Forgejo; cards show the provider ("Forgejo · main"). Git over ssh: - ssh:// and git@host:owner/repo URLs are accepted; the panel generates an ed25519 deploy key in state/panel/ssh and uses it for clone/fetch (BatchMode, accept-new host keys). openssh added to the service path. - Credential redaction only applies to http(s) URLs, so ssh usernames are kept; git errors now report the meaningful line instead of git's advice. Environment variables: - Stored per app in state/env/<app>.env (0600), outside the repo and stack. - panelctl passes them to every compose command via env(1), so ${VAR} interpolation works; by default deploy/restart also generate a compose override listing the keys under every service's environment (values are read from compose's environment, never quoted into YAML). - Environment tab (and a section in the new-app dialog) with .env paste import, hidden values, validation of names (reserved podman/compose vars rejected), hints for ${VAR}s the compose file uses but aren't set, and Save / Save & deploy. Removing an app deletes its variables. The API still accepts the old source_type "github" / github_* fields. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UbWSNkXxZhYf7eqHTyx3Bf