Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ testem.log
/typings
__screenshots__/

# Microsoft Store listing
/store-listing/

# System files
.DS_Store
Thumbs.db
Expand Down
89 changes: 89 additions & 0 deletions PRIVACY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# Politique de confidentialité — Markify

_Dernière mise à jour : 14 août 2026_

Markify est un éditeur Markdown de bureau. Votre vie privée est simple : **Markify ne collecte aucune donnée personnelle.**

## Données collectées

- **Aucune** donnée personnelle n'est collectée, traitée ou transmise.
- Aucun compte utilisateur, aucune inscription.
- Aucune télémétrie, aucun suivi (tracking), aucun cookie.

## Données locales

- Les documents que vous ouvrez, éditez, enregistrez et exportez restent **uniquement sur votre appareil**.
- Markify ne communique jamais le contenu de vos documents à un serveur.
- L'export PDF est généré localement sur votre appareil.

## Préférences

- Votre langue d'interface et votre thème (clair/sombre) sont enregistrés localement sur votre appareil (stockage local de l'application). Ils ne sont jamais transmis à l'extérieur.

## Fonctionnalités locales

- Le presse-papiers est utilisé uniquement pour vos opérations Couper/Copier/Coller.
- Les polices système sont lues localement pour le rendu de l'éditeur et des exports PDF.

## Liens externes

- La boîte **À propos** contient un lien vers le profil GitHub de l'éditeur. Cliquer sur ce lien ouvre votre navigateur ; ce site est soumis à sa propre politique de confidentialité (GitHub).
- Markify n'intègre aucun service publicitaire ni contenu tiers.

## Partage de données

- Aucune donnée n'est partagée, vendue, louée ni transférée à des tiers, pour quelque finalité que ce soit.

## Sécurité

- Comme aucune donnée ne quitte votre appareil, il n'existe aucune donnée à sécuriser côté serveur.

## Contact

Pour toute question relative à cette politique de confidentialité : https://github.com/Martzcode

---

# Privacy Policy — Markify

_Last updated: August 14, 2026_

Markify is a desktop Markdown editor. Your privacy is simple: **Markify collects no personal data.**

## Data collection

- **No** personal data is collected, processed, or transmitted.
- No user account, no sign-up.
- No telemetry, no tracking, no cookies.

## Local data

- The documents you open, edit, save, and export remain **on your device only**.
- Markify never sends your document content to any server.
- PDF export is generated locally on your device.

## Preferences

- Your interface language and theme (light/dark) are stored locally on your device (application local storage). They are never transmitted anywhere.

## Local features

- The clipboard is used only for your Cut/Copy/Paste operations.
- System fonts are read locally for the editor rendering and PDF exports.

## External links

- The **About** dialog contains a link to the developer's GitHub profile. Clicking it opens your browser; that website is governed by its own privacy policy (GitHub).
- Markify embeds no advertising or third-party content.

## Data sharing

- No data is shared, sold, rented, or transferred to third parties, for any purpose.

## Security

- Since no data leaves your device, there is no data to secure on a server side.

## Contact

For any question regarding this privacy policy: https://github.com/Martzcode
2 changes: 2 additions & 0 deletions src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,7 @@ tauri-plugin-opener = "2.5.4"

[target.'cfg(target_os = "linux")'.dependencies]
gtk = "0.18"
gobject-sys = "0.18"

[target.'cfg(target_os = "windows")'.dependencies]
webview2-com = "0.38"
51 changes: 51 additions & 0 deletions src-tauri/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,8 @@ pub fn run() {
read_system_fonts
])
.setup(|app| {
#[cfg(any(target_os = "linux", target_os = "windows"))]
disable_pinch_zoom(app);
if cfg!(debug_assertions) {
app.handle().plugin(
tauri_plugin_log::Builder::default()
Expand All @@ -504,3 +506,52 @@ pub fn run() {
.run(context)
.expect("error while running tauri application");
}

// On Linux, the pinch-to-zoom gesture is handled natively by WebKitGTK (it
// never reaches the web content, so CSS/JS cannot block it). WebKit stores
// its internal zoom gesture (a GtkGestureZoom) on the WebView widget under
// the "wk-view-zoom-gesture" qdata; destroying its signal handlers disables
// the gesture. See WebKitWebViewBase.cpp in the WebKit source.
#[cfg(target_os = "linux")]
fn disable_pinch_zoom(app: &tauri::App) {
use tauri::Manager;

let Some(window) = app.get_webview_window("main") else {
return;
};
window
.with_webview(|webview| {
use gtk::glib::prelude::*;
unsafe {
if let Some(gesture) = webview.inner().data::<gobject_sys::GObject>("wk-view-zoom-gesture") {
gobject_sys::g_signal_handlers_destroy(gesture.as_ptr());
}
}
})
.expect("failed to disable pinch zoom");
}

// On Windows, pinch-to-zoom is handled natively by WebView2 (Chromium) and
// does not always reach the web content. Disable it through the WebView2
// settings, falling back to the web-side guards (CSS/JS) if the runtime is
// too old to expose ICoreWebView2Settings5.
#[cfg(target_os = "windows")]
fn disable_pinch_zoom(app: &tauri::App) {
use tauri::Manager;
use webview2_com::Microsoft::Web::WebView2::Win32::ICoreWebView2Settings5;

let Some(window) = app.get_webview_window("main") else {
return;
};
window
.with_webview(|webview| unsafe {
if let Ok(core) = webview.controller().CoreWebView2() {
if let Ok(settings) = core.Settings() {
if let Ok(settings5) = settings.cast::<ICoreWebView2Settings5>() {
let _ = settings5.SetIsPinchZoomEnabled(false);
}
}
}
})
.expect("failed to disable pinch zoom");
}
20 changes: 19 additions & 1 deletion src/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,29 @@
<meta charset="utf-8">
<title>Markify</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<script>
document.documentElement.dataset.theme = matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
</script>
<script>
(() => {
for (const type of ['gesturestart', 'gesturechange']) {
document.addEventListener(type, (event) => event.preventDefault());
}
for (const type of ['touchstart', 'touchmove']) {
document.addEventListener(
type,
(event) => {
if (event.touches.length > 1) {
event.preventDefault();
}
},
{ passive: false },
);
}
})();
</script>
</head>
<body>
<app-root></app-root>
Expand Down
1 change: 1 addition & 0 deletions src/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,5 @@ body {
padding: 0;
height: 100%;
overflow: hidden;
touch-action: none;
}
Loading