Repository files navigation

TaskTrail Mobile — Flutter companion client on the same live TaskTrail backend

Live Web App · Live API · Main Repo · Android APK

Architecture · Product surfaces · Run the app · Validation & release · Documentation


TaskTrail Mobile is the Flutter companion to the TaskTrail web app. It is not a mock or a prototype — it runs against the same production backend at api.tasktrail.site, uses the same team and task model, and enforces the same auth and role rules. The mobile UI is built from scratch for touch; the rules come from the server.

How it fits

SurfaceLinkRole
Web apptasktrail.siteReference product surface
Shared APIapi.tasktrail.siteThe exact backend both clients call
Main repocloud-computing-projectBackend, web, deployment, infra docs
Android releaseTaskTrail-android-arm64-release.apkInstallable APK kept in-repo

Architecture

TaskTrail Mobile architecture — presentation widgets, controllers, repositories, ApiClient, and the shared backend

The mobile app follows a clean Widgets → Controllers → Repositories → ApiClient layering. Widgets stay presentational, controllers hold state, repositories own data access, and a single TaskTrailApiClient wraps dio so the base URL, headers, and session tokens live in one place. No business logic lives in widgets; the backend stays the source of truth.

Product flow

flowchart LR
Auth["Sign in / restore session"] --> Role{"Role-aware shell"}
Role --> Employee["Employee<br/>Tasks · Calendar · Teams · Join · Profile"]
Role --> Manager["Manager<br/>Dashboard · Tracker · Tasks · Teams · Profile"]
Employee --> Execute["Join teams · update work · complete tasks"]
Manager --> Oversight["Assign · manage teams · monitor execution"]
Loading

The shell reads the role off the authenticated user and switches between employee and manager tab sets. Both use the same session model and the same API contracts.

Product surfaces

RoleMobile surfaces
EmployeeJoin · Tasks · Calendar · Teams · Profile
ManagerDashboard · Worker Tracker · Tasks · Teams · Recurring · Profile

The UI uses bottom sheets, compact lists, and tab persistence instead of desktop-style pages.

Engineering profile

ConcernChoice
FrameworkFlutter
LanguageDart 3
Navigationgo_router with role-aware shell routes
Networkingdio via a single TaskTrailApiClient
Secure persistenceflutter_secure_storage
UI directionCalm, mobile-first, iOS-esque shell/theme
Validationflutter test + integration_test + emulator runs

Repository layout

tasktrail-mobile/
├── lib/src/
│ ├── app/ # bootstrap + router
│ ├── core/ # config, API client, storage, theme, models
│ ├── features/ # auth, dashboard, tracker, tasks, teams, join, calendar, profile
│ └── shared/ # shell, tab bar, reusable mobile surfaces
├── test/ # unit + widget tests
├── integration_test/ # end-to-end mobile flows
├── apk/ # Android release artifact
├── docs/
│ ├── assets/ # README visuals
│ ├── README.md
│ └── ARCHITECTURE.md
├── android/ ios/
└── README.md

Run the app

Install dependencies

flutter pub get

Android emulator against local backend

flutter run -d emulator-5554 \
--dart-define=TASKTRAIL_ENV=development \
--dart-define=TASKTRAIL_API_BASE_URL=http://10.0.2.2:4000/api/v1

Android emulator against live backend

flutter run -d emulator-5554 \
--dart-define=TASKTRAIL_ENV=production

Environment defaults:

  • developmenthttp://10.0.2.2:4000/api/v1
  • productionhttps://api.tasktrail.site/api/v1
  • TASKTRAIL_API_BASE_URL overrides both

Validation & release

flutter analyze
flutter test

Release build:

flutter build apk --release --dart-define=TASKTRAIL_ENV=production

The latest Android artifact lives at apk/TaskTrail-android-arm64-release.apk. For proper long-term release signing, copy android/key.properties.example to android/key.properties and point it at a real keystore.

What is particularly strong here

  • Same backend, same rules. No separate mock data path, no parallel product logic.
  • Role-aware shell. Manager and employee flows feel different while sharing the same session.
  • Persistent session. Login survives app relaunch through flutter_secure_storage.
  • Touch-first UI. Bottom sheets, compact lists, and tab persistence — not a desktop port.
  • Real validation. Module-by-module emulator testing was used throughout development.

Documentation

For backend, web, and deployment context, use the main repo: blank-space-gsu/cloud-computing-project.

Known limitations

  • Mobile deep-link handling is still limited.
  • Recurring-rule edit / pause / resume is not built yet.
  • Manager task edit/reassign deserves deeper end-to-end mobile coverage.
  • Android store-grade signing is not finalized in-repo.
  • The app is production-usable, but there is still room for polish in notifications, offline handling, and richer activity history.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

TaskTrail Mobile — Flutter companion client on the same live TaskTrail backend

Live Web App · Live API · Main Repo · Android APK

Architecture · Product surfaces · Run the app · Validation & release · Documentation


TaskTrail Mobile is the Flutter companion to the TaskTrail web app. It is not a mock or a prototype — it runs against the same production backend at api.tasktrail.site, uses the same team and task model, and enforces the same auth and role rules. The mobile UI is built from scratch for touch; the rules come from the server.

How it fits

SurfaceLinkRole
Web apptasktrail.siteReference product surface
Shared APIapi.tasktrail.siteThe exact backend both clients call
Main repocloud-computing-projectBackend, web, deployment, infra docs
Android releaseTaskTrail-android-arm64-release.apkInstallable APK kept in-repo

Architecture

TaskTrail Mobile architecture — presentation widgets, controllers, repositories, ApiClient, and the shared backend

The mobile app follows a clean Widgets → Controllers → Repositories → ApiClient layering. Widgets stay presentational, controllers hold state, repositories own data access, and a single TaskTrailApiClient wraps dio so the base URL, headers, and session tokens live in one place. No business logic lives in widgets; the backend stays the source of truth.

Product flow

flowchart LR
Auth["Sign in / restore session"] --> Role{"Role-aware shell"}
Role --> Employee["Employee<br/>Tasks · Calendar · Teams · Join · Profile"]
Role --> Manager["Manager<br/>Dashboard · Tracker · Tasks · Teams · Profile"]
Employee --> Execute["Join teams · update work · complete tasks"]
Manager --> Oversight["Assign · manage teams · monitor execution"]
Loading

The shell reads the role off the authenticated user and switches between employee and manager tab sets. Both use the same session model and the same API contracts.

Product surfaces

RoleMobile surfaces
EmployeeJoin · Tasks · Calendar · Teams · Profile
ManagerDashboard · Worker Tracker · Tasks · Teams · Recurring · Profile

The UI uses bottom sheets, compact lists, and tab persistence instead of desktop-style pages.

Engineering profile

ConcernChoice
FrameworkFlutter
LanguageDart 3
Navigationgo_router with role-aware shell routes
Networkingdio via a single TaskTrailApiClient
Secure persistenceflutter_secure_storage
UI directionCalm, mobile-first, iOS-esque shell/theme
Validationflutter test + integration_test + emulator runs

Repository layout

tasktrail-mobile/
├── lib/src/
│ ├── app/ # bootstrap + router
│ ├── core/ # config, API client, storage, theme, models
│ ├── features/ # auth, dashboard, tracker, tasks, teams, join, calendar, profile
│ └── shared/ # shell, tab bar, reusable mobile surfaces
├── test/ # unit + widget tests
├── integration_test/ # end-to-end mobile flows
├── apk/ # Android release artifact
├── docs/
│ ├── assets/ # README visuals
│ ├── README.md
│ └── ARCHITECTURE.md
├── android/ ios/
└── README.md

Run the app

Install dependencies

flutter pub get

Android emulator against local backend

flutter run -d emulator-5554 \
--dart-define=TASKTRAIL_ENV=development \
--dart-define=TASKTRAIL_API_BASE_URL=http://10.0.2.2:4000/api/v1

Android emulator against live backend

flutter run -d emulator-5554 \
--dart-define=TASKTRAIL_ENV=production

Environment defaults:

  • developmenthttp://10.0.2.2:4000/api/v1
  • productionhttps://api.tasktrail.site/api/v1
  • TASKTRAIL_API_BASE_URL overrides both

Validation & release

flutter analyze
flutter test

Release build:

flutter build apk --release --dart-define=TASKTRAIL_ENV=production

The latest Android artifact lives at apk/TaskTrail-android-arm64-release.apk. For proper long-term release signing, copy android/key.properties.example to android/key.properties and point it at a real keystore.

What is particularly strong here

  • Same backend, same rules. No separate mock data path, no parallel product logic.
  • Role-aware shell. Manager and employee flows feel different while sharing the same session.
  • Persistent session. Login survives app relaunch through flutter_secure_storage.
  • Touch-first UI. Bottom sheets, compact lists, and tab persistence — not a desktop port.
  • Real validation. Module-by-module emulator testing was used throughout development.

Documentation

For backend, web, and deployment context, use the main repo: blank-space-gsu/cloud-computing-project.

Known limitations

  • Mobile deep-link handling is still limited.
  • Recurring-rule edit / pause / resume is not built yet.
  • Manager task edit/reassign deserves deeper end-to-end mobile coverage.
  • Android store-grade signing is not finalized in-repo.
  • The app is production-usable, but there is still room for polish in notifications, offline handling, and richer activity history.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

TaskTrail Mobile — Flutter companion client on the same live TaskTrail backend

Live Web App · Live API · Main Repo · Android APK

Architecture · Product surfaces · Run the app · Validation & release · Documentation


TaskTrail Mobile is the Flutter companion to the TaskTrail web app. It is not a mock or a prototype — it runs against the same production backend at api.tasktrail.site, uses the same team and task model, and enforces the same auth and role rules. The mobile UI is built from scratch for touch; the rules come from the server.

How it fits

SurfaceLinkRole
Web apptasktrail.siteReference product surface
Shared APIapi.tasktrail.siteThe exact backend both clients call
Main repocloud-computing-projectBackend, web, deployment, infra docs
Android releaseTaskTrail-android-arm64-release.apkInstallable APK kept in-repo

Architecture

TaskTrail Mobile architecture — presentation widgets, controllers, repositories, ApiClient, and the shared backend

The mobile app follows a clean Widgets → Controllers → Repositories → ApiClient layering. Widgets stay presentational, controllers hold state, repositories own data access, and a single TaskTrailApiClient wraps dio so the base URL, headers, and session tokens live in one place. No business logic lives in widgets; the backend stays the source of truth.

Product flow

flowchart LR
Auth["Sign in / restore session"] --> Role{"Role-aware shell"}
Role --> Employee["Employee<br/>Tasks · Calendar · Teams · Join · Profile"]
Role --> Manager["Manager<br/>Dashboard · Tracker · Tasks · Teams · Profile"]
Employee --> Execute["Join teams · update work · complete tasks"]
Manager --> Oversight["Assign · manage teams · monitor execution"]
Loading

The shell reads the role off the authenticated user and switches between employee and manager tab sets. Both use the same session model and the same API contracts.

Product surfaces

RoleMobile surfaces
EmployeeJoin · Tasks · Calendar · Teams · Profile
ManagerDashboard · Worker Tracker · Tasks · Teams · Recurring · Profile

The UI uses bottom sheets, compact lists, and tab persistence instead of desktop-style pages.

Engineering profile

ConcernChoice
FrameworkFlutter
LanguageDart 3
Navigationgo_router with role-aware shell routes
Networkingdio via a single TaskTrailApiClient
Secure persistenceflutter_secure_storage
UI directionCalm, mobile-first, iOS-esque shell/theme
Validationflutter test + integration_test + emulator runs

Repository layout

tasktrail-mobile/
├── lib/src/
│ ├── app/ # bootstrap + router
│ ├── core/ # config, API client, storage, theme, models
│ ├── features/ # auth, dashboard, tracker, tasks, teams, join, calendar, profile
│ └── shared/ # shell, tab bar, reusable mobile surfaces
├── test/ # unit + widget tests
├── integration_test/ # end-to-end mobile flows
├── apk/ # Android release artifact
├── docs/
│ ├── assets/ # README visuals
│ ├── README.md
│ └── ARCHITECTURE.md
├── android/ ios/
└── README.md

Run the app

Install dependencies

flutter pub get

Android emulator against local backend

flutter run -d emulator-5554 \
--dart-define=TASKTRAIL_ENV=development \
--dart-define=TASKTRAIL_API_BASE_URL=http://10.0.2.2:4000/api/v1

Android emulator against live backend

flutter run -d emulator-5554 \
--dart-define=TASKTRAIL_ENV=production

Environment defaults:

  • developmenthttp://10.0.2.2:4000/api/v1
  • productionhttps://api.tasktrail.site/api/v1
  • TASKTRAIL_API_BASE_URL overrides both

Validation & release

flutter analyze
flutter test

Release build:

flutter build apk --release --dart-define=TASKTRAIL_ENV=production

The latest Android artifact lives at apk/TaskTrail-android-arm64-release.apk. For proper long-term release signing, copy android/key.properties.example to android/key.properties and point it at a real keystore.

What is particularly strong here

  • Same backend, same rules. No separate mock data path, no parallel product logic.
  • Role-aware shell. Manager and employee flows feel different while sharing the same session.
  • Persistent session. Login survives app relaunch through flutter_secure_storage.
  • Touch-first UI. Bottom sheets, compact lists, and tab persistence — not a desktop port.
  • Real validation. Module-by-module emulator testing was used throughout development.

Documentation

For backend, web, and deployment context, use the main repo: blank-space-gsu/cloud-computing-project.

Known limitations

  • Mobile deep-link handling is still limited.
  • Recurring-rule edit / pause / resume is not built yet.
  • Manager task edit/reassign deserves deeper end-to-end mobile coverage.
  • Android store-grade signing is not finalized in-repo.
  • The app is production-usable, but there is still room for polish in notifications, offline handling, and richer activity history.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

TaskTrail Mobile — Flutter companion client on the same live TaskTrail backend

Live Web App · Live API · Main Repo · Android APK

Architecture · Product surfaces · Run the app · Validation & release · Documentation


TaskTrail Mobile is the Flutter companion to the TaskTrail web app. It is not a mock or a prototype — it runs against the same production backend at api.tasktrail.site, uses the same team and task model, and enforces the same auth and role rules. The mobile UI is built from scratch for touch; the rules come from the server.

How it fits

SurfaceLinkRole
Web apptasktrail.siteReference product surface
Shared APIapi.tasktrail.siteThe exact backend both clients call
Main repocloud-computing-projectBackend, web, deployment, infra docs
Android releaseTaskTrail-android-arm64-release.apkInstallable APK kept in-repo

Architecture

TaskTrail Mobile architecture — presentation widgets, controllers, repositories, ApiClient, and the shared backend

The mobile app follows a clean Widgets → Controllers → Repositories → ApiClient layering. Widgets stay presentational, controllers hold state, repositories own data access, and a single TaskTrailApiClient wraps dio so the base URL, headers, and session tokens live in one place. No business logic lives in widgets; the backend stays the source of truth.

Product flow

flowchart LR
Auth["Sign in / restore session"] --> Role{"Role-aware shell"}
Role --> Employee["Employee<br/>Tasks · Calendar · Teams · Join · Profile"]
Role --> Manager["Manager<br/>Dashboard · Tracker · Tasks · Teams · Profile"]
Employee --> Execute["Join teams · update work · complete tasks"]
Manager --> Oversight["Assign · manage teams · monitor execution"]
Loading

The shell reads the role off the authenticated user and switches between employee and manager tab sets. Both use the same session model and the same API contracts.

Product surfaces

RoleMobile surfaces
EmployeeJoin · Tasks · Calendar · Teams · Profile
ManagerDashboard · Worker Tracker · Tasks · Teams · Recurring · Profile

The UI uses bottom sheets, compact lists, and tab persistence instead of desktop-style pages.

Engineering profile

ConcernChoice
FrameworkFlutter
LanguageDart 3
Navigationgo_router with role-aware shell routes
Networkingdio via a single TaskTrailApiClient
Secure persistenceflutter_secure_storage
UI directionCalm, mobile-first, iOS-esque shell/theme
Validationflutter test + integration_test + emulator runs

Repository layout

tasktrail-mobile/
├── lib/src/
│ ├── app/ # bootstrap + router
│ ├── core/ # config, API client, storage, theme, models
│ ├── features/ # auth, dashboard, tracker, tasks, teams, join, calendar, profile
│ └── shared/ # shell, tab bar, reusable mobile surfaces
├── test/ # unit + widget tests
├── integration_test/ # end-to-end mobile flows
├── apk/ # Android release artifact
├── docs/
│ ├── assets/ # README visuals
│ ├── README.md
│ └── ARCHITECTURE.md
├── android/ ios/
└── README.md

Run the app

Install dependencies

flutter pub get

Android emulator against local backend

flutter run -d emulator-5554 \
--dart-define=TASKTRAIL_ENV=development \
--dart-define=TASKTRAIL_API_BASE_URL=http://10.0.2.2:4000/api/v1

Android emulator against live backend

flutter run -d emulator-5554 \
--dart-define=TASKTRAIL_ENV=production

Environment defaults:

  • developmenthttp://10.0.2.2:4000/api/v1
  • productionhttps://api.tasktrail.site/api/v1
  • TASKTRAIL_API_BASE_URL overrides both

Validation & release

flutter analyze
flutter test

Release build:

flutter build apk --release --dart-define=TASKTRAIL_ENV=production

The latest Android artifact lives at apk/TaskTrail-android-arm64-release.apk. For proper long-term release signing, copy android/key.properties.example to android/key.properties and point it at a real keystore.

What is particularly strong here

  • Same backend, same rules. No separate mock data path, no parallel product logic.
  • Role-aware shell. Manager and employee flows feel different while sharing the same session.
  • Persistent session. Login survives app relaunch through flutter_secure_storage.
  • Touch-first UI. Bottom sheets, compact lists, and tab persistence — not a desktop port.
  • Real validation. Module-by-module emulator testing was used throughout development.

Documentation

For backend, web, and deployment context, use the main repo: blank-space-gsu/cloud-computing-project.

Known limitations

  • Mobile deep-link handling is still limited.
  • Recurring-rule edit / pause / resume is not built yet.
  • Manager task edit/reassign deserves deeper end-to-end mobile coverage.
  • Android store-grade signing is not finalized in-repo.
  • The app is production-usable, but there is still room for polish in notifications, offline handling, and richer activity history.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

TaskTrail Mobile — Flutter companion client on the same live TaskTrail backend

Live Web App · Live API · Main Repo · Android APK

Architecture · Product surfaces · Run the app · Validation & release · Documentation


TaskTrail Mobile is the Flutter companion to the TaskTrail web app. It is not a mock or a prototype — it runs against the same production backend at api.tasktrail.site, uses the same team and task model, and enforces the same auth and role rules. The mobile UI is built from scratch for touch; the rules come from the server.

How it fits

SurfaceLinkRole
Web apptasktrail.siteReference product surface
Shared APIapi.tasktrail.siteThe exact backend both clients call
Main repocloud-computing-projectBackend, web, deployment, infra docs
Android releaseTaskTrail-android-arm64-release.apkInstallable APK kept in-repo

Architecture

TaskTrail Mobile architecture — presentation widgets, controllers, repositories, ApiClient, and the shared backend

The mobile app follows a clean Widgets → Controllers → Repositories → ApiClient layering. Widgets stay presentational, controllers hold state, repositories own data access, and a single TaskTrailApiClient wraps dio so the base URL, headers, and session tokens live in one place. No business logic lives in widgets; the backend stays the source of truth.

Product flow

flowchart LR
Auth["Sign in / restore session"] --> Role{"Role-aware shell"}
Role --> Employee["Employee<br/>Tasks · Calendar · Teams · Join · Profile"]
Role --> Manager["Manager<br/>Dashboard · Tracker · Tasks · Teams · Profile"]
Employee --> Execute["Join teams · update work · complete tasks"]
Manager --> Oversight["Assign · manage teams · monitor execution"]
Loading

The shell reads the role off the authenticated user and switches between employee and manager tab sets. Both use the same session model and the same API contracts.

Product surfaces

RoleMobile surfaces
EmployeeJoin · Tasks · Calendar · Teams · Profile
ManagerDashboard · Worker Tracker · Tasks · Teams · Recurring · Profile

The UI uses bottom sheets, compact lists, and tab persistence instead of desktop-style pages.

Engineering profile

ConcernChoice
FrameworkFlutter
LanguageDart 3
Navigationgo_router with role-aware shell routes
Networkingdio via a single TaskTrailApiClient
Secure persistenceflutter_secure_storage
UI directionCalm, mobile-first, iOS-esque shell/theme
Validationflutter test + integration_test + emulator runs

Repository layout

tasktrail-mobile/
├── lib/src/
│ ├── app/ # bootstrap + router
│ ├── core/ # config, API client, storage, theme, models
│ ├── features/ # auth, dashboard, tracker, tasks, teams, join, calendar, profile
│ └── shared/ # shell, tab bar, reusable mobile surfaces
├── test/ # unit + widget tests
├── integration_test/ # end-to-end mobile flows
├── apk/ # Android release artifact
├── docs/
│ ├── assets/ # README visuals
│ ├── README.md
│ └── ARCHITECTURE.md
├── android/ ios/
└── README.md

Run the app

Install dependencies

flutter pub get

Android emulator against local backend

flutter run -d emulator-5554 \
--dart-define=TASKTRAIL_ENV=development \
--dart-define=TASKTRAIL_API_BASE_URL=http://10.0.2.2:4000/api/v1

Android emulator against live backend

flutter run -d emulator-5554 \
--dart-define=TASKTRAIL_ENV=production

Environment defaults:

  • developmenthttp://10.0.2.2:4000/api/v1
  • productionhttps://api.tasktrail.site/api/v1
  • TASKTRAIL_API_BASE_URL overrides both

Validation & release

flutter analyze
flutter test

Release build:

flutter build apk --release --dart-define=TASKTRAIL_ENV=production

The latest Android artifact lives at apk/TaskTrail-android-arm64-release.apk. For proper long-term release signing, copy android/key.properties.example to android/key.properties and point it at a real keystore.

What is particularly strong here

  • Same backend, same rules. No separate mock data path, no parallel product logic.
  • Role-aware shell. Manager and employee flows feel different while sharing the same session.
  • Persistent session. Login survives app relaunch through flutter_secure_storage.
  • Touch-first UI. Bottom sheets, compact lists, and tab persistence — not a desktop port.
  • Real validation. Module-by-module emulator testing was used throughout development.

Documentation

For backend, web, and deployment context, use the main repo: blank-space-gsu/cloud-computing-project.

Known limitations

  • Mobile deep-link handling is still limited.
  • Recurring-rule edit / pause / resume is not built yet.
  • Manager task edit/reassign deserves deeper end-to-end mobile coverage.
  • Android store-grade signing is not finalized in-repo.
  • The app is production-usable, but there is still room for polish in notifications, offline handling, and richer activity history.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

TaskTrail Mobile — Flutter companion client on the same live TaskTrail backend

Live Web App · Live API · Main Repo · Android APK

Architecture · Product surfaces · Run the app · Validation & release · Documentation


TaskTrail Mobile is the Flutter companion to the TaskTrail web app. It is not a mock or a prototype — it runs against the same production backend at api.tasktrail.site, uses the same team and task model, and enforces the same auth and role rules. The mobile UI is built from scratch for touch; the rules come from the server.

How it fits

SurfaceLinkRole
Web apptasktrail.siteReference product surface
Shared APIapi.tasktrail.siteThe exact backend both clients call
Main repocloud-computing-projectBackend, web, deployment, infra docs
Android releaseTaskTrail-android-arm64-release.apkInstallable APK kept in-repo

Architecture

TaskTrail Mobile architecture — presentation widgets, controllers, repositories, ApiClient, and the shared backend

The mobile app follows a clean Widgets → Controllers → Repositories → ApiClient layering. Widgets stay presentational, controllers hold state, repositories own data access, and a single TaskTrailApiClient wraps dio so the base URL, headers, and session tokens live in one place. No business logic lives in widgets; the backend stays the source of truth.

Product flow

flowchart LR
Auth["Sign in / restore session"] --> Role{"Role-aware shell"}
Role --> Employee["Employee<br/>Tasks · Calendar · Teams · Join · Profile"]
Role --> Manager["Manager<br/>Dashboard · Tracker · Tasks · Teams · Profile"]
Employee --> Execute["Join teams · update work · complete tasks"]
Manager --> Oversight["Assign · manage teams · monitor execution"]
Loading

The shell reads the role off the authenticated user and switches between employee and manager tab sets. Both use the same session model and the same API contracts.

Product surfaces

RoleMobile surfaces
EmployeeJoin · Tasks · Calendar · Teams · Profile
ManagerDashboard · Worker Tracker · Tasks · Teams · Recurring · Profile

The UI uses bottom sheets, compact lists, and tab persistence instead of desktop-style pages.

Engineering profile

ConcernChoice
FrameworkFlutter
LanguageDart 3
Navigationgo_router with role-aware shell routes
Networkingdio via a single TaskTrailApiClient
Secure persistenceflutter_secure_storage
UI directionCalm, mobile-first, iOS-esque shell/theme
Validationflutter test + integration_test + emulator runs

Repository layout

tasktrail-mobile/
├── lib/src/
│ ├── app/ # bootstrap + router
│ ├── core/ # config, API client, storage, theme, models
│ ├── features/ # auth, dashboard, tracker, tasks, teams, join, calendar, profile
│ └── shared/ # shell, tab bar, reusable mobile surfaces
├── test/ # unit + widget tests
├── integration_test/ # end-to-end mobile flows
├── apk/ # Android release artifact
├── docs/
│ ├── assets/ # README visuals
│ ├── README.md
│ └── ARCHITECTURE.md
├── android/ ios/
└── README.md

Run the app

Install dependencies

flutter pub get

Android emulator against local backend

flutter run -d emulator-5554 \
--dart-define=TASKTRAIL_ENV=development \
--dart-define=TASKTRAIL_API_BASE_URL=http://10.0.2.2:4000/api/v1

Android emulator against live backend

flutter run -d emulator-5554 \
--dart-define=TASKTRAIL_ENV=production

Environment defaults:

  • developmenthttp://10.0.2.2:4000/api/v1
  • productionhttps://api.tasktrail.site/api/v1
  • TASKTRAIL_API_BASE_URL overrides both

Validation & release

flutter analyze
flutter test

Release build:

flutter build apk --release --dart-define=TASKTRAIL_ENV=production

The latest Android artifact lives at apk/TaskTrail-android-arm64-release.apk. For proper long-term release signing, copy android/key.properties.example to android/key.properties and point it at a real keystore.

What is particularly strong here

  • Same backend, same rules. No separate mock data path, no parallel product logic.
  • Role-aware shell. Manager and employee flows feel different while sharing the same session.
  • Persistent session. Login survives app relaunch through flutter_secure_storage.
  • Touch-first UI. Bottom sheets, compact lists, and tab persistence — not a desktop port.
  • Real validation. Module-by-module emulator testing was used throughout development.

Documentation

For backend, web, and deployment context, use the main repo: blank-space-gsu/cloud-computing-project.

Known limitations

  • Mobile deep-link handling is still limited.
  • Recurring-rule edit / pause / resume is not built yet.
  • Manager task edit/reassign deserves deeper end-to-end mobile coverage.
  • Android store-grade signing is not finalized in-repo.
  • The app is production-usable, but there is still room for polish in notifications, offline handling, and richer activity history.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

TaskTrail Mobile — Flutter companion client on the same live TaskTrail backend

Live Web App · Live API · Main Repo · Android APK

Architecture · Product surfaces · Run the app · Validation & release · Documentation


TaskTrail Mobile is the Flutter companion to the TaskTrail web app. It is not a mock or a prototype — it runs against the same production backend at api.tasktrail.site, uses the same team and task model, and enforces the same auth and role rules. The mobile UI is built from scratch for touch; the rules come from the server.

How it fits

SurfaceLinkRole
Web apptasktrail.siteReference product surface
Shared APIapi.tasktrail.siteThe exact backend both clients call
Main repocloud-computing-projectBackend, web, deployment, infra docs
Android releaseTaskTrail-android-arm64-release.apkInstallable APK kept in-repo

Architecture

TaskTrail Mobile architecture — presentation widgets, controllers, repositories, ApiClient, and the shared backend

The mobile app follows a clean Widgets → Controllers → Repositories → ApiClient layering. Widgets stay presentational, controllers hold state, repositories own data access, and a single TaskTrailApiClient wraps dio so the base URL, headers, and session tokens live in one place. No business logic lives in widgets; the backend stays the source of truth.

Product flow

flowchart LR
Auth["Sign in / restore session"] --> Role{"Role-aware shell"}
Role --> Employee["Employee<br/>Tasks · Calendar · Teams · Join · Profile"]
Role --> Manager["Manager<br/>Dashboard · Tracker · Tasks · Teams · Profile"]
Employee --> Execute["Join teams · update work · complete tasks"]
Manager --> Oversight["Assign · manage teams · monitor execution"]
Loading

The shell reads the role off the authenticated user and switches between employee and manager tab sets. Both use the same session model and the same API contracts.

Product surfaces

RoleMobile surfaces
EmployeeJoin · Tasks · Calendar · Teams · Profile
ManagerDashboard · Worker Tracker · Tasks · Teams · Recurring · Profile

The UI uses bottom sheets, compact lists, and tab persistence instead of desktop-style pages.

Engineering profile

ConcernChoice
FrameworkFlutter
LanguageDart 3
Navigationgo_router with role-aware shell routes
Networkingdio via a single TaskTrailApiClient
Secure persistenceflutter_secure_storage
UI directionCalm, mobile-first, iOS-esque shell/theme
Validationflutter test + integration_test + emulator runs

Repository layout

tasktrail-mobile/
├── lib/src/
│ ├── app/ # bootstrap + router
│ ├── core/ # config, API client, storage, theme, models
│ ├── features/ # auth, dashboard, tracker, tasks, teams, join, calendar, profile
│ └── shared/ # shell, tab bar, reusable mobile surfaces
├── test/ # unit + widget tests
├── integration_test/ # end-to-end mobile flows
├── apk/ # Android release artifact
├── docs/
│ ├── assets/ # README visuals
│ ├── README.md
│ └── ARCHITECTURE.md
├── android/ ios/
└── README.md

Run the app

Install dependencies

flutter pub get

Android emulator against local backend

flutter run -d emulator-5554 \
--dart-define=TASKTRAIL_ENV=development \
--dart-define=TASKTRAIL_API_BASE_URL=http://10.0.2.2:4000/api/v1

Android emulator against live backend

flutter run -d emulator-5554 \
--dart-define=TASKTRAIL_ENV=production

Environment defaults:

  • developmenthttp://10.0.2.2:4000/api/v1
  • productionhttps://api.tasktrail.site/api/v1
  • TASKTRAIL_API_BASE_URL overrides both

Validation & release

flutter analyze
flutter test

Release build:

flutter build apk --release --dart-define=TASKTRAIL_ENV=production

The latest Android artifact lives at apk/TaskTrail-android-arm64-release.apk. For proper long-term release signing, copy android/key.properties.example to android/key.properties and point it at a real keystore.

What is particularly strong here

  • Same backend, same rules. No separate mock data path, no parallel product logic.
  • Role-aware shell. Manager and employee flows feel different while sharing the same session.
  • Persistent session. Login survives app relaunch through flutter_secure_storage.
  • Touch-first UI. Bottom sheets, compact lists, and tab persistence — not a desktop port.
  • Real validation. Module-by-module emulator testing was used throughout development.

Documentation

For backend, web, and deployment context, use the main repo: blank-space-gsu/cloud-computing-project.

Known limitations

  • Mobile deep-link handling is still limited.
  • Recurring-rule edit / pause / resume is not built yet.
  • Manager task edit/reassign deserves deeper end-to-end mobile coverage.
  • Android store-grade signing is not finalized in-repo.
  • The app is production-usable, but there is still room for polish in notifications, offline handling, and richer activity history.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

TaskTrail Mobile — Flutter companion client on the same live TaskTrail backend

Live Web App · Live API · Main Repo · Android APK

Architecture · Product surfaces · Run the app · Validation & release · Documentation


TaskTrail Mobile is the Flutter companion to the TaskTrail web app. It is not a mock or a prototype — it runs against the same production backend at api.tasktrail.site, uses the same team and task model, and enforces the same auth and role rules. The mobile UI is built from scratch for touch; the rules come from the server.

How it fits

SurfaceLinkRole
Web apptasktrail.siteReference product surface
Shared APIapi.tasktrail.siteThe exact backend both clients call
Main repocloud-computing-projectBackend, web, deployment, infra docs
Android releaseTaskTrail-android-arm64-release.apkInstallable APK kept in-repo

Architecture

TaskTrail Mobile architecture — presentation widgets, controllers, repositories, ApiClient, and the shared backend

The mobile app follows a clean Widgets → Controllers → Repositories → ApiClient layering. Widgets stay presentational, controllers hold state, repositories own data access, and a single TaskTrailApiClient wraps dio so the base URL, headers, and session tokens live in one place. No business logic lives in widgets; the backend stays the source of truth.

Product flow

flowchart LR
Auth["Sign in / restore session"] --> Role{"Role-aware shell"}
Role --> Employee["Employee<br/>Tasks · Calendar · Teams · Join · Profile"]
Role --> Manager["Manager<br/>Dashboard · Tracker · Tasks · Teams · Profile"]
Employee --> Execute["Join teams · update work · complete tasks"]
Manager --> Oversight["Assign · manage teams · monitor execution"]
Loading

The shell reads the role off the authenticated user and switches between employee and manager tab sets. Both use the same session model and the same API contracts.

Product surfaces

RoleMobile surfaces
EmployeeJoin · Tasks · Calendar · Teams · Profile
ManagerDashboard · Worker Tracker · Tasks · Teams · Recurring · Profile

The UI uses bottom sheets, compact lists, and tab persistence instead of desktop-style pages.

Engineering profile

ConcernChoice
FrameworkFlutter
LanguageDart 3
Navigationgo_router with role-aware shell routes
Networkingdio via a single TaskTrailApiClient
Secure persistenceflutter_secure_storage
UI directionCalm, mobile-first, iOS-esque shell/theme
Validationflutter test + integration_test + emulator runs

Repository layout

tasktrail-mobile/
├── lib/src/
│ ├── app/ # bootstrap + router
│ ├── core/ # config, API client, storage, theme, models
│ ├── features/ # auth, dashboard, tracker, tasks, teams, join, calendar, profile
│ └── shared/ # shell, tab bar, reusable mobile surfaces
├── test/ # unit + widget tests
├── integration_test/ # end-to-end mobile flows
├── apk/ # Android release artifact
├── docs/
│ ├── assets/ # README visuals
│ ├── README.md
│ └── ARCHITECTURE.md
├── android/ ios/
└── README.md

Run the app

Install dependencies

flutter pub get

Android emulator against local backend

flutter run -d emulator-5554 \
--dart-define=TASKTRAIL_ENV=development \
--dart-define=TASKTRAIL_API_BASE_URL=http://10.0.2.2:4000/api/v1

Android emulator against live backend

flutter run -d emulator-5554 \
--dart-define=TASKTRAIL_ENV=production

Environment defaults:

  • developmenthttp://10.0.2.2:4000/api/v1
  • productionhttps://api.tasktrail.site/api/v1
  • TASKTRAIL_API_BASE_URL overrides both

Validation & release

flutter analyze
flutter test

Release build:

flutter build apk --release --dart-define=TASKTRAIL_ENV=production

The latest Android artifact lives at apk/TaskTrail-android-arm64-release.apk. For proper long-term release signing, copy android/key.properties.example to android/key.properties and point it at a real keystore.

What is particularly strong here

  • Same backend, same rules. No separate mock data path, no parallel product logic.
  • Role-aware shell. Manager and employee flows feel different while sharing the same session.
  • Persistent session. Login survives app relaunch through flutter_secure_storage.
  • Touch-first UI. Bottom sheets, compact lists, and tab persistence — not a desktop port.
  • Real validation. Module-by-module emulator testing was used throughout development.

Documentation

For backend, web, and deployment context, use the main repo: blank-space-gsu/cloud-computing-project.

Known limitations

  • Mobile deep-link handling is still limited.
  • Recurring-rule edit / pause / resume is not built yet.
  • Manager task edit/reassign deserves deeper end-to-end mobile coverage.
  • Android store-grade signing is not finalized in-repo.
  • The app is production-usable, but there is still room for polish in notifications, offline handling, and richer activity history.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages