Skip to main content
daagwerk

Structure & Freedom

This is daagwerk.

Fifty-six features. One goal: time tracking should feel like a single motion, not a form. We've sorted them into three tiers — from the daily craft, through the economic shield, down to the invisible foundation. If you're looking for something specific, type it into the field at the top.

Tier 1

The daily craft

For everyone who tracks time.

These features turn day-to-day time tracking from a chore into a fluid, frictionless workflow. Everything here touches you every day — most of it, without you having to think about it.

First: the mental model

The three-tier standard hierarchy

Structuring work through Accounts, Projects and Jobs.

The core concept for organising time is the cascade Account → Project → Job. An Account represents the client, customer or an internal department, while a Project bundles the concrete undertaking. The Job finally defines the exact, bookable activity. This structure is flexible enough to model the working styles of agencies, consultancies, corporations and trades alike.

A lightning-fast entry

Intelligent global full-text search

Cross-cutting real-time search across Accounts, Projects and Jobs.

The keyboard shortcuts ⌘K (Mac) or Ctrl+K (Windows) activate a fault-tolerant token search from anywhere in the app. The system searches every layer at once, so three letters are usually enough to find the exact task. Matched terms are visually highlighted, and pressing Enter starts the timer immediately.

Quick-start via direct play buttons

Start a timer with a single click, right from your work lists.

In the account overview and in every project table, each active task is prefixed with a small, lime-green play button. A single click starts the timer for that specific job — no detour through search fields or modals. If the job is inactive or a timer is already running on it, the system blocks the action and shows a matching warning.

Personal & enterprise favourites

Pin your most-used account-and-job combinations for instant access.

Users can save frequently used combinations as personal favourites, ready to start with a single tap in the entry tab. For company-wide standards — like general project management or internal admin — managers can define tenant-wide favourites via company_favorites. These are visually distinct and available to the whole team.

Dynamic "recent jobs" list

Automatic log of the most recently used tasks.

Below the favourites, the software automatically lists the last distinct jobs the user has tracked time against. The size of this section is configurable per user profile between 0 and 25 entries. After every timer stop, this list updates in real time, minimising repetitive clicks.

Focus in the chaos

Quick-start timer & private inbox

Start a timer immediately, without classifying it up front.

A prominent, amber lightning button in the sidebar lets users start an unassigned blank timer with an optional free-text note. Once stopped, the entry lands in a private inbox that stays invisible even to managers, for GDPR reasons. Only afterwards is the entry linked to a real job through the AssignJobModal, at which point rounding rules and budgets are recalculated.

Unlimited parallel multi-timers

Run several time stamps at once, per user.

The system lets every user keep an unlimited number of timers active in parallel. This maps directly onto the reality of agency life, where meetings, unexpected phone calls and parallel sprints overlap. Timers run cleanly separated by job and project on the server side, without users having to log out or split data by hand.

Catching up without friction

Fully manual bookings (from — to)

Retroactive time tracking for offline hours or missed sessions.

When time needs to be logged after the fact, the NewBookingModal in the sidebar is the tool. It supports manually entered start and end times, or hard durations. The form has real-time validation that blocks saving on illogical inputs (end before start) and immediately triggers automatic midnight splitting once saved.

Automatic end-date sync

Intelligent date adjustment on manual bookings.

When a user changes the start date of a booking in advanced edit mode, the system moves the end date along with it. This helper deliberately only kicks in for single-day bookings, so complex multi-day entries stay intact. It prevents accidents where invalid time ranges quietly slip through.

Type-first DateTime input ("Harvest-style")

Keyboard-friendly time entry without blocking overlays.

To enable fast typing without mouse dependency, the calendar popovers on date fields no longer open automatically on focus. Direct typing in the input stays permanently available. The graphical calendar (flatpickr) opens only on an explicit click on the dedicated icon at the right of the field.

Text templates & note presets

Store recurring text for booking comments.

To cut down on typing on standardised tasks, daagwerk offers a template system for booking notes. Text templates can be defined globally for the whole tenant, specifically for one account, or directly for a single job. When capturing or editing time, the user gets a dropdown that inserts the chosen text without error.

Automatic midnight splitting (Cross-Day-Split)

Automatic split of bookings that cross the midnight line.

If a timer or a manual booking runs past the midnight boundary of the tenant's timezone, the backend automatically decomposes the range into per-day segments. Each segment is stored as its own time_entry. Rounding rules and budget checks run separately per day, which prevents unrealistic utilisation spikes.

Personal balance

Personal work-time models

Store individual weekly hours and working days.

Every user can define their exact working arrangement in their profile. Alongside the contractual weekly hours, seven dedicated workday pills specify precisely on which weekdays (Mon–Sun) work is to be performed. The system derives the daily target from this.

Dynamic planned-vs-actual balance (week/month/year)

Graphic visualisation of your personal workload.

In the workload tab, actually captured hours (actual) are mirrored in real time against the calculated planned model. The view can switch flexibly between weekly, monthly and yearly perspectives, with the system auto-scaling the Y axis of the bar charts. Over-tracking is signalled through adjustable colour codes and a top edge indicator.

Integrated absence tracker

Capture and dynamically factor in time off.

Users can log absences such as vacation, comp time or sick days directly. The form distinguishes between full and half days, with half days reducing the day's target by exactly 50 %. In the workload tab, these entries appear with matching i18n labels (e.g. Vacation (½)) directly under the date.

Localised holidays engine

Automatic target reduction on statutory holidays.

The backend has an integrated in-memory holidays computation for Germany. Based on Gauss's Easter formula, all movable and fixed holidays are calculated. Depending on the federal state stored in the user profile, the daily target is automatically set to zero on holidays and the day is rendered in the chart's grey free-day style.

Seamless mobility

Responsive web application

A modern, high-performance browser client for every device.

The primary web interface is built on a fast React and Vite stack. It's fully responsive across desktop, laptop and tablet, and supports quick, mouse-free navigation. A native, manually toggleable dark mode picks up system preferences and adapts all UI components (including the datepicker) to high contrast.

Native iOS SwiftUI app

A fully-fledged mobile client for iPhone.

The iOS app is written as a fully native SwiftUI app in Swift 6. It mirrors the web's core functionality: mobile users can start timers via full-text search, use the NewBookingSheet for manual from–to entries, or quick-start from the "recent jobs" section. A lilac PO badge under project rows also signals budget affiliation at a glance.

Native watchOS app with complications

Time tracking and timer control right from the wrist.

The Apple Watch app allows running timers to be managed independently, without reaching for the phone. It supports native complications in all common formats (Circular, Rectangular, Corner, Inline), so the current project time can be shown directly on the watch face. Token and data sync happen encrypted through the WatchConnectivity framework.

Native macOS menubar app

A standalone desktop client with fast menubar access.

The macOS app runs as a standalone menubar application in the Apple ecosystem. Its unobtrusive icon in the menubar shows the live time or the number of parallel timers whenever work is in progress. The global hotkey ⌘⇧B calls up the manual booking window from anywhere in the OS, without having to open the browser.

And the small things that smooth out the day — contextual help tooltips (HelpIcon) sit at the trickier corners of the interface, explaining complex concepts like the auto-switch or the negotiation gap right where they matter.

Tier 2

The economic shield

For project leads and management.

Here are the tools that make sure no money is burned, budgets hold, and end-of-month billing is done in minutes. Anyone negotiating with clients or owning margin spends most of their time here.

A precise data model

The precise booked/billable model

A strict separation between time actually worked and time that can be invoiced.

daagwerk stores every booking in two exact dimensions: booked_seconds (the actual time worked) and billable_seconds (the invoiceable time). The error-prone practice of working with percentages has been eliminated. All tables display billable time as HH:MM and immediately turn to a warning colour when the billable amount falls below the booked amount.

Four granular billing types per job

Control the billing method at the job level.

Every job is firmly bound to a billing type: hourly billable (invoiced by time spent), fixed price (time is captured for internal info only, invoicing is fixed), non-billable (e.g. internal admin), or fee/retainer (recurring_fee). The backend enforces these rules strictly; on a non-billable job, billable_seconds is automatically set to 0 on insert.

Dynamic hourly-rate inheritance (cascade)

Automatic propagation and flexible overrides of rates.

Amount calculations follow a strict hierarchical cascade: Tenant → Account → Project → Job. A base hourly rate can be defined globally, then overridden at any deeper level as often as needed. On every read, the system calculates the effectively valid rate for the specific booking.

Recurring fees & revenue resolver

Manage and cleanly evaluate retainer models.

Alongside time-based work, the recurring_fee type lets you store fixed amounts with defined rhythms and durations. The integrated arrangement resolver ensures these fees and fixed prices flow into budget evaluations as exact flat units. This effectively prevents flawed extrapolations (like accidentally multiplying fixed prices by hourly rates) in reporting.

Contract and budget compliance

First-class purchase orders

Manage contractual client budgets with hard limits.

Purchase orders are anchored deep in the system as standalone entities. Via an XOR constraint they hang either off a project or directly off a job, with exactly one PO active per carrier at any time. A PO manages validity periods, procurement budgets (in hours or money) and the associated client debtor data.

Automatic utilisation splitting (budget split)

Automatic split of time bookings on budget overrun.

When a time booking exceeds the remaining budget of an active purchase order, the system performs a linear interpolation. The booking is split at the exact budget boundary. The first segment fully consumes the old PO, while the remainder segment is automatically booked to a stored successor PO — or dropped as an orphaned entry into the backfill pool.

Inheritable rounding rules

Automatic rounding of time bookings on configurable rhythms.

Rounding rules (none, 5, 10, 15, 30, 60 minutes) can be defined at every level of the hierarchy. The system applies these rules automatically on every timer stop, manual entry or CSV import. So a tenant can bill globally to the minute, yet enforce a 15-minute cadence for a specific large client.

Multi-currency support (per-client currencies)

Flexibly manage different national currencies.

From the Business plan upwards, daagwerk supports maintaining client- and account-specific currencies from a pool of 11 world currencies. Revenue is captured per engagement in the correct target currency. On aggregated evaluations or in the PDF export, the system generates a clear "totals per currency" table to avoid exchange-rate distortions.

When it's burning: control and rescue

Automated, logged PO events

Systemd-driven monitoring of budgets and validity periods.

A systemd timer running every minute checks four critical core events in the background: PO exhausted, PO expiring, hitting budget thresholds (80 % / 100 %), and the presence of orphaned bookings. To prevent email floods, every event is deduplicated through a strict notification_log. A repeat alarm is only sent once the status materially changes.

Internal account roles & notification routing

Targeted routing of system alerts to project owners.

Accounts can be tagged with internal free-text roles, assigning responsibilities like Account Manager, Customer Success, or Client Contact. Operational system notifications are routed exclusively to these internal roles. This prevents automated budget warnings from accidentally reaching external recipients or plain time bookers.

The PO backfill wizard

Retroactively assign open bookings to new purchase orders.

Because new purchase orders often arrive with a delay in practice, bookings pile up in "negotiation gaps" without a PO link. The two-step backfill wizard lets managers select a range of dates and assign all open bookings collectively to a new PO. An integrated dry-run preview shows exactly, before writing, how many hours will be moved and whether the budget would be exceeded in the process.

Visual detection of orphaned bookings

Clear marking of work that sits outside any budget.

When a booking has no purchase_order_id, but the job or project does have historic POs, the backend computes the status is_orphaned. In the frontend, that booking is immediately marked with an amber "no PO" pill and an explanatory tooltip. This visually signals to management that work has been done outside any contract.

Efficiency in bulk

Advanced bulk edit

Change hundreds of bookings at once, in a single step.

Through a multi-select toolbar in the reports, managers can apply wide-reaching changes as a block. A smart checkbox-per-field pattern ensures only explicitly selected dimensions (like moving jobs, overwriting notes, or adjusting billability) are overwritten. Before finally saving, the system stores the old data in an audit-safe way.

Bulk date and time shifting

Quickly correct wrongly-booked team meetings.

Since iteration 3 of bulk edit, calendar dates and times can also be adjusted in bulk for large numbers of bookings. The system recalculates the duration entirely, taking the tenant's timezone and rounding rules into account. Rows where the new end would fall before the start are skipped with an error message.

Fast inline editing

Edit times directly in table rows, no modals required.

To keep administrative work as fluid as possible, the rows in booking lists and reports carry integrated inline editing. A click on the slim, teal edit button turns text fields directly into input controls for From, To, Note and Billability. Saving is a keyboard action away, without popups blocking the reading flow.

Planned bookings (forecast)

Create future time horizons and activate them later.

The system supports capturing future capacities and planned work as forecast bookings. These planned times flow into future budget utilisations, but don't yet trigger real invoicing amounts. Once the work is done, the entries can be activated with a single click and confirmed as real bookings.

Audit safety

The four-stage approval workflow

Lifecycle control for every captured time unit.

Every booking passes through the status stages Booked → Reviewed → Invoiced or Cancelled. The statuses are colour-coded throughout the system (teal, dark grey, pink). Managers use this workflow to release captured time for invoicing, while admins can also correct already-invoiced entries when needed.

Rigid period lock

Lock completed time periods against retroactive changes.

Managers have the right to finally close out historical weeks and months. Once a period is locked, the API blocks any write access (INSERT, UPDATE, DELETE) for every role in the system. This guarantees consistent data for financial accounting and prevents already-exported invoicing bases from being altered later.

Audit trail & change history

Audit-safe logging of every manual data change.

On every write or bulk update against an existing booking, the backend stores the exact previous state as a JSONB record in the time_entry_history table. Recorded are the old values for booked_seconds, billable_seconds, timestamps, notes and the job_id. This ensures gap-free traceability during audits.

Client-ready reports

Premium PDF platform (Layout 2 Editorial)

Generate client-ready deliverables records in bank-statement style.

Through a server-side Gotenberg pipeline, daagwerk renders highly professional, multi-page PDF reports using the typographically optimised Geist typeface. The layout wraps tables cleanly, repeats table headers (thead) automatically on continuation pages, and prevents the ugly cutoff of individual rows. Numbers are held tightly aligned with tabular nums.

Tenant custom branding for PDFs

Embed your own logos and brand colours in the PDF export.

Via the branding tab in the profile, admins can upload their company logo as a base64 data URI and define a primary colour. The premium PDF adapts these fully automatically: the defined primary colour overrides the accents (--primary), the logo is placed in the header, and the letterhead and per-page footer are branded accordingly.

Performance filter bar with saved views

Filter large volumes of bookings with per-user presets.

Reports allow filtering by accounts, projects, jobs, users, billing types, statuses and free-text notes across unbounded date ranges. The filter settings persist through a JSONB field in the user preferences. As a result, the chosen table configuration stays fully intact even after leaving the page or reloading.

Tri-state table column control

Flexibly show or hide information columns.

Tables like the booking list have column control via a dropdown. For complex columns like the purchase order number, a tri-state mode can be defined (Dynamic / Always on / Off). In "Dynamic" mode, the backend automatically checks whether the filtered set contains any data for the column, and hides the column without flicker if the feature isn't being used.

Structured multi-format data export

Provide time data in common machine-readable formats.

For processing in external ERP, accounting or BI systems, daagwerk delivers all reports at the press of a button in four standard formats: CSV (with BOM for Excel compatibility), JSON, XML and a pure PDF report. The exports are fully consistent with the filters set in the UI.

Bulk export as ZIP archive (bulk PDF)

Collected invoice download for every client, as one block.

For the monthly billing cycle, Business-plan users can request a collected ZIP stream through the /export/entries-bulk.zip route. In the background, the system generates a separate, filtered premium PDF for every active account and packs them structured into a single archive. Revenue tables are role-gated and visible only to managers.

Tier 3

The invisible foundation

For admin, IT and compliance.

These features sell the product at the decision-maker level. They take away every concern IT, procurement and the data-protection officer might have — and you almost never see them in daily work.

Data security

Data isolation through PostgreSQL Row-Level Security

Strictly isolated data spaces at the database level, for maximum security.

daagwerk is designed from the ground up as a true multi-tenant platform. Separation of individual tenants isn't merely cosmetic in code — it's enforced by PostgreSQL Row-Level Security directly at the database layer. No user can ever view or manipulate data from another tenant, because every API request is validated against the verified tenant_id from the JWT security token.

Granular role and permission system

Four security levels for controlling system permissions.

The system strictly differentiates between the roles Booker (may only capture/see their own time), Manager (may manage budgets, view rates, lock periods and pull team-wide reports), Admin (full tenant configuration) and Super-Admin (cross-tenant administration). These permissions are checked restrictively at the API level on every single request.

Integrated SMTP infrastructure with Redis rate limiting

Secure delivery of system emails with abuse protection.

For sending password reset links and budget notifications, daagwerk has a fully integrated SMTP pipeline via STARTTLS (port 587). To prevent spam attacks and server blocks, delivery is coupled to a Redis-based load check. It strictly limits password requests to at most three per email address per hour.

Structure & migration

Default account jobs (project-less direct booking)

Book tasks directly against a client without a mandatory project.

For long-standing existing clients or recurring support engagements without classic project structure, tasks can be created directly at the account level. Where needed, the system generates an invisible default project in the background. In lists and CSV exports, these bookings are consistently marked as (Default) so as not to break Excel filters, while in the client PDF they are automatically hidden for a clean appearance.

Hierarchy shifting (move actions)

Flexibly move tasks between accounts and projects.

Should the structure of an engagement change, daagwerk offers dedicated endpoints for restructuring. Jobs can be moved together with their historic bookings through commands like move-to-account or move-to-project. Before the final move, the backend automatically checks all inherited hourly rates and rounding rules to prevent calculation errors.

CSV hierarchy and time-entry import

Mass-import master data and time bookings via spreadsheet.

For migrations from legacy systems, daagwerk offers a two-track CSV importer. Alongside mass creation of client structures, time bookings can be imported through a per-user prefilled template. Before the final write, a row-by-row preview lists all validations and conflicts, with the user free to choose between the modes "Skip" or "Replace".

Data sovereignty

Daily systemd gzip backups & retention

Automated nightly backup of all tenant data.

A systemd timer triggers an automated backup cronjob every night at 02:00 on the German-hosted server. The system creates a complete, compressed JSON gzip snapshot of the entire isolated data set. A rolling 28-day retention policy automatically deletes older versions to save storage and maintain GDPR compliance.

Encrypted external WebDAV backup target

Automated secondary upload of backups to your own cloud storage.

In the company settings, admins can define an external WebDAV server (like Nextcloud or ownCloud) as a secondary backup destination. The system automatically transfers the daily encrypted snapshots there. A "Test connection" button validates the configuration immediately in the UI via a direct PROPFIND request.

Granular point-in-time restore (safety-first)

Safe restoration of data sets up to a chosen date.

In case of user error, admins can restore historic backups directly from a UI list. The system supports a full restore alongside a point-in-time mode that filters transactional data exactly to a given cutoff. To rule out data loss, the backend enforces an automatic safety backup of the current state before every restore process.

Compliance & maintenance

GDPR self-service data portability

Full download of all organisational data as a ZIP archive.

To fully meet the requirements of GDPR Art. 20 (data portability), every user has a global data export available in their profile. The system packs all accounts, projects, jobs, time bookings and user data ever captured into a compressed ZIP archive containing both structured JSON files and a fully flattened context CSV.

Comprehensive cleanup & purge UI

Central dashboard for cleaning up inactive data structures.

On a dedicated cleanup surface, administrators can inspect orphaned, unused or inactive-marked accounts, projects and jobs. The system aggregates the dangling records and allows final deletion (purge) as a block, provided no real bookings are still linked to the objects. This keeps the database lean and performant.

And tomorrow?

What's coming next lives on the roadmap.

daagwerk keeps growing. Upcoming features like the profitability layer with coverage charts are documented on the roadmap page — with a clear outlook on what lands in which version.