Focused time tracking, goal setting, and team collaboration—backed by clear analytics.
ION is a lightweight productivity companion that helps you:
- Log Core Work and Shared Work with accurate durations
- Enter a distraction‑free Hyperfocus mode for deep work
- Visualize trends and distributions in Analytics
- Align teams in Teamspaces with shared goals and visibility
- Individuals who want a clear picture of how they spend time
- Teams that need a shared rhythm and goals without heavy process
- Daily goals with an elegant vertical time picker (hours/minutes)
- One‑click logging for Core and Shared work
- Hyperfocus mode to protect deep work
- Rich Analytics (trends, distributions, weekly stats)
- Teamspaces for collaboration
- Set your daily goal and log focused sessions with minute precision
- See progress toward the goal right in the sidebar
- Quickly switch between Core and Shared work types
- A dedicated, minimal interface for deep work
- Keep context visible while eliminating noise
- Productivity Trend: see how your output evolves over time
- Work Mode Distribution: balance Core/Shared/Hyperfocus time
- Daily & Weekly breakdowns to spot patterns and improve
- Create teamspaces, invite teammates, and track shared goals
- View team activity and align on priorities
- Core Work: high‑value, individual focus time that moves your priorities forward.
- Shared Work: collaboration and support that keeps the team unblocked.
- Set a daily target in hours/minutes using a vertical time picker.
- See live progress as you log work entries.
- Access all sections quickly from the left sidebar: Core, Shared, Hyperfocus, Analytics, Team, Profile.
Requirements: Node.js and npm.
npm i- Copy
.env.exampleto.env.local - Set your Supabase values:
VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEY
- Keep server‑only secrets out of client code (e.g.
SUPABASE_SERVICE_ROLE— do not prefix withVITE_).
npm run devOpen the printed local URL in your browser.
/ (repo root)
├─ public/
│ ├─ COREWORK.png
│ ├─ HYPERFOCUS.png
│ ├─ ANALYTICS.png
│ ├─ ANALYTICS2.png
│ ├─ TEAMSPACE.png
│ └─ favicon.ico
├─ src/
│ ├─ components/
│ │ └─ layout/
│ │ └─ Sidebar.tsx
│ ├─ integrations/
│ │ └─ supabase/
│ │ └─ client.ts
│ ├─ lib/
│ │ └─ supabaseClient.ts
│ └─ pages/
│ ├─ CoreWork.tsx
│ ├─ SharedWork.tsx
│ ├─ Hyperfocus.tsx
│ ├─ Team.tsx
│ ├─ TeamspaceDetail.tsx
│ ├─ Profile.tsx
│ ├─ Login.tsx, Auth.tsx, AuthCallback.tsx
│ └─ Analytics/
│ ├─ Analytics.tsx
│ ├─ ProductivityTrend.tsx
│ ├─ WorkModeDistribution.tsx
│ ├─ DailyWorkDistribution.tsx
│ └─ WeeklyStatistics.tsx
├─ .env.example
├─ CODEBASE_OVERVIEW.md
├─ tailwind.config.ts
├─ vite.config.ts
└─ package.json
We use the official @supabase/supabase-js client for authentication and data access.
- Reads
VITE_SUPABASE_URLandVITE_SUPABASE_ANON_KEY - Persists auth session to
localStorage - Optional typed client in
src/integrations/supabase/client.ts
Example (from src/lib/supabaseClient.ts):
import { createClient } from "@supabase/supabase-js";
const supabaseUrl = import.meta.env.VITE_SUPABASE_URL;
const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY;
export const supabase = createClient(supabaseUrl!, supabaseAnonKey!);// Current user
const { data: { user } } = await supabase.auth.getUser();
// Read today's work entries
const { data, error } = await supabase
.from("work")
.select("duration_minutes")
.eq("user_id", user!.id)
.eq("Date", new Date().toISOString().slice(0, 10));work— per‑user time logs withduration_minutesandDateuserdailyGoal— per‑user daily goal (goal_hours) keyed byDate
VITE_SUPABASE_URL=... # your project URL
VITE_SUPABASE_ANON_KEY=... # anon (public) key for client
SUPABASE_SERVICE_ROLE=... # server-only secret (never expose to the browser)- Core Work —
/ - Shared Work —
/shared-work - Hyperfocus —
/hyperfocus - Analytics —
/analytics - Team —
/team - Profile —
/profile
npm run dev # start dev server
npm run build # production build
npm run preview # preview build
npm run lint # lint source- UI: React + TypeScript, Tailwind CSS, shadcn/ui components
- Data fetching: TanStack Query for caching and mutations
- Build: Vite
- Routing:
react-router-dom
- Vite + React + TypeScript
- Tailwind CSS + shadcn/ui
- Supabase (Auth + Database)
- TanStack Query for data fetching and caching
For a deeper tour of the code, see CODEBASE_OVERVIEW.md.




