Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
6fb4951
perf: increase process guard interval to 2s and snapshot blocked set
arshsisodiya Mar 12, 2026
3616e56
perf: decouple URL sniffing from logger loop via background resolver
arshsisodiya Mar 12, 2026
f2e9c0e
perf: batch file monitor DB writes with 2s flush interval and bounded…
arshsisodiya Mar 12, 2026
63530f2
perf: enable threaded mode for Werkzeug API server
arshsisodiya Mar 12, 2026
0c4ecfd
perf: push date-range filtering into SQL for heatmap, weekly-trend, s…
arshsisodiya Mar 12, 2026
a854efe
perf: replace date() function call with range filter in focus query f…
arshsisodiya Mar 12, 2026
95302bc
perf: add /api/dashboard-bundle endpoint and use single fetch in fron…
arshsisodiya Mar 12, 2026
15303c1
perf: expand data retention cleanup to daily_stats and file_logs tables
arshsisodiya Mar 12, 2026
bfd22d9
stability: make setup_logger() idempotent to prevent handler loss
arshsisodiya Mar 12, 2026
9fecb82
stability: standardize boolean settings to true/false format
arshsisodiya Mar 12, 2026
07cbbba
fix: include all categories in wellbeing totalScreenTime calculation
arshsisodiya Mar 12, 2026
82bf424
fix: cap file monitor throttle cache at 10k entries to prevent memory…
arshsisodiya Mar 12, 2026
f52cdd2
perf: add in-memory cache to BaseSettingsManager to avoid per-call DB…
arshsisodiya Mar 12, 2026
2f4b26d
perf: eliminate redundant top_app SQL query in wellbeing endpoint
arshsisodiya Mar 12, 2026
db651da
perf: cache focus score per date with 45s TTL for today
arshsisodiya Mar 12, 2026
c0bf191
stability: add threading.Lock to BlockingService.blocked_apps access
arshsisodiya Mar 12, 2026
e5731cc
fix: use mtime-based cache for ignored_apps instead of permanent lru_…
arshsisodiya Mar 12, 2026
0b85cc3
perf: add /api/init-bundle endpoint and consolidate 6 mount-time fetches
arshsisodiya Mar 12, 2026
ba509f1
perf: warm settings cache at startup to avoid first-call DB hit
arshsisodiya Mar 12, 2026
ef603c4
feat(HourlyBar): add live now needle with pulsing dot
arshsisodiya Mar 12, 2026
2aec43b
feat(ScreenTimeCard): add active/idle ratio segmented bar
arshsisodiya Mar 12, 2026
6c744e3
feat(AppsPage): animate category filter chip count badges
arshsisodiya Mar 12, 2026
92473e3
fix(SessionTimeline): clamp tooltips, add gap break markers, show cat…
arshsisodiya Mar 12, 2026
3e9f791
fix(UpdateDialog): implement real snooze scheduling for Remind Later
arshsisodiya Mar 12, 2026
1508f5a
perf(ui): comprehensive frontend performance optimizations
arshsisodiya Mar 12, 2026
d75c39a
feat: add Goals & Targets and Weekly Report features
arshsisodiya Mar 12, 2026
c3c0791
fix: make re-block persist and unify blocked state in app_limits
arshsisodiya Mar 12, 2026
3f8f85f
feat(goals): add 7-day streak tracker and best streak badge
arshsisodiya Mar 13, 2026
4ce0796
feat(report): enhance weekly report visuals/export and add auto-send …
arshsisodiya Mar 13, 2026
416a50c
feat(report): add compare, export formats, verbosity, and analytics
arshsisodiya Mar 13, 2026
9c3cb78
feat(dashboard): regroup Goals/Limits/Reports under Insights
arshsisodiya Mar 13, 2026
6895e22
feat(overview): wire active goals data into metric cards
arshsisodiya Mar 14, 2026
87e55dc
feat(overview): add hover set-goal CTA on metric cards
arshsisodiya Mar 14, 2026
1e1f99a
feat(overview): show inline goal status on metric cards
arshsisodiya Mar 14, 2026
b18245b
feat(overview): enable in-card goal create and edit modal
arshsisodiya Mar 14, 2026
1b1bf34
feat(overview): improve desktop keyboard interactions for goals
arshsisodiya Mar 14, 2026
d6e28b7
fix(overview): move early return after hooks to fix blank page
arshsisodiya Mar 14, 2026
00476d4
fix(overview): restore goal modal actions and card hover triggers
arshsisodiya Mar 14, 2026
d23feff
fix(overview): add focus goal actions and center quick-goal modal
arshsisodiya Mar 14, 2026
22fac52
fix(overview): remove off-theme native goal tooltips
arshsisodiya Mar 14, 2026
78a2cf4
refactor(overview): unify goal slot layout across metric cards
arshsisodiya Mar 14, 2026
3c42174
feat(overview): show 7-day goal streaks on metric cards
arshsisodiya Mar 14, 2026
f795267
fix(overview): reorder screen-time card sections and compact goal strip
arshsisodiya Mar 14, 2026
989d83b
style(overview): tighten top spacing across metric cards
arshsisodiya Mar 14, 2026
55b19a0
refactor(overview): equalize card containers with conditional goal block
arshsisodiya Mar 14, 2026
48015f8
fix(overview): align focus header and relax card heights
arshsisodiya Mar 14, 2026
e6b09b1
refactor(overview): add compact no-goal CTA state to metric cards
arshsisodiya Mar 14, 2026
e35182e
refactor(overview): remove no-goal pills from metric cards
arshsisodiya Mar 14, 2026
99a3de5
feat(goals): toggle overview goal visibility from goals tab
arshsisodiya Mar 14, 2026
a502d38
style(goals): use switch toggle for overview goal visibility
arshsisodiya Mar 15, 2026
7e0ed76
phase 1: smooth motion baseline and hover refactor
arshsisodiya Mar 15, 2026
86f4640
phase 2: responsive grid cleanup across dashboard pages
arshsisodiya Mar 15, 2026
bf40f74
phase 3: visibility-aware polling and refresh throttling
arshsisodiya Mar 15, 2026
1819b4f
improve tab switch smoothness and remove empty-state flicker
arshsisodiya Mar 15, 2026
e865dc8
sync overview goals toggle without page refresh
arshsisodiya Mar 15, 2026
27e2a88
add tab prewarm, list windowing, and hover performance cleanup
arshsisodiya Mar 15, 2026
7505872
move historical days-ago info to dashboard and remove overview banner
arshsisodiya Mar 15, 2026
d81b732
avoid overview card remount on date change
arshsisodiya Mar 15, 2026
02c4a0b
redesign the weekly report page
arshsisodiya Mar 15, 2026
854a98c
feat(notifications): ship Windows Notification Center flow for goals …
arshsisodiya Mar 15, 2026
f42f777
feat(notifications): add daily digest, context-aware quiet mode, and …
arshsisodiya Mar 16, 2026
5790804
fix(settings): remove blank trailing scroll space across tabs
arshsisodiya Mar 16, 2026
9fd959f
perf(settings): smooth tab transitions without remount jitter
arshsisodiya Mar 16, 2026
1aaa7ee
docs: refresh README and docs for latest weekly reporting and privacy…
arshsisodiya Mar 16, 2026
ffe7044
ci: add dev/master pipelines with selective docs build and auto PR/me…
arshsisodiya Mar 16, 2026
b8b0fe2
installer: require privacy acceptance and use local legal docs
arshsisodiya Mar 16, 2026
124a231
feat(weekly-report): integrate hourly activity heatmap API
arshsisodiya Mar 16, 2026
a756bd4
added /site directory
arshsisodiya Mar 16, 2026
3d2fd63
Fix backend smoke test script for pwsh
arshsisodiya Mar 16, 2026
477fea3
fix(frontend): resolve lint errors
arshsisodiya Mar 16, 2026
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
55 changes: 55 additions & 0 deletions .github/workflows/auto-pr-dev-to-master.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Auto PR - Dev to Master

on:
push:
branches:
- dev
workflow_dispatch:

permissions:
contents: read
pull-requests: write

jobs:
create-or-update-pr:
runs-on: ubuntu-latest
steps:
- name: Ensure PR from dev to master exists
uses: actions/github-script@v7
with:
script: |
const owner = context.repo.owner;
const repo = context.repo.repo;
const head = `${owner}:dev`;
const base = 'master';

const { data: existing } = await github.rest.pulls.list({
owner,
repo,
state: 'open',
head,
base,
per_page: 1,
});

if (existing.length > 0) {
core.info(`Open PR already exists: #${existing[0].number}`);
return;
}

const { data: pr } = await github.rest.pulls.create({
owner,
repo,
head: 'dev',
base,
title: 'Sync dev into master',
body: [
'Automated PR from dev to master.',
'',
'- Commit history is preserved as-is (no squash/rebase).',
'- Merge should happen only after required CI checks pass.',
].join('\n'),
maintainer_can_modify: true,
});

core.info(`Created PR #${pr.number}: ${pr.html_url}`);
27 changes: 27 additions & 0 deletions .github/workflows/automerge-dev-pr.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Enable Auto-Merge for Dev PRs

on:
pull_request_target:
branches:
- master
types:
- opened
- reopened
- synchronize
- ready_for_review

permissions:
contents: write
pull-requests: write

jobs:
enable-auto-merge:
if: github.event.pull_request.head.ref == 'dev' && github.event.pull_request.draft == false
runs-on: ubuntu-latest
steps:
- name: Enable auto-merge (merge commit)
uses: peter-evans/enable-pull-request-automerge@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
pull-request-number: ${{ github.event.pull_request.number }}
merge-method: merge
155 changes: 155 additions & 0 deletions .github/workflows/ci-dev.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
name: CI - Dev Branch

on:
push:
branches:
- dev
workflow_dispatch:

permissions:
contents: read

concurrency:
group: ci-dev-${{ github.ref }}
cancel-in-progress: true

jobs:
changes:
name: Detect changed paths
runs-on: ubuntu-latest
outputs:
docs: ${{ steps.filter.outputs.docs }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Path filter
id: filter
uses: dorny/paths-filter@v3
with:
filters: |
docs:
- docs/**
- mkdocs.yml
- README.md
- index.html

backend-smoke:
name: Backend smoke checks
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
cache: pip

- name: Install backend dependencies
run: |
python -m pip install --upgrade pip
python -m pip install -r requirements.txt

- name: Smoke test health and core API
shell: pwsh
run: |
@'
from src.database.database import init_db
from src.api.api_server import create_app

init_db()
app = create_app(None)
client = app.test_client()

health = client.get('/api/health')
assert health.status_code == 200, f"/api/health failed: {health.status_code}"
assert health.get_json().get('status') == 'running', f"Unexpected health payload: {health.get_data(as_text=True)}"

dates = client.get('/api/available-dates')
assert dates.status_code == 200, f"/api/available-dates failed: {dates.status_code}"

print('Backend smoke checks passed.')
'@ | python -

- name: Run backend tests if present
shell: pwsh
run: |
$hasTests = $false
if (Test-Path tests) {
$found = Get-ChildItem tests -Recurse -Include "test_*.py","*_test.py" -ErrorAction SilentlyContinue | Select-Object -First 1
if ($found) { $hasTests = $true }
}
if (-not $hasTests) {
$foundSrc = Get-ChildItem src -Recurse -Include "test_*.py","*_test.py" -ErrorAction SilentlyContinue | Select-Object -First 1
if ($foundSrc) { $hasTests = $true }
}

if ($hasTests) {
python -m pip install pytest
python -m pytest -q
}
else {
Write-Host "No backend tests found. Skipping pytest."
}

frontend-ci:
name: Frontend lint and build
runs-on: windows-latest
defaults:
run:
working-directory: frontend
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: "20"
cache: npm
cache-dependency-path: frontend/package-lock.json

- name: Install frontend dependencies
run: npm ci

- name: Run lint
run: npm run lint

- name: Build frontend
run: npm run build

- name: Run frontend tests if script exists
shell: pwsh
run: |
$pkg = Get-Content package.json | ConvertFrom-Json
$hasTestScript = $pkg.scripts.PSObject.Properties.Name -contains "test"
if ($hasTestScript) {
npm test -- --run
}
else {
Write-Host "No frontend test script found. Skipping frontend tests."
}

docs-build:
name: Docs build (docs changes only)
needs: changes
if: needs.changes.outputs.docs == 'true'
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
cache: pip

- name: Install docs dependencies
run: |
python -m pip install --upgrade pip
python -m pip install mkdocs mkdocs-material pymdown-extensions

- name: Build docs
run: python -m mkdocs build --strict --site-dir site
158 changes: 158 additions & 0 deletions .github/workflows/ci-master.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
name: CI - Master Gate and Post-Merge

on:
pull_request:
branches:
- master
push:
branches:
- master
workflow_dispatch:

permissions:
contents: read

concurrency:
group: ci-master-${{ github.ref }}
cancel-in-progress: true

jobs:
changes:
name: Detect changed paths
runs-on: ubuntu-latest
outputs:
docs: ${{ steps.filter.outputs.docs }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Path filter
id: filter
uses: dorny/paths-filter@v3
with:
filters: |
docs:
- docs/**
- mkdocs.yml
- README.md
- index.html

backend-smoke:
name: Backend smoke checks
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
cache: pip

- name: Install backend dependencies
run: |
python -m pip install --upgrade pip
python -m pip install -r requirements.txt

- name: Smoke test health and core API
shell: pwsh
run: |
@'
from src.database.database import init_db
from src.api.api_server import create_app

init_db()
app = create_app(None)
client = app.test_client()

health = client.get('/api/health')
assert health.status_code == 200, f"/api/health failed: {health.status_code}"
assert health.get_json().get('status') == 'running', f"Unexpected health payload: {health.get_data(as_text=True)}"

dates = client.get('/api/available-dates')
assert dates.status_code == 200, f"/api/available-dates failed: {dates.status_code}"

print('Backend smoke checks passed.')
'@ | python -

- name: Run backend tests if present
shell: pwsh
run: |
$hasTests = $false
if (Test-Path tests) {
$found = Get-ChildItem tests -Recurse -Include "test_*.py","*_test.py" -ErrorAction SilentlyContinue | Select-Object -First 1
if ($found) { $hasTests = $true }
}
if (-not $hasTests) {
$foundSrc = Get-ChildItem src -Recurse -Include "test_*.py","*_test.py" -ErrorAction SilentlyContinue | Select-Object -First 1
if ($foundSrc) { $hasTests = $true }
}

if ($hasTests) {
python -m pip install pytest
python -m pytest -q
}
else {
Write-Host "No backend tests found. Skipping pytest."
}

frontend-ci:
name: Frontend lint and build
runs-on: windows-latest
defaults:
run:
working-directory: frontend
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: "20"
cache: npm
cache-dependency-path: frontend/package-lock.json

- name: Install frontend dependencies
run: npm ci

- name: Run lint
run: npm run lint

- name: Build frontend
run: npm run build

- name: Run frontend tests if script exists
shell: pwsh
run: |
$pkg = Get-Content package.json | ConvertFrom-Json
$hasTestScript = $pkg.scripts.PSObject.Properties.Name -contains "test"
if ($hasTestScript) {
npm test -- --run
}
else {
Write-Host "No frontend test script found. Skipping frontend tests."
}

docs-build:
name: Docs build (docs changes only)
needs: changes
if: needs.changes.outputs.docs == 'true'
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
cache: pip

- name: Install docs dependencies
run: |
python -m pip install --upgrade pip
python -m pip install mkdocs mkdocs-material pymdown-extensions

- name: Build docs
run: python -m mkdocs build --strict --site-dir site
Loading
Loading