Skip to content

Allow starting up web when workflow data directory is not present - #680

Closed
karthikscale3 wants to merge 1 commit into
vercel:mainfrom
karthikscale3:karthik/web-nodata-fallback
Closed

Allow starting up web when workflow data directory is not present#680
karthikscale3 wants to merge 1 commit into
vercel:mainfrom
karthikscale3:karthik/web-nodata-fallback

Conversation

@karthikscale3

Copy link
Copy Markdown
Contributor

This PR makes the changes to allow starting up the o11y dashboard(web) even when the workflow data directory is not already present in the project.

Current behaviour:
Currently, when we run npx workflow web from a project that has no workflow data directory(no workflow runs), the o11y dashboard fails to startup with an error stating no workflow data directory is present.

New behaviour:
With the changes from this PR, when the o11y dashboard startups,

  • it checks if the workflow data directory is present.
  • if it is NOT present, it will set a searchDir url param pointing to the project root and will allow starting up the o11y dashboard.
  • once a workflow is run and the workflow data directory is created, the web will search the workflow data directory inside the searchDir and will set the dataDir correctly after it finds it. This will happen ONLY when dataDir is not set and ONLY for local backend.

… auto-detect workflow data directory in web UI after a workflow is run
Signed-off-by: Karthik Kalyanaraman <karthik@scale3labs.com>
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7287486

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 6 packages
NameType
@workflow/cliPatch
@workflow/webPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/aiPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Dec 22, 2025

Copy link
Copy Markdown
Contributor

@karthikscale3 is attempting to deploy a commit to the Vercel Labs Team on Vercel.

A member of the Team first needs to authorize it.

if (!envVars.WORKFLOW_LOCAL_DATA_DIR) {
const cwd = getWorkflowConfig().workingDir;
const repoRoot = await findRepoRoot(cwd, cwd);
const searchDir = repoRoot && repoRoot !== cwd ? `${cwd}:${repoRoot}` : cwd;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is needed so the server action can constrain the search for data dir within the project root

* @returns The detected data directory path, or null if not found
*/
export async function detectWorkflowDataDir(
searchDir?: string

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is passed down from the client


// On initial load, try to detect the data directory if not explicitly set
useEffect(() => {
if (!isLocalBackend || dataDirFromUrl) {

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this won't run if dataDir is already set or if its not a local backend

@VaguelySerious

Copy link
Copy Markdown
Member

Will review this soon! Note that I also have a thicker PR for this here: #626 but haven't gotten to finish it. I think yours is more concise.

Once I'm back in ~half a day to review this, I'll probably take a look to ensure the CLI still errors if the local directory isn't found (since the CLI doesn't have the same refreshing behavior), but otherwise the PR seems good at first glance

@VaguelySeriousVaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coming back to review - this is going in the right direction, but I think still needs some work so that:

  • The CLI should still tell you if it can't find the dataDir
  • The web UI should not rely on pressing "refresh" to be accurate. I think it should just tell you e.g. "hey, couldn't find the data dir in , totally fine, once you run some workflows, they should show up here"
    • Check once a second or do a file system subscription for the folder so it automatically resolves

Otherwise, there might be cases where users get very confused as to why they aren't seeing any runs, despite them existing in a different folder, and there's little debugging indication

Also, separately, it'd be neat if the dataDir was simply initialized as part of the initial bundling step, so that "an app running workflows" guarantees "workflow-data can be found", and the CLI/UI warning/error messages make more sense. That's what we should have done from the beginning, but I think both that and the UI/CLI improvements are useful in separation too

@VaguelySerious

Copy link
Copy Markdown
Member

I'm adding these smaller fixes here:

After which this PR could use the dataDir helper introduced in those PRs, show a warning if the dir can't be found, and if not found (or the list is empty), auto-refreshing every second until the first time something is found.

@karthikscale3

Copy link
Copy Markdown
ContributorAuthor

Coming back to review - this is going in the right direction, but I think still needs some work so that:

  • The CLI should still tell you if it can't find the dataDir

  • The web UI should not rely on pressing "refresh" to be accurate. I think it should just tell you e.g. "hey, couldn't find the data dir in , totally fine, once you run some workflows, they should show up here"

    • Check once a second or do a file system subscription for the folder so it automatically resolves

Otherwise, there might be cases where users get very confused as to why they aren't seeing any runs, despite them existing in a different folder, and there's little debugging indication

Also, separately, it'd be neat if the dataDir was simply initialized as part of the initial bundling step, so that "an app running workflows" guarantees "workflow-data can be found", and the CLI/UI warning/error messages make more sense. That's what we should have done from the beginning, but I think both that and the UI/CLI improvements are useful in separation too

Thanks for the feedback @VaguelySerious ! And yes, I initially thought about setting the correct data directory so we do not need to do any search. But, I was under the impression that the data directory could change based on the framework or if the user set a different path using the env var. But, I guess we could still deterministically infer it. Let me iterate on this further and update soon.

@VaguelySerious

Copy link
Copy Markdown
Member

I ended up working on this myself in #684, which is ready to merge and superseeds this behavior. Feel free to close this PR, or rebase it onto that if you think there are any changes you'd like to still push for and aren't included there

@karthikscale3

Copy link
Copy Markdown
ContributorAuthor

I ended up working on this myself in #684, which is ready to merge and superseeds this behavior. Feel free to close this PR, or rebase it onto that if you think there are any changes you'd like to still push for and aren't included there

Thank you @VaguelySerious! Sorry, I was away for a few days. I will go ahead and close this one.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@karthikscale3@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Allow starting up web when workflow data directory is not present by karthikscale3 · Pull Request #680 · vercel/workflow · GitHub
Skip to content

Allow starting up web when workflow data directory is not present - #680

Closed
karthikscale3 wants to merge 1 commit into
vercel:mainfrom
karthikscale3:karthik/web-nodata-fallback
Closed

Allow starting up web when workflow data directory is not present#680
karthikscale3 wants to merge 1 commit into
vercel:mainfrom
karthikscale3:karthik/web-nodata-fallback

Conversation

@karthikscale3

Copy link
Copy Markdown
Contributor

This PR makes the changes to allow starting up the o11y dashboard(web) even when the workflow data directory is not already present in the project.

Current behaviour:
Currently, when we run npx workflow web from a project that has no workflow data directory(no workflow runs), the o11y dashboard fails to startup with an error stating no workflow data directory is present.

New behaviour:
With the changes from this PR, when the o11y dashboard startups,

  • it checks if the workflow data directory is present.
  • if it is NOT present, it will set a searchDir url param pointing to the project root and will allow starting up the o11y dashboard.
  • once a workflow is run and the workflow data directory is created, the web will search the workflow data directory inside the searchDir and will set the dataDir correctly after it finds it. This will happen ONLY when dataDir is not set and ONLY for local backend.

… auto-detect workflow data directory in web UI after a workflow is run
Signed-off-by: Karthik Kalyanaraman <karthik@scale3labs.com>
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7287486

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 6 packages
NameType
@workflow/cliPatch
@workflow/webPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/aiPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Dec 22, 2025

Copy link
Copy Markdown
Contributor

@karthikscale3 is attempting to deploy a commit to the Vercel Labs Team on Vercel.

A member of the Team first needs to authorize it.

if (!envVars.WORKFLOW_LOCAL_DATA_DIR) {
const cwd = getWorkflowConfig().workingDir;
const repoRoot = await findRepoRoot(cwd, cwd);
const searchDir = repoRoot && repoRoot !== cwd ? `${cwd}:${repoRoot}` : cwd;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is needed so the server action can constrain the search for data dir within the project root

* @returns The detected data directory path, or null if not found
*/
export async function detectWorkflowDataDir(
searchDir?: string

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is passed down from the client


// On initial load, try to detect the data directory if not explicitly set
useEffect(() => {
if (!isLocalBackend || dataDirFromUrl) {

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this won't run if dataDir is already set or if its not a local backend

@VaguelySerious

Copy link
Copy Markdown
Member

Will review this soon! Note that I also have a thicker PR for this here: #626 but haven't gotten to finish it. I think yours is more concise.

Once I'm back in ~half a day to review this, I'll probably take a look to ensure the CLI still errors if the local directory isn't found (since the CLI doesn't have the same refreshing behavior), but otherwise the PR seems good at first glance

@VaguelySeriousVaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coming back to review - this is going in the right direction, but I think still needs some work so that:

  • The CLI should still tell you if it can't find the dataDir
  • The web UI should not rely on pressing "refresh" to be accurate. I think it should just tell you e.g. "hey, couldn't find the data dir in , totally fine, once you run some workflows, they should show up here"
    • Check once a second or do a file system subscription for the folder so it automatically resolves

Otherwise, there might be cases where users get very confused as to why they aren't seeing any runs, despite them existing in a different folder, and there's little debugging indication

Also, separately, it'd be neat if the dataDir was simply initialized as part of the initial bundling step, so that "an app running workflows" guarantees "workflow-data can be found", and the CLI/UI warning/error messages make more sense. That's what we should have done from the beginning, but I think both that and the UI/CLI improvements are useful in separation too

@VaguelySerious

Copy link
Copy Markdown
Member

I'm adding these smaller fixes here:

After which this PR could use the dataDir helper introduced in those PRs, show a warning if the dir can't be found, and if not found (or the list is empty), auto-refreshing every second until the first time something is found.

@karthikscale3

Copy link
Copy Markdown
ContributorAuthor

Coming back to review - this is going in the right direction, but I think still needs some work so that:

  • The CLI should still tell you if it can't find the dataDir

  • The web UI should not rely on pressing "refresh" to be accurate. I think it should just tell you e.g. "hey, couldn't find the data dir in , totally fine, once you run some workflows, they should show up here"

    • Check once a second or do a file system subscription for the folder so it automatically resolves

Otherwise, there might be cases where users get very confused as to why they aren't seeing any runs, despite them existing in a different folder, and there's little debugging indication

Also, separately, it'd be neat if the dataDir was simply initialized as part of the initial bundling step, so that "an app running workflows" guarantees "workflow-data can be found", and the CLI/UI warning/error messages make more sense. That's what we should have done from the beginning, but I think both that and the UI/CLI improvements are useful in separation too

Thanks for the feedback @VaguelySerious ! And yes, I initially thought about setting the correct data directory so we do not need to do any search. But, I was under the impression that the data directory could change based on the framework or if the user set a different path using the env var. But, I guess we could still deterministically infer it. Let me iterate on this further and update soon.

@VaguelySerious

Copy link
Copy Markdown
Member

I ended up working on this myself in #684, which is ready to merge and superseeds this behavior. Feel free to close this PR, or rebase it onto that if you think there are any changes you'd like to still push for and aren't included there

@karthikscale3

Copy link
Copy Markdown
ContributorAuthor

I ended up working on this myself in #684, which is ready to merge and superseeds this behavior. Feel free to close this PR, or rebase it onto that if you think there are any changes you'd like to still push for and aren't included there

Thank you @VaguelySerious! Sorry, I was away for a few days. I will go ahead and close this one.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@karthikscale3@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Allow starting up web when workflow data directory is not present by karthikscale3 · Pull Request #680 · vercel/workflow · GitHub
Skip to content

Allow starting up web when workflow data directory is not present - #680

Closed
karthikscale3 wants to merge 1 commit into
vercel:mainfrom
karthikscale3:karthik/web-nodata-fallback
Closed

Allow starting up web when workflow data directory is not present#680
karthikscale3 wants to merge 1 commit into
vercel:mainfrom
karthikscale3:karthik/web-nodata-fallback

Conversation

@karthikscale3

Copy link
Copy Markdown
Contributor

This PR makes the changes to allow starting up the o11y dashboard(web) even when the workflow data directory is not already present in the project.

Current behaviour:
Currently, when we run npx workflow web from a project that has no workflow data directory(no workflow runs), the o11y dashboard fails to startup with an error stating no workflow data directory is present.

New behaviour:
With the changes from this PR, when the o11y dashboard startups,

  • it checks if the workflow data directory is present.
  • if it is NOT present, it will set a searchDir url param pointing to the project root and will allow starting up the o11y dashboard.
  • once a workflow is run and the workflow data directory is created, the web will search the workflow data directory inside the searchDir and will set the dataDir correctly after it finds it. This will happen ONLY when dataDir is not set and ONLY for local backend.

… auto-detect workflow data directory in web UI after a workflow is run
Signed-off-by: Karthik Kalyanaraman <karthik@scale3labs.com>
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7287486

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 6 packages
NameType
@workflow/cliPatch
@workflow/webPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/aiPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Dec 22, 2025

Copy link
Copy Markdown
Contributor

@karthikscale3 is attempting to deploy a commit to the Vercel Labs Team on Vercel.

A member of the Team first needs to authorize it.

if (!envVars.WORKFLOW_LOCAL_DATA_DIR) {
const cwd = getWorkflowConfig().workingDir;
const repoRoot = await findRepoRoot(cwd, cwd);
const searchDir = repoRoot && repoRoot !== cwd ? `${cwd}:${repoRoot}` : cwd;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is needed so the server action can constrain the search for data dir within the project root

* @returns The detected data directory path, or null if not found
*/
export async function detectWorkflowDataDir(
searchDir?: string

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is passed down from the client


// On initial load, try to detect the data directory if not explicitly set
useEffect(() => {
if (!isLocalBackend || dataDirFromUrl) {

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this won't run if dataDir is already set or if its not a local backend

@VaguelySerious

Copy link
Copy Markdown
Member

Will review this soon! Note that I also have a thicker PR for this here: #626 but haven't gotten to finish it. I think yours is more concise.

Once I'm back in ~half a day to review this, I'll probably take a look to ensure the CLI still errors if the local directory isn't found (since the CLI doesn't have the same refreshing behavior), but otherwise the PR seems good at first glance

@VaguelySeriousVaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coming back to review - this is going in the right direction, but I think still needs some work so that:

  • The CLI should still tell you if it can't find the dataDir
  • The web UI should not rely on pressing "refresh" to be accurate. I think it should just tell you e.g. "hey, couldn't find the data dir in , totally fine, once you run some workflows, they should show up here"
    • Check once a second or do a file system subscription for the folder so it automatically resolves

Otherwise, there might be cases where users get very confused as to why they aren't seeing any runs, despite them existing in a different folder, and there's little debugging indication

Also, separately, it'd be neat if the dataDir was simply initialized as part of the initial bundling step, so that "an app running workflows" guarantees "workflow-data can be found", and the CLI/UI warning/error messages make more sense. That's what we should have done from the beginning, but I think both that and the UI/CLI improvements are useful in separation too

@VaguelySerious

Copy link
Copy Markdown
Member

I'm adding these smaller fixes here:

After which this PR could use the dataDir helper introduced in those PRs, show a warning if the dir can't be found, and if not found (or the list is empty), auto-refreshing every second until the first time something is found.

@karthikscale3

Copy link
Copy Markdown
ContributorAuthor

Coming back to review - this is going in the right direction, but I think still needs some work so that:

  • The CLI should still tell you if it can't find the dataDir

  • The web UI should not rely on pressing "refresh" to be accurate. I think it should just tell you e.g. "hey, couldn't find the data dir in , totally fine, once you run some workflows, they should show up here"

    • Check once a second or do a file system subscription for the folder so it automatically resolves

Otherwise, there might be cases where users get very confused as to why they aren't seeing any runs, despite them existing in a different folder, and there's little debugging indication

Also, separately, it'd be neat if the dataDir was simply initialized as part of the initial bundling step, so that "an app running workflows" guarantees "workflow-data can be found", and the CLI/UI warning/error messages make more sense. That's what we should have done from the beginning, but I think both that and the UI/CLI improvements are useful in separation too

Thanks for the feedback @VaguelySerious ! And yes, I initially thought about setting the correct data directory so we do not need to do any search. But, I was under the impression that the data directory could change based on the framework or if the user set a different path using the env var. But, I guess we could still deterministically infer it. Let me iterate on this further and update soon.

@VaguelySerious

Copy link
Copy Markdown
Member

I ended up working on this myself in #684, which is ready to merge and superseeds this behavior. Feel free to close this PR, or rebase it onto that if you think there are any changes you'd like to still push for and aren't included there

@karthikscale3

Copy link
Copy Markdown
ContributorAuthor

I ended up working on this myself in #684, which is ready to merge and superseeds this behavior. Feel free to close this PR, or rebase it onto that if you think there are any changes you'd like to still push for and aren't included there

Thank you @VaguelySerious! Sorry, I was away for a few days. I will go ahead and close this one.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@karthikscale3@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Allow starting up web when workflow data directory is not present by karthikscale3 · Pull Request #680 · vercel/workflow · GitHub
Skip to content

Allow starting up web when workflow data directory is not present - #680

Closed
karthikscale3 wants to merge 1 commit into
vercel:mainfrom
karthikscale3:karthik/web-nodata-fallback
Closed

Allow starting up web when workflow data directory is not present#680
karthikscale3 wants to merge 1 commit into
vercel:mainfrom
karthikscale3:karthik/web-nodata-fallback

Conversation

@karthikscale3

Copy link
Copy Markdown
Contributor

This PR makes the changes to allow starting up the o11y dashboard(web) even when the workflow data directory is not already present in the project.

Current behaviour:
Currently, when we run npx workflow web from a project that has no workflow data directory(no workflow runs), the o11y dashboard fails to startup with an error stating no workflow data directory is present.

New behaviour:
With the changes from this PR, when the o11y dashboard startups,

  • it checks if the workflow data directory is present.
  • if it is NOT present, it will set a searchDir url param pointing to the project root and will allow starting up the o11y dashboard.
  • once a workflow is run and the workflow data directory is created, the web will search the workflow data directory inside the searchDir and will set the dataDir correctly after it finds it. This will happen ONLY when dataDir is not set and ONLY for local backend.

… auto-detect workflow data directory in web UI after a workflow is run
Signed-off-by: Karthik Kalyanaraman <karthik@scale3labs.com>
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7287486

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 6 packages
NameType
@workflow/cliPatch
@workflow/webPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/aiPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Dec 22, 2025

Copy link
Copy Markdown
Contributor

@karthikscale3 is attempting to deploy a commit to the Vercel Labs Team on Vercel.

A member of the Team first needs to authorize it.

if (!envVars.WORKFLOW_LOCAL_DATA_DIR) {
const cwd = getWorkflowConfig().workingDir;
const repoRoot = await findRepoRoot(cwd, cwd);
const searchDir = repoRoot && repoRoot !== cwd ? `${cwd}:${repoRoot}` : cwd;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is needed so the server action can constrain the search for data dir within the project root

* @returns The detected data directory path, or null if not found
*/
export async function detectWorkflowDataDir(
searchDir?: string

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is passed down from the client


// On initial load, try to detect the data directory if not explicitly set
useEffect(() => {
if (!isLocalBackend || dataDirFromUrl) {

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this won't run if dataDir is already set or if its not a local backend

@VaguelySerious

Copy link
Copy Markdown
Member

Will review this soon! Note that I also have a thicker PR for this here: #626 but haven't gotten to finish it. I think yours is more concise.

Once I'm back in ~half a day to review this, I'll probably take a look to ensure the CLI still errors if the local directory isn't found (since the CLI doesn't have the same refreshing behavior), but otherwise the PR seems good at first glance

@VaguelySeriousVaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coming back to review - this is going in the right direction, but I think still needs some work so that:

  • The CLI should still tell you if it can't find the dataDir
  • The web UI should not rely on pressing "refresh" to be accurate. I think it should just tell you e.g. "hey, couldn't find the data dir in , totally fine, once you run some workflows, they should show up here"
    • Check once a second or do a file system subscription for the folder so it automatically resolves

Otherwise, there might be cases where users get very confused as to why they aren't seeing any runs, despite them existing in a different folder, and there's little debugging indication

Also, separately, it'd be neat if the dataDir was simply initialized as part of the initial bundling step, so that "an app running workflows" guarantees "workflow-data can be found", and the CLI/UI warning/error messages make more sense. That's what we should have done from the beginning, but I think both that and the UI/CLI improvements are useful in separation too

@VaguelySerious

Copy link
Copy Markdown
Member

I'm adding these smaller fixes here:

After which this PR could use the dataDir helper introduced in those PRs, show a warning if the dir can't be found, and if not found (or the list is empty), auto-refreshing every second until the first time something is found.

@karthikscale3

Copy link
Copy Markdown
ContributorAuthor

Coming back to review - this is going in the right direction, but I think still needs some work so that:

  • The CLI should still tell you if it can't find the dataDir

  • The web UI should not rely on pressing "refresh" to be accurate. I think it should just tell you e.g. "hey, couldn't find the data dir in , totally fine, once you run some workflows, they should show up here"

    • Check once a second or do a file system subscription for the folder so it automatically resolves

Otherwise, there might be cases where users get very confused as to why they aren't seeing any runs, despite them existing in a different folder, and there's little debugging indication

Also, separately, it'd be neat if the dataDir was simply initialized as part of the initial bundling step, so that "an app running workflows" guarantees "workflow-data can be found", and the CLI/UI warning/error messages make more sense. That's what we should have done from the beginning, but I think both that and the UI/CLI improvements are useful in separation too

Thanks for the feedback @VaguelySerious ! And yes, I initially thought about setting the correct data directory so we do not need to do any search. But, I was under the impression that the data directory could change based on the framework or if the user set a different path using the env var. But, I guess we could still deterministically infer it. Let me iterate on this further and update soon.

@VaguelySerious

Copy link
Copy Markdown
Member

I ended up working on this myself in #684, which is ready to merge and superseeds this behavior. Feel free to close this PR, or rebase it onto that if you think there are any changes you'd like to still push for and aren't included there

@karthikscale3

Copy link
Copy Markdown
ContributorAuthor

I ended up working on this myself in #684, which is ready to merge and superseeds this behavior. Feel free to close this PR, or rebase it onto that if you think there are any changes you'd like to still push for and aren't included there

Thank you @VaguelySerious! Sorry, I was away for a few days. I will go ahead and close this one.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@karthikscale3@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Allow starting up web when workflow data directory is not present by karthikscale3 · Pull Request #680 · vercel/workflow · GitHub
Skip to content

Allow starting up web when workflow data directory is not present - #680

Closed
karthikscale3 wants to merge 1 commit into
vercel:mainfrom
karthikscale3:karthik/web-nodata-fallback
Closed

Allow starting up web when workflow data directory is not present#680
karthikscale3 wants to merge 1 commit into
vercel:mainfrom
karthikscale3:karthik/web-nodata-fallback

Conversation

@karthikscale3

Copy link
Copy Markdown
Contributor

This PR makes the changes to allow starting up the o11y dashboard(web) even when the workflow data directory is not already present in the project.

Current behaviour:
Currently, when we run npx workflow web from a project that has no workflow data directory(no workflow runs), the o11y dashboard fails to startup with an error stating no workflow data directory is present.

New behaviour:
With the changes from this PR, when the o11y dashboard startups,

  • it checks if the workflow data directory is present.
  • if it is NOT present, it will set a searchDir url param pointing to the project root and will allow starting up the o11y dashboard.
  • once a workflow is run and the workflow data directory is created, the web will search the workflow data directory inside the searchDir and will set the dataDir correctly after it finds it. This will happen ONLY when dataDir is not set and ONLY for local backend.

… auto-detect workflow data directory in web UI after a workflow is run
Signed-off-by: Karthik Kalyanaraman <karthik@scale3labs.com>
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7287486

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 6 packages
NameType
@workflow/cliPatch
@workflow/webPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/aiPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Dec 22, 2025

Copy link
Copy Markdown
Contributor

@karthikscale3 is attempting to deploy a commit to the Vercel Labs Team on Vercel.

A member of the Team first needs to authorize it.

if (!envVars.WORKFLOW_LOCAL_DATA_DIR) {
const cwd = getWorkflowConfig().workingDir;
const repoRoot = await findRepoRoot(cwd, cwd);
const searchDir = repoRoot && repoRoot !== cwd ? `${cwd}:${repoRoot}` : cwd;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is needed so the server action can constrain the search for data dir within the project root

* @returns The detected data directory path, or null if not found
*/
export async function detectWorkflowDataDir(
searchDir?: string

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is passed down from the client


// On initial load, try to detect the data directory if not explicitly set
useEffect(() => {
if (!isLocalBackend || dataDirFromUrl) {

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this won't run if dataDir is already set or if its not a local backend

@VaguelySerious

Copy link
Copy Markdown
Member

Will review this soon! Note that I also have a thicker PR for this here: #626 but haven't gotten to finish it. I think yours is more concise.

Once I'm back in ~half a day to review this, I'll probably take a look to ensure the CLI still errors if the local directory isn't found (since the CLI doesn't have the same refreshing behavior), but otherwise the PR seems good at first glance

@VaguelySeriousVaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coming back to review - this is going in the right direction, but I think still needs some work so that:

  • The CLI should still tell you if it can't find the dataDir
  • The web UI should not rely on pressing "refresh" to be accurate. I think it should just tell you e.g. "hey, couldn't find the data dir in , totally fine, once you run some workflows, they should show up here"
    • Check once a second or do a file system subscription for the folder so it automatically resolves

Otherwise, there might be cases where users get very confused as to why they aren't seeing any runs, despite them existing in a different folder, and there's little debugging indication

Also, separately, it'd be neat if the dataDir was simply initialized as part of the initial bundling step, so that "an app running workflows" guarantees "workflow-data can be found", and the CLI/UI warning/error messages make more sense. That's what we should have done from the beginning, but I think both that and the UI/CLI improvements are useful in separation too

@VaguelySerious

Copy link
Copy Markdown
Member

I'm adding these smaller fixes here:

After which this PR could use the dataDir helper introduced in those PRs, show a warning if the dir can't be found, and if not found (or the list is empty), auto-refreshing every second until the first time something is found.

@karthikscale3

Copy link
Copy Markdown
ContributorAuthor

Coming back to review - this is going in the right direction, but I think still needs some work so that:

  • The CLI should still tell you if it can't find the dataDir

  • The web UI should not rely on pressing "refresh" to be accurate. I think it should just tell you e.g. "hey, couldn't find the data dir in , totally fine, once you run some workflows, they should show up here"

    • Check once a second or do a file system subscription for the folder so it automatically resolves

Otherwise, there might be cases where users get very confused as to why they aren't seeing any runs, despite them existing in a different folder, and there's little debugging indication

Also, separately, it'd be neat if the dataDir was simply initialized as part of the initial bundling step, so that "an app running workflows" guarantees "workflow-data can be found", and the CLI/UI warning/error messages make more sense. That's what we should have done from the beginning, but I think both that and the UI/CLI improvements are useful in separation too

Thanks for the feedback @VaguelySerious ! And yes, I initially thought about setting the correct data directory so we do not need to do any search. But, I was under the impression that the data directory could change based on the framework or if the user set a different path using the env var. But, I guess we could still deterministically infer it. Let me iterate on this further and update soon.

@VaguelySerious

Copy link
Copy Markdown
Member

I ended up working on this myself in #684, which is ready to merge and superseeds this behavior. Feel free to close this PR, or rebase it onto that if you think there are any changes you'd like to still push for and aren't included there

@karthikscale3

Copy link
Copy Markdown
ContributorAuthor

I ended up working on this myself in #684, which is ready to merge and superseeds this behavior. Feel free to close this PR, or rebase it onto that if you think there are any changes you'd like to still push for and aren't included there

Thank you @VaguelySerious! Sorry, I was away for a few days. I will go ahead and close this one.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@karthikscale3@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Allow starting up web when workflow data directory is not present by karthikscale3 · Pull Request #680 · vercel/workflow · GitHub
Skip to content

Allow starting up web when workflow data directory is not present - #680

Closed
karthikscale3 wants to merge 1 commit into
vercel:mainfrom
karthikscale3:karthik/web-nodata-fallback
Closed

Allow starting up web when workflow data directory is not present#680
karthikscale3 wants to merge 1 commit into
vercel:mainfrom
karthikscale3:karthik/web-nodata-fallback

Conversation

@karthikscale3

Copy link
Copy Markdown
Contributor

This PR makes the changes to allow starting up the o11y dashboard(web) even when the workflow data directory is not already present in the project.

Current behaviour:
Currently, when we run npx workflow web from a project that has no workflow data directory(no workflow runs), the o11y dashboard fails to startup with an error stating no workflow data directory is present.

New behaviour:
With the changes from this PR, when the o11y dashboard startups,

  • it checks if the workflow data directory is present.
  • if it is NOT present, it will set a searchDir url param pointing to the project root and will allow starting up the o11y dashboard.
  • once a workflow is run and the workflow data directory is created, the web will search the workflow data directory inside the searchDir and will set the dataDir correctly after it finds it. This will happen ONLY when dataDir is not set and ONLY for local backend.

… auto-detect workflow data directory in web UI after a workflow is run
Signed-off-by: Karthik Kalyanaraman <karthik@scale3labs.com>
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7287486

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 6 packages
NameType
@workflow/cliPatch
@workflow/webPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/aiPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Dec 22, 2025

Copy link
Copy Markdown
Contributor

@karthikscale3 is attempting to deploy a commit to the Vercel Labs Team on Vercel.

A member of the Team first needs to authorize it.

if (!envVars.WORKFLOW_LOCAL_DATA_DIR) {
const cwd = getWorkflowConfig().workingDir;
const repoRoot = await findRepoRoot(cwd, cwd);
const searchDir = repoRoot && repoRoot !== cwd ? `${cwd}:${repoRoot}` : cwd;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is needed so the server action can constrain the search for data dir within the project root

* @returns The detected data directory path, or null if not found
*/
export async function detectWorkflowDataDir(
searchDir?: string

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is passed down from the client


// On initial load, try to detect the data directory if not explicitly set
useEffect(() => {
if (!isLocalBackend || dataDirFromUrl) {

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this won't run if dataDir is already set or if its not a local backend

@VaguelySerious

Copy link
Copy Markdown
Member

Will review this soon! Note that I also have a thicker PR for this here: #626 but haven't gotten to finish it. I think yours is more concise.

Once I'm back in ~half a day to review this, I'll probably take a look to ensure the CLI still errors if the local directory isn't found (since the CLI doesn't have the same refreshing behavior), but otherwise the PR seems good at first glance

@VaguelySeriousVaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coming back to review - this is going in the right direction, but I think still needs some work so that:

  • The CLI should still tell you if it can't find the dataDir
  • The web UI should not rely on pressing "refresh" to be accurate. I think it should just tell you e.g. "hey, couldn't find the data dir in , totally fine, once you run some workflows, they should show up here"
    • Check once a second or do a file system subscription for the folder so it automatically resolves

Otherwise, there might be cases where users get very confused as to why they aren't seeing any runs, despite them existing in a different folder, and there's little debugging indication

Also, separately, it'd be neat if the dataDir was simply initialized as part of the initial bundling step, so that "an app running workflows" guarantees "workflow-data can be found", and the CLI/UI warning/error messages make more sense. That's what we should have done from the beginning, but I think both that and the UI/CLI improvements are useful in separation too

@VaguelySerious

Copy link
Copy Markdown
Member

I'm adding these smaller fixes here:

After which this PR could use the dataDir helper introduced in those PRs, show a warning if the dir can't be found, and if not found (or the list is empty), auto-refreshing every second until the first time something is found.

@karthikscale3

Copy link
Copy Markdown
ContributorAuthor

Coming back to review - this is going in the right direction, but I think still needs some work so that:

  • The CLI should still tell you if it can't find the dataDir

  • The web UI should not rely on pressing "refresh" to be accurate. I think it should just tell you e.g. "hey, couldn't find the data dir in , totally fine, once you run some workflows, they should show up here"

    • Check once a second or do a file system subscription for the folder so it automatically resolves

Otherwise, there might be cases where users get very confused as to why they aren't seeing any runs, despite them existing in a different folder, and there's little debugging indication

Also, separately, it'd be neat if the dataDir was simply initialized as part of the initial bundling step, so that "an app running workflows" guarantees "workflow-data can be found", and the CLI/UI warning/error messages make more sense. That's what we should have done from the beginning, but I think both that and the UI/CLI improvements are useful in separation too

Thanks for the feedback @VaguelySerious ! And yes, I initially thought about setting the correct data directory so we do not need to do any search. But, I was under the impression that the data directory could change based on the framework or if the user set a different path using the env var. But, I guess we could still deterministically infer it. Let me iterate on this further and update soon.

@VaguelySerious

Copy link
Copy Markdown
Member

I ended up working on this myself in #684, which is ready to merge and superseeds this behavior. Feel free to close this PR, or rebase it onto that if you think there are any changes you'd like to still push for and aren't included there

@karthikscale3

Copy link
Copy Markdown
ContributorAuthor

I ended up working on this myself in #684, which is ready to merge and superseeds this behavior. Feel free to close this PR, or rebase it onto that if you think there are any changes you'd like to still push for and aren't included there

Thank you @VaguelySerious! Sorry, I was away for a few days. I will go ahead and close this one.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@karthikscale3@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Allow starting up web when workflow data directory is not present by karthikscale3 · Pull Request #680 · vercel/workflow · GitHub
Skip to content

Allow starting up web when workflow data directory is not present - #680

Closed
karthikscale3 wants to merge 1 commit into
vercel:mainfrom
karthikscale3:karthik/web-nodata-fallback
Closed

Allow starting up web when workflow data directory is not present#680
karthikscale3 wants to merge 1 commit into
vercel:mainfrom
karthikscale3:karthik/web-nodata-fallback

Conversation

@karthikscale3

Copy link
Copy Markdown
Contributor

This PR makes the changes to allow starting up the o11y dashboard(web) even when the workflow data directory is not already present in the project.

Current behaviour:
Currently, when we run npx workflow web from a project that has no workflow data directory(no workflow runs), the o11y dashboard fails to startup with an error stating no workflow data directory is present.

New behaviour:
With the changes from this PR, when the o11y dashboard startups,

  • it checks if the workflow data directory is present.
  • if it is NOT present, it will set a searchDir url param pointing to the project root and will allow starting up the o11y dashboard.
  • once a workflow is run and the workflow data directory is created, the web will search the workflow data directory inside the searchDir and will set the dataDir correctly after it finds it. This will happen ONLY when dataDir is not set and ONLY for local backend.

… auto-detect workflow data directory in web UI after a workflow is run
Signed-off-by: Karthik Kalyanaraman <karthik@scale3labs.com>
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7287486

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 6 packages
NameType
@workflow/cliPatch
@workflow/webPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/aiPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Dec 22, 2025

Copy link
Copy Markdown
Contributor

@karthikscale3 is attempting to deploy a commit to the Vercel Labs Team on Vercel.

A member of the Team first needs to authorize it.

if (!envVars.WORKFLOW_LOCAL_DATA_DIR) {
const cwd = getWorkflowConfig().workingDir;
const repoRoot = await findRepoRoot(cwd, cwd);
const searchDir = repoRoot && repoRoot !== cwd ? `${cwd}:${repoRoot}` : cwd;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is needed so the server action can constrain the search for data dir within the project root

* @returns The detected data directory path, or null if not found
*/
export async function detectWorkflowDataDir(
searchDir?: string

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is passed down from the client


// On initial load, try to detect the data directory if not explicitly set
useEffect(() => {
if (!isLocalBackend || dataDirFromUrl) {

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this won't run if dataDir is already set or if its not a local backend

@VaguelySerious

Copy link
Copy Markdown
Member

Will review this soon! Note that I also have a thicker PR for this here: #626 but haven't gotten to finish it. I think yours is more concise.

Once I'm back in ~half a day to review this, I'll probably take a look to ensure the CLI still errors if the local directory isn't found (since the CLI doesn't have the same refreshing behavior), but otherwise the PR seems good at first glance

@VaguelySeriousVaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coming back to review - this is going in the right direction, but I think still needs some work so that:

  • The CLI should still tell you if it can't find the dataDir
  • The web UI should not rely on pressing "refresh" to be accurate. I think it should just tell you e.g. "hey, couldn't find the data dir in , totally fine, once you run some workflows, they should show up here"
    • Check once a second or do a file system subscription for the folder so it automatically resolves

Otherwise, there might be cases where users get very confused as to why they aren't seeing any runs, despite them existing in a different folder, and there's little debugging indication

Also, separately, it'd be neat if the dataDir was simply initialized as part of the initial bundling step, so that "an app running workflows" guarantees "workflow-data can be found", and the CLI/UI warning/error messages make more sense. That's what we should have done from the beginning, but I think both that and the UI/CLI improvements are useful in separation too

@VaguelySerious

Copy link
Copy Markdown
Member

I'm adding these smaller fixes here:

After which this PR could use the dataDir helper introduced in those PRs, show a warning if the dir can't be found, and if not found (or the list is empty), auto-refreshing every second until the first time something is found.

@karthikscale3

Copy link
Copy Markdown
ContributorAuthor

Coming back to review - this is going in the right direction, but I think still needs some work so that:

  • The CLI should still tell you if it can't find the dataDir

  • The web UI should not rely on pressing "refresh" to be accurate. I think it should just tell you e.g. "hey, couldn't find the data dir in , totally fine, once you run some workflows, they should show up here"

    • Check once a second or do a file system subscription for the folder so it automatically resolves

Otherwise, there might be cases where users get very confused as to why they aren't seeing any runs, despite them existing in a different folder, and there's little debugging indication

Also, separately, it'd be neat if the dataDir was simply initialized as part of the initial bundling step, so that "an app running workflows" guarantees "workflow-data can be found", and the CLI/UI warning/error messages make more sense. That's what we should have done from the beginning, but I think both that and the UI/CLI improvements are useful in separation too

Thanks for the feedback @VaguelySerious ! And yes, I initially thought about setting the correct data directory so we do not need to do any search. But, I was under the impression that the data directory could change based on the framework or if the user set a different path using the env var. But, I guess we could still deterministically infer it. Let me iterate on this further and update soon.

@VaguelySerious

Copy link
Copy Markdown
Member

I ended up working on this myself in #684, which is ready to merge and superseeds this behavior. Feel free to close this PR, or rebase it onto that if you think there are any changes you'd like to still push for and aren't included there

@karthikscale3

Copy link
Copy Markdown
ContributorAuthor

I ended up working on this myself in #684, which is ready to merge and superseeds this behavior. Feel free to close this PR, or rebase it onto that if you think there are any changes you'd like to still push for and aren't included there

Thank you @VaguelySerious! Sorry, I was away for a few days. I will go ahead and close this one.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@karthikscale3@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Allow starting up web when workflow data directory is not present by karthikscale3 · Pull Request #680 · vercel/workflow · GitHub
Skip to content

Allow starting up web when workflow data directory is not present - #680

Closed
karthikscale3 wants to merge 1 commit into
vercel:mainfrom
karthikscale3:karthik/web-nodata-fallback
Closed

Allow starting up web when workflow data directory is not present#680
karthikscale3 wants to merge 1 commit into
vercel:mainfrom
karthikscale3:karthik/web-nodata-fallback

Conversation

@karthikscale3

Copy link
Copy Markdown
Contributor

This PR makes the changes to allow starting up the o11y dashboard(web) even when the workflow data directory is not already present in the project.

Current behaviour:
Currently, when we run npx workflow web from a project that has no workflow data directory(no workflow runs), the o11y dashboard fails to startup with an error stating no workflow data directory is present.

New behaviour:
With the changes from this PR, when the o11y dashboard startups,

  • it checks if the workflow data directory is present.
  • if it is NOT present, it will set a searchDir url param pointing to the project root and will allow starting up the o11y dashboard.
  • once a workflow is run and the workflow data directory is created, the web will search the workflow data directory inside the searchDir and will set the dataDir correctly after it finds it. This will happen ONLY when dataDir is not set and ONLY for local backend.

… auto-detect workflow data directory in web UI after a workflow is run
Signed-off-by: Karthik Kalyanaraman <karthik@scale3labs.com>
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7287486

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 6 packages
NameType
@workflow/cliPatch
@workflow/webPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/aiPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Dec 22, 2025

Copy link
Copy Markdown
Contributor

@karthikscale3 is attempting to deploy a commit to the Vercel Labs Team on Vercel.

A member of the Team first needs to authorize it.

if (!envVars.WORKFLOW_LOCAL_DATA_DIR) {
const cwd = getWorkflowConfig().workingDir;
const repoRoot = await findRepoRoot(cwd, cwd);
const searchDir = repoRoot && repoRoot !== cwd ? `${cwd}:${repoRoot}` : cwd;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is needed so the server action can constrain the search for data dir within the project root

* @returns The detected data directory path, or null if not found
*/
export async function detectWorkflowDataDir(
searchDir?: string

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is passed down from the client


// On initial load, try to detect the data directory if not explicitly set
useEffect(() => {
if (!isLocalBackend || dataDirFromUrl) {

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this won't run if dataDir is already set or if its not a local backend

@VaguelySerious

Copy link
Copy Markdown
Member

Will review this soon! Note that I also have a thicker PR for this here: #626 but haven't gotten to finish it. I think yours is more concise.

Once I'm back in ~half a day to review this, I'll probably take a look to ensure the CLI still errors if the local directory isn't found (since the CLI doesn't have the same refreshing behavior), but otherwise the PR seems good at first glance

@VaguelySeriousVaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coming back to review - this is going in the right direction, but I think still needs some work so that:

  • The CLI should still tell you if it can't find the dataDir
  • The web UI should not rely on pressing "refresh" to be accurate. I think it should just tell you e.g. "hey, couldn't find the data dir in , totally fine, once you run some workflows, they should show up here"
    • Check once a second or do a file system subscription for the folder so it automatically resolves

Otherwise, there might be cases where users get very confused as to why they aren't seeing any runs, despite them existing in a different folder, and there's little debugging indication

Also, separately, it'd be neat if the dataDir was simply initialized as part of the initial bundling step, so that "an app running workflows" guarantees "workflow-data can be found", and the CLI/UI warning/error messages make more sense. That's what we should have done from the beginning, but I think both that and the UI/CLI improvements are useful in separation too

@VaguelySerious

Copy link
Copy Markdown
Member

I'm adding these smaller fixes here:

After which this PR could use the dataDir helper introduced in those PRs, show a warning if the dir can't be found, and if not found (or the list is empty), auto-refreshing every second until the first time something is found.

@karthikscale3

Copy link
Copy Markdown
ContributorAuthor

Coming back to review - this is going in the right direction, but I think still needs some work so that:

  • The CLI should still tell you if it can't find the dataDir

  • The web UI should not rely on pressing "refresh" to be accurate. I think it should just tell you e.g. "hey, couldn't find the data dir in , totally fine, once you run some workflows, they should show up here"

    • Check once a second or do a file system subscription for the folder so it automatically resolves

Otherwise, there might be cases where users get very confused as to why they aren't seeing any runs, despite them existing in a different folder, and there's little debugging indication

Also, separately, it'd be neat if the dataDir was simply initialized as part of the initial bundling step, so that "an app running workflows" guarantees "workflow-data can be found", and the CLI/UI warning/error messages make more sense. That's what we should have done from the beginning, but I think both that and the UI/CLI improvements are useful in separation too

Thanks for the feedback @VaguelySerious ! And yes, I initially thought about setting the correct data directory so we do not need to do any search. But, I was under the impression that the data directory could change based on the framework or if the user set a different path using the env var. But, I guess we could still deterministically infer it. Let me iterate on this further and update soon.

@VaguelySerious

Copy link
Copy Markdown
Member

I ended up working on this myself in #684, which is ready to merge and superseeds this behavior. Feel free to close this PR, or rebase it onto that if you think there are any changes you'd like to still push for and aren't included there

@karthikscale3

Copy link
Copy Markdown
ContributorAuthor

I ended up working on this myself in #684, which is ready to merge and superseeds this behavior. Feel free to close this PR, or rebase it onto that if you think there are any changes you'd like to still push for and aren't included there

Thank you @VaguelySerious! Sorry, I was away for a few days. I will go ahead and close this one.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@karthikscale3@VaguelySerious