Repository navigation
PRDCT-692: describe the Apps actions the way the UI shows them - #1159
Merged
Merged
Conversation
The kbc-ui build europe-west3 loads on 2026-10-01 (bundle.B71zPxpk.js -> app-Ctfkb0Pk.js, label function qO in promise-C32ImHGm.js) labels the header button, the wizard title and its submit button Deploy (state created), Redeploy (running, starting, restarting) or Start (any other state, including stopped and sleeping). The 30 Sep build (bundle.D8PUgM9Y.js) already did; the 14 Sep build said Deploy App / Redeploy App / Start App. All three submit the same request (patchApp with desiredState running, restartIfRunning and the saved configVersion), so the pages now offer Start wherever an app may be asleep. Whether Start on a sleeping app clones the branch again is not tried yet, so operate.md carries a VERIFY(Nikita) note. The same build hides the Backend size field on projects with the pay-as-you-go feature (WorkspaceSizeControl-DmN0mNiM.js returns null when hasPayAsYouGo()), and on Redeploy and Start it folds the wizard's fields, including the Streamlit "Update packages dependencies" switch, into a collapsed Deploy settings section (CredentialsModal-B_bRWS_U.js). So operate.md no longer says the wizard asks for them every time, and getting-started's step 5 no longer sends readers to set size and auto-sleep on the app's page. Open App shows on any deployed app with a URL (StatusLabel-BG6QKoCN.js), not only running ones, and the App actions intro on reference.md now names the header and the menu. The two publish-and-share alt texts now describe what the 2026-07-10 screenshots show; the screenshots themselves still carry the older UI. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 63cf978643ccdfeb1e564630ce592b8e0d3a8886)
The kbc-ui build europe-west3 loads on 2026-10-01 (bundle.CF29sTZY.js,
Last-Modified 13:38 GMT -> app-QW9Ajcyu.js; the 12:28 build
bundle.B71zPxpk.js agrees) has no "Modify with Kai" on apps. That label
survives only on flows (DetailHeader-BMtgH9uA.js). The app page header
(DataAppDetailHeader-Dmx7xNmH.js) shows "Edit with Kai"
(OpenBuilderButton-CMgXpIbI.js, data-testid open-data-app-builder-button)
only when the page isn't read-only, Kai can build apps in the project
(canUseChat and isKaiAgent; the Create app page says "Kai can't build apps
in this project yet" when only the first holds) and tO in
promise-3eZRphUI.js holds: the app is Python/JS and has a Keboola-managed
Git repository. It follows the repository, not who built the app. The
same header has "Migrate to Python/JS with Kai" on Streamlit apps (also
only for users who can edit, with Kai able to build apps, on stacks that
offer Python/JS; PromptButton renders nothing without canSendPrompt),
which the reference list lacked.
The ⋯ menu (data-app-actions-dropdown) shows "Duplicate with Kai" when
app.hasManagedGitRepo (StatusLabel-v2pya8eH.js). It opens a new Kai chat
and sends a prompt to copy the app, check first, say what carries over and
what to set up again, and copy once the user confirms; it is disabled when
Kai can't take prompts ("only Kai can copy it"). Other apps get the
generic copy item (CopyButton -> CopyVersionButton-B5pKl52S.js), whose
menu text is "Copy " followed by b, and b = "app" for keboola.data-apps,
so "Copy app" is still on screen there although no chunk holds the
literal string. copyVersion creates the new app from the configuration
minus parameters.id, so a copy of an app on its own repository deploys
the same branch; the operate page now says to give the copy its own
branch. Duplicate, Copy, Automate and Delete render only for users who
can edit the project.
The Overview (Detail-rhJ8jrVk.js, component yn) shows "The code of this
app is stored in a Keboola-managed Git repository, so there is nothing to
set up here." for a managed repository and a Git Repository (Python/JS)
or Code Source (Streamlit) section otherwise, so operate.md and
what-are-apps.md now tell readers how to see which kind their app has.
what-are-apps' old test ("if the Kai builder and the live preview are
missing, its code lives in a repository you host") fails wherever Edit
with Kai is hidden for other reasons, such as a read-only role.
operate.md, reference.md, publish-and-share.md and what-are-apps.md now
say Edit with Kai, and Duplicate with Kai or Copy app, with those
conditions. "Ship a code change" keys its first bullet on the managed
repository, as its intro ("where the code lives") already does, and links
the push-it-yourself route for projects without Kai. The three
VERIFY(Michal Ševčík) comments are gone: the labels were renamed, and the
copy item depends on the repository. The VERIFY(Nikita) question in
reference.md (do apps Kai built show the Open App dialog?) goes too: the
dialog (CredentialsModal-DKVAbjxh.js) branches only on the app's
authentication, address and state, never on its repository or builder.
The publish-and-share alt text still describes the 2026-07-10 screenshot
until it is reshot.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 8353a599f95e99b02718921cdfe50a1c44cca902)
Checked against the kbc-ui build europe-west3 loads on 2026-10-02
(bundle.7TCWrz7w.js, Last-Modified 12:56:27 GMT -> app-ZybA-vsV.js,
770 chunks; read from a signed-in project 264 page, document.scripts
only), using the public source maps' original TypeScript. Compared with
the 2026-10-01 13:38 build (bundle.CF29sTZY.js), this build renamed two
of the actions the pages describe, so this commit takes those as well
(Nikita's call):
- The header button is "Open", no longer "Open App" (OpenDataApp.tsx,
mode "header"; tooltip "Open the production app in a new tab"). It
renders on any app whose state is not "created" and that has a URL,
and it always opens the "Open app" dialog (CredentialsModal,
CredentialsModalContent.tsx), whatever the authentication: App address
with a copy button, then the Password field (hidden, reveal, copy) for
password auth, or a NO_PASSWORD_REASON line for SSO, public or unset
auth. The footer's "Open app" link opens the URL with target=_blank.
reference, operate, publish-and-share, getting-started (twice),
authentication (twice), build-locally (five times) and troubleshooting
now say Open; authentication step 2 and getting-started step 7 now go
through the dialog. Kai's chat card still says "Open App"
(surface kai_card), so getting-started's line about Kai's final
message stays. getting-started's VERIFY(Nikita) on whether Kai-built
apps get the dialog goes: the dialog branches only on authentication,
address and state.
- The menu item "Suspend app" is "Pause app" (TerminateDataApp.tsx,
STOP_ACT.sleep in stopAct.ts), offered on a running app; on a
starting app it is "Cancel start" (STOP_ACT.cancelStart). Pause sends
patchApp { desiredState: "stopped" } only (actions.ts updateApp), as
Suspend app already did on 01.10, so the old "stops serving until
Start" text was wrong before the rename as well. The
confirmation says "Sleep mode will be activated and the app will wake
up on the next visit or start.", and appStatus.ts headlines a stopped
app with auto-restart on as Sleeping ("A stopped app wakes on the next
request unless autoRestartEnabled === false"). So operate's Stopping
bullet becomes Pausing: the app sleeps early, keeps its configuration,
and wakes on the next visit or Start. The bullet names the
confirmation's "Pause now" and says what the reader then sees: the
page badge reads Stopped (StatusLabel.tsx keys on the raw state) with
Start in the header, while the Apps list says Sleeping (AppsTable ->
AppStatus -> getStatusLabel). kbagent 0.95.0's data-app stop sends the
same patch (stop_data_app -> patch_app(desired_state="stopped")), so
the terminal line says it does what Pause app does.
- Two Open buttons exist on the Overview tab: the header's opens the
dialog, the App access card's is a plain link to the app
(AppUrlSetting.tsx). The password steps (authentication twice,
troubleshooting, build-locally twice plus its two stage-strip items,
getting-started step 7) now say "in the page header".
The items from the brief, all unchanged since 01.10 in this build:
- Debug mode (DebugModeLink.tsx) links to route generic-config-raw,
path "raw" (components-directory/routes.tsx), which renders
GenericDetailRaw: a full-screen JSON editor with the tabs "Update
Configuration" and "Update State" and Save buttons. hideRun covers
keboola.data-apps, so it has no Run Job buttons for apps. It never ran
the app "with extra diagnostics". A saved configuration is a new
version that Start and Redeploy pick up (DeployDataApp.tsx re-reads
the latest configuration and sends its configVersion); a saved state
goes through updateConfigurationState, which the Storage API spec says
"does not create a new configuration version".
- Automate (ScheduleConfigurationButton.tsx): "You are about to create
a single task flow with a given name and schedule." Flow name defaults
to "Scheduled <app name>", the schedule to "Once per hour"
(1 * * * *, UTC). handleSubmit creates a keboola.flow configuration
with one task (prepareTaskRef -> keboola.data-app-control with the
app's appId) and creates and activates its schedule. The public
component index describes keboola.data-app-control as "This component
allows to start Data App from Flow"; it is registered (tag 0.0.2) on
all five multi-tenant stacks (/v2/storage, 2026-10-02). operate's
"redeploy it after the data it reads has been refreshed" had no
source; the "(add it to a flow)" parentheticals said the same. The
bullet now says how to set a time of day (Custom schedule; the
presets are every 5 or 10 minutes, twice per hour, once per hour,
once per 6 hours, 5 am and 5 pm, 12 pm), that times follow the
"Timezone:" picker next to Schedule (UTC by default,
ScheduleTimezone.tsx), that a started app still sleeps after its
inactivity timeout, and who sees the item: DataAppDetailHeader.tsx
renders it for !readOnly && canManageSchedule, which is Admin or
Share (admin/privileges.ts canActivateSchedule); the Production
Manager branch of that check never applies, because projects with a
protected default branch have no Apps (ApplicationStore.hasDataApps).
- publish-and-share "Share with your team" ("Open in new tab") is left
alone here: branch PRDCT-692-apps-app-access (2060a0ce, stacked on the
reshoot) rewrites that section around the App access card
(AppUrlSetting.tsx: App URL with "Copy the address", Open with the
tooltip "Open the production app in a new tab", the Password field)
and reshoots publish-config.png, so a second edit would only conflict.
- reference Terminal log: the button is "Download logs"
(TerminalLogs/DownloadButton.tsx) and the tab "Terminal Logs"
(DataAppDetailHeader.tsx).
- The header menu trigger is a vertical ellipsis (EllipsisVertical)
with aria-label "More actions" (RowActionDropdown.tsx, inHeader), and
nothing visible names it. The pages wrote ⋯; they now write ⋮ and,
once per page, "the ⋮ (More actions) menu" (Nikita's call).
Found in the same build and fixed in the next commit of this PR: the
non-managed-repo copy item is now "Duplicate" (DataAppCopyAction.tsx,
dialog "Duplicate app"), and Start on an app that has run before now
starts without the wizard unless Kai drafts are pending
(DeployDataApp.tsx startsWithoutAsking).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The two commits below this one were written against the 2026-10-01 build. The 2026-10-02 builds (bundle.DZIl0CMv.js 12:14 GMT and bundle.7TCWrz7w.js 12:56 GMT) changed two things they describe: - The copy item on apps without a Keboola-managed repository is "Duplicate" (DataAppCopyAction.tsx passes CopyButton label "Duplicate", title "Duplicate app" and the note "The new app gets this one's code (or repository and branch) and settings. It starts undeployed and gets its own address when you deploy it. Change the repository or branch afterwards if it should not follow this one."). operate.md (twice), publish-and-share.md and reference.md now say Duplicate, and operate and reference say what the copy gets. Duplicate with Kai is unchanged. - Start on an app that has run before starts it right away with its saved settings: DeployDataApp.tsx has startsWithoutAsking = label === 'Start' && draftCount === 0, where draftCount counts Kai's undeployed drafts (useDeployableDrafts), and handleDeploy(readSavedSettings()) sends the same patch as before. Redeploy still opens the wizard with Deploy settings collapsed. getting-started step 6, reference's deploy wizard paragraph, operate's Change settings and lock-version's "Updating package dependencies" step 1 now say so, in the wording branch PRDCT-692-streamlit-reshoot (d397b1a2) uses for the same lines, so that branch merges cleanly on top. On main before this PR, getting-started said only "The same wizard runs on Redeploy", which was right; operate.md said the wizard opens "each time you deploy or start the app" and lock-version said to start the app and then turn the toggle on, both already wrong for Start. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Seven Apps images showed the July or March UI (Redeploy App, Start App, the Kai Agent Beta pill, the old Start Data App dialog, an Overview with the App URL below Authentication), so they contradicted the lifecycle text around them. All new shots come from demo project 264 on europe-west3 on 2026-10-01 (kbc-ui bundle.CF29sTZY.js -> app-QW9Ajcyu.js), 2x, cropped to the part of the UI the step points at, with person names in the Versions panel blurred. - deploy-wizard.png (new): Deploy wizard of an app that has never run. Replaces deploy-timeout-backedsize.png on getting-started step 6 and publish-and-share step 1. - redeploy-wizard.png (new): Redeploy wizard of a running app with Deploy settings collapsed, for reference "Sleep and resume". - app-actions-menu.png: stopped app header with the menu open (Duplicate with Kai, Automate, Debug mode, Delete app); now also on reference "App actions", replacing the March manage-redeploy.png panel. - build-in-ui-config.png: a never-deployed Python/JS app's Overview with the App access card (getting-started step 5, authentication Step 1). - streamlit/lock-start-data-app.png, lock-update-dependencies.png: the Start wizard, and the Redeploy wizard expanded with the Update packages dependencies switch. - streamlit/lock-freeze-version-toggle.png: Packages card with Freeze Version on (taken while freezing was on for the shot above). - Removed the now unreferenced deploy-timeout-backedsize.png and manage-redeploy.png. Text: alt text for every changed image. authentication says the App URL block is in the App access card, above Authentication, and that the card's not-deployed notice doesn't matter there. getting-started step 6 and publish-and-share step 1 say to click Deploy in the wizard. lock-version says "Freeze Version" (the UI label) in the Packages card, puts the wizard shots under their steps, shows the Packages card as it looks after the first start, adds the confirm step to section 3, and says what to do when the Update packages dependencies toggle is missing (start once, reload, reopen the wizard): the wizard (CredentialsModal-DKVAbjxh.js) renders it only when parameters.dataApp.freezeDependencies and state.data_app["requirements.txt"] are set, and the state key appeared after one start with freezing on. Masked a colleague's name (three Versions lines) in the old streamlit/lock-update-requirements.png and in its byte-identical, unreferenced copy lock-streamlit-version/code-deployment/update-requirements.png, which help.keboola.com still serves (PRDCT-616 rule). Project 264 changes made for the shots, approved by Nikita: new docs-manual-app (App ID 74022487, repo keboola/titanic-python-app, never deployed), and on docs-test-oidc-google (74021824) Freeze Version on, one start, Suspend App, Freeze Version off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
publish-and-share said the app URL was in the App URL block "with a copy
button and Open in new tab", and publish-config.png showed the July UI
(OPEN IN NEW TAB, the Git Repository card above App URL). The Overview
tab now has an App access card: Open at its top right once the app has
been deployed, the App URL block (URL prefix plus the generated part,
with a copy button), then Authentication, which has a Password field on
a Basic (Password) app. No other Apps page said "Open in new tab".
- publish-and-share "Share with your team": where the URL is and what
its copy button (Copy the address) copies; the card's own Open only
after the first deploy, with a notice such as "Not deployed yet. Deploy
it to get an address you can share." before it; that the first visit
wakes a sleeping app, with a link to Stop, start, sleep. For Basic
(Password): the Password field in the same card (hidden until the eye
icon reveals it; copy works while hidden), what to do when the card
asks for a deploy first, and what Reset does (the old password stops
working, usually within a minute).
- publish-config.png: reshot from Toy Store Sales Dashboard (project
264, App ID 74016144, deployed and stopped; its state read through the
Sandboxes API before and after the capture, stopped both times;
nothing clicked), 1100 px at 2x, cropped to the App access card and
the right rail (App Info, Last App Runs, Versions), person names in
the Versions panel blurred, the password masked as the UI shows it.
Checked against the UI build loaded on 2026-10-02 (bundle.DZIl0CMv.js ->
app-725wdyTu.js, Last-Modified 12:14 GMT) through its public source maps:
- AppUrlSetting.tsx: Open renders only when the app has been deployed and
has a URL; it is a link with target="_blank" (tooltip "Open the
production app in a new tab"). The copy button ("Copy the address")
copies https:// plus the prefix and the generated part. The status line
reads "Not deployed yet. Deploy it to get an address you can share."
with a Deploy button, or No code yet / No authentication yet /
Deploying.
- AppPasswordField.tsx: the password is masked (hiddenByDefault), an eye
(aria-label "Show password") reveals it and a copy button copies the
real value. Reset, hidden from read-only users, asks first: "A new
password is generated and this one stops working, for everyone who has
it." The success toast (promise-D6gHcaBZ.js) adds "this change may take
effect within the next minute"; the apps proxy (keboola-as-code
appsproxy) refetches app config when its max-age runs out and checks
each visitor's cookie against the current password.
- Before a Basic app has a password, the card shows "<Deploy|Start|
Redeploy> the app to generate its password." instead of the field
(AppUrlSetting.tsx passwordPending).
Reviews: fact-checker 0 critical / 0 major, 16 of 16 claims confirmed
plus every element the alt text names; guide-tester (cold read) no
blockers, its in-scope points applied. Delta pass on the revised text:
7 confirmed; its MAJOR was that operate.md's stopping text is stale
(today's menu has Pause app, "Sleep mode will be activated and the app
will wake up on the next visit or start.", where 1 October had Suspend
app), so the pointer now covers sleeping apps only; its two minors
(the eye's label is only an aria-label, "usually within a minute") are
applied. Humanizer pass on the final section: the authentication
sentence no longer repeats step 3 of the list above it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Steps 1-4 of getting-started "Create an app manually" and build-in-ui-create.png still showed the July Create App screen: "or create manually" above a Streamlit card and a Python / JS card. Today's screen is titled Create app: Build with Kai, then Other ways to start with Build locally with your coding agent, Deploy from your own Git repository (Python / JS, No Kai) and a Create a Streamlit app link. Read live in project 264 on europe-west3 (kbc-ui bundle.DZIl0CMv.js on 2026-10-02, and bundle.7TCWrz7w.js later that afternoon, same text); the CreateAppPage code comes from bundle.CF29sTZY.js of 2026-10-01, which has the same strings. getting-started, Create an app manually: - Steps 1-4 follow the new screen: Create app; choose the stack under Other ways to start; name the app (Folder optional; the Python / JS form takes an optional Repository URL and shows a Private repository switch once one is typed); add the code. Python / JS needs a keboola-config/ folder (link to App structure), then the Git Repository card: URL and credentials if skipped, Load branches, branch, save. Streamlit uses the Code Source card: Code + Add Code, or Git Repository with a Main File Path. - The App access card says No code yet and Deploy is disabled until the app has code. A saved repository URL already counts as code, so Deploy turns on before a branch is picked; the step says to pick it first (Detail zt notices; TO/wO/SO behind Deploy). These post-creation states are code-only, so they carry VERIFY(Nikita). - A project with no apps has no Create app button; its Apps page shows the same choices (Header-CLb288SU returns null for an empty list; Index empty state). VERIFY(Nikita), as project 264 has apps. - Single-tenant and Streamlit-only stacks still get the older layout (CreateAppPage renders DataAppsEmptyState when $O holds): one sentence plus VERIFY(Jordan). - The stack hints (custom app, existing Streamlit app) stay, linked to what-are-apps and the Streamlit section. Steps 5-7 are unchanged. getting-started Step 1 (Kai walkthrough): the Create app button, the new screen, and the no-apps case (use the Apps page's prompt for Step 2). getting-started-create-app.png (a byte-identical copy of the old create shot) and getting-started-apps-list.png (old + Create App button, Kai Agent Beta pill, colleagues' names in Last Change) are reshot. index.md and build-locally: Create App -> Create app. build-locally "Sync to your project": step 1 is Apps -> Create app -> Deploy from your own Git repository with a link to the manual steps, step 2 skips what was given at creation, step 3 says Load branches and save, and the comment below gives the Load branches rule as the 2026-10-01 UI code has it. Shots: 2x at a 960 px viewport, cropped below the top bar (no project, branch or avatar) and above the apps table (no names); the Git form is filled with docs-manual-app and keboola/titanic-python-app and was not submitted. Mean luma 243-247. Nothing was created or changed in project 264. Checks: npm run build clean (373 pages); audit-phase2 identical to the base (0 broken links, 0 missing images, 70 known); docs-link-redirect-check 0 blockers. fact-checker: 0 critical, 0 major, 32 confirmed; three minors applied, two filed as follow-ups (Build on Keboola, build-locally's skill offer). Second fact-check pass on the added sentences: 0 / 0, 8 confirmed, both minors applied. guide-tester (live, read-only): no blockers, its three majors applied, minors applied except two outside the rewritten steps. checker: PASS, its text minors applied; the Streamlit page's stale create steps are filed as a follow-up. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Eight Streamlit images showed the March UI (General Setting, Deployment Type, Data App Repository, the old Upload requirement.txt dialog). They are reshot on europe-west3, project 264, app docs-test-oidc-google (74021824), 2x, headless Playwright with the saved session, on 2026-10-02 against build bundle.7TCWrz7w.js -> app-ZybA-vsV.js (deployed 12:56 GMT). The sources quoted below were read in the 12:14 build bundle.DZIl0CMv.js and are byte-identical in both builds. - streamlit/custom-data-app-url.png: App access card (App URL; Authentication collapsed) - streamlit/development-type-code.png: Code Source card with Code selected - streamlit/packages.png: Packages card, cropped above the Click Here line a new app doesn't have - streamlit/theming-predefined.png: Theme card with the Color Palette list open - streamlit/lock-upload-requirements.png: Upload requirements.txt File dialog, empty - streamlit/lock-update-requirements.png: the same dialog after picking a three-line sample requirements.txt (Nikita's OK, 2026-10-02; the browser reads the file locally) - streamlit/git-repository-public.png and git-repository-private-ssh.png: the empty Git Repository form, with Private off and on (Nikita's OK for the radio and the Private switch only: nothing typed, Load branches not clicked) Nothing was saved: the config stayed at version 7 through every capture. The text follows the same build (public source maps): Create app -> Create a Streamlit app, the empty-project link, the single-tenant and Streamlit-only layouts (CreateAppPage, DataAppsEmptyState, Header, singleTenant; VERIFY(Jordan) because not seen live); the prefilled New App name, Description and Folder, Create app, the name becoming the URL prefix, Basic (Password) as the default access (wizardConfig, getDataAppConfig, basicProxyAuthorization); App URL up to 50 characters, the new address from the next deploy (AppUrlSetting, helpers); Code Source, Add Code, the collapsed card (DeploymentCard, CodeField); saving one deployment method removes the other's settings (DeploymentCard, GitSetting, PackagesCard); Packages saving on every change and shown only with Code (PackagesCard, PackagesSelect, Deployment); Git Repository, Project URL, Load branches, Private, the repo-scope note, SSH Private Key, no passphrase field, the key-wins rule (GitSetting, GitSettingHelpers, SshKey; the Project URL form an SSH key needs is a VERIFY(Jordan) comment); Theme on Advanced Settings, Streamlit Default, Keboola as the start palette (ThemeSettings, constants, withStreamlitTheme); the upload dialog's merge strategies and the lines Save Packages skips, which include any line starting with http, so packages such as httpx (UploadRequirementsFileModalContent, utils). Save is the shared SaveButtons label. Removed 11 images no page has referenced since 8c1f39e (July): general-design-guide/pic1, pic3, pic4 (copies of streamlit/design-guide-*), lock-streamlit-version/code-deployment/*.png (5), streamlit/hello-world-code.png, streamlit/theming-custom.png, terminal-log-tab/hello-world.png. No reference in src or _data; no open PR's branch has one (29 stale remote branches still carry the pre-July pages); none in developers-docs main; gh search code, org-wide and GitHub-wide, finds only page URLs, which redirect_from still covers (the dist redirect pages for all three old paths were checked). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Since the 2026-10-02 builds (bundle.DZIl0CMv.js 12:14 GMT and bundle.7TCWrz7w.js 12:56 GMT; DeployDataApp.tsx is identical in both), Start on an app that has run before starts it right away with its saved settings: `startsWithoutAsking = label === 'Start' && draftCount === 0`, where draftCount counts Kai's undeployed drafts of the app (useDeployableDrafts). getDeployActionLabel: created -> Deploy, running/starting/restarting -> Redeploy, else Start. The Update packages dependencies switch renders in the wizard only when Freeze Version is on and frozen requirements exist, so it is reachable through Redeploy only. Kai edits a Streamlit app in place (its tool reads "Modifying app"; the Python/JS one reads "Creating draft"), so the Streamlit page leaves the drafts case out. - lock-version, Enable version freezing, step 2: Start starts the app; Deploy and Redeploy open the wizard. The Start-wizard image gives way to redeploy-wizard.png (running Streamlit app, from f9bb4733), and lock-start-data-app.png, now unreferenced, is removed. - lock-version, Updating package dependencies: Redeploy only; start the app first if the header shows Start; the missing-toggle note says Redeploy. - getting-started step 6, reference (deploy wizard paragraph) and operate (changing settings): Redeploy opens the wizard; Start starts directly unless Kai has undeployed drafts; operate says how to change size or timeout on a stopped or sleeping app. Outside the original brief. On 2026-10-04 Nikita chose to extend it to getting-started and reference; operate.md made the same claim (found afterwards by the fact-checker) and gets the same fix plus one how-to sentence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
After an app fails to start several times in a row, the platform stops retrying and opening its URL no longer wakes it; someone has to fix the cause and start it by hand. The Apps pages promised that the next visit always wakes a sleeping app, and none of them mentioned this case. Troubleshooting now covers it: the visitor page, the warning on the app's page, Fix with Kai for apps Kai built, the failed run's reason and startup log (All Runs, or kbagent data-app runs with --json for the logs), and starting the app with Start or kbagent data-app deploy. Its first table row quoted the same visitor page by its pre-August heading, "Data App is not running", and now uses the current one. The reference and Operate name the exception and link there. Operate's terminal line says to use deploy after a fix, because start keeps the configuration version the app was last deployed with. This first sat on #1153 and is now rebuilt on #1159, which renamed Suspend app to Pause app and says a paused app wakes on the next visit, as the UI's confirmation dialog does. Operate and the reference keep #1159's Pause app and Redeploy text, and the question whether a visit wakes a suspended app is gone. Two VERIFY(Miro) comments stay: does a manual start turn waking back on, and does one failed deploy turn it off at once? The evidence is public code: the kbc-ui builds europe-west3 served on 2026-09-30 and 2026-10-01 (and 2026-10-02 for Pause app), the Sandboxes API definition of ExistingApp.autoRestartEnabled, the apps proxy in keboola/keboola-as-code (restart-disabled page instead of a wakeup), and kbagent's data-app commands in keboola/cli. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The reshot app-actions-menu.png shows the More actions menu as ⋮, the glyph #1159 uses in the text, but the alt text on publish-and-share and reference still said ⋯. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
keboola-pr-reviewer-bot
left a comment
There was a problem hiding this comment.
Verdict: needs_human (risk 3/5) · profile connection-docs
Content-bucket docs PR, but a newly added VERIFY(Nikita) marker in operate.md fails auto-approve gate 3.
Concerns:
src/content/docs/data-apps/operate.md: Newly added unresolved VERIFY(Nikita) marker on line 26 fails auto-approve gate 3.src/content/docs/data-apps/publish-and-share.md: Reworded alt text still names old labels (Modify with Kai, Copy app); deferred to reshoot branch.
Suggested reviewers: @keboola/docs
python-js-config.png in "Sync to your project" dated from July. It showed the old Overview layout (a separate Authentication card, no App access card), the Kai Agent Beta pill, and a Keboola-managed repository URL in a section about a repository you host. A user's name appeared three times in the Versions panel, which PRDCT-616 says to blur or crop. The new image is the Git Repository card alone: Project URL, the Private switch, Branch and Reload branches. The crop leaves out the top bar and the Versions panel, so no names show. It now sits under step 3, the step whose result it shows, indented as publish-and-share and lock-version do. Step 3 is in click order: Load branches, the Branch field, save. It adds that the button reads Reload branches once the branches have loaded, which is what the screenshot shows. The alt text describes the card. Source: docs-manual-app (App ID 74022487, config 01m3vxjspktqh2tbhmn0kzyese) in project 264 on europe-west3, repository keboola/titanic-python-app, branch main, never deployed. Headless Playwright with the saved session, build bundle.BeQYTX6g.js -> app-DYO4ae3t.js, 1100 px viewport at 2x, crop = card + 16 px. The card loaded collapsed. The only UI action was expanding it with a click() from JS, so the mouse never moved and nothing has focus. The Branch combobox stayed closed. Nothing was saved (versions are still #1 to #3) and nothing was deployed. DOM on 2026-10-06: the button text is "Reload branches" (uppercased by CSS), Private is a switch with aria-checked=false, Project URL is https://github.com/keboola/titanic-python-app, Branch is main. Load branches as the first label, and its change on load, come from the UI code of 2026-10-01. No app in project 264's production branch has a repository without a branch (kbagent config list, 2026-10-06), so the comment carries a VERIFY(Nikita). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
app-actions-menu.png was shot on 1 October, when the header button read Open App. The UI renamed it Open on 2 October, so the shot and its alt text on publish-and-share and reference no longer matched the text around them (#1159). The review bot flagged both on this PR. Retaken on 6 October in project 264 (europe-west3), UI build kbc-ui/bundle.BeQYTX6g.js (Last-Modified 06 Oct 11:46 GMT), on the same app as before: Toy Store Sales Dashboard, App ID 74016144, deployed and stopped (GET data-science /apps/74016144 said stopped before and after). Headless Playwright with the saved session. The only click was the ⋮ (More actions) trigger, closed with Escape. Same framing as the 1 October shot: 1100 px viewport at 2x, cropped to the breadcrumb, header, tabs and the open menu (Duplicate with Kai, Automate, Debug mode, Delete app). The top bar is cropped out, and the Versions panel's names were blurred before the shot and fall outside the crop. Mean luma 242.7. Source: OpenDataApp.tsx (TerminateDataApp-DvAPVWPU.js.map) labels the header button Open, tooltip "Open the production app in a new tab". The data-apps sources in this build match 2 October's bundle.DZIl0CMv.js byte for byte, except Builder/kaiPrompts.ts, which adds two Kai prompts for drafts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Streamlit page's "Create your first Streamlit app" (as #1167 left it) describes the create flow in its own words, including the rare layouts that getting-started's "Create an app manually" (#1166) also covers. Keep the Streamlit steps here and send the rare layouts there: - Old steps 1 and 2 become one step in getting-started's words: open Apps from the left navigation, click Create app, then under Other ways to start click Create a Streamlit app, the small link below the list. The step names the Create Streamlit app dialog it opens, so a reader whose Create app opens that dialog straight away knows where they are. A reader who can't find the button or the link follows the link to getting-started and comes back for step 2. Getting-started covers the Apps page of a project with no apps, the older single-tenant layout and the Streamlit-only stack, with its own VERIFY(Nikita) and VERIFY(Jordan) notes. The VERIFY(Jordan) comment on this page leaves with the sentences it flagged. - Logged deletion: the old text named the single-tenant card "Streamlit App". Getting-started says "a card per stack" and names its Create Streamlit app button, which is what the reader clicks. - The naming step adds that the app opens marked Not Deployed. - The URL prefix step says the App access card shows the address the app gets once it's deployed: a new app's card carries a "No code yet" or "Not deployed yet" notice above that field. - custom-data-app-url.png is cropped to the App URL field and its hint, pixel for pixel from #1167's shot, which showed a deployed app's card (Open button, OIDC). The App URL row looks the same on deployed and never-deployed apps; the alt text follows the crop. - The Deploy step links to getting-started for the wizard's fields and for opening the app once it runs. - Old steps 4 to 6 are renumbered 3 to 5. The link target's new text arrives with #1166; on this branch's parent getting-started still has the July section. Merge #1166 before this. Checked read-only in project 264 on 6 Oct 2026 (kbc-ui bundle.BeQYTX6g.js, newer than the 2 Oct builds): the Create app screen (data-apps/new) has Other ways to start with two cards and the Create a Streamlit app link below them; the link opens "Create Streamlit app" with Name prefilled "New App", Description (optional), Folder (optional) and Create app (the dialog was closed, nothing created); apps that never ran show the Not Deployed badge and "Not deployed yet. Deploy it to get an address you can share."; Code Source offers Git Repository and Code. #1167's custom-data-app-url.png was pixel-identical to today's App access card of docs-test-oidc-google before the crop. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…amlit steps Two reviewer findings from the Streamlit create-steps follow-up, which now links to this section for the rare layouts: - The VERIFY(Jordan) under step 2 named only the single-tenant layout. Step 2 also says that where only Streamlit is offered, Create app opens the Streamlit dialog straight away, which is known from the UI code of 1-2 Oct too. The Streamlit page's VERIFY used to name both and is gone in the follow-up, so this one now does. - The Streamlit bullet linked to the top of the Streamlit page. It now lands on "Create your first Streamlit app" there. Those steps describe today's flow once #1167 is in; before that the link lands on the old steps, which were one scroll below the old target anyway. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PRDCT-692: say when visiting a sleeping app no longer wakes it
PRDCT-692: reshoot the Apps screenshots against today's UI
PRDCT-692: describe today's Create app screen in Create an app manually
eruveo
approved these changes
Oct 7, 2026
eruveo
left a comment
Collaborator
There was a problem hiding this comment.
quick visual review looks good, this will be changing again soon i think
PRDCT-692: point "Share with your team" at the App access card
PRDCT-692: reshoot the Streamlit screenshots and drop stray Apps images
PRDCT-692: point the Streamlit create steps at Create an app manually
An app created with a Repository URL and no branch shows Load branches and no Branch field; after loading, the Branch field appears next to Reload branches (project 264, 2026-10-07, bundle.KLJ3B_2i.js). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PRDCT-692: reshoot the Git Repository screenshot on Build locally
No code yet with Deploy disabled, Not deployed yet once a URL is saved, Add Code, Main File Path's streamlit_app.py default and Load branches all checked on temporary apps in project 264 (2026-10-07, bundle.KLJ3B_2i.js); the page text already matched. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n-labels # Conflicts: # public/data-apps/lock-streamlit-version/code-deployment/update-requirements.png # public/data-apps/streamlit/lock-update-requirements.png
…markers Measured on a temporary app in project 264 (2026-10-08): a single failed start of a stopped app sets autoRestartEnabled to false, and a visit gets "This app is not running" without waking it. Start after the fix turns waking back on, and a visit after Pause app wakes the app. A failed Redeploy of a running app keeps the old version up. Operate and Troubleshooting said "several failed starts in a row"; they now say one failed start is enough, and that a manual Start restores waking. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Linear: PRDCT-692
Why
The Apps pages name and describe an app's actions the way the UI looked in July and September. The UI builds of 1 and 2 October changed almost every one of them: the lifecycle buttons, the Kai actions, the ⋮ menu and the dialogs behind them. This PR brings the pages in line, one commit per group:
Each commit message lists the UI build and the source files it was checked against.
What changed
Commit 1: lifecycle buttons
On reference, operate, publish-and-share, getting-started, authentication, build-locally, troubleshooting, what-are-apps and lock-version:
Commit 2: Kai actions
On operate, reference, publish-and-share and what-are-apps:
Commit 3: the other actions
kbagent data-app stopdoes the same as Pause app.Commit 4: two 2 October changes
PRDCT-692-streamlit-reshootuses for the same lines. Before this PR, getting-started said only "The same wizard runs on Redeploy", which is still true, while operate and lock-version already sent Start through the wizard.Evidence
A signed-in europe-west3 project page loaded
kbc-ui/bundle.B71zPxpk.jsandbundle.CF29sTZY.json 1 October (commits 1 and 2), andbundle.7TCWrz7w.js(12:56 GMT) on 2 October (commits 3 and 4). The chunks and their source maps are public on ui.keboola-assets.com, and the file names below come from the maps.helpers.tsgetDeployActionLabel:createdgives Deploy,running,startingandrestartinggive Redeploy, and anything else gives Start. The same label titles the wizard and its submit button.DeployDataApp.tsx:startsWithoutAsking = label === 'Start' && draftCount === 0, wheredraftCountcounts Kai's undeployed drafts. Start then deploysreadSavedSettings(), with the same patch as before.WorkspaceSizeControl).OpenBuilderButton.tsxandDataAppDetailHeader.tsx: Edit with Kai needs edit rights, Kai able to build apps (canUseChatandisKaiAgent) and a Python/JS app with a Keboola-managed repository. The same header renders Migrate to Python/JS with Kai, Open and the ⋮ menu.DataAppCopyAction.tsx: an app with a managed repository gets Duplicate with Kai. Any other app getsCopyButtonwith the label "Duplicate", the title "Duplicate app" and a note saying what the copy gets.OpenDataApp.tsx: the header's Open (tooltip "Open the production app in a new tab") renders once the state isn'tcreatedand always opensCredentialsModal. On 1 October it read "Open App". InCredentialsModalContent.tsx, the dialog's content branches only on authentication, address and state.TerminateDataApp.tsxandstopAct.ts:actions.tssends onlydesiredState: stopped, the same request Suspend app sent on 1 October, so the old "stops serving until Start" text was wrong before the rename too.StatusLabel.tsx) reads Stopped, and the Apps list (AppStatus.tsx) reads Sleeping.DebugModeLink.tsxleads to the routegeneric-config-raw, which rendersGenericDetailRaw.tsx: a full-screen JSON editor with the tabs "Update Configuration" and "Update State", and no run buttons forkeboola.data-apps.ScheduleConfigurationButton.tsx:keboola.data-app-control(flows-v2/helpers.ts). The public component index says that component "allows to start Data App from Flow", and all five multi-tenant stacks register it.DataAppDetailHeader.tsx,privileges.ts). Projects with a protected default branch, where Production Manager would qualify, have no Apps (ApplicationStore.hasDataApps).RowActionDropdown.tsx: the header's menu trigger isEllipsisVerticalwitharia-label="More actions"and no tooltip.TerminalLogs/DownloadButton.tsxreads "Download logs", and the tab is "Terminal Logs".Not in this PR
PRDCT-692-apps-app-access, which rewrites the section around the App access card and reshoots its screenshot. Until that lands, the section still names Open in new tab, as main does today.Open questions
POST /apps. After a deploy from the UI, that configuration hasruntime.backend.sizeand noparameters.size, and keboola/cli saw the endpoint reject that shape with a 422 (commit c26867af). The same code path was behind Copy app before this PR.Other branches
PRDCT-692-apps-lifecycle-labelsandPRDCT-692-apps-kai-labelsare folded into this PR as commits 1 and 2, so they get no PRs of their own.git rebase --onto main 63cf9786. The one conflict is getting-started step 6, where the reshoot and commit 4 edit different halves of one sentence. The Streamlit reshoot's final line is the merged result.Checks
npm run buildis clean (373 pages), and the pages and their markdown twins show the new text.check-cli-reference: 0 findings.audit-phase2: 0 broken links and 0 missing images, and its total is unchanged.git merge-tree, each simulated on this branch's tip:🤖 Generated with Claude Code