diff --git a/examples/apps/screenpipe-app-tauri/components/screenpipe-status.tsx b/examples/apps/screenpipe-app-tauri/components/screenpipe-status.tsx
index 75e23fc0..ea048b66 100644
--- a/examples/apps/screenpipe-app-tauri/components/screenpipe-status.tsx
+++ b/examples/apps/screenpipe-app-tauri/components/screenpipe-status.tsx
@@ -26,6 +26,7 @@ import { Separator } from "./ui/separator";
import { Card, CardContent, CardFooter } from "./ui/card";
import { useHealthCheck } from "@/lib/hooks/use-health-check";
import { DevSettings } from "./dev-dialog";
+import { Lock } from "lucide-react";
const getDebuggingCommands = (os: string | null) => {
let cliInstructions = "";
@@ -317,18 +318,44 @@ const DevModeSettings = () => {
);
};
-interface HealthCheckResponse {
- status: string;
- last_frame_timestamp: string | null;
- last_audio_timestamp: string | null;
- frame_status: string;
- audio_status: string;
- message: string;
-}
-
const HealthStatus = ({ className }: { className?: string }) => {
const { health } = useHealthCheck();
const [isDialogOpen, setIsDialogOpen] = useState(false);
+ const [isMac, setIsMac] = useState(false);
+
+ useEffect(() => {
+ setIsMac(platform() === "macos");
+ }, []);
+
+ const handleResetScreenPermissions = async () => {
+ const toastId = toast({
+ title: "opening permissions",
+ description: "please wait...",
+ duration: Infinity,
+ });
+
+ try {
+ await invoke("open_screen_capture_preferences");
+ await new Promise((resolve) => setTimeout(resolve, 2000));
+
+ toastId.update({
+ id: toastId.id,
+ title: "permissions reset",
+ description:
+ "screen capture permissions have been reset. please restart the app.",
+ duration: 5000,
+ });
+ } catch (error) {
+ console.error("failed to reset screen permissions:", error);
+ toastId.update({
+ id: toastId.id,
+ title: "error",
+ description: "failed to reset screen permissions.",
+ variant: "destructive",
+ duration: 3000,
+ });
+ }
+ };
const getStatusColor = (status: string) => {
switch (status) {
@@ -395,8 +422,8 @@ const HealthStatus = ({ className }: { className?: string }) => {
last audio: {formatTimestamp(health.last_audio_timestamp)}
-
-
troubleshooting Instructions:
+
+
troubleshooting instructions:
{`if you're experiencing issues, please try the following steps:
1. restart screenpipe
@@ -404,6 +431,28 @@ const HealthStatus = ({ className }: { className?: string }) => {
3. if the problem persists, please contact support at [louis@screenpi.pe](mailto:louis@screenpi.pe) or @louis030195 on Discord, X, or LinkedIn
4. last, here are some [FAQ](https://github.com/mediar-ai/screenpipe/blob/main/content/docs/NOTES.md) with visuals to help you troubleshoot`}
+ {isMac && (
+
+
+
+
+
+
+ open permissions
+
+
+
+ open screen capture permissions
+
+
+
+
+ )}
diff --git a/examples/apps/screenpipe-app-tauri/src-tauri/src/commands.rs b/examples/apps/screenpipe-app-tauri/src-tauri/src/commands.rs
new file mode 100644
index 00000000..f367b03f
--- /dev/null
+++ b/examples/apps/screenpipe-app-tauri/src-tauri/src/commands.rs
@@ -0,0 +1,45 @@
+
+// #[tauri::command]
+// pub fn has_screen_capture_access() -> bool {
+// scap::has_permission()
+// }
+
+#[tauri::command]
+pub fn open_screen_capture_preferences() {
+ #[cfg(target_os = "macos")]
+ std::process::Command::new("open")
+ .arg("x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture")
+ .spawn()
+ .expect("failed to open system preferences");
+}
+
+#[tauri::command]
+pub fn open_mic_preferences() {
+ #[cfg(target_os = "macos")]
+ std::process::Command::new("open")
+ .arg("x-apple.systempreferences:com.apple.preference.security?Privacy_Microphone")
+ .spawn()
+ .expect("failed to open system preferences");
+}
+
+#[tauri::command]
+pub fn reset_screen_permissions() {
+ #[cfg(target_os = "macos")]
+ std::process::Command::new("tccutil")
+ .arg("reset")
+ .arg("ScreenCapture")
+ .arg("so.cap.desktop")
+ .spawn()
+ .expect("failed to reset screen permissions");
+}
+
+#[tauri::command]
+pub fn reset_microphone_permissions() {
+ #[cfg(target_os = "macos")]
+ std::process::Command::new("tccutil")
+ .arg("reset")
+ .arg("Microphone")
+ .arg("so.cap.desktop")
+ .spawn()
+ .expect("failed to reset microphone permissions");
+}
diff --git a/examples/apps/screenpipe-app-tauri/src-tauri/src/main.rs b/examples/apps/screenpipe-app-tauri/src-tauri/src/main.rs
index 919686fb..7a6b5ba5 100755
--- a/examples/apps/screenpipe-app-tauri/src-tauri/src/main.rs
+++ b/examples/apps/screenpipe-app-tauri/src-tauri/src/main.rs
@@ -35,6 +35,10 @@ mod analytics;
use crate::analytics::start_analytics;
+mod commands;
+
+pub use commands::reset_screen_permissions;
+pub use commands::open_screen_capture_preferences;
struct SidecarState(Arc
>>);
#[tauri::command]
@@ -351,6 +355,8 @@ async fn main() {
.invoke_handler(tauri::generate_handler![
spawn_screenpipe,
kill_all_sreenpipes,
+ reset_screen_permissions,
+ open_screen_capture_preferences,
])
.setup(|app| {
// Logging setup