{"id":13929048,"url":"https://github.com/temporalio/ui","last_synced_at":"2026-02-24T20:06:17.446Z","repository":{"id":37076869,"uuid":"383845173","full_name":"temporalio/ui","owner":"temporalio","description":"Temporal UI","archived":false,"fork":false,"pushed_at":"2024-11-22T18:36:17.000Z","size":22845,"stargazers_count":194,"open_issues_count":123,"forks_count":71,"subscribers_count":11,"default_branch":"main","last_synced_at":"2024-11-22T19:35:22.411Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://docs.temporal.io/web-ui","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/temporalio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-07-07T15:30:22.000Z","updated_at":"2024-11-22T18:36:19.000Z","dependencies_parsed_at":"2024-04-15T15:16:00.714Z","dependency_job_id":"f4fc0ce8-76e2-416f-b6a4-46e403ccadc3","html_url":"https://github.com/temporalio/ui","commit_stats":null,"previous_names":[],"tags_count":217,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/temporalio%2Fui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/temporalio%2Fui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/temporalio%2Fui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/temporalio%2Fui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/temporalio","download_url":"https://codeload.github.com/temporalio/ui/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":226588954,"owners_count":17655809,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-07T18:02:04.383Z","updated_at":"2026-02-24T20:06:17.434Z","avatar_url":"https://github.com/temporalio.png","language":"TypeScript","funding_links":[],"categories":["others"],"sub_categories":[],"readme":"# Temporal UI\n\n## Prerequisites\n\nTemporal must be running in development.\n\nTemporal UI requires [Temporal v1.16.0](https://github.com/temporalio/temporal/releases/tag/v1.16.0) or later.\n\nMake sure [Corepack](https://pnpm.io/installation#using-corepack) is installed and run `corepack enable pnpm`. \n\n### Using Temporal CLI\n\nYou can install [Temporal CLI][] using [Homebrew][]:\n\n```sh\nbrew install temporal\n```\n\nYou can start a Temporal server in development using the following command:\n\n```sh\ntemporal server start-dev\n```\n\n[temporal cli]: https://github.com/temporalio/cli\n[homebrew]: https://brew.sh\n\n## Development\n\n### Local Development\n\n#### Setup\n\nOnce you have the prerequisites going, run the following:\n\n```bash\npnpm install\n```\n\nRunning `pnpm install` will attempt to download and install the most recent version of [Temporal CLI][] into `./bin/cli/temporal`. The development server will attempt to use use this version of this Temporal when starting up.\n\n- If that port is already in use, the UI will fallback to trying to talk to whatever process is running on that port.\n- If you do not have a version of Temporal CLI at `./bin/cli/temporal`, the development server will look for a version of Temporal CLI in your path.\n- For Windows users, you will need to start Temporal using one of the methods listed above until we have sufficiently tested this functionality on Windows. (We would absolutely welcome a pull request.)\n\n```bash\ngit submodule update\n```\n\nThis clones the [Temporal API Protos](https://github.com/temporalio/api) into the git submodule, which is required for local development of the UI when running against a local version of the UI server.\n\n\nTo run a local development version of the Svelte application via Vite, run `pnpm dev`. The application will run on [http://localhost:3000]() against a local ui-server running along with Temporal server from the temporal-cli.\n\n```bash\npnpm dev\n```\n\nAlternatively, you can run `pnpm dev:temporal-cli` to run against the version of ui-server and Temporal server included temporal-cli.\n```bash\npnpm dev:temporal-cli\n```\n\n### Building the UI\n\nThe Temporal UI can be built for local preview. You must set the `VITE_TEMPORAL_UI_BUILD_TARGET` environment variable in order to build the assets. This will be set for you if you use either of the following `pnpm` scripts. The resulting assets will be placed in `./build` by default or the directory defined by the `BUILD_PATH` environment variable.\n\n\u003e You can preview the built app with `pnpm run preview`, regardless of whether you installed an adapter. This should _not_ be used to serve your app in production.\n\n\n```bash\npnpm build:local\n```\n\n\nThe Temporal UI can build assets for ui-server. The resulting assets will be placed in `./server/ui/assets`.\n\n```bash\npnpm build:server\n```\n\n### Using Docker\n\nAfter pulling down the lastest version of Temporal's [`docker-compose`](https://github.com/temporalio/docker-compose), you can access the UI by visiting `http://localhost:8080`.\n\nIf you want to point the development environment at the `docker-compose` version of Temporal, you can use the following command:\n\n```bash\npnpm dev:docker\n```\n\n```bash\npnpm run build:docker\npnpm run preview:docker\n```\n\n\n### Running UI and Temporal Server locally\n\n1. In `temporal` repo, run Temporal server locally\n    \n```diff\nmake start\n```\n\n2. In `ui` repo, add .env.local-temporal file with the following env variables\n\n```diff\nVITE_TEMPORAL_PORT=\"7134\"\nVITE_API=\"http://localhost:8081\"\nVITE_MODE=\"development\"\nVITE_TEMPORAL_UI_BUILD_TARGET=\"local\"\n```\n\n3. Run UI with pnpm dev:local-temporal\n\n```diff\npnpm dev:local-temporal\n```\n\n4. Create namespace with CLI (Temporal server does not do this automatically unlike CLI)\n\n```diff\ntemporal operator namespace create default\n```\n\n## OSS API Development\n\n### Understanding OSS API Endpoints\n\nWhen developing new features that require API endpoints for the OSS version of Temporal, the available APIs can be found in the [Temporal API repository](https://github.com/temporalio/api). These gRPC APIs are converted to HTTP through the ui-server's gRPC proxy.\n\n**Key Resources:**\n- **API Definitions**: https://github.com/temporalio/api/tree/master/temporal/api\n- **Service Definitions**: Look for `*_service.proto` files for available operations\n- **HTTP Conversion**: The ui-server automatically converts gRPC calls to HTTP endpoints\n\n**Common API Patterns:**\n- **WorkflowService**: `temporal/api/workflowservice/v1/service.proto` - Core workflow operations\n- **OperatorService**: `temporal/api/operatorservice/v1/service.proto` - Administrative operations (search attributes, clusters, etc.)\n- **Endpoint Mapping**: gRPC service methods map to HTTP POST endpoints at `/api/v1/{service}/{method}`\n\n**Example:**\n- gRPC: `temporal.api.operatorservice.v1.OperatorService.ListSearchAttributes`\n- HTTP: `POST /api/v1/operator/list-search-attributes`\n\n**Finding Available Operations:**\n1. Browse the API repository to find relevant service files\n2. Look for existing method definitions in `*_service.proto` files\n3. Check if the operation you need already exists before requesting new endpoints\n4. For new operations, coordinate with the SDK team to add them to the appropriate service\n\n**Development Workflow:**\n1. Check existing API definitions for required operations\n2. Use existing endpoints where possible via services in `src/lib/services/`\n3. For missing endpoints, create adapters with TODO comments (like in `SearchAttributesAdapter`)\n4. Coordinate with SDK team to implement missing gRPC methods\n5. Update adapters once endpoints are available\n\n## Authentication\n\nTemporal UI supports OAuth2/OIDC authentication with automatic token refresh and configurable session duration.\n\n**Quick Start:**\n```bash\npnpm dev:with-auth  # Start with local OIDC server\n```\n\nSee [AUTHENTICATION.md](./AUTHENTICATION.md) for complete documentation on:\n- Configuration and setup\n- Token refresh flow\n- Session duration management\n- Testing procedures\n- Security considerations\n- Troubleshooting\n\n## Testing\nWe use [Playwright](https://playwright.dev) to interactively test the Temporal UI.\n\n### Running the E2E tests\nThe e2e tests run against the UI with workflows via the [TypeScript SDK](https://github.com/temporalio/sdk-typescript), a locally built version of the UI Server, a NodeJS/Express Codec Server, and a Temporal dev server via [Temporal CLI](https://github.com/temporalio/cli)\n\n`pnpm test:e2e`\n\n### Running the Integration tests\nThe integration tests run against the UI using Mocks\n\n`pnpm test:integration`\n\nBoth `pnpm test:e2e` and `pnpm test:integration` use the `playwright.config.ts` at the root of the repo. This file will [run the UI via the vite development server](https://playwright.dev/docs/api/class-testconfig#test-config-web-server) with the correct configuration by running either `pnpm serve:playwright:e2e` or `pnpm serve:playwright:integration`. It will also invoke the default function in `tests/globalSetup.ts`, which instantiates all of the necessary dependencies (UI Server, Codec Server, Temporal Server, Temporl Workers, etc.) when running in e2e mode.\n\n## Configuration\n\nSet these environment variables if you want to change their defaults\n\n| Variable  | Description                                                      | Default               | Stage |\n| --------- | ---------------------------------------------------------------- | --------------------- | ----- |\n| VITE_API  | Temporal HTTP API address. Set to empty `` to use relative paths | http://localhost:8322 | Build |\n| VITE_MODE | Build target                                                     | development           | Build |\n| UI_SERVER_VERBOSE | Enable verbose output to see Air build logs and server output for debugging | false | Development |\n| UI_SERVER_HOT_RELOAD | Enable hot reload using Air                           | false | Development |\n\n## Releases\n\nThis repository uses an automated release management system that enforces version bump PRs before releases and maintains dual version sync between `package.json` and `server/server/version/version.go`.\n\n### Release Management\n\nThe release system uses custom GitHub Actions for modular, reusable functionality. See [GitHub Workflows Documentation](.github/WORKFLOWS.md) for detailed information about the 8 custom actions and 3 workflows.\n\n**Release Process**:\n1. **Version Bump**: Use Actions → \"Version Bump\" to create a PR with updated versions\n   - **Auto mode**: Analyzes commits since last tag for semantic versioning\n   - **Manual mode**: Specify major/minor/patch bump type\n   - **Specific version**: Override with exact version (e.g., \"2.38.0\")\n   - **Dry run**: Preview changes without making modifications\n2. **Review and Merge**: Review the auto-generated version bump PR and merge to main\n3. **Draft Release**: Automatically created when version changes are detected\n4. **Publish Release**: Review and publish the auto-generated draft release\n5. **UI-server Release**: A published release automatically triggers a matching release in the ui-server repository\n\n**Version Source of Truth**: The Go `UIVersion` constant in `server/server/version/version.go` is the authoritative source. All validation uses this as the reference, and `package.json` must be kept in sync.\n\n**Version Validation**: \n- Run `pnpm validate:versions` to ensure version files are in sync and ready for release\n- Validation compares against last git tag (not last commit) for robust release workflows\n- Custom actions provide detailed validation and error messages\n\n**Integration**:\n- Draft releases trigger downstream ui-server releases and Docker image publishing\n- UI repo releases (https://github.com/temporalio/ui/releases) contain the latest UI artifacts\n- Our [npm package](https://www.npmjs.com/package/@temporalio/ui) will be manually published as needed.\n- UI-server repo releases (https://github.com/temporalio/ui-server/releases) manage Docker images\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftemporalio%2Fui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftemporalio%2Fui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftemporalio%2Fui/lists"}