Skip to content

create tauri ui#84

Merged
mors119 merged 7 commits into
FrilLab:mainfrom
mors119:feature/create-tauri
Jun 19, 2026
Merged

create tauri ui#84
mors119 merged 7 commits into
FrilLab:mainfrom
mors119:feature/create-tauri

Conversation

@mors119

@mors119 mors119 commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator

What

Add Tauri CI
Create Tauri Template (is blank)

Summary by CodeRabbit

  • New Features

    • Introduced a new desktop application built with Tauri, React, and TypeScript.
  • Chores

    • Added GitHub Actions workflow for continuous integration verification.
    • Reorganized workspace configuration to support the new application structure.
    • Updated development environment configurations and tooling setup.

@coderabbitai

coderabbitai Bot commented Jun 19, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@mors119, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 34 minutes and 59 seconds. Learn how PR review limits work.

To continue reviewing without waiting, enable usage-based billing in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan refill rate.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, the refill rate gradually slows as usage increases. The highest same-day bursts are limited more strictly.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: e075f743-979d-4d0b-b1d3-f2a4fb807712

📥 Commits

Reviewing files that changed from the base of the PR and between a70ac8c and 88b5e76.

📒 Files selected for processing (2)
  • .github/workflows/rust.yml
  • .github/workflows/tauri.yml
📝 Walkthrough

Walkthrough

A new Tauri + React + TypeScript desktop app (apps/dustfril-tauri) is added to the monorepo. The Cargo workspace is updated to include the new crate, the .gitignore is rewritten to cover all artifact types, and a GitHub Actions workflow is added to validate the Tauri build via cargo check.

Changes

Tauri Desktop App Addition

Layer / File(s) Summary
Workspace and repo integration
Cargo.toml, .gitignore
Cargo workspace members updated to use crates/* glob and add apps/dustfril-tauri/src-tauri; .gitignore rewritten with sections for Rust, Node/Frontend, Tauri, logs, and editor artifacts.
Tauri Rust backend
apps/dustfril-tauri/src-tauri/Cargo.toml, apps/dustfril-tauri/src-tauri/build.rs, apps/dustfril-tauri/src-tauri/tauri.conf.json, apps/dustfril-tauri/src-tauri/capabilities/default.json, apps/dustfril-tauri/src-tauri/src/lib.rs, apps/dustfril-tauri/src-tauri/src/main.rs, apps/dustfril-tauri/src-tauri/.gitignore
New dustfril-tauri crate with tauri-build, tauri, tauri-plugin-opener, serde, and local dustfril-core dependencies; build.rs delegates to tauri_build::build(); lib.rs exposes a greet Tauri command and run() entry; main.rs delegates to run(); tauri.conf.json sets product metadata, dev server config, window dimensions, and bundling; capability manifest grants core:default and opener:default.
React frontend and Vite tooling
apps/dustfril-tauri/package.json, apps/dustfril-tauri/index.html, apps/dustfril-tauri/tsconfig.json, apps/dustfril-tauri/tsconfig.node.json, apps/dustfril-tauri/vite.config.ts, apps/dustfril-tauri/src/App.tsx, apps/dustfril-tauri/src/App.css, apps/dustfril-tauri/src/main.tsx, apps/dustfril-tauri/src/vite-env.d.ts
package.json with React 19, @tauri-apps/api, and Vite dev tooling; index.html with #root mount point; TypeScript configs targeting ES2020/ESNext with bundler resolution; vite.config.ts with fixed port 1420, TAURI_DEV_HOST-aware WebSocket HMR, and src-tauri watch exclusion; App.tsx component invoking the greet command via invoke(); App.css with dark-mode media query; main.tsx React root render.
CI workflow, docs, and editor config
.github/workflows/tauri.yml, apps/dustfril-tauri/README.md, apps/dustfril-tauri/.vscode/extensions.json
GitHub Actions workflow triggering on main push and PRs: installs Rust stable + Node 20, runs npm install, and runs cargo check in src-tauri; README with project title and IDE setup section; VS Code extension recommendations for tauri-apps.tauri-vscode and rust-lang.rust-analyzer.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant App.tsx
  participant TauriIPC as Tauri IPC Bridge
  participant lib.rs

  User->>App.tsx: Submits form with name input
  App.tsx->>TauriIPC: invoke("greet", { name })
  TauriIPC->>lib.rs: greet(name: &str)
  lib.rs-->>TauriIPC: "Hello, {name}! You've been greeted from Rust!"
  TauriIPC-->>App.tsx: greeting String
  App.tsx->>User: Renders greetMsg in paragraph
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐇 A window appears with a Tauri flair,
React and Rust dancing through the air,
cargo check guards the CI gate,
greet() returns — no need to wait!
The rabbit hops in, types a name, hits send,
A message from Rust: "Hello, friend!"

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title 'create tauri ui' is vague and only partially describes the changeset. While it mentions Tauri, it doesn't convey the scope of changes—including CI setup, workspace configuration, and a complete Tauri application scaffold. Consider a more specific title like 'Set up Tauri application with CI configuration' or 'Add Tauri desktop app scaffold with GitHub Actions workflow' to better communicate the full scope of changes.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 10

🧹 Nitpick comments (1)
.github/workflows/tauri.yml (1)

23-25: Use npm ci instead of npm install for deterministic CI builds.

Since apps/dustfril-tauri/package-lock.json is committed, use npm ci at line 25 for reproducible dependency resolution and faster CI runs.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/tauri.yml around lines 23 - 25, In the GitHub Actions
workflow file, locate the "Install frontend deps" step that currently runs `npm
install` in the `apps/dustfril-tauri` directory. Replace the `npm install`
command with `npm ci` to ensure deterministic dependency resolution using the
committed package-lock.json file. This change will provide reproducible builds
and faster CI execution since npm ci respects the exact versions specified in
the lock file.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/tauri.yml:
- Line 13: The actions/checkout action is configured without explicit credential
handling settings, which can pose a security risk. Add the `persist-credentials:
false` parameter to the actions/checkout@v4 action to prevent git credentials
from being persisted in the environment, unless the workflow requires subsequent
git operations like pushes or authentication. This hardening measure ensures
credentials are only kept in memory when actually needed.
- Around line 13-19: The GitHub Actions workflow uses version tags (`@v4`,
`@stable`) which are mutable and expose the CI to supply-chain risks. Replace the
tag references in the three action uses statements (actions/checkout,
dtolnay/rust-toolchain, and actions/setup-node) with their corresponding full
40-character commit SHAs. Lookup the commit SHA for each tagged version and
replace the `@tag` notation with @<full-commit-sha> to pin each action to an
immutable commit reference.

In `@apps/dustfril-tauri/index.html`:
- Line 7: The title element in the HTML file uses incorrect casing for the
TypeScript library name. Locate the `<title>` tag and change "Typescript" to
"TypeScript" to match the canonical spelling of the programming language,
ensuring consistency with documentation and avoiding visible typos in the
application chrome.

In `@apps/dustfril-tauri/README.md`:
- Around line 1-3: The README.md file uses incorrect capitalization for the
programming language name. Change "Typescript" to "TypeScript" in two locations:
in the heading on the first line and in the description sentence on the third
line. The standard and canonical spelling is "TypeScript" with a capital T and
capital S, which properly reflects the official name of the language.

In `@apps/dustfril-tauri/src-tauri/capabilities/default.json`:
- Around line 6-8: In the default.json capabilities file, remove the
"opener:default" permission from the permissions array. The opener plugin is
initialized but never actually used by the application since it only relies on
the core functionality for the greet endpoint. Removing this unused permission
reduces the attack surface by following the principle of least privilege and
only granting the necessary permissions.

In `@apps/dustfril-tauri/src-tauri/tauri.conf.json`:
- Around line 20-22: The security.csp setting in the tauri.conf.json file is
currently set to null, which disables Content Security Policy entirely and
weakens XSS protection. Replace the null value with an explicit CSP policy
string that defines appropriate directives for your application's needs, such as
restricting script sources, frame ancestors, and other relevant content types to
maintain security hardening.

In `@apps/dustfril-tauri/src/App.css`:
- Around line 14-18: Remove the blank line between the background-color and
font-synthesis declarations in the CSS block at lines 14-18 of App.css.
Stylelint enforces no empty lines within declaration blocks for proper spacing.
Ensure all declarations are listed consecutively without blank lines between
them, and verify that CSS keywords and property values follow lowercase
conventions as required by your Stylelint configuration.
- Around line 89-92: The input and button selector in App.css is removing the
outline without providing a replacement focus-visible style, which breaks
keyboard navigation accessibility. Remove the outline: none property from the
input and button selector and replace it with a proper focus-visible style that
provides clear visual feedback for keyboard users when they navigate to form
elements. This ensures keyboard users can clearly see which element has focus.

In `@apps/dustfril-tauri/src/App.tsx`:
- Around line 20-27: Add the rel="noopener noreferrer" attribute to each of the
three external anchor tags in App.tsx that have target="_blank". Specifically,
update the anchor tags linking to https://vite.dev, https://tauri.app, and
https://react.dev by adding rel="noopener noreferrer" to prevent
reverse-tabnabbing vulnerabilities when opening external pages in a new tab.
- Around line 10-13: The greet() function lacks proper type safety and error
handling for the invoke call, and the function is called without awaiting it
elsewhere in the code. Add an explicit type annotation to the invoke call in the
greet() function to specify the expected response type (e.g., invoke<string>),
wrap the invoke call in a try-catch block to handle potential command failures,
and ensure that wherever greet() is invoked (check around line 36 where the form
submission likely occurs), the call is properly awaited so errors can be caught
and handled.

---

Nitpick comments:
In @.github/workflows/tauri.yml:
- Around line 23-25: In the GitHub Actions workflow file, locate the "Install
frontend deps" step that currently runs `npm install` in the
`apps/dustfril-tauri` directory. Replace the `npm install` command with `npm ci`
to ensure deterministic dependency resolution using the committed
package-lock.json file. This change will provide reproducible builds and faster
CI execution since npm ci respects the exact versions specified in the lock
file.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 3fcb8d8f-c728-4f62-8ea7-90e140fb1738

📥 Commits

Reviewing files that changed from the base of the PR and between eea1427 and a70ac8c.

⛔ Files ignored due to path filters (20)
  • Cargo.lock is excluded by !**/*.lock
  • apps/dustfril-tauri/package-lock.json is excluded by !**/package-lock.json
  • apps/dustfril-tauri/public/tauri.svg is excluded by !**/*.svg
  • apps/dustfril-tauri/public/vite.svg is excluded by !**/*.svg
  • apps/dustfril-tauri/src-tauri/icons/128x128.png is excluded by !**/*.png
  • apps/dustfril-tauri/src-tauri/icons/128x128@2x.png is excluded by !**/*.png
  • apps/dustfril-tauri/src-tauri/icons/32x32.png is excluded by !**/*.png
  • apps/dustfril-tauri/src-tauri/icons/Square107x107Logo.png is excluded by !**/*.png
  • apps/dustfril-tauri/src-tauri/icons/Square142x142Logo.png is excluded by !**/*.png
  • apps/dustfril-tauri/src-tauri/icons/Square150x150Logo.png is excluded by !**/*.png
  • apps/dustfril-tauri/src-tauri/icons/Square284x284Logo.png is excluded by !**/*.png
  • apps/dustfril-tauri/src-tauri/icons/Square30x30Logo.png is excluded by !**/*.png
  • apps/dustfril-tauri/src-tauri/icons/Square310x310Logo.png is excluded by !**/*.png
  • apps/dustfril-tauri/src-tauri/icons/Square44x44Logo.png is excluded by !**/*.png
  • apps/dustfril-tauri/src-tauri/icons/Square71x71Logo.png is excluded by !**/*.png
  • apps/dustfril-tauri/src-tauri/icons/Square89x89Logo.png is excluded by !**/*.png
  • apps/dustfril-tauri/src-tauri/icons/StoreLogo.png is excluded by !**/*.png
  • apps/dustfril-tauri/src-tauri/icons/icon.ico is excluded by !**/*.ico
  • apps/dustfril-tauri/src-tauri/icons/icon.png is excluded by !**/*.png
  • apps/dustfril-tauri/src/assets/react.svg is excluded by !**/*.svg
📒 Files selected for processing (23)
  • .github/workflows/tauri.yml
  • .gitignore
  • Cargo.toml
  • apps/dustfril-tauri/.vscode/extensions.json
  • apps/dustfril-tauri/README.md
  • apps/dustfril-tauri/index.html
  • apps/dustfril-tauri/package.json
  • apps/dustfril-tauri/src-tauri/.gitignore
  • apps/dustfril-tauri/src-tauri/Cargo.toml
  • apps/dustfril-tauri/src-tauri/build.rs
  • apps/dustfril-tauri/src-tauri/capabilities/default.json
  • apps/dustfril-tauri/src-tauri/icons/icon.icns
  • apps/dustfril-tauri/src-tauri/src/lib.rs
  • apps/dustfril-tauri/src-tauri/src/main.rs
  • apps/dustfril-tauri/src-tauri/tauri.conf.json
  • apps/dustfril-tauri/src/App.css
  • apps/dustfril-tauri/src/App.tsx
  • apps/dustfril-tauri/src/main.tsx
  • apps/dustfril-tauri/src/vite-env.d.ts
  • apps/dustfril-tauri/tsconfig.json
  • apps/dustfril-tauri/tsconfig.node.json
  • apps/dustfril-tauri/vite.config.ts
  • crates/dustfril-core/.gitignore
💤 Files with no reviewable changes (1)
  • crates/dustfril-core/.gitignore

Comment thread .github/workflows/tauri.yml
Comment on lines +13 to +19
- uses: actions/checkout@v4

- name: Install Rust
uses: dtolnay/rust-toolchain@stable

- name: Install Node
uses: actions/setup-node@v4

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify all workflow actions are SHA-pinned (40-hex)
rg -nP '^\s*-\s*uses:\s*[^@\s]+@([0-9a-f]{40}|.+\/.+@.+)$' .github/workflows/*.yml
rg -nP '^\s*-\s*uses:\s*[^@\s]+@(?![0-9a-f]{40}\b).+' .github/workflows/*.yml

Repository: FrilLab/dustfril

Length of output: 125


🏁 Script executed:

cat -n .github/workflows/tauri.yml | sed -n '10,25p'

Repository: FrilLab/dustfril

Length of output: 531


Pin GitHub Actions to full commit SHAs.

Lines 13, 16, and 19 use tag refs (@v4, @stable) instead of immutable commit SHAs. This leaves CI exposed to upstream tag retargeting/supply-chain compromise. Replace each with the full 40-character commit SHA for the corresponding version/tag.

🧰 Tools
🪛 zizmor (1.25.2)

[warning] 13-13: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[error] 13-13: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 16-16: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 19-19: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/tauri.yml around lines 13 - 19, The GitHub Actions
workflow uses version tags (`@v4`, `@stable`) which are mutable and expose the CI to
supply-chain risks. Replace the tag references in the three action uses
statements (actions/checkout, dtolnay/rust-toolchain, and actions/setup-node)
with their corresponding full 40-character commit SHAs. Lookup the commit SHA
for each tagged version and replace the `@tag` notation with @<full-commit-sha> to
pin each action to an immutable commit reference.

Source: Linters/SAST tools

<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Tauri + React + Typescript</title>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix product title casing (TypeScript).

Use the canonical spelling TypeScript in the <title> to avoid a visible typo in app chrome/docs parity.

Suggested patch
-    <title>Tauri + React + Typescript</title>
+    <title>Tauri + React + TypeScript</title>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<title>Tauri + React + Typescript</title>
<title>Tauri + React + TypeScript</title>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/dustfril-tauri/index.html` at line 7, The title element in the HTML file
uses incorrect casing for the TypeScript library name. Locate the `<title>` tag
and change "Typescript" to "TypeScript" to match the canonical spelling of the
programming language, ensuring consistency with documentation and avoiding
visible typos in the application chrome.

Comment on lines +1 to +3
# Tauri + React + Typescript

This template should help get you started developing with Tauri, React and Typescript in Vite.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use canonical “TypeScript” capitalization in docs.

Line 1 and Line 3 use “Typescript”; standard spelling is “TypeScript”.

Suggested diff
-# Tauri + React + Typescript
+# Tauri + React + TypeScript

-This template should help get you started developing with Tauri, React and Typescript in Vite.
+This template should help get you started developing with Tauri, React and TypeScript in Vite.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Tauri + React + Typescript
This template should help get you started developing with Tauri, React and Typescript in Vite.
# Tauri + React + TypeScript
This template should help get you started developing with Tauri, React and TypeScript in Vite.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/dustfril-tauri/README.md` around lines 1 - 3, The README.md file uses
incorrect capitalization for the programming language name. Change "Typescript"
to "TypeScript" in two locations: in the heading on the first line and in the
description sentence on the third line. The standard and canonical spelling is
"TypeScript" with a capital T and capital S, which properly reflects the
official name of the language.

Comment on lines +6 to +8
"permissions": [
"core:default",
"opener:default"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify whether opener is actually used anywhere before removing permission/plugin.
rg -n -C3 'tauri_plugin_opener|`@tauri-apps/plugin-opener`|open_url|opener'

Repository: FrilLab/dustfril

Length of output: 3825


🏁 Script executed:

# Search for opener plugin usage in TypeScript/JavaScript source files
rg -g '*.ts' -g '*.tsx' -g '*.js' -g '*.jsx' 'opener|open.*url|plugin.*opener' apps/dustfril-tauri/

Repository: FrilLab/dustfril

Length of output: 42


🏁 Script executed:

# Check the actual app structure and what endpoints are being invoked
rg -g '*.ts' -g '*.tsx' -g '*.js' -g '*.jsx' 'greet|invoke' apps/dustfril-tauri/

Repository: FrilLab/dustfril

Length of output: 526


Remove unused opener:default permission to enforce least privilege.

The opener plugin is initialized in lib.rs but never invoked. The application exclusively uses the greet endpoint, which relies only on core functionality. Granting the opener capability unnecessarily expands the desktop attack surface.

Suggested change
   "permissions": [
-    "core:default",
-    "opener:default"
+    "core:default"
   ]
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"permissions": [
"core:default",
"opener:default"
"permissions": [
"core:default"
]
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/dustfril-tauri/src-tauri/capabilities/default.json` around lines 6 - 8,
In the default.json capabilities file, remove the "opener:default" permission
from the permissions array. The opener plugin is initialized but never actually
used by the application since it only relies on the core functionality for the
greet endpoint. Removing this unused permission reduces the attack surface by
following the principle of least privilege and only granting the necessary
permissions.

Comment on lines +20 to +22
"security": {
"csp": null
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Avoid disabling CSP in production config.

Line 21 sets "csp": null, which disables Content Security Policy entirely for the app webview. That weakens XSS containment and plugin-surface hardening. Use an explicit CSP policy instead.

Suggested config change
   "app": {
     "windows": [
       {
         "title": "dustfril-tauri",
         "width": 800,
         "height": 600
       }
     ],
     "security": {
-      "csp": null
+      "csp": "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' asset: data:; connect-src 'self' ipc: http://ipc.localhost"
     }
   },
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"security": {
"csp": null
}
"security": {
"csp": "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' asset: data:; connect-src 'self' ipc: http://ipc.localhost"
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/dustfril-tauri/src-tauri/tauri.conf.json` around lines 20 - 22, The
security.csp setting in the tauri.conf.json file is currently set to null, which
disables Content Security Policy entirely and weakens XSS protection. Replace
the null value with an explicit CSP policy string that defines appropriate
directives for your application's needs, such as restricting script sources,
frame ancestors, and other relevant content types to maintain security
hardening.

Comment on lines +14 to +18
color: #0f0f0f;
background-color: #f6f6f6;

font-synthesis: none;
text-rendering: optimizeLegibility;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix the reported Stylelint violations in this block.

Stylelint reports declaration spacing and keyword casing issues around Line 14–18; this will fail lint-gated CI if enabled.

🧰 Tools
🪛 Stylelint (17.13.0)

[error] 14-14: Expected no empty line before declaration (declaration-empty-line-before)

(declaration-empty-line-before)


[error] 17-17: Expected no empty line before declaration (declaration-empty-line-before)

(declaration-empty-line-before)


[error] 18-18: Expected "optimizeLegibility" to be "optimizelegibility" (value-keyword-case)

(value-keyword-case)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/dustfril-tauri/src/App.css` around lines 14 - 18, Remove the blank line
between the background-color and font-synthesis declarations in the CSS block at
lines 14-18 of App.css. Stylelint enforces no empty lines within declaration
blocks for proper spacing. Ensure all declarations are listed consecutively
without blank lines between them, and verify that CSS keywords and property
values follow lowercase conventions as required by your Stylelint configuration.

Source: Linters/SAST tools

Comment on lines +89 to +92
input,
button {
outline: none;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Do not remove focus outlines without a replacement focus-visible style.

At Line 89–92, outline: none; removes keyboard focus indication, which is an accessibility blocker for form interaction.

Suggested patch
-input,
-button {
-  outline: none;
-}
+input:focus-visible,
+button:focus-visible {
+  outline: 2px solid `#396cd8`;
+  outline-offset: 2px;
+}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
input,
button {
outline: none;
}
input:focus-visible,
button:focus-visible {
outline: 2px solid `#396cd8`;
outline-offset: 2px;
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/dustfril-tauri/src/App.css` around lines 89 - 92, The input and button
selector in App.css is removing the outline without providing a replacement
focus-visible style, which breaks keyboard navigation accessibility. Remove the
outline: none property from the input and button selector and replace it with a
proper focus-visible style that provides clear visual feedback for keyboard
users when they navigate to form elements. This ensures keyboard users can
clearly see which element has focus.

Comment on lines +10 to +13
async function greet() {
// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
setGreetMsg(await invoke("greet", { name }));
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify strictness and locate invoke call sites for type-safety consistency
fd -a tsconfig.json
rg -n --type=json '"strict"\s*:\s*true|"noImplicitAny"\s*:\s*true'
rg -n --type=ts --type=tsx '\binvoke\s*\(' apps/dustfril-tauri

Repository: FrilLab/dustfril

Length of output: 216


🏁 Script executed:

# Read the App.tsx file to inspect invoke() calls at the mentioned lines
cat -n apps/dustfril-tauri/src/App.tsx | head -60

Repository: FrilLab/dustfril

Length of output: 1854


🏁 Script executed:

# Search the entire App.tsx file for all invoke() calls
cat -n apps/dustfril-tauri/src/App.tsx | grep -i "invoke"

Repository: FrilLab/dustfril

Length of output: 171


Type the Tauri invoke response and handle command failures.

At line 12, the invoke call lacks an explicit type annotation and has no error handling. Additionally, line 36 calls the async greet() function without awaiting it, which means errors won't be caught even with error handling added to greet().

Suggested patch
   async function greet() {
     // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
-    setGreetMsg(await invoke("greet", { name }));
+    try {
+      const message = await invoke<string>("greet", { name });
+      setGreetMsg(message);
+    } catch {
+      setGreetMsg("Failed to greet. Please try again.");
+    }
   }

Additionally, the form submission should await the async operation:

         onSubmit={(e) => {
           e.preventDefault();
-          greet();
+          greet().catch((err) => console.error(err));
         }}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
async function greet() {
// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
setGreetMsg(await invoke("greet", { name }));
}
async function greet() {
// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
try {
const message = await invoke<string>("greet", { name });
setGreetMsg(message);
} catch {
setGreetMsg("Failed to greet. Please try again.");
}
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/dustfril-tauri/src/App.tsx` around lines 10 - 13, The greet() function
lacks proper type safety and error handling for the invoke call, and the
function is called without awaiting it elsewhere in the code. Add an explicit
type annotation to the invoke call in the greet() function to specify the
expected response type (e.g., invoke<string>), wrap the invoke call in a
try-catch block to handle potential command failures, and ensure that wherever
greet() is invoked (check around line 36 where the form submission likely
occurs), the call is properly awaited so errors can be caught and handled.

Comment on lines +20 to +27
<a href="https://vite.dev" target="_blank">
<img src="/vite.svg" className="logo vite" alt="Vite logo" />
</a>
<a href="https://tauri.app" target="_blank">
<img src="/tauri.svg" className="logo tauri" alt="Tauri logo" />
</a>
<a href="https://react.dev" target="_blank">
<img src={reactLogo} className="logo react" alt="React logo" />

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add rel="noopener noreferrer" to external _blank links.

At Line 20, Line 23, and Line 26, opening external pages with _blank without rel allows reverse-tabnabbing.

Suggested patch
-        <a href="https://vite.dev" target="_blank">
+        <a href="https://vite.dev" target="_blank" rel="noopener noreferrer">
           <img src="/vite.svg" className="logo vite" alt="Vite logo" />
         </a>
-        <a href="https://tauri.app" target="_blank">
+        <a href="https://tauri.app" target="_blank" rel="noopener noreferrer">
           <img src="/tauri.svg" className="logo tauri" alt="Tauri logo" />
         </a>
-        <a href="https://react.dev" target="_blank">
+        <a href="https://react.dev" target="_blank" rel="noopener noreferrer">
           <img src={reactLogo} className="logo react" alt="React logo" />
         </a>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<a href="https://vite.dev" target="_blank">
<img src="/vite.svg" className="logo vite" alt="Vite logo" />
</a>
<a href="https://tauri.app" target="_blank">
<img src="/tauri.svg" className="logo tauri" alt="Tauri logo" />
</a>
<a href="https://react.dev" target="_blank">
<img src={reactLogo} className="logo react" alt="React logo" />
<a href="https://vite.dev" target="_blank" rel="noopener noreferrer">
<img src="/vite.svg" className="logo vite" alt="Vite logo" />
</a>
<a href="https://tauri.app" target="_blank" rel="noopener noreferrer">
<img src="/tauri.svg" className="logo tauri" alt="Tauri logo" />
</a>
<a href="https://react.dev" target="_blank" rel="noopener noreferrer">
<img src={reactLogo} className="logo react" alt="React logo" />
</a>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/dustfril-tauri/src/App.tsx` around lines 20 - 27, Add the rel="noopener
noreferrer" attribute to each of the three external anchor tags in App.tsx that
have target="_blank". Specifically, update the anchor tags linking to
https://vite.dev, https://tauri.app, and https://react.dev by adding
rel="noopener noreferrer" to prevent reverse-tabnabbing vulnerabilities when
opening external pages in a new tab.

@mors119 mors119 merged commit 717c040 into FrilLab:main Jun 19, 2026
3 checks passed
@mors119 mors119 deleted the feature/create-tauri branch June 19, 2026 10:04
Sign up for free to 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.

1 participant