diff --git a/CLAUDE.md b/CLAUDE.md
index 0e1da9f6b..9cd9bf3bc 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -54,7 +54,7 @@ For comprehensive guidelines on code patterns and conventions, see the `.claude/
| **citycorners** | City guide for Konstanz | Web, Landing |
| **inventar** | Inventory management | Web |
| **traces** | City exploration | Backend, Mobile |
-| **taktik** | Time tracking | Web |
+| **times** | Time tracking | Web |
| **uload** | URL shortener & link management | Server, Web, Landing |
| **news** | AI news reader & personal library | Server, Web, Landing |
| **wisekeep** | AI transcription & wisdom library | Server, Web, Landing |
@@ -585,7 +585,7 @@ Logged in: App → IndexedDB → UI → SyncEngine → mana-sync (Go) → Postg
| Photos | albums, albumItems, favorites, tags, photoTags | Done |
| SkilltTree | skills, activities, achievements | Done |
| CityCorners | locations, favorites | Done |
-| Taktik | clients, projects, timeEntries, tags, templates, settings | Done |
+| Times | clients, projects, timeEntries, tags, templates, settings | Done |
| uLoad | links, tags, folders, linkTags | Done |
| Calc | calculations, savedFormulas | Done |
| ManaCore | userSettings, dashboardConfigs | Done |
diff --git a/apps/manacore/apps/landing/src/content/manascore/2026-03-30-taktik.md b/apps/manacore/apps/landing/src/content/manascore/2026-03-30-times.md
similarity index 90%
rename from apps/manacore/apps/landing/src/content/manascore/2026-03-30-taktik.md
rename to apps/manacore/apps/landing/src/content/manascore/2026-03-30-times.md
index beb8988fa..db8aa1a94 100644
--- a/apps/manacore/apps/landing/src/content/manascore/2026-03-30-taktik.md
+++ b/apps/manacore/apps/landing/src/content/manascore/2026-03-30-times.md
@@ -1,10 +1,10 @@
---
-title: 'Taktik: Production Readiness Audit'
+title: 'Times: Production Readiness Audit'
description: 'Zeiterfassung mit Live-Timer, Projekten, Kunden, Reports, CSV-Export, Templates und Abrechnungsraten - local-first mit umfassender Dokumentation und solider Testabdeckung'
date: 2026-03-30
-app: 'taktik'
+app: 'times'
author: 'Claude Code'
-tags: ['audit', 'taktik', 'production-readiness', 'beta']
+tags: ['audit', 'times', 'production-readiness', 'beta']
score: 55
scores:
backend: 5
@@ -39,7 +39,7 @@ stats:
## Zusammenfassung
-Taktik ist eine **vollwertige Zeiterfassung** mit Live-Timer, Projekt-/Kunden-Management, Reports mit Charts, CSV-Export und konfigurierbaren Abrechnungsraten. Local-first mit 6 Dexie-Collections, 4 Testdateien und umfassender CLAUDE.md. Feature-komplett für den Produktiveinsatz.
+Times ist eine **vollwertige Zeiterfassung** mit Live-Timer, Projekt-/Kunden-Management, Reports mit Charts, CSV-Export und konfigurierbaren Abrechnungsraten. Local-first mit 6 Dexie-Collections, 4 Testdateien und umfassender CLAUDE.md. Feature-komplett für den Produktiveinsatz.
## Backend (5/100)
diff --git a/apps/taktik/package.json b/apps/taktik/package.json
deleted file mode 100644
index 279d3617b..000000000
--- a/apps/taktik/package.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "name": "taktik",
- "version": "1.0.0",
- "private": true,
- "description": "Taktik - Zeiterfassung & Timetracking",
- "scripts": {
- "dev": "pnpm --filter @taktik/web dev",
- "dev:web": "pnpm --filter @taktik/web dev"
- },
- "devDependencies": {
- "typescript": "^5.9.3"
- },
- "packageManager": "pnpm@9.15.0"
-}
diff --git a/apps/taktik/CLAUDE.md b/apps/times/CLAUDE.md
similarity index 93%
rename from apps/taktik/CLAUDE.md
rename to apps/times/CLAUDE.md
index 4a5e10bc0..694e36c08 100644
--- a/apps/taktik/CLAUDE.md
+++ b/apps/times/CLAUDE.md
@@ -1,4 +1,4 @@
-# Taktik
+# Times
Zeiterfassung & Timetracking - Dein Arbeitsrhythmus, messbar gemacht.
@@ -6,7 +6,7 @@ Zeiterfassung & Timetracking - Dein Arbeitsrhythmus, messbar gemacht.
## Project Overview
-Taktik is a professional time tracking app with timer, manual entry, projects, clients, reports, templates, and guild (team) integration. Built local-first for offline capability and instant UI.
+Times is a professional time tracking app with timer, manual entry, projects, clients, reports, templates, and guild (team) integration. Built local-first for offline capability and instant UI.
### Tech Stack
@@ -24,16 +24,16 @@ Taktik is a professional time tracking app with timer, manual entry, projects, c
```bash
# From monorepo root
-pnpm dev:taktik:web # Start web app on port 5197
-pnpm dev:taktik:full # Start with auth + sync server
+pnpm dev:times:web # Start web app on port 5197
+pnpm dev:times:full # Start with auth + sync server
# Tests
-pnpm --filter @taktik/web test # Run all tests
-pnpm --filter @taktik/web test:unit # Run in watch mode
+pnpm --filter @times/web test # Run all tests
+pnpm --filter @times/web test:unit # Run in watch mode
# Type checking
-pnpm --filter @taktik/web type-check
-pnpm --filter @taktik/shared type-check
+pnpm --filter @times/web type-check
+pnpm --filter @times/shared type-check
```
## Key Features
@@ -104,7 +104,7 @@ pnpm --filter @taktik/shared type-check
## Project Structure
```
-apps/taktik/
+apps/times/
├── apps/
│ └── web/ # SvelteKit web client (port 5197)
│ ├── src/
@@ -160,7 +160,7 @@ apps/taktik/
│ │ └── version.ts
│ └── static/
├── packages/
-│ └── shared/ # @taktik/shared
+│ └── shared/ # @times/shared
│ └── src/
│ ├── types/index.ts # All TypeScript types
│ ├── constants/index.ts # Currencies, colors, defaults
diff --git a/apps/taktik/apps/web/Dockerfile b/apps/times/apps/web/Dockerfile
similarity index 77%
rename from apps/taktik/apps/web/Dockerfile
rename to apps/times/apps/web/Dockerfile
index f331eb09e..15f225f24 100644
--- a/apps/taktik/apps/web/Dockerfile
+++ b/apps/times/apps/web/Dockerfile
@@ -9,15 +9,15 @@ ARG PUBLIC_MANA_CORE_AUTH_URL=http://mana-core-auth:3001
ENV PUBLIC_MANA_CORE_AUTH_URL=$PUBLIC_MANA_CORE_AUTH_URL
# Copy app-specific packages
-COPY apps/taktik/packages/shared ./apps/taktik/packages/shared
-COPY apps/taktik/apps/web ./apps/taktik/apps/web
+COPY apps/times/packages/shared ./apps/times/packages/shared
+COPY apps/times/apps/web ./apps/times/apps/web
# Install app-specific dependencies
RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store \
pnpm install --no-frozen-lockfile --ignore-scripts
# Build the web app
-WORKDIR /app/apps/taktik/apps/web
+WORKDIR /app/apps/times/apps/web
RUN pnpm exec svelte-kit sync
RUN NODE_OPTIONS="--max-old-space-size=4096" pnpm build
@@ -25,17 +25,17 @@ RUN NODE_OPTIONS="--max-old-space-size=4096" pnpm build
FROM node:20-alpine AS production
# Keep same directory structure as builder so pnpm symlinks resolve correctly
-WORKDIR /app/apps/taktik/apps/web
+WORKDIR /app/apps/times/apps/web
# Copy the pnpm store that symlinks point to (at /app/node_modules/.pnpm)
COPY --from=builder /app/node_modules/.pnpm /app/node_modules/.pnpm
# Copy the app's node_modules (contains symlinks to the pnpm store)
-COPY --from=builder /app/apps/taktik/apps/web/node_modules ./node_modules
+COPY --from=builder /app/apps/times/apps/web/node_modules ./node_modules
# Copy built application
-COPY --from=builder /app/apps/taktik/apps/web/build ./build
-COPY --from=builder /app/apps/taktik/apps/web/package.json ./
+COPY --from=builder /app/apps/times/apps/web/build ./build
+COPY --from=builder /app/apps/times/apps/web/package.json ./
# Expose port
EXPOSE 5027
diff --git a/apps/taktik/apps/web/package.json b/apps/times/apps/web/package.json
similarity index 96%
rename from apps/taktik/apps/web/package.json
rename to apps/times/apps/web/package.json
index 976c4072b..cc1906d2e 100644
--- a/apps/taktik/apps/web/package.json
+++ b/apps/times/apps/web/package.json
@@ -1,5 +1,5 @@
{
- "name": "@taktik/web",
+ "name": "@times/web",
"version": "1.0.0",
"private": true,
"scripts": {
@@ -44,7 +44,7 @@
"@manacore/shared-types": "workspace:*",
"@manacore/shared-ui": "workspace:*",
"@manacore/shared-utils": "workspace:*",
- "@taktik/shared": "workspace:*",
+ "@times/shared": "workspace:*",
"date-fns": "^4.1.0",
"svelte-i18n": "^4.0.1"
},
diff --git a/apps/taktik/apps/web/src/app.css b/apps/times/apps/web/src/app.css
similarity index 100%
rename from apps/taktik/apps/web/src/app.css
rename to apps/times/apps/web/src/app.css
diff --git a/apps/taktik/apps/web/src/app.html b/apps/times/apps/web/src/app.html
similarity index 96%
rename from apps/taktik/apps/web/src/app.html
rename to apps/times/apps/web/src/app.html
index a5df47bb5..27fb3a849 100644
--- a/apps/taktik/apps/web/src/app.html
+++ b/apps/times/apps/web/src/app.html
@@ -9,7 +9,7 @@
-
Taktik
+ Times
%sveltekit.head%
diff --git a/apps/taktik/apps/web/src/lib/components/ConfirmDialog.svelte b/apps/times/apps/web/src/lib/components/ConfirmDialog.svelte
similarity index 100%
rename from apps/taktik/apps/web/src/lib/components/ConfirmDialog.svelte
rename to apps/times/apps/web/src/lib/components/ConfirmDialog.svelte
diff --git a/apps/taktik/apps/web/src/lib/components/EntryForm.svelte b/apps/times/apps/web/src/lib/components/EntryForm.svelte
similarity index 99%
rename from apps/taktik/apps/web/src/lib/components/EntryForm.svelte
rename to apps/times/apps/web/src/lib/components/EntryForm.svelte
index 548042100..401b6a0bc 100644
--- a/apps/taktik/apps/web/src/lib/components/EntryForm.svelte
+++ b/apps/times/apps/web/src/lib/components/EntryForm.svelte
@@ -2,7 +2,7 @@
import { getContext } from 'svelte';
import { _ } from 'svelte-i18n';
import { timeEntryCollection } from '$lib/data/local-store';
- import type { Project, Client } from '@taktik/shared';
+ import type { Project, Client } from '@times/shared';
let {
visible = false,
diff --git a/apps/taktik/apps/web/src/lib/components/EntryItem.svelte b/apps/times/apps/web/src/lib/components/EntryItem.svelte
similarity index 99%
rename from apps/taktik/apps/web/src/lib/components/EntryItem.svelte
rename to apps/times/apps/web/src/lib/components/EntryItem.svelte
index 0c5772aa8..68bedabf6 100644
--- a/apps/taktik/apps/web/src/lib/components/EntryItem.svelte
+++ b/apps/times/apps/web/src/lib/components/EntryItem.svelte
@@ -3,7 +3,7 @@
import { _ } from 'svelte-i18n';
import { timeEntryCollection } from '$lib/data/local-store';
import { formatDurationCompact } from '$lib/data/queries';
- import type { TimeEntry, Project, Client } from '@taktik/shared';
+ import type { TimeEntry, Project, Client } from '@times/shared';
import ConfirmDialog from './ConfirmDialog.svelte';
let {
diff --git a/apps/taktik/apps/web/src/lib/components/EntryList.svelte b/apps/times/apps/web/src/lib/components/EntryList.svelte
similarity index 97%
rename from apps/taktik/apps/web/src/lib/components/EntryList.svelte
rename to apps/times/apps/web/src/lib/components/EntryList.svelte
index 6aed4789a..d1f96cf83 100644
--- a/apps/taktik/apps/web/src/lib/components/EntryList.svelte
+++ b/apps/times/apps/web/src/lib/components/EntryList.svelte
@@ -2,7 +2,7 @@
import { _ } from 'svelte-i18n';
import EntryItem from './EntryItem.svelte';
import { groupEntriesByDate, getTotalDuration, formatDurationCompact } from '$lib/data/queries';
- import type { TimeEntry } from '@taktik/shared';
+ import type { TimeEntry } from '@times/shared';
let { entries }: { entries: TimeEntry[] } = $props();
diff --git a/apps/taktik/apps/web/src/lib/components/KeyboardShortcuts.svelte b/apps/times/apps/web/src/lib/components/KeyboardShortcuts.svelte
similarity index 100%
rename from apps/taktik/apps/web/src/lib/components/KeyboardShortcuts.svelte
rename to apps/times/apps/web/src/lib/components/KeyboardShortcuts.svelte
diff --git a/apps/taktik/apps/web/src/lib/components/QuickStart.svelte b/apps/times/apps/web/src/lib/components/QuickStart.svelte
similarity index 97%
rename from apps/taktik/apps/web/src/lib/components/QuickStart.svelte
rename to apps/times/apps/web/src/lib/components/QuickStart.svelte
index 0b4e35fa8..1d78a2cc9 100644
--- a/apps/taktik/apps/web/src/lib/components/QuickStart.svelte
+++ b/apps/times/apps/web/src/lib/components/QuickStart.svelte
@@ -2,7 +2,7 @@
import { getContext } from 'svelte';
import { _ } from 'svelte-i18n';
import { timerStore } from '$lib/stores/timer.svelte';
- import type { TimeEntry, Project } from '@taktik/shared';
+ import type { TimeEntry, Project } from '@times/shared';
const allTimeEntries = getContext<{ value: TimeEntry[] }>('timeEntries');
const allProjects = getContext<{ value: Project[] }>('projects');
diff --git a/apps/taktik/apps/web/src/lib/components/TimerCard.svelte b/apps/times/apps/web/src/lib/components/TimerCard.svelte
similarity index 99%
rename from apps/taktik/apps/web/src/lib/components/TimerCard.svelte
rename to apps/times/apps/web/src/lib/components/TimerCard.svelte
index 603647aa1..fa64fdc0a 100644
--- a/apps/taktik/apps/web/src/lib/components/TimerCard.svelte
+++ b/apps/times/apps/web/src/lib/components/TimerCard.svelte
@@ -3,7 +3,7 @@
import { _ } from 'svelte-i18n';
import { timerStore } from '$lib/stores/timer.svelte';
import { formatDuration } from '$lib/data/queries';
- import type { Project, Client } from '@taktik/shared';
+ import type { Project, Client } from '@times/shared';
const allProjects = getContext<{ value: Project[] }>('projects');
const allClients = getContext<{ value: Client[] }>('clients');
diff --git a/apps/taktik/apps/web/src/lib/components/TimerIndicator.svelte b/apps/times/apps/web/src/lib/components/TimerIndicator.svelte
similarity index 97%
rename from apps/taktik/apps/web/src/lib/components/TimerIndicator.svelte
rename to apps/times/apps/web/src/lib/components/TimerIndicator.svelte
index 4cbb34796..3768c69de 100644
--- a/apps/taktik/apps/web/src/lib/components/TimerIndicator.svelte
+++ b/apps/times/apps/web/src/lib/components/TimerIndicator.svelte
@@ -3,7 +3,7 @@
import { _ } from 'svelte-i18n';
import { timerStore } from '$lib/stores/timer.svelte';
import { formatDuration } from '$lib/data/queries';
- import type { Project } from '@taktik/shared';
+ import type { Project } from '@times/shared';
const allProjects = getContext<{ value: Project[] }>('projects');
diff --git a/apps/taktik/apps/web/src/lib/data/guest-seed.ts b/apps/times/apps/web/src/lib/data/guest-seed.ts
similarity index 99%
rename from apps/taktik/apps/web/src/lib/data/guest-seed.ts
rename to apps/times/apps/web/src/lib/data/guest-seed.ts
index ccad98d30..464ced626 100644
--- a/apps/taktik/apps/web/src/lib/data/guest-seed.ts
+++ b/apps/times/apps/web/src/lib/data/guest-seed.ts
@@ -1,5 +1,5 @@
/**
- * Guest seed data for the Taktik app.
+ * Guest seed data for the Times app.
*
* Provides demo clients, projects, and time entries for the guest experience.
*/
diff --git a/apps/taktik/apps/web/src/lib/data/local-store.ts b/apps/times/apps/web/src/lib/data/local-store.ts
similarity index 84%
rename from apps/taktik/apps/web/src/lib/data/local-store.ts
rename to apps/times/apps/web/src/lib/data/local-store.ts
index 22e5c759e..6fa0d8fe5 100644
--- a/apps/taktik/apps/web/src/lib/data/local-store.ts
+++ b/apps/times/apps/web/src/lib/data/local-store.ts
@@ -1,5 +1,5 @@
/**
- * Taktik — Local-First Data Layer
+ * Times — Local-First Data Layer
*
* IndexedDB (Dexie.js) with sync support for time tracking.
* Clients, projects, time entries, tags, templates, and settings.
@@ -13,7 +13,7 @@ import {
guestTags,
guestSettings,
} from './guest-seed';
-import type { BillingRate, ProjectVisibility, EntrySourceRef } from '@taktik/shared';
+import type { BillingRate, ProjectVisibility, EntrySourceRef } from '@times/shared';
// ─── Types ──────────────────────────────────────────────────
@@ -97,8 +97,8 @@ export interface LocalSettings extends BaseRecord {
const SYNC_SERVER_URL = import.meta.env.PUBLIC_SYNC_SERVER_URL || 'http://localhost:3050';
-export const taktikStore = createLocalStore({
- appId: 'taktik',
+export const timesStore = createLocalStore({
+ appId: 'times',
collections: [
{
name: 'clients',
@@ -145,9 +145,9 @@ export const taktikStore = createLocalStore({
});
// Typed collection accessors
-export const clientCollection = taktikStore.collection('clients');
-export const projectCollection = taktikStore.collection('projects');
-export const timeEntryCollection = taktikStore.collection('timeEntries');
-export const tagCollection = taktikStore.collection('tags');
-export const templateCollection = taktikStore.collection('templates');
-export const settingsCollection = taktikStore.collection('settings');
+export const clientCollection = timesStore.collection('clients');
+export const projectCollection = timesStore.collection('projects');
+export const timeEntryCollection = timesStore.collection('timeEntries');
+export const tagCollection = timesStore.collection('tags');
+export const templateCollection = timesStore.collection('templates');
+export const settingsCollection = timesStore.collection('settings');
diff --git a/apps/taktik/apps/web/src/lib/data/queries.test.ts b/apps/times/apps/web/src/lib/data/queries.test.ts
similarity index 99%
rename from apps/taktik/apps/web/src/lib/data/queries.test.ts
rename to apps/times/apps/web/src/lib/data/queries.test.ts
index 36244d127..dc7f51ba6 100644
--- a/apps/taktik/apps/web/src/lib/data/queries.test.ts
+++ b/apps/times/apps/web/src/lib/data/queries.test.ts
@@ -17,7 +17,7 @@ import {
getClientById,
getProjectsByClient,
} from './queries';
-import type { TimeEntry, Project, Client } from '@taktik/shared';
+import type { TimeEntry, Project, Client } from '@times/shared';
// ─── Test Factories ──────────────────────────────────────
diff --git a/apps/taktik/apps/web/src/lib/data/queries.ts b/apps/times/apps/web/src/lib/data/queries.ts
similarity index 98%
rename from apps/taktik/apps/web/src/lib/data/queries.ts
rename to apps/times/apps/web/src/lib/data/queries.ts
index e9a4d7970..bc9bf0d3f 100644
--- a/apps/taktik/apps/web/src/lib/data/queries.ts
+++ b/apps/times/apps/web/src/lib/data/queries.ts
@@ -1,5 +1,5 @@
/**
- * Reactive Queries & Pure Helpers for Taktik
+ * Reactive Queries & Pure Helpers for Times
*
* Uses Dexie liveQuery to automatically re-render when IndexedDB changes
* (local writes, sync updates, other tabs).
@@ -26,10 +26,10 @@ import type {
TimeEntry,
Tag,
EntryTemplate,
- TaktikSettings,
+ TimesSettings,
FilterCriteria,
SortOption,
-} from '@taktik/shared';
+} from '@times/shared';
// ─── Type Converters ───────────────────────────────────────
@@ -118,7 +118,7 @@ export function toTemplate(local: LocalTemplate): EntryTemplate {
};
}
-export function toSettings(local: LocalSettings): TaktikSettings {
+export function toSettings(local: LocalSettings): TimesSettings {
return {
id: local.id,
defaultBillingRate: local.defaultBillingRate ?? undefined,
@@ -178,7 +178,7 @@ export function useSettings() {
const locals = await settingsCollection.getAll();
return locals.length > 0 ? toSettings(locals[0]) : null;
},
- null as TaktikSettings | null
+ null as TimesSettings | null
);
}
diff --git a/apps/taktik/apps/web/src/lib/data/types.test.ts b/apps/times/apps/web/src/lib/data/types.test.ts
similarity index 97%
rename from apps/taktik/apps/web/src/lib/data/types.test.ts
rename to apps/times/apps/web/src/lib/data/types.test.ts
index 0021d0b35..f343b145e 100644
--- a/apps/taktik/apps/web/src/lib/data/types.test.ts
+++ b/apps/times/apps/web/src/lib/data/types.test.ts
@@ -5,11 +5,11 @@ import type {
TimeEntry,
Tag,
EntryTemplate,
- TaktikSettings,
+ TimesSettings,
BillingRate,
FilterCriteria,
SortOption,
-} from '@taktik/shared';
+} from '@times/shared';
describe('Shared Types', () => {
it('BillingRate has correct shape', () => {
diff --git a/apps/taktik/apps/web/src/lib/i18n/index.ts b/apps/times/apps/web/src/lib/i18n/index.ts
similarity index 89%
rename from apps/taktik/apps/web/src/lib/i18n/index.ts
rename to apps/times/apps/web/src/lib/i18n/index.ts
index bf8800877..e6ce82614 100644
--- a/apps/taktik/apps/web/src/lib/i18n/index.ts
+++ b/apps/times/apps/web/src/lib/i18n/index.ts
@@ -11,7 +11,7 @@ register('en', () => import('./locales/en.json'));
function getInitialLocale(): SupportedLocale {
if (browser) {
- const stored = localStorage.getItem('taktik_locale');
+ const stored = localStorage.getItem('times_locale');
if (stored && supportedLocales.includes(stored as SupportedLocale)) {
return stored as SupportedLocale;
}
@@ -31,7 +31,7 @@ init({
export function setLocale(newLocale: SupportedLocale) {
locale.set(newLocale);
if (browser) {
- localStorage.setItem('taktik_locale', newLocale);
+ localStorage.setItem('times_locale', newLocale);
}
}
diff --git a/apps/taktik/apps/web/src/lib/i18n/locales/de.json b/apps/times/apps/web/src/lib/i18n/locales/de.json
similarity index 99%
rename from apps/taktik/apps/web/src/lib/i18n/locales/de.json
rename to apps/times/apps/web/src/lib/i18n/locales/de.json
index 27aedbc0f..5d3ae1077 100644
--- a/apps/taktik/apps/web/src/lib/i18n/locales/de.json
+++ b/apps/times/apps/web/src/lib/i18n/locales/de.json
@@ -1,6 +1,6 @@
{
"app": {
- "name": "Taktik",
+ "name": "Times",
"loading": "Laden...",
"tagline": "Dein Arbeitsrhythmus, messbar gemacht."
},
diff --git a/apps/taktik/apps/web/src/lib/i18n/locales/en.json b/apps/times/apps/web/src/lib/i18n/locales/en.json
similarity index 99%
rename from apps/taktik/apps/web/src/lib/i18n/locales/en.json
rename to apps/times/apps/web/src/lib/i18n/locales/en.json
index f6adc8157..1f310d620 100644
--- a/apps/taktik/apps/web/src/lib/i18n/locales/en.json
+++ b/apps/times/apps/web/src/lib/i18n/locales/en.json
@@ -1,6 +1,6 @@
{
"app": {
- "name": "Taktik",
+ "name": "Times",
"loading": "Loading...",
"tagline": "Your work rhythm, made measurable."
},
diff --git a/apps/taktik/apps/web/src/lib/stores/auth.svelte.ts b/apps/times/apps/web/src/lib/stores/auth.svelte.ts
similarity index 100%
rename from apps/taktik/apps/web/src/lib/stores/auth.svelte.ts
rename to apps/times/apps/web/src/lib/stores/auth.svelte.ts
diff --git a/apps/taktik/apps/web/src/lib/stores/navigation.ts b/apps/times/apps/web/src/lib/stores/navigation.ts
similarity index 100%
rename from apps/taktik/apps/web/src/lib/stores/navigation.ts
rename to apps/times/apps/web/src/lib/stores/navigation.ts
diff --git a/apps/taktik/apps/web/src/lib/stores/theme.ts b/apps/times/apps/web/src/lib/stores/theme.ts
similarity index 87%
rename from apps/taktik/apps/web/src/lib/stores/theme.ts
rename to apps/times/apps/web/src/lib/stores/theme.ts
index d5ded30af..08689a37b 100644
--- a/apps/taktik/apps/web/src/lib/stores/theme.ts
+++ b/apps/times/apps/web/src/lib/stores/theme.ts
@@ -1,6 +1,6 @@
import { createThemeStore } from '@manacore/shared-theme';
export const theme = createThemeStore({
- appId: 'taktik',
+ appId: 'times',
defaultVariant: 'ocean',
});
diff --git a/apps/taktik/apps/web/src/lib/stores/timer.svelte.ts b/apps/times/apps/web/src/lib/stores/timer.svelte.ts
similarity index 100%
rename from apps/taktik/apps/web/src/lib/stores/timer.svelte.ts
rename to apps/times/apps/web/src/lib/stores/timer.svelte.ts
diff --git a/apps/taktik/apps/web/src/lib/stores/user-settings.svelte.ts b/apps/times/apps/web/src/lib/stores/user-settings.svelte.ts
similarity index 97%
rename from apps/taktik/apps/web/src/lib/stores/user-settings.svelte.ts
rename to apps/times/apps/web/src/lib/stores/user-settings.svelte.ts
index 73ffe777f..5a96e282b 100644
--- a/apps/taktik/apps/web/src/lib/stores/user-settings.svelte.ts
+++ b/apps/times/apps/web/src/lib/stores/user-settings.svelte.ts
@@ -12,7 +12,7 @@ function getAuthUrl(): string {
}
export const userSettings = createUserSettingsStore({
- appId: 'taktik',
+ appId: 'times',
authUrl: getAuthUrl,
getAccessToken: () => authStore.getAccessToken(),
});
diff --git a/apps/taktik/apps/web/src/lib/stores/view.svelte.ts b/apps/times/apps/web/src/lib/stores/view.svelte.ts
similarity index 94%
rename from apps/taktik/apps/web/src/lib/stores/view.svelte.ts
rename to apps/times/apps/web/src/lib/stores/view.svelte.ts
index d0b94a1a9..b00bd0901 100644
--- a/apps/taktik/apps/web/src/lib/stores/view.svelte.ts
+++ b/apps/times/apps/web/src/lib/stores/view.svelte.ts
@@ -1,9 +1,9 @@
import { browser } from '$app/environment';
-import type { ViewMode, SortOption, FilterCriteria, SavedFilter } from '@taktik/shared';
+import type { ViewMode, SortOption, FilterCriteria, SavedFilter } from '@times/shared';
-const VIEW_KEY = 'taktik_view_mode';
-const SORT_KEY = 'taktik_sort';
-const FILTERS_KEY = 'taktik_saved_filters';
+const VIEW_KEY = 'times_view_mode';
+const SORT_KEY = 'times_sort';
+const FILTERS_KEY = 'times_saved_filters';
function load(key: string, fallback: T): T {
if (!browser) return fallback;
diff --git a/apps/taktik/apps/web/src/lib/utils/export.test.ts b/apps/times/apps/web/src/lib/utils/export.test.ts
similarity index 98%
rename from apps/taktik/apps/web/src/lib/utils/export.test.ts
rename to apps/times/apps/web/src/lib/utils/export.test.ts
index 83bb6aa4e..e22b1ded3 100644
--- a/apps/taktik/apps/web/src/lib/utils/export.test.ts
+++ b/apps/times/apps/web/src/lib/utils/export.test.ts
@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest';
-import type { TimeEntry, Project, Client } from '@taktik/shared';
+import type { TimeEntry, Project, Client } from '@times/shared';
// We test the CSV generation logic without triggering DOM download.
// This mirrors the core logic from export.ts.
diff --git a/apps/taktik/apps/web/src/lib/utils/export.ts b/apps/times/apps/web/src/lib/utils/export.ts
similarity index 91%
rename from apps/taktik/apps/web/src/lib/utils/export.ts
rename to apps/times/apps/web/src/lib/utils/export.ts
index 588d3be9f..bb3841c2a 100644
--- a/apps/taktik/apps/web/src/lib/utils/export.ts
+++ b/apps/times/apps/web/src/lib/utils/export.ts
@@ -2,7 +2,7 @@
* CSV Export utility for time entries
*/
-import type { TimeEntry, Project, Client } from '@taktik/shared';
+import type { TimeEntry, Project, Client } from '@times/shared';
export function exportEntriesToCSV(
entries: TimeEntry[],
@@ -55,7 +55,7 @@ export function exportEntriesToCSV(
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
- a.download = `taktik-export-${new Date().toISOString().split('T')[0]}.csv`;
+ a.download = `times-export-${new Date().toISOString().split('T')[0]}.csv`;
a.click();
URL.revokeObjectURL(url);
}
diff --git a/apps/taktik/apps/web/src/lib/utils/rounding.test.ts b/apps/times/apps/web/src/lib/utils/rounding.test.ts
similarity index 100%
rename from apps/taktik/apps/web/src/lib/utils/rounding.test.ts
rename to apps/times/apps/web/src/lib/utils/rounding.test.ts
diff --git a/apps/taktik/apps/web/src/lib/utils/rounding.ts b/apps/times/apps/web/src/lib/utils/rounding.ts
similarity index 94%
rename from apps/taktik/apps/web/src/lib/utils/rounding.ts
rename to apps/times/apps/web/src/lib/utils/rounding.ts
index 39b3fab21..229542f0f 100644
--- a/apps/taktik/apps/web/src/lib/utils/rounding.ts
+++ b/apps/times/apps/web/src/lib/utils/rounding.ts
@@ -4,7 +4,7 @@
* Applies rounding based on user settings (increment + method).
*/
-import type { RoundingMethod } from '@taktik/shared';
+import type { RoundingMethod } from '@times/shared';
/**
* Round a duration in seconds based on settings.
diff --git a/apps/taktik/apps/web/src/lib/version.ts b/apps/times/apps/web/src/lib/version.ts
similarity index 100%
rename from apps/taktik/apps/web/src/lib/version.ts
rename to apps/times/apps/web/src/lib/version.ts
diff --git a/apps/taktik/apps/web/src/routes/(app)/+layout.svelte b/apps/times/apps/web/src/routes/(app)/+layout.svelte
similarity index 96%
rename from apps/taktik/apps/web/src/routes/(app)/+layout.svelte
rename to apps/times/apps/web/src/routes/(app)/+layout.svelte
index 18a9f3999..d9e7d31b4 100644
--- a/apps/taktik/apps/web/src/routes/(app)/+layout.svelte
+++ b/apps/times/apps/web/src/routes/(app)/+layout.svelte
@@ -13,7 +13,7 @@
import { getPillAppItems } from '@manacore/shared-branding';
import { AuthGate, GuestWelcomeModal } from '@manacore/shared-auth-ui';
import { shouldShowGuestWelcome } from '@manacore/shared-auth-ui';
- import { taktikStore } from '$lib/data/local-store';
+ import { timesStore } from '$lib/data/local-store';
import {
useAllClients,
useAllProjects,
@@ -46,17 +46,17 @@
setContext('settings', settings);
async function handleAuthReady() {
- await taktikStore.initialize();
+ await timesStore.initialize();
if (authStore.isAuthenticated) {
- taktikStore.startSync(() => authStore.getValidToken());
+ timesStore.startSync(() => authStore.getValidToken());
}
viewStore.initialize();
await timerStore.initialize();
initialized = true;
- if (!authStore.isAuthenticated && shouldShowGuestWelcome('taktik')) {
+ if (!authStore.isAuthenticated && shouldShowGuestWelcome('times')) {
showGuestWelcome = true;
}
}
@@ -105,7 +105,7 @@
/>
- Taktik
+ Times
@@ -203,7 +203,7 @@
(showGuestWelcome = false)}
onLogin={() => goto('/login')}
diff --git a/apps/taktik/apps/web/src/routes/(app)/+page.svelte b/apps/times/apps/web/src/routes/(app)/+page.svelte
similarity index 96%
rename from apps/taktik/apps/web/src/routes/(app)/+page.svelte
rename to apps/times/apps/web/src/routes/(app)/+page.svelte
index db82f9b3a..c0e2d0a1b 100644
--- a/apps/taktik/apps/web/src/routes/(app)/+page.svelte
+++ b/apps/times/apps/web/src/routes/(app)/+page.svelte
@@ -1,7 +1,7 @@
- Timer | Taktik
+ Timer | Times
diff --git a/apps/taktik/apps/web/src/routes/(app)/clients/+page.svelte b/apps/times/apps/web/src/routes/(app)/clients/+page.svelte
similarity index 98%
rename from apps/taktik/apps/web/src/routes/(app)/clients/+page.svelte
rename to apps/times/apps/web/src/routes/(app)/clients/+page.svelte
index 8494a4163..533a8d157 100644
--- a/apps/taktik/apps/web/src/routes/(app)/clients/+page.svelte
+++ b/apps/times/apps/web/src/routes/(app)/clients/+page.svelte
@@ -3,8 +3,8 @@
import { _ } from 'svelte-i18n';
import { clientCollection } from '$lib/data/local-store';
import { getTotalDuration, formatDurationCompact } from '$lib/data/queries';
- import type { Client, Project, TimeEntry } from '@taktik/shared';
- import { PROJECT_COLORS } from '@taktik/shared/constants';
+ import type { Client, Project, TimeEntry } from '@times/shared';
+ import { PROJECT_COLORS } from '@times/shared/constants';
import ConfirmDialog from '$lib/components/ConfirmDialog.svelte';
const allClients = getContext<{ value: Client[] }>('clients');
@@ -101,7 +101,7 @@
- {$_('nav.clients')} | Taktik
+ {$_('nav.clients')} | Times
diff --git a/apps/taktik/apps/web/src/routes/(app)/clients/[id]/+page.svelte b/apps/times/apps/web/src/routes/(app)/clients/[id]/+page.svelte
similarity index 97%
rename from apps/taktik/apps/web/src/routes/(app)/clients/[id]/+page.svelte
rename to apps/times/apps/web/src/routes/(app)/clients/[id]/+page.svelte
index e13fce126..babc0a262 100644
--- a/apps/taktik/apps/web/src/routes/(app)/clients/[id]/+page.svelte
+++ b/apps/times/apps/web/src/routes/(app)/clients/[id]/+page.svelte
@@ -10,7 +10,7 @@
formatDurationDecimal,
} from '$lib/data/queries';
import EntryList from '$lib/components/EntryList.svelte';
- import type { Project, Client, TimeEntry } from '@taktik/shared';
+ import type { Project, Client, TimeEntry } from '@times/shared';
const allClients = getContext<{ value: Client[] }>('clients');
const allProjects = getContext<{ value: Project[] }>('projects');
@@ -42,7 +42,7 @@
- {client?.name || 'Kunde'} | Taktik
+ {client?.name || 'Kunde'} | Times
{#if !client}
diff --git a/apps/taktik/apps/web/src/routes/(app)/entries/+page.svelte b/apps/times/apps/web/src/routes/(app)/entries/+page.svelte
similarity index 97%
rename from apps/taktik/apps/web/src/routes/(app)/entries/+page.svelte
rename to apps/times/apps/web/src/routes/(app)/entries/+page.svelte
index 4d2fccb47..d35215e09 100644
--- a/apps/taktik/apps/web/src/routes/(app)/entries/+page.svelte
+++ b/apps/times/apps/web/src/routes/(app)/entries/+page.svelte
@@ -1,7 +1,7 @@
- {$_('nav.entries')} | Taktik
+ {$_('nav.entries')} | Times
diff --git a/apps/taktik/apps/web/src/routes/(app)/feedback/+page.svelte b/apps/times/apps/web/src/routes/(app)/feedback/+page.svelte
similarity index 88%
rename from apps/taktik/apps/web/src/routes/(app)/feedback/+page.svelte
rename to apps/times/apps/web/src/routes/(app)/feedback/+page.svelte
index c71b318f0..728c121cc 100644
--- a/apps/taktik/apps/web/src/routes/(app)/feedback/+page.svelte
+++ b/apps/times/apps/web/src/routes/(app)/feedback/+page.svelte
@@ -3,7 +3,7 @@
- Feedback | Taktik
+ Feedback | Times
diff --git a/apps/taktik/apps/web/src/routes/(app)/help/+page.svelte b/apps/times/apps/web/src/routes/(app)/help/+page.svelte
similarity index 89%
rename from apps/taktik/apps/web/src/routes/(app)/help/+page.svelte
rename to apps/times/apps/web/src/routes/(app)/help/+page.svelte
index 14e51499b..026f98656 100644
--- a/apps/taktik/apps/web/src/routes/(app)/help/+page.svelte
+++ b/apps/times/apps/web/src/routes/(app)/help/+page.svelte
@@ -3,7 +3,7 @@
- Hilfe | Taktik
+ Hilfe | Times
diff --git a/apps/taktik/apps/web/src/routes/(app)/mana/+page.svelte b/apps/times/apps/web/src/routes/(app)/mana/+page.svelte
similarity index 89%
rename from apps/taktik/apps/web/src/routes/(app)/mana/+page.svelte
rename to apps/times/apps/web/src/routes/(app)/mana/+page.svelte
index 8e964a054..591e3cb50 100644
--- a/apps/taktik/apps/web/src/routes/(app)/mana/+page.svelte
+++ b/apps/times/apps/web/src/routes/(app)/mana/+page.svelte
@@ -3,7 +3,7 @@
- Mana | Taktik
+ Mana | Times
diff --git a/apps/taktik/apps/web/src/routes/(app)/profile/+page.svelte b/apps/times/apps/web/src/routes/(app)/profile/+page.svelte
similarity index 89%
rename from apps/taktik/apps/web/src/routes/(app)/profile/+page.svelte
rename to apps/times/apps/web/src/routes/(app)/profile/+page.svelte
index c3a07ad34..fa18b6d5a 100644
--- a/apps/taktik/apps/web/src/routes/(app)/profile/+page.svelte
+++ b/apps/times/apps/web/src/routes/(app)/profile/+page.svelte
@@ -3,7 +3,7 @@
- Profil | Taktik
+ Profil | Times
diff --git a/apps/taktik/apps/web/src/routes/(app)/projects/+page.svelte b/apps/times/apps/web/src/routes/(app)/projects/+page.svelte
similarity index 98%
rename from apps/taktik/apps/web/src/routes/(app)/projects/+page.svelte
rename to apps/times/apps/web/src/routes/(app)/projects/+page.svelte
index ddf264dbb..0a1ea835f 100644
--- a/apps/taktik/apps/web/src/routes/(app)/projects/+page.svelte
+++ b/apps/times/apps/web/src/routes/(app)/projects/+page.svelte
@@ -3,8 +3,8 @@
import { _ } from 'svelte-i18n';
import { projectCollection } from '$lib/data/local-store';
import { getTotalDuration, formatDurationCompact } from '$lib/data/queries';
- import type { Project, Client, TimeEntry } from '@taktik/shared';
- import { PROJECT_COLORS } from '@taktik/shared/constants';
+ import type { Project, Client, TimeEntry } from '@times/shared';
+ import { PROJECT_COLORS } from '@times/shared/constants';
import ConfirmDialog from '$lib/components/ConfirmDialog.svelte';
const allProjects = getContext<{ value: Project[] }>('projects');
@@ -109,7 +109,7 @@
- {$_('nav.projects')} | Taktik
+ {$_('nav.projects')} | Times
diff --git a/apps/taktik/apps/web/src/routes/(app)/projects/[id]/+page.svelte b/apps/times/apps/web/src/routes/(app)/projects/[id]/+page.svelte
similarity index 98%
rename from apps/taktik/apps/web/src/routes/(app)/projects/[id]/+page.svelte
rename to apps/times/apps/web/src/routes/(app)/projects/[id]/+page.svelte
index 600ed8913..7db40156c 100644
--- a/apps/taktik/apps/web/src/routes/(app)/projects/[id]/+page.svelte
+++ b/apps/times/apps/web/src/routes/(app)/projects/[id]/+page.svelte
@@ -11,8 +11,8 @@
formatDurationDecimal,
} from '$lib/data/queries';
import EntryList from '$lib/components/EntryList.svelte';
- import type { Project, Client, TimeEntry } from '@taktik/shared';
- import { PROJECT_COLORS } from '@taktik/shared/constants';
+ import type { Project, Client, TimeEntry } from '@times/shared';
+ import { PROJECT_COLORS } from '@times/shared/constants';
const allProjects = getContext<{ value: Project[] }>('projects');
const allClients = getContext<{ value: Client[] }>('clients');
@@ -82,7 +82,7 @@
- {project?.name || 'Projekt'} | Taktik
+ {project?.name || 'Projekt'} | Times
{#if !project}
diff --git a/apps/taktik/apps/web/src/routes/(app)/reports/+page.svelte b/apps/times/apps/web/src/routes/(app)/reports/+page.svelte
similarity index 98%
rename from apps/taktik/apps/web/src/routes/(app)/reports/+page.svelte
rename to apps/times/apps/web/src/routes/(app)/reports/+page.svelte
index 240c48df3..9b191f869 100644
--- a/apps/taktik/apps/web/src/routes/(app)/reports/+page.svelte
+++ b/apps/times/apps/web/src/routes/(app)/reports/+page.svelte
@@ -1,7 +1,7 @@
- {$_('nav.reports')} | Taktik
+ {$_('nav.reports')} | Times
diff --git a/apps/taktik/apps/web/src/routes/(app)/settings/+page.svelte b/apps/times/apps/web/src/routes/(app)/settings/+page.svelte
similarity index 97%
rename from apps/taktik/apps/web/src/routes/(app)/settings/+page.svelte
rename to apps/times/apps/web/src/routes/(app)/settings/+page.svelte
index 719b40c0a..3266bdfde 100644
--- a/apps/taktik/apps/web/src/routes/(app)/settings/+page.svelte
+++ b/apps/times/apps/web/src/routes/(app)/settings/+page.svelte
@@ -2,10 +2,10 @@
import { getContext } from 'svelte';
import { _ } from 'svelte-i18n';
import { settingsCollection } from '$lib/data/local-store';
- import type { TaktikSettings } from '@taktik/shared';
- import { CURRENCIES, ROUNDING_INCREMENTS } from '@taktik/shared/constants';
+ import type { TimesSettings } from '@times/shared';
+ import { CURRENCIES, ROUNDING_INCREMENTS } from '@times/shared/constants';
- const settings = getContext<{ value: TaktikSettings | null }>('settings');
+ const settings = getContext<{ value: TimesSettings | null }>('settings');
// Local edit state, synced from settings
let workingHoursPerDay = $state(8);
@@ -49,7 +49,7 @@
- {$_('settings.title')} | Taktik
+ {$_('settings.title')} | Times
diff --git a/apps/taktik/apps/web/src/routes/(app)/templates/+page.svelte b/apps/times/apps/web/src/routes/(app)/templates/+page.svelte
similarity index 98%
rename from apps/taktik/apps/web/src/routes/(app)/templates/+page.svelte
rename to apps/times/apps/web/src/routes/(app)/templates/+page.svelte
index 7c04d45da..805040f1a 100644
--- a/apps/taktik/apps/web/src/routes/(app)/templates/+page.svelte
+++ b/apps/times/apps/web/src/routes/(app)/templates/+page.svelte
@@ -3,7 +3,7 @@
import { _ } from 'svelte-i18n';
import { templateCollection, timeEntryCollection } from '$lib/data/local-store';
import { timerStore } from '$lib/stores/timer.svelte';
- import type { EntryTemplate, Project, Client } from '@taktik/shared';
+ import type { EntryTemplate, Project, Client } from '@times/shared';
const allTemplates = getContext<{ value: EntryTemplate[] }>('templates');
const allProjects = getContext<{ value: Project[] }>('projects');
@@ -64,7 +64,7 @@
- {$_('nav.templates')} | Taktik
+ {$_('nav.templates')} | Times
diff --git a/apps/taktik/apps/web/src/routes/(app)/themes/+page.svelte b/apps/times/apps/web/src/routes/(app)/themes/+page.svelte
similarity index 88%
rename from apps/taktik/apps/web/src/routes/(app)/themes/+page.svelte
rename to apps/times/apps/web/src/routes/(app)/themes/+page.svelte
index 8a8878ce4..000b1b683 100644
--- a/apps/taktik/apps/web/src/routes/(app)/themes/+page.svelte
+++ b/apps/times/apps/web/src/routes/(app)/themes/+page.svelte
@@ -3,7 +3,7 @@
- Themes | Taktik
+ Themes | Times
diff --git a/apps/taktik/apps/web/src/routes/(auth)/+layout.svelte b/apps/times/apps/web/src/routes/(auth)/+layout.svelte
similarity index 100%
rename from apps/taktik/apps/web/src/routes/(auth)/+layout.svelte
rename to apps/times/apps/web/src/routes/(auth)/+layout.svelte
diff --git a/apps/taktik/apps/web/src/routes/(auth)/login/+page.svelte b/apps/times/apps/web/src/routes/(auth)/login/+page.svelte
similarity index 99%
rename from apps/taktik/apps/web/src/routes/(auth)/login/+page.svelte
rename to apps/times/apps/web/src/routes/(auth)/login/+page.svelte
index 74438d766..b62dd355d 100644
--- a/apps/taktik/apps/web/src/routes/(auth)/login/+page.svelte
+++ b/apps/times/apps/web/src/routes/(auth)/login/+page.svelte
@@ -96,7 +96,7 @@
- {showRegister ? $_('auth.register') : $_('auth.login')} | Taktik
+ {showRegister ? $_('auth.register') : $_('auth.login')} | Times