Skip to content

Refactor code splitting and optimize chunk loading in Vite config#26906

Open
chirag-madlani wants to merge 58 commits intomainfrom
enahncement-loading-time
Open

Refactor code splitting and optimize chunk loading in Vite config#26906
chirag-madlani wants to merge 58 commits intomainfrom
enahncement-loading-time

Conversation

@chirag-madlani
Copy link
Copy Markdown
Collaborator

@chirag-madlani chirag-madlani commented Apr 1, 2026

Fix: #3457

This pull request introduces significant improvements to the frontend build and routing for the OpenMetadata UI. The main focus is on optimizing application performance by implementing code-splitting via React lazy loading for routes, refining build output chunking for better caching and load times, and adding cache-busting for static assets. There are also enhancements to error handling and build configuration for more efficient asset compression.

Frontend performance and routing optimizations:

  • Converted several statically imported route components (such as AppContainer, AccessNotAllowedPage, LogoutPage, PageNotFound, SamlCallback, SignUpPage, and other authenticated pages) to be lazy-loaded with React's lazy and a suspense fallback, reducing the initial bundle size and improving load times for unauthenticated users. [1] [2]

Build output and asset optimization:

  • Refined Vite's manualChunks configuration to use a function-based approach, grouping dependencies into logical vendor chunks (e.g., React, AntD, MUI, editors, charts, auth SDKs, utilities), and added a catch-all for unlisted node_modules to prevent main bundle bloat. This improves caching and load performance.
  • Added a Vite plugin to append an ?v=${APP_VERSION} cache-busting query parameter to all JS and CSS asset URLs in the generated HTML, ensuring clients always load the latest assets after a deployment. The APP_VERSION is injected from the Maven build. [1] [2]
  • Updated asset compression configuration to only compress relevant file types (excluding already-compressed formats), optimizing build time and output size.

Error handling improvements:

  • Enhanced the error boundary's chunk load detection logic to recognize additional error patterns from modern build tools (like Vite), providing users with more accurate instructions when a dynamic import fails.

Describe your changes:

Fixes

I worked on ... because ...

Type of change:

  • Bug fix
  • Improvement
  • New feature
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation

Checklist:

  • I have read the CONTRIBUTING document.
  • My PR title is Fixes <issue-number>: <short explanation>
  • I have commented on my code, particularly in hard-to-understand areas.
  • For JSON Schema changes: I updated the migration scripts or explained why it is not needed.

Copilot AI review requested due to automatic review settings April 1, 2026 05:33
@chirag-madlani chirag-madlani requested a review from a team as a code owner April 1, 2026 05:33
@github-actions github-actions bot added safe to test Add this label to run secure Github workflows on PRs UI UI specific issues labels Apr 1, 2026
Comment thread openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AppRouter.tsx Outdated
Comment thread openmetadata-ui/src/main/resources/ui/vite.config.ts Outdated
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR optimizes OpenMetadata UI load performance by introducing route-level code splitting (React lazy + Suspense), improving vendor chunking in Vite for better caching, and adding cache-busting for JS/CSS assets based on the Maven-injected app version.

Changes:

  • Lazy-loads several authenticated and unauthenticated route components behind a Suspense fallback to reduce initial bundle size.
  • Refactors Vite manualChunks into a function-based vendor chunk map with a node_modules catch-all chunk.
  • Adds HTML post-processing to append ?v=${APP_VERSION} to JS/CSS URLs and tightens compression filters for gzip/brotli.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
openmetadata-ui/src/main/resources/ui/vite.config.ts Adds HTML cache-busting, refines compression filtering, and overhauls chunk splitting configuration.
openmetadata-ui/src/main/resources/ui/src/components/common/ErrorBoundary/ErrorFallback.tsx Expands chunk-load error detection to include Vite/Safari dynamic import failure patterns.
openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AppRouter.tsx Converts key unauthenticated routes and the authenticated shell to lazy-loaded components.
openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedAppRouter.tsx Lazifies multiple authenticated pages to keep them out of the initial bundle.
openmetadata-ui/pom.xml Injects APP_VERSION env var into the UI build step for cache busting.

Comment thread openmetadata-ui/src/main/resources/ui/vite.config.ts Outdated
Comment thread openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AppRouter.tsx Outdated
Comment thread openmetadata-ui/src/main/resources/ui/vite.config.ts Outdated
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 1, 2026

Jest test Coverage

UI tests summary

Lines Statements Branches Functions
Coverage: 63%
63.34% (59257/93546) 43.65% (31446/72028) 46.51% (9433/20281)

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 1, 2026

🔴 Playwright Results — 2 failure(s), 24 flaky

✅ 3659 passed · ❌ 2 failed · 🟡 24 flaky · ⏭️ 89 skipped

Shard Passed Failed Flaky Skipped
🔴 Shard 1 476 1 3 4
🔴 Shard 2 648 1 2 7
🟡 Shard 3 655 0 5 1
🟡 Shard 4 628 0 6 27
✅ Shard 5 611 0 0 42
🟡 Shard 6 641 0 8 8

Genuine Failures (failed on all attempts)

Pages/Customproperties-part1.spec.ts › sqlQuery shows scrollable CodeMirror container and no expand toggle (shard 1)
Error: �[2mexpect(�[22m�[31mreceived�[39m�[2m).�[22mtoBeTruthy�[2m()�[22m

Received: �[31mfalse�[39m
Features/ActivityFeed.spec.ts › Mention notification shows correct user details in Notification box (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoBeVisible�[2m(�[22m�[2m)�[22m failed

Locator: locator('[data-testid="message-container"]').filter({ hasText: 'Initial conversation thread for mention test' }).first()
Expected: visible
Timeout: 30000ms
Error: element(s) not found

Call log:
�[2m  - Expect "toBeVisible" with timeout 30000ms�[22m
�[2m  - waiting for locator('[data-testid="message-container"]').filter({ hasText: 'Initial conversation thread for mention test' }).first()�[22m

🟡 24 flaky test(s) (passed on retry)
  • Features/CustomizeDetailPage.spec.ts › API Endpoint - customization should work (shard 1, 2 retries)
  • Features/TeamsHierarchy.spec.ts › Delete Parent Team (shard 1, 1 retry)
  • Pages/UserCreationWithPersona.spec.ts › Create user with persona and verify on profile (shard 1, 1 retry)
  • Features/ChangeSummaryBadge.spec.ts › Automated badge should appear on entity description with Automated source (shard 2, 1 retry)
  • Features/DomainTierCertificationVoting.spec.ts › DataProduct - Tier assign, update, and remove (shard 2, 1 retry)
  • Features/RestoreEntityInheritedFields.spec.ts › Validate restore with Inherited domain and data products assigned (shard 3, 1 retry)
  • Features/RestoreEntityInheritedFields.spec.ts › Validate restore with Inherited domain and data products assigned (shard 3, 1 retry)
  • Features/RTL.spec.ts › Verify Following widget functionality (shard 3, 1 retry)
  • Flow/AddRoleAndAssignToUser.spec.ts › Verify assigned role to new user (shard 3, 1 retry)
  • Flow/PersonaDeletionUserProfile.spec.ts › User profile loads correctly before and after persona deletion (shard 3, 1 retry)
  • Pages/Customproperties-part2.spec.ts › entityReferenceList shows item count, scrollable list, no expand toggle (shard 4, 1 retry)
  • Pages/DataContracts.spec.ts › Create Data Contract and validate for Table (shard 4, 1 retry)
  • Pages/DataContracts.spec.ts › Create Data Contract and validate for Container (shard 4, 1 retry)
  • Pages/DataContracts.spec.ts › Create Data Contract and validate for SearchIndex (shard 4, 1 retry)
  • Pages/DataProducts.spec.ts › Create Data Product and Manage Assets (shard 4, 1 retry)
  • Pages/Domains.spec.ts › Domain Rbac (shard 4, 1 retry)
  • Pages/Glossary.spec.ts › Column dropdown drag-and-drop functionality for Glossary Terms table (shard 6, 1 retry)
  • Pages/Lineage/DataAssetLineage.spec.ts › verify create lineage for entity - Api Endpoint (shard 6, 1 retry)
  • Pages/Lineage/DataAssetLineage.spec.ts › Column lineage for table -> table (shard 6, 1 retry)
  • Pages/Lineage/LineageFilters.spec.ts › Verify lineage schema filter selection (shard 6, 1 retry)
  • Pages/Lineage/LineageRightPanel.spec.ts › Verify custom properties tab IS visible for supported type: searchIndex (shard 6, 1 retry)
  • Pages/Users.spec.ts › Permissions for table details page for Data Consumer (shard 6, 1 retry)
  • Pages/Users.spec.ts › Check permissions for Data Steward (shard 6, 1 retry)
  • VersionPages/EntityVersionPages.spec.ts › Directory (shard 6, 1 retry)

📦 Download artifacts

How to debug locally
# Download playwright-test-results-<shard> artifact and unzip
npx playwright show-trace path/to/trace.zip    # view trace

Copilot AI review requested due to automatic review settings April 1, 2026 06:45
Comment thread openmetadata-ui/src/main/resources/ui/vite.config.ts Outdated
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 6 out of 6 changed files in this pull request and generated 4 comments.

Comment thread openmetadata-ui/src/main/resources/ui/vite.config.ts
Comment on lines +195 to +206
* manualChunks object — Rollup resolves each package name and groups
* all its internal modules into the named chunk automatically.
*
* Order within this object does not matter; what matters is which
* chunk a package is assigned to. Keep the comment groups as a guide.
*/
/**
* Function-based manualChunks using an explicit package map.
* This achieves what the object pattern does, but importantly
* allows us to add a catch-all at the end so unlisted node_modules
* are properly split out of the main index.js bundle.
*/
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

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

The block comment above manualChunks still describes an “object” form and claims order doesn’t matter, but the implementation is now a function that iterates Object.entries(packageMap) and returns the first matching chunk. Please update/remove the outdated comment to avoid misleading future changes (and note that ordering can matter if package match patterns ever overlap).

Suggested change
* manualChunks object Rollup resolves each package name and groups
* all its internal modules into the named chunk automatically.
*
* Order within this object does not matter; what matters is which
* chunk a package is assigned to. Keep the comment groups as a guide.
*/
/**
* Function-based manualChunks using an explicit package map.
* This achieves what the object pattern does, but importantly
* allows us to add a catch-all at the end so unlisted node_modules
* are properly split out of the main index.js bundle.
*/
* Function-based manualChunks using an explicit package map.
*
* Each key in `packageMap` is a named vendor chunk, and its array
* value lists package name fragments to match within `node_modules`.
* The generated function walks `Object.entries(packageMap)` in
* iteration order and returns the first chunk whose package list
* matches the current module id. If package match patterns ever
* overlap, this means the ordering of entries in `packageMap`
* can affect which chunk a module ends up in.
*
* At the end, we add a catch-all so any unlisted `node_modules`
* are grouped into `vendor-misc` instead of bloating the main
* application bundle.
*/

Copilot uses AI. Check for mistakes.
Comment on lines +66 to +67
(_, attr, path, qs) =>
`${attr}="${path}${qs ? qs + '&' : '?'}v=${appVersion}"`
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

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

In the html cache-buster transform, the replace callback parameter is named path, which shadows the imported Node path module used elsewhere in this file. Renaming the callback parameter (e.g., assetPath) would avoid confusion and reduce the chance of mistakes during future edits.

Suggested change
(_, attr, path, qs) =>
`${attr}="${path}${qs ? qs + '&' : '?'}v=${appVersion}"`
(_, attr, assetPath, qs) =>
`${attr}="${assetPath}${qs ? qs + '&' : '?'}v=${appVersion}"`

Copilot uses AI. Check for mistakes.
Comment thread openmetadata-ui/pom.xml
Comment on lines 152 to 156
<!--arguments>build</arguments-->
<environmentVariables>
<NODE_OPTIONS>--max-old-space-size=${node.heap.size}</NODE_OPTIONS>
<APP_VERSION>${project.version}</APP_VERSION>
</environmentVariables>
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

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

The PR description says this “Fixes #3457” (replying on deleted entity threads), but the changes here are build/routing performance tweaks (APP_VERSION env var for cache busting) and don’t appear related to that backend/UI behavior. Please update the PR title/description to reference the correct issue, or link the relevant issue for these frontend build optimizations.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 172 out of 172 changed files in this pull request and generated 4 comments.

Comment thread openmetadata-ui/src/main/resources/ui/vite.config.ts
Comment thread openmetadata-ui/src/main/resources/ui/src/setupTests.js Outdated
Comment thread openmetadata-ui/src/main/resources/ui/src/utils/TableUtils.tsx Outdated
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 172 out of 172 changed files in this pull request and generated 1 comment.

Comment on lines +19 to +27
i18next
.use(LanguageDetector)
.use(initReactI18next)
.init(getInitOptions())
.then(async () => {
if (i18next.language !== i18next.resolvedLanguage) {
await i18next.changeLanguage(i18next.language);
}
});
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 172 out of 172 changed files in this pull request and generated 4 comments.

Comment thread openmetadata-ui/src/main/resources/ui/vite.config.ts
Comment thread openmetadata-ui/src/main/resources/ui/vite.config.ts
karanh37
karanh37 previously approved these changes Apr 16, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 173 out of 173 changed files in this pull request and generated 1 comment.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 173 out of 173 changed files in this pull request and generated 3 comments.

Comment thread openmetadata-ui/src/main/resources/ui/src/setupTests.js
Comment thread openmetadata-ui/src/main/resources/ui/src/utils/UserDataUtils.ts
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 173 out of 173 changed files in this pull request and generated 2 comments.

Comment thread openmetadata-ui/src/main/resources/ui/vite.config.ts
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 173 out of 173 changed files in this pull request and generated 2 comments.

Comments suppressed due to low confidence (1)

openmetadata-ui/src/main/resources/ui/src/utils/i18next/LocalUtil.tsx:28

  • i18next.init(getInitOptions()) now only preloads the en-US resource bundle, but the post-init changeLanguage(i18next.language) runs without ensuring the target locale bundle has been loaded. If a user already has a non-English language in the i18next cookie (or the browser detector resolves to one), this will switch to that locale with no resources and the UI will render translation keys. Consider loading the locale bundle before calling changeLanguage (e.g., via LocalUtilClassBase.loadLocales() or an i18next backend) or avoiding the changeLanguage call unless resources exist.

Comment on lines +38 to +48
export const getImages = (imageUri: string) => {
const imagesObj: typeof imageTypes = imageTypes;
for (const type in imageTypes) {
imagesObj[type as keyof typeof imageTypes] = imageUri.replace(
's96-c',
imageTypes[type as keyof typeof imageTypes]
);
}

return imagesObj;
};
Comment on lines +191 to +203
manualChunks: (id) => {
if (id.includes('node_modules')) {
if (id.includes('antd')) {
return 'vendor-antd';
}
if (id.includes('@openmetadata/ui-core-components')) {
return 'vendor-untitled';
}
if (id.includes('@untitledui/icons')) {
return 'vendor-untitled-icons';
}
}
},
@gitar-bot
Copy link
Copy Markdown

gitar-bot bot commented Apr 17, 2026

Code Review 👍 Approved with suggestions 16 resolved / 17 findings

Vite config refactor optimizes chunk loading and resolves multiple import, dependency, and license header issues. Address the unhandled promise rejection in i18next.init() to ensure robust error handling.

💡 Edge Case: Unhandled rejection on i18next.init() promise

📄 openmetadata-ui/src/main/resources/ui/src/utils/i18next/LocalUtil.tsx:20-28

The i18next.init() call at module scope chains .then() but has no .catch() handler. If initialization fails (e.g., getInitOptions() returns invalid config, or the language detector throws), the promise rejection will be unhandled and silently swallowed in most environments or trigger an unhandledrejection event.

This is unlikely to fail in practice, but adding a .catch() provides visibility into initialization failures.

Suggested fix
i18next
  .use(LanguageDetector)
  .use(initReactI18next)
  .init(getInitOptions())
  .then(async () => {
    if (i18next.language !== i18next.resolvedLanguage) {
      await i18next.changeLanguage(i18next.language);
    }
  })
  .catch((error) => {
    // eslint-disable-next-line no-console
    console.error('Failed to initialize i18next:', error);
  });
✅ 16 resolved
Quality: webpackChunkName magic comments are ignored by Vite

📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AppRouter.tsx:34 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AppRouter.tsx:44 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AppRouter.tsx:53 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AppRouter.tsx:62 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AppRouter.tsx:71 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AppRouter.tsx:80 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedAppRouter.tsx:35 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedAppRouter.tsx:44 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedAppRouter.tsx:53 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedAppRouter.tsx:62 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedAppRouter.tsx:71 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedAppRouter.tsx:80 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedAppRouter.tsx:87 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedAppRouter.tsx:94 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedAppRouter.tsx:100 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedAppRouter.tsx:105 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedAppRouter.tsx:112 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedAppRouter.tsx:120 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedAppRouter.tsx:129
The /* webpackChunkName: "..." */ comments throughout AppRouter.tsx and AuthenticatedAppRouter.tsx are Webpack-specific and have no effect in Vite. Vite determines chunk names from the file path or the manualChunks config. These comments add visual noise and may confuse future contributors into thinking they control the output chunk names.

This is cosmetic and harmless — feel free to defer cleanup.

Edge Case: Cache-buster regex silently skips URLs with existing query params

📄 openmetadata-ui/src/main/resources/ui/vite.config.ts:64-66
The html-cache-buster plugin regex /(href|src)="([^"]+\.(?:js|css))"/g requires the URL to end with .js" or .css" immediately. If a URL already contains query parameters (e.g., app.js?existing=1), the regex won't match and the version string is silently not appended.

In practice this is unlikely with Vite's standard output (no query params on generated assets), but if another plugin or future change introduces query params, the cache-buster will silently break.

Bug: Broken import: withDomainFilter still imported from old DomainUtils in test

📄 openmetadata-ui/src/main/resources/ui/src/hoc/withDomainFilter.tsx:1-15
withDomainFilter was moved from DomainUtils.tsx to hoc/withDomainFilter.tsx, but DomainUtils.test.tsx still imports it from the old path. This will cause the test to fail at compile time.

Quality: New file hoc/withDomainFilter.tsx is missing Apache license header

📄 openmetadata-ui/src/main/resources/ui/src/hoc/withDomainFilter.tsx:1
All other source files in the project include the Apache 2.0 license header. The new hoc/withDomainFilter.tsx starts directly with import on line 1, missing the standard license block.

Bug: ReactNode type used without import in ReactAriaRouterBridge

📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedApp.tsx:21 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedApp.tsx:40 📄 openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AuthenticatedApp.tsx:47
Line 40 uses ReactNode as a bare type, but only FC and useMemo are imported from 'react' (line 21). The file doesn't have import React from 'react' either. Line 47 correctly uses React.ReactNode with the namespace qualifier, showing the inconsistency.

Depending on the TypeScript/React types configuration, this will either be a compilation error or silently resolve to any. Either way, it should be consistent with the rest of the file.

...and 11 more resolved from earlier reviews

🤖 Prompt for agents
Code Review: Vite config refactor optimizes chunk loading and resolves multiple import, dependency, and license header issues. Address the unhandled promise rejection in i18next.init() to ensure robust error handling.

1. 💡 Edge Case: Unhandled rejection on i18next.init() promise
   Files: openmetadata-ui/src/main/resources/ui/src/utils/i18next/LocalUtil.tsx:20-28

   The `i18next.init()` call at module scope chains `.then()` but has no `.catch()` handler. If initialization fails (e.g., `getInitOptions()` returns invalid config, or the language detector throws), the promise rejection will be unhandled and silently swallowed in most environments or trigger an `unhandledrejection` event.
   
   This is unlikely to fail in practice, but adding a `.catch()` provides visibility into initialization failures.

   Suggested fix:
   i18next
     .use(LanguageDetector)
     .use(initReactI18next)
     .init(getInitOptions())
     .then(async () => {
       if (i18next.language !== i18next.resolvedLanguage) {
         await i18next.changeLanguage(i18next.language);
       }
     })
     .catch((error) => {
       // eslint-disable-next-line no-console
       console.error('Failed to initialize i18next:', error);
     });

Options

Display: compact → Showing less information.

Comment with these commands to change:

Compact
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Gitar

@sonarqubecloud
Copy link
Copy Markdown

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

Labels

safe to test Add this label to run secure Github workflows on PRs UI UI specific issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants