Skip to content
Open
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
Empty file added.nojekyll
Empty file.
5 changes: 5 additions & 0 deletions categories/index.html
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Categories · TaskWarrior Mobile</title><meta name=description content="The cross-platform TaskWarrior mobile app by CCExtractor — offline-first task management with native TaskChampion sync."><link rel=stylesheet href=/taskwarrior-flutter/css/style.css></head><body><header class=site-header><a class=brand href=/>TaskWarrior <span>Mobile</span></a><nav><a href=/taskwarrior-flutter/>Home</a>
<a href=/taskwarrior-flutter/features/>Features</a>
<a href=/taskwarrior-flutter/downloads/>Downloads</a>
<a href=/taskwarrior-flutter/docs/>Docs</a>
<a href=https://github.com/CCExtractor/taskwarrior-flutter rel=noopener>GitHub</a></nav></header><main class=content><article class=page><h1>Categories</h1></article></main><footer class=site-footer><p>TaskWarrior Mobile · maintained by <a href=https://ccextractor.org/ rel=noopener>CCExtractor</a> · built with Hugo</p></footer></body></html>
1 change: 1 addition & 0 deletions categories/index.xml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Categories on TaskWarrior Mobile</title><link>https://ccextractor.github.io/taskwarrior-flutter/categories/</link><description>Recent content in Categories on TaskWarrior Mobile</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://ccextractor.github.io/taskwarrior-flutter/categories/index.xml" rel="self" type="application/rss+xml"/></channel></rss>
165 changes: 165 additions & 0 deletions css/style.css
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
:root {
--bg: #0f1419;
--surface: #171d26;
--text: #e6e9ee;
--muted: #9aa4b2;
--accent: #7c5cff;
--accent-2: #4dd0e1;
--border: #263041;
--ok: #3fb950;
--fail: #f85149;
--radius: 12px;
--maxw: 900px;
}

* { box-sizing: border-box; }

html { -webkit-text-size-adjust: 100%; }

body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
background: var(--bg);
color: var(--text);
line-height: 1.6;
}

a { color: var(--accent-2); text-decoration: none; }
a:hover { text-decoration: underline; }

code {
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
background: var(--surface);
border: 1px solid var(--border);
border-radius: 6px;
padding: 0.1em 0.4em;
font-size: 0.9em;
}

/* Header */
.site-header {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 1rem;
padding: 1rem 1.5rem;
border-bottom: 1px solid var(--border);
background: var(--surface);
}
.brand { font-weight: 700; font-size: 1.15rem; color: var(--text); }
.brand span { color: var(--accent); }
.site-header nav { display: flex; flex-wrap: wrap; gap: 1.1rem; }
.site-header nav a { color: var(--muted); font-weight: 500; }
.site-header nav a:hover { color: var(--text); text-decoration: none; }

/* Layout */
.content { max-width: var(--maxw); margin: 0 auto; padding: 2.5rem 1.5rem 4rem; }

/* Hero */
.hero { text-align: center; padding: 2rem 0 1rem; }
.hero h1 { font-size: clamp(2rem, 6vw, 3rem); margin: 0 0 0.5rem; }
.tagline { color: var(--muted); font-size: 1.15rem; max-width: 640px; margin: 0 auto 1.5rem; }
.cta { display: flex; gap: 0.75rem; justify-content: center; flex-wrap: wrap; }

.button {
display: inline-block;
background: var(--accent);
color: #fff;
padding: 0.7rem 1.4rem;
border-radius: var(--radius);
font-weight: 600;
}
.button:hover { filter: brightness(1.1); text-decoration: none; }
.button-ghost { background: transparent; color: var(--text); border: 1px solid var(--border); }

/* Features */
.features {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 1rem;
margin: 2.5rem 0;
}
.feature {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 1.25rem;
}
.feature h3 { margin: 0 0 0.4rem; color: var(--accent-2); }
.feature p { margin: 0; color: var(--muted); }

/* Pages */
.page h1 { border-bottom: 1px solid var(--border); padding-bottom: 0.5rem; }
.page h2 { margin-top: 2rem; }
.page-list { padding-left: 1.2rem; }

/* Content tables (markdown) */
.page table {
width: 100%;
border-collapse: collapse;
margin: 1.25rem 0;
font-size: 0.95rem;
}
.page th, .page td {
text-align: left;
padding: 0.55rem 0.7rem;
border-bottom: 1px solid var(--border);
vertical-align: top;
}
.page th { color: var(--muted); font-weight: 600; }
.page thead tr { border-bottom: 2px solid var(--border); }

/* Code blocks */
.page pre {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 1rem;
overflow-x: auto;
}
.page pre code { background: none; border: none; padding: 0; }
.page blockquote {
margin: 1.25rem 0;
padding: 0.25rem 1rem;
border-left: 3px solid var(--accent);
color: var(--muted);
}

/* Nightly build table */
.table-scroll { overflow-x: auto; }
.nightly-builds table {
width: 100%;
border-collapse: collapse;
margin: 1rem 0;
font-size: 0.92rem;
}
.nightly-builds th, .nightly-builds td {
text-align: left;
padding: 0.55rem 0.7rem;
border-bottom: 1px solid var(--border);
vertical-align: top;
}
.nightly-builds th { color: var(--muted); font-weight: 600; }
.nowrap { white-space: nowrap; }
.empty { color: var(--muted); font-style: italic; }

.status {
display: inline-block;
padding: 0.1em 0.6em;
border-radius: 999px;
font-size: 0.8em;
font-weight: 600;
text-transform: capitalize;
}
.status-success { background: rgba(63,185,80,0.15); color: var(--ok); }
.status-failure { background: rgba(248,81,73,0.15); color: var(--fail); }

/* Footer */
.site-footer {
border-top: 1px solid var(--border);
padding: 1.5rem;
text-align: center;
color: var(--muted);
font-size: 0.9rem;
}
23 changes: 23 additions & 0 deletions docs/architecture/index.html
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Architecture · TaskWarrior Mobile</title><meta name=description content="How TaskWarrior Mobile is built — Flutter UI over a native Rust core."><link rel=stylesheet href=/taskwarrior-flutter/css/style.css></head><body><header class=site-header><a class=brand href=/>TaskWarrior <span>Mobile</span></a><nav><a href=/taskwarrior-flutter/>Home</a>
<a href=/taskwarrior-flutter/features/>Features</a>
<a href=/taskwarrior-flutter/downloads/>Downloads</a>
<a href=/taskwarrior-flutter/docs/>Docs</a>
<a href=https://github.com/CCExtractor/taskwarrior-flutter rel=noopener>GitHub</a></nav></header><main class=content><article class=page><h1>Architecture</h1><p>TaskWarrior Mobile is a Flutter app sitting on top of a native Rust core, so the same
task engine that powers TaskWarrior on the desktop runs unchanged on your phone.</p><h2 id=layers>Layers</h2><ul><li><strong>UI — Flutter (Dart).</strong> Screens, navigation, and state management use
<a href=https://pub.dev/packages/get>GetX</a>. This layer never talks to the network for task
data; it reads and writes through the core.</li><li><strong>Core — Rust (<code>tc_helper</code>).</strong> A thin wrapper around
<a href=https://github.com/GothenburgBitFactory/taskchampion>TaskChampion</a> exposed to Dart
through <a href=https://github.com/fzyzcjy/flutter_rust_bridge><code>flutter_rust_bridge</code></a>. It
owns task storage, mutations, and sync.</li><li><strong>Storage & sync — TaskChampion.</strong> Tasks live in a local replica on the device.
Syncing reconciles that replica with a TaskChampion sync server; there is no
bespoke HTTP API in between.</li></ul><h2 id=offline-first-data-flow>Offline-first data flow</h2><pre tabindex=0><code>tap &#34;complete&#34; ─▶ Flutter ─▶ Rust FFI ─▶ local replica (instant, no network)
(later, when online)
TaskChampion sync server
</code></pre><p>Every create, edit, and complete is committed to the local replica synchronously, so the
UI never waits on the network. Synchronisation is a separate, best-effort step that runs
when connectivity is available.</p><h2 id=why-a-rust-core>Why a Rust core?</h2><p>Reusing TaskChampion means the mobile app shares TaskWarrior&rsquo;s battle-tested task model —
recurrence, dependencies, annotations, tags, and the sync protocol — instead of
reimplementing them. The Rust bridge surfaces those capabilities to the Flutter UI with a
small, typed FFI surface.</p></article></main><footer class=site-footer><p>TaskWarrior Mobile · maintained by <a href=https://ccextractor.org/ rel=noopener>CCExtractor</a> · built with Hugo</p></footer></body></html>
15 changes: 15 additions & 0 deletions docs/faq/index.html
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>FAQ · TaskWarrior Mobile</title><meta name=description content="Frequently asked questions about TaskWarrior Mobile."><link rel=stylesheet href=/taskwarrior-flutter/css/style.css></head><body><header class=site-header><a class=brand href=/>TaskWarrior <span>Mobile</span></a><nav><a href=/taskwarrior-flutter/>Home</a>
<a href=/taskwarrior-flutter/features/>Features</a>
<a href=/taskwarrior-flutter/downloads/>Downloads</a>
<a href=/taskwarrior-flutter/docs/>Docs</a>
<a href=https://github.com/CCExtractor/taskwarrior-flutter rel=noopener>GitHub</a></nav></header><main class=content><article class=page><h1>FAQ</h1><h2 id=do-i-need-a-sync-server-to-use-the-app>Do I need a sync server to use the app?</h2><p>No. TaskWarrior Mobile is fully usable offline — tasks are stored in a local replica on
your device. A sync server is only needed if you want your tasks mirrored to another
device or backed up remotely.</p><h2 id=is-my-data-encrypted>Is my data encrypted?</h2><p>Yes. When you sync, your tasks are encrypted locally with your encryption secret before
being uploaded. The server stores only ciphertext; only clients that hold the secret can
read your tasks.</p><h2 id=which-platforms-are-supported>Which platforms are supported?</h2><p>The app targets Android, iOS, Windows, macOS, and Linux from a single Flutter codebase.
Android builds are published as APKs on the <a href=../../downloads/>downloads page</a>.</p><h2 id=does-it-work-with-my-existing-taskwarrior-setup>Does it work with my existing TaskWarrior setup?</h2><p>If your TaskWarrior 3.x desktop syncs through a TaskChampion sync server, point the app at
the same server, client ID, and encryption secret and your tasks will sync between them.
See <a href=../sync-setup/>setting up sync</a>.</p><h2 id=whats-the-difference-between-stable-and-nightly-builds>What&rsquo;s the difference between stable and nightly builds?</h2><p>Stable builds are tagged releases meant for everyday use. Nightly builds are automatic
snapshots of the <code>main</code> branch — useful for trying the latest changes, but less tested.</p><h2 id=where-do-i-report-a-bug-or-request-a-feature>Where do I report a bug or request a feature?</h2><p>Open an issue on the
<a href=https://github.com/CCExtractor/taskwarrior-flutter/issues>GitHub repository</a>. Pull
requests are welcome too — see the <a href=../../docs/#contributing>contributing notes</a>.</p></article></main><footer class=site-footer><p>TaskWarrior Mobile · maintained by <a href=https://ccextractor.org/ rel=noopener>CCExtractor</a> · built with Hugo</p></footer></body></html>
7 changes: 7 additions & 0 deletions docs/getting-started/index.html
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Getting started · TaskWarrior Mobile</title><meta name=description content="Install TaskWarrior Mobile and create your first task."><link rel=stylesheet href=/taskwarrior-flutter/css/style.css></head><body><header class=site-header><a class=brand href=/>TaskWarrior <span>Mobile</span></a><nav><a href=/taskwarrior-flutter/>Home</a>
<a href=/taskwarrior-flutter/features/>Features</a>
<a href=/taskwarrior-flutter/downloads/>Downloads</a>
<a href=/taskwarrior-flutter/docs/>Docs</a>
<a href=https://github.com/CCExtractor/taskwarrior-flutter rel=noopener>GitHub</a></nav></header><main class=content><article class=page><h1>Getting started</h1><h2 id=install-the-app>Install the app</h2><p>Grab a build from the <a href=../../downloads/>downloads page</a>:</p><ul><li><strong>Stable</strong> — the latest signed APK from the GitHub <a href=https://github.com/CCExtractor/taskwarrior-flutter/releases>releases page</a>.</li><li><strong>Nightly</strong> — an automatically-built snapshot from the <code>main</code> branch, for testing the newest changes.</li></ul><p>On Android you may need to allow installation from your browser or file manager the
first time you sideload an APK.</p><h2 id=create-your-first-task>Create your first task</h2><ol><li>Open the app — you land on the task list.</li><li>Tap the <strong>+</strong> button.</li><li>Give the task a description, and optionally a project, tags, priority, and due date.</li><li>Save. The task is written to the local database immediately — no network required.</li></ol><p>Everything you do works fully offline. Sync is optional and layered on top; set it up
whenever you want your tasks mirrored to a server or another device.</p><h2 id=next-steps>Next steps</h2><ul><li><a href=../sync-setup/>Set up sync</a> with a TaskChampion server.</li><li>Learn how the app is <a href=../architecture/>put together</a>.</li><li>Browse the <a href=../faq/>FAQ</a> for common questions.</li></ul></article></main><footer class=site-footer><p>TaskWarrior Mobile · maintained by <a href=https://ccextractor.org/ rel=noopener>CCExtractor</a> · built with Hugo</p></footer></body></html>
11 changes: 11 additions & 0 deletions docs/index.html
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Documentation · TaskWarrior Mobile</title><meta name=description content="Developer and user documentation for TaskWarrior Mobile."><link rel=stylesheet href=/taskwarrior-flutter/css/style.css></head><body><header class=site-header><a class=brand href=/>TaskWarrior <span>Mobile</span></a><nav><a href=/taskwarrior-flutter/>Home</a>
<a href=/taskwarrior-flutter/features/>Features</a>
<a href=/taskwarrior-flutter/downloads/>Downloads</a>
<a href=/taskwarrior-flutter/docs/>Docs</a>
<a href=https://github.com/CCExtractor/taskwarrior-flutter rel=noopener>GitHub</a></nav></header><main class=content><article class=page><h1>Documentation</h1><p>Documentation for TaskWarrior Mobile — a living set of guides that grows alongside the
app. New here? Start with <a href=getting-started/>Getting started</a>, then
<a href=sync-setup/>set up sync</a> when you are ready to connect a server. Curious how it all
fits together? See the <a href=architecture/>architecture overview</a>.</p><h2 id=contributing>Contributing</h2><p>Contributions are welcome. Start with the
<a href=https://github.com/CCExtractor/taskwarrior-flutter/blob/main/CONTRIBUTING.md>CONTRIBUTING guide</a>
in the repository, and join the <a href=https://ccextractor.org/>CCExtractor community</a> on Slack
or Zulip.</p><h2 id=guides>Guides</h2><ul class=page-list><li><a href=/taskwarrior-flutter/docs/getting-started/>Getting started</a></li><li><a href=/taskwarrior-flutter/docs/sync-setup/>Setting up sync</a></li><li><a href=/taskwarrior-flutter/docs/architecture/>Architecture</a></li><li><a href=/taskwarrior-flutter/docs/faq/>FAQ</a></li></ul></article></main><footer class=site-footer><p>TaskWarrior Mobile · maintained by <a href=https://ccextractor.org/ rel=noopener>CCExtractor</a> · built with Hugo</p></footer></body></html>
Loading