{"id":50425022,"url":"https://github.com/dioxuslabs/dioxus-ci","last_synced_at":"2026-05-31T10:01:28.293Z","repository":{"id":355895065,"uuid":"1230105272","full_name":"DioxusLabs/dioxus-ci","owner":"DioxusLabs","description":"Github CI workflows for dioxus including nightly github pages builds for every pr","archived":false,"fork":false,"pushed_at":"2026-05-29T16:47:32.000Z","size":64,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-30T23:20:50.372Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":null,"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/DioxusLabs.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":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-05T17:23:27.000Z","updated_at":"2026-05-29T16:47:36.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/DioxusLabs/dioxus-ci","commit_stats":null,"previous_names":["ealmloff/dioxus-ci"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/DioxusLabs/dioxus-ci","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DioxusLabs%2Fdioxus-ci","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DioxusLabs%2Fdioxus-ci/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DioxusLabs%2Fdioxus-ci/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DioxusLabs%2Fdioxus-ci/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DioxusLabs","download_url":"https://codeload.github.com/DioxusLabs/dioxus-ci/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DioxusLabs%2Fdioxus-ci/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33726719,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":"2026-05-31T10:01:27.173Z","updated_at":"2026-05-31T10:01:28.274Z","avatar_url":"https://github.com/DioxusLabs.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# dioxus-ci\n\nReusable GitHub Actions and workflows for [Dioxus](https://dioxuslabs.com) projects.\n\nTwo layers:\n\n- **Composite actions**: fine-grained building blocks you drop into your own workflow.\n- **Reusable workflows**: opinionated, batteries-included flows you call with one `uses:` line.\n\nPin this repository by tag or commit SHA in production. The internal third-party actions used by these workflows are pinned to exact commit SHAs.\n\n---\n\n## Quick start\n\nCI checks for a typical Dioxus app:\n\n```yaml\nname: CI\non:\n  push: { branches: [main] }\n  pull_request: { types: [opened, synchronize, reopened, ready_for_review], branches: [main] }\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}\n  cancel-in-progress: true\njobs:\n  check:  { uses: ealmloff/dioxus-ci/.github/workflows/check.yml@main }\n  test:   { uses: ealmloff/dioxus-ci/.github/workflows/test.yml@main }\n  clippy: { uses: ealmloff/dioxus-ci/.github/workflows/clippy.yml@main }\n  fmt:    { uses: ealmloff/dioxus-ci/.github/workflows/fmt.yml@main }\n```\n\nGitHub Pages deploys use one unprivileged web build and one privileged publisher. The build workflow always uploads a static artifact; the publisher deploys it as the main site for default-branch pushes, or under `pr-preview/pr-\u003cN\u003e/` for pull requests.\n\n```yaml\n# .github/workflows/web.yml\nname: Web\non:\n  push:\n    branches: [main]\n  pull_request:\n    types: [opened, synchronize, reopened, ready_for_review]\n    branches: [main]\npermissions:\n  contents: read\nconcurrency:\n  group: web-${{ github.event.pull_request.number || github.ref }}\n  cancel-in-progress: true\njobs:\n  build:\n    uses: ealmloff/dioxus-ci/.github/workflows/web-build.yml@main\n    with:\n      working-directory: app\n      ssg: true\n      features: fullstack\n      base-path: ${{ github.event.repository.name }}\n      dx-cli-version: 0.7.7\n```\n\n```yaml\n# .github/workflows/pages.yml\nname: Pages\non:\n  workflow_run:\n    workflows: [\"Web\"]\n    types: [completed]\n  pull_request:\n    types: [closed]\npermissions:\n  actions: read\n  contents: write\n  pull-requests: write\nconcurrency:\n  group: pages-${{ github.event.workflow_run.id || github.event.pull_request.number }}\n  cancel-in-progress: false\njobs:\n  publish:\n    uses: ealmloff/dioxus-ci/.github/workflows/pages-publish.yml@main\n```\n\n---\n\n## Composite actions\n\n### `setup-dioxus`\n\nInstall the Rust toolchain and a Swatinem cache.\n\n```yaml\n- uses: ealmloff/dioxus-ci/actions/setup-dioxus@main\n  with:\n    toolchain: stable\n    targets: wasm32-unknown-unknown\n```\n\n| input | default | description |\n|---|---|---|\n| `toolchain` | `stable` | Rust toolchain string passed to the pinned `dtolnay/rust-toolchain` action. |\n| `components` | `\"\"` | Comma-separated toolchain components. |\n| `targets` | `\"\"` | Comma-separated toolchain targets. |\n| `cache` | `\"true\"` | Set to `\"false\"` to manage caching yourself. |\n| `cache-all-crates` | `\"true\"` | Passed to `Swatinem/rust-cache`. |\n| `cache-on-failure` | `\"false\"` | Passed to `Swatinem/rust-cache`. |\n| `cache-directories` | `\"\"` | Extra dirs to cache. |\n| `cache-shared-key` | `\"\"` | Passed to `Swatinem/rust-cache` `shared-key`. |\n| `cache-provider` | `\"\"` | Passed to `Swatinem/rust-cache` `cache-provider`. |\n\n### `install-dioxus-cli`\n\nInstall the `dx` CLI via [`cargo-binstall`](https://github.com/cargo-bins/cargo-binstall).\n\n```yaml\n- uses: ealmloff/dioxus-ci/actions/install-dioxus-cli@main\n  with:\n    version: 0.7.7\n```\n\n| input | default | description |\n|---|---|---|\n| `version` | `latest` | Version of `dioxus-cli` to install, or `latest`. |\n| `force` | `\"true\"` | Pass `--force` to `cargo binstall`. |\n\n### `free-disk-space`\n\nReclaim roughly 10-20 GB on Ubuntu runners by removing pre-installed toolchains. Runs only on Linux runners.\n\n```yaml\n- uses: ealmloff/dioxus-ci/actions/free-disk-space@main\n```\n\n### `build-web`\n\nRun `dx build --web` with typed inputs for the common flags. Returns the path to the built assets.\n\n```yaml\n- id: build\n  uses: ealmloff/dioxus-ci/actions/build-web@main\n  with:\n    working-directory: app\n    ssg: true\n    features: fullstack\n    base-path: my-app\n- run: ls \"${{ steps.build.outputs.output-path }}\"\n```\n\n| input | default | description |\n|---|---|---|\n| `working-directory` | `.` | Where `dx build` runs. |\n| `ssg` | `\"false\"` | When `\"true\"`, adds `--fullstack --ssg`. |\n| `features` | `\"\"` | Cargo features passed as one `--features` value. |\n| `no-default-features` | `\"false\"` | When `\"true\"`, adds `--no-default-features`. |\n| `release` | `\"true\"` | When `\"true\"`, adds `--release`. |\n| `debug-symbols` | `\"true\"` | When `\"false\"`, adds `--debug-symbols false`. |\n| `base-path` | `\"\"` | Adds `--base-path \u003cvalue\u003e` when set. |\n| `output-dir` | `\"\"` | Explicit built asset directory to return instead of resolving the standard Dioxus output path. |\n\n| output | description |\n|---|---|\n| `output-path` | Absolute path to the built web assets. |\n| `crate-name` | Name of the built crate when auto-resolved. Empty when `output-dir` is used. |\n\n### `spa-404-fallback`\n\nWrite a `404.html` next to your built site so any URL deep-links to the SPA. Optionally recognizes `\u003cbase\u003e/\u003cprefix\u003e/pr-\u003cN\u003e/` and root-level `\u003cprefix\u003e/pr-\u003cN\u003e/` PR-preview subroutes.\n\n```yaml\n- uses: ealmloff/dioxus-ci/actions/spa-404-fallback@main\n  with:\n    output-dir: docs\n    base-path: my-app\n    pr-preview-prefix: pr-preview\n```\n\n| input | default | description |\n|---|---|---|\n| `output-dir` | required | Directory to write `404.html` into. |\n| `base-path` | `\"\"` | Base path the app is deployed at. |\n| `pr-preview-prefix` | `\"\"` | Recognize `\u003cbase\u003e/\u003cprefix\u003e/pr-\u003cN\u003e/` and root-level `\u003cprefix\u003e/pr-\u003cN\u003e/` subroutes when set. |\n\n---\n\n## Reusable workflows\n\n| workflow | purpose |\n|---|---|\n| `check.yml` | `cargo check` with typed package, feature, target, and resolver inputs. |\n| `test.yml` | `cargo test` with typed package, feature, target, and test-selection inputs. |\n| `clippy.yml` | `cargo clippy` with typed target/lint inputs and `-D warnings` by default. |\n| `fmt.yml` | `cargo fmt --all -- --check` by default. |\n| `docs.yml` | `cargo doc --workspace --no-deps --all-features --document-private-items` with denied warnings by default. |\n| `web-build.yml` | Build a Dioxus web app and upload a deployable Pages artifact. |\n| `pages-publish.yml` | Publish validated Pages artifacts to `gh-pages`, comment on PR previews, and remove previews when PRs close. |\n\nPages web builds time out after 45 minutes. Pages publish jobs time out after 15 minutes, and PR-preview cleanup after 10 minutes.\n\nThe cargo workflows expose typed inputs for every supported flag — use the per-workflow tables below. For desktop/webview apt packages, Firefox, or disk cleanup, compose a custom job and install those dependencies explicitly.\n\nNote the `all-features` defaults: `check.yml`, `clippy.yml`, and `docs.yml` default to `true`; `test.yml` defaults to `false`. Pass `all-features: false` explicitly when feature combinations matter.\n\n### `check.yml`\n\n| input | default | description |\n|---|---|---|\n| `toolchain` | `stable` | Rust toolchain string. |\n| `workspace` | `true` | Pass `--workspace`. |\n| `package` | `\"\"` | Newline-separated package names passed with `--package`. |\n| `exclude` | `\"\"` | Newline-separated package names passed with `--exclude`. |\n| `features` | `\"\"` | Space-separated cargo features. |\n| `all-features` | `true` | Pass `--all-features`. |\n| `no-default-features` | `false` | Pass `--no-default-features`. |\n| `target` | `\"\"` | Adds `--target \u003cvalue\u003e`. |\n| `all-targets` | `false` | Pass `--all-targets`. |\n| `bins` | `false` | Pass `--bins`. |\n| `examples` | `false` | Pass `--examples`. |\n| `tests` | `false` | Pass `--tests`. |\n| `benches` | `false` | Pass `--benches`. |\n| `locked` | `false` | Pass `--locked`. |\n| `frozen` | `false` | Pass `--frozen`. |\n| `offline` | `false` | Pass `--offline`. |\n| `jobs` | `\"\"` | Adds `--jobs \u003cvalue\u003e`. |\n| `cache-directories` | `\"\"` | Extra dirs passed to `Swatinem/rust-cache`. |\n| `runs-on` | `ubuntu-latest` | Runner label. |\n\n### `test.yml`\n\n| input | default | description |\n|---|---|---|\n| `toolchain` | `stable` | Rust toolchain string. |\n| `workspace` | `true` | Pass `--workspace`. |\n| `package` | `\"\"` | Newline-separated `--package` names. |\n| `exclude` | `\"\"` | Newline-separated `--exclude` names. |\n| `features` | `\"\"` | Space-separated cargo features. |\n| `all-features` | `false` | Pass `--all-features`. |\n| `no-default-features` | `false` | Pass `--no-default-features`. |\n| `target` | `\"\"` | Adds `--target \u003cvalue\u003e`. |\n| `test-name` | `\"\"` | Optional cargo test filter. |\n| `lib` | `false` | Pass `--lib`. |\n| `bins` | `false` | Pass `--bins`. |\n| `examples` | `false` | Pass `--examples`. |\n| `tests` | `false` | Pass `--tests`. |\n| `benches` | `false` | Pass `--benches`. |\n| `all-targets` | `false` | Pass `--all-targets`. |\n| `doc` | `false` | Pass `--doc`. |\n| `no-run` | `false` | Pass `--no-run`. |\n| `no-fail-fast` | `false` | Pass `--no-fail-fast`. |\n| `ignored` | `false` | Pass `--ignored` after `--`. |\n| `include-ignored` | `false` | Pass `--include-ignored` after `--`. |\n| `locked` | `false` | Pass `--locked`. |\n| `frozen` | `false` | Pass `--frozen`. |\n| `offline` | `false` | Pass `--offline`. |\n| `jobs` | `\"\"` | Adds `--jobs \u003cvalue\u003e`. |\n| `cache-directories` | `\"\"` | Extra dirs passed to `Swatinem/rust-cache`. |\n| `runs-on` | `ubuntu-24.04` | Runner label. |\n\n### `clippy.yml`\n\n| input | default | description |\n|---|---|---|\n| `toolchain` | `stable` | Rust toolchain string. |\n| `workspace` | `true` | Pass `--workspace`. |\n| `package` | `\"\"` | Newline-separated `--package` names. |\n| `exclude` | `\"\"` | Newline-separated `--exclude` names. |\n| `features` | `\"\"` | Space-separated cargo features. |\n| `all-features` | `true` | Pass `--all-features`. |\n| `no-default-features` | `false` | Pass `--no-default-features`. |\n| `target` | `\"\"` | Adds `--target \u003cvalue\u003e`. |\n| `all-targets` | `true` | Pass `--all-targets`. |\n| `bins` | `false` | Pass `--bins`. |\n| `examples` | `true` | Pass `--examples`. |\n| `tests` | `true` | Pass `--tests`. |\n| `benches` | `false` | Pass `--benches`. |\n| `deny-warnings` | `true` | Append `-D warnings` after `--`. |\n| `deny` | `\"\"` | Newline-separated lints passed after `--` as `-D \u003clint\u003e`. |\n| `warn` | `\"\"` | Newline-separated lints passed after `--` as `-W \u003clint\u003e`. |\n| `allow` | `\"\"` | Newline-separated lints passed after `--` as `-A \u003clint\u003e`. |\n| `locked` | `false` | Pass `--locked`. |\n| `frozen` | `false` | Pass `--frozen`. |\n| `offline` | `false` | Pass `--offline`. |\n| `jobs` | `\"\"` | Adds `--jobs \u003cvalue\u003e`. |\n| `cache-directories` | `\"\"` | Extra dirs passed to `Swatinem/rust-cache`. |\n| `runs-on` | `ubuntu-24.04` | Runner label. |\n\n### `fmt.yml`\n\n| input | default | description |\n|---|---|---|\n| `toolchain` | `stable` | Rust toolchain string. |\n| `all` | `true` | Pass `--all`. |\n| `package` | `\"\"` | Newline-separated `--package` names. |\n| `check` | `true` | Pass `-- --check`. |\n| `runs-on` | `ubuntu-24.04` | Runner label. |\n\n### `docs.yml`\n\nDefaults to `nightly` so `--document-private-items` works on the standard library docs.\n\n| input | default | description |\n|---|---|---|\n| `toolchain` | `nightly` | Rust toolchain string. |\n| `workspace` | `true` | Pass `--workspace`. |\n| `package` | `\"\"` | Newline-separated `--package` names. |\n| `exclude` | `\"\"` | Newline-separated `--exclude` names. |\n| `features` | `\"\"` | Space-separated cargo features. |\n| `all-features` | `true` | Pass `--all-features`. |\n| `no-default-features` | `false` | Pass `--no-default-features`. |\n| `target` | `\"\"` | Adds `--target \u003cvalue\u003e`. |\n| `no-deps` | `true` | Pass `--no-deps`. |\n| `document-private-items` | `true` | Pass `--document-private-items`. |\n| `deny-warnings` | `true` | Set `RUSTDOCFLAGS=-D warnings`. |\n| `open` | `false` | Pass `--open`. |\n| `locked` | `false` | Pass `--locked`. |\n| `frozen` | `false` | Pass `--frozen`. |\n| `offline` | `false` | Pass `--offline`. |\n| `jobs` | `\"\"` | Adds `--jobs \u003cvalue\u003e`. |\n| `cache-directories` | `\"\"` | Extra dirs passed to `Swatinem/rust-cache`. |\n| `runs-on` | `ubuntu-24.04` | Runner label. |\n\n### `web-build.yml`\n\nBuilds a Dioxus web app and uploads a deployable Pages artifact (with metadata that `pages-publish.yml` validates).\n\n| input | default | description |\n|---|---|---|\n| `working-directory` | `.` | Where `dx build` runs. |\n| `ssg` | `false` | When `true`, adds `--fullstack --ssg`. |\n| `features` | `\"\"` | Cargo features passed as one `--features` value. |\n| `no-default-features` | `false` | When `true`, adds `--no-default-features`. |\n| `debug-symbols` | `true` | When `false`, adds `--debug-symbols false`. |\n| `base-path` | `\"\"` | Adds `--base-path \u003cvalue\u003e`. PR previews are built under `\u003cbase-path\u003e/pr-preview/pr-\u003cN\u003e`. |\n| `artifact-retention-days` | `7` | Retention for the uploaded artifact. |\n| `dx-cli-version` | `latest` | Version of `dioxus-cli` to install. |\n| `toolchain` | `stable` | Rust toolchain string. |\n| `runs-on` | `ubuntu-latest` | Runner label. |\n| `submodules` | `\"\"` | Forwarded to `actions/checkout` `submodules`. |\n| `cache-provider` | `\"\"` | Forwarded to `Swatinem/rust-cache` `cache-provider`. |\n\n### `pages-publish.yml`\n\nWire it from a separate workflow file using `workflow_run` (for publish) and `pull_request: closed` (for cleanup) — see the [Pages quick-start](#quick-start) above.\n\n| input | default | description |\n|---|---|---|\n| `pages-url-base` | `\"\"` | Site root used for PR-preview comments. Defaults to `https://\u003cowner\u003e.github.io`. |\n| `branch` | `gh-pages` | GitHub Pages branch to deploy to. |\n| `runs-on` | `ubuntu-latest` | Runner label. |\n\n---\n\n## Recipes\n\n### Use a custom toolchain\n\n```yaml\njobs:\n  check:\n    uses: ealmloff/dioxus-ci/.github/workflows/check.yml@main\n    with:\n      toolchain: 1.88.0\n```\n\n### Compile Linux desktop dependencies\n\n```yaml\njobs:\n  desktop-check:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5\n      - run: |\n          sudo apt-get update\n          sudo apt-get install -y libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev libxdo-dev\n      - uses: ealmloff/dioxus-ci/actions/setup-dioxus@main\n      - run: cargo check --workspace\n```\n\n### Compose your own deploy job\n\n```yaml\njobs:\n  custom-deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5\n      - uses: ealmloff/dioxus-ci/actions/setup-dioxus@main\n        with: { targets: wasm32-unknown-unknown, cache-directories: target/dx }\n      - uses: ealmloff/dioxus-ci/actions/install-dioxus-cli@main\n      - id: build\n        uses: ealmloff/dioxus-ci/actions/build-web@main\n        with: { working-directory: app, ssg: true, features: fullstack, base-path: my-app }\n      - uses: ealmloff/dioxus-ci/actions/spa-404-fallback@main\n        with: { output-dir: '${{ steps.build.outputs.output-path }}', base-path: my-app }\n      # Now deploy `${{ steps.build.outputs.output-path }}` wherever you like.\n```\n\n---\n\n## License\n\nDual-licensed under [MIT](LICENSE) at your option, matching the rest of the Dioxus ecosystem.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdioxuslabs%2Fdioxus-ci","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdioxuslabs%2Fdioxus-ci","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdioxuslabs%2Fdioxus-ci/lists"}