140

Project Management Dashboard Website Template

£29 View live demo or the whole Vault, £79.20

An eight-page project management dashboard in a dark, keyboard-first app shell: a project home with a giant title and a draggable hill chart that replays past weeks, an issue list that turns into a drag-and-drop board, issue detail with J and K, a Gantt timeline, an inbox to triage, settings with a live theme preview and Cmd K. Worked example: a brand studio running a ferry booking relaunch.

Flip advanced
17 more details
draggablepointer-dragtouch-dragsvg-pathkeyboard-navigationfocus-managementflip-layoutaccessible-filteringtimeline-controlstate-transitioncount-upclick-toggletabsstaggerload-sequencereduced-motionprogressive-enhancement

Released

About this template

A working project management app for any team that ships work in pieces: a product or engineering issue tracker, an agency's client projects, a fit-out or construction schedule, an event production plan or a marketing campaign board. It runs on a true black shell, built for OLED screens, with a sidebar you can collapse to icons, a raised page slab with a hairline edge, and almost no colour in the chrome. Colour belongs to the work: five scope hues, the project glyphs, the status icons and one cobalt blue for the section labels.

Read the full template overview

The project page is the centrepiece. A giant heavy title sits over a grid of tiles, each named by a coloured label set above the card. The widest tile is a hill chart: every part of the project is a dot on a bell curve, uphill while the team is still figuring it out and downhill once it is just a matter of doing it. Drag a dot along the line, or nudge it with the arrow keys, and the to-do list beside it re-orders by progress. A compare slider tweens every dot back through six weekly snapshots while dashed rings hold the current positions. Beneath it sit a message board with people's photos, the schedule, the team and a grid of files.

Seven more pages share the shell. Home greets the signed-in designer with her issues grouped by due date, project cards with small hill charts and recent activity. Issues is a dense list that becomes a status board, with filters, grouping, bulk moves and cards you can drag between columns by pointer or by keyboard. Each issue opens on one detail page rendered from a single data list, where J and K slide between issues. The timeline is a Gantt chart with draggable, resizable bars, dependency lines and a weeks or months zoom. The inbox triages notifications from the keyboard with a preview pane. Settings holds a profile with a live preview of how others see you, three appearance cards that re-theme the whole app as you choose, notification switches by event and channel, and the workspace members with invites. An account menu in the sidebar carries the same System, Light or Dark choice, and every icon-only control names itself and its shortcut in a tooltip. A components page lays out every building block in its states.

The worked example is Rookery, the app, signed in as Brindle, a nine-person brand and digital studio in Bristol, whose lead project is relaunching a ferry operator's booking site.

Project Management Dashboard - website template preview

What's included

14 items
  • Eight pages on one stylesheet and one script: Home, a project page, Issues, issue detail, Timeline, Inbox, Settings and a components page
  • Hill chart signature: scopes are buttons on a bell curve you drag along the line or move with the arrow keys, past the crest their ring fills, and labels never cover each other or a dot
  • Weekly compare slider that tweens every scope to an earlier snapshot, with dashed rings marking where each one stands now
  • To-dos by scope that re-order with Flip as dots move on the hill, with live done counts
  • Giant heavy project title over coloured section labels set above each tile: message board, schedule, team, docs and files
  • Issues as a grouped list or a status board, switched with Flip; filter chips, group by status, priority, project or assignee, and bulk move
  • Board cards drag between columns with a pointer, a held touch or the keyboard (Space to lift, arrows to move, Space to drop, Escape to cancel), with rolling column counts
  • Issue detail rendered from one data list: J and K or the arrows slide between issues, status, priority and assignee menus write to the activity feed, sub-tasks fill a progress ring and a composer adds comments
  • Gantt timeline: drag bars to reschedule, drag either end to resize, snapping to days; dependency lines redraw and turn red when a task starts before what it depends on; weeks or months zoom tweens one value
  • Inbox triage from the keyboard: J and K to move, E to archive, S to snooze, with undo, a preview pane that follows the selection and a sheet on phones
  • Settings: tabs linked to the address bar; a profile with photo, timezone, a live preview and an unsaved-changes bar; System, Light and Dark preview cards that re-theme the app from the card you click; notification switches with a channel each; members with role selects, invites with validation and removal with confirmation
  • Account menu from the sidebar with a three-way System, Light or Dark choice kept in step with the top-bar toggle, plus tooltips on every icon-only control showing its shortcut, on hover or keyboard focus and never on touch
  • Command menu (Cmd K or Ctrl K) that searches pages, actions and every issue; a New issue dialog; a keyboard shortcuts dialog
  • Dark and light themes that follow the visitor's system setting, on the same token names with measured contrast; sidebar collapsible to icons; phone tab bar with a More sheet; complete pages without JavaScript or with reduced motion

Perfect for

5 use cases
  • Project management and task tracking apps
  • Product and engineering issue trackers
  • Agency and client project portals
  • Construction, fit-out and event schedules
  • Marketing campaign and content planning boards

How it works

6 sections

Colour belongs to the work

The chrome uses only the shell, ground, surface and ink tokens, so the interface stays quiet. Five scope hues mark dots, project glyphs, status icons and timeline bars, each with a darker text partner in the light theme, and one cobalt signal colour names the tiles and marks the selection.

The hill chart

The curve is a single path, and each scope is a native button placed on it by its position from 0 to 100. Dragging looks up the nearest point on the curve to the pointer, so the dot can never leave the line. Each scope carries its weekly history in a data attribute, which the compare slider replays. Labels step around one another and the dots so none is hidden.

One row, two views

Every issue is a single list element carrying its status, priority, assignee and project as data attributes. Grouping, filtering and the board all move those same elements into new containers, and Flip animates them from where they were, so the list and the board can never disagree.

Pages that render from data

The issue detail page, the command menu search and the inbox preview all read one short list of issues at the top of the script. The default issue is written into the HTML so the page reads without JavaScript; a query string picks any other one.

Timeline on one custom property

Bars are positioned by their start day and length multiplied by a single day-width property, so zooming tweens one number and every bar, grid line, milestone and the today line follow. Dependency lines are redrawn from the bars' days whenever they move.

Keyboard first, with fallbacks

Menus, dialogs, the account menu, the More sheet and the command menu open through one overlay stack that traps focus and returns it to the opener. Every pointer interaction has a key equivalent. Without JavaScript the pages show at rest and a footer reaches every page; reduced motion keeps every interaction and drops the movement.

Plugins Flip
Difficulty Advanced
Includes HTML + JS + CSS source, documentation, AI setup prompt, lifetime updates

Lighthouse, as measured

Google Lighthouse on this template's demo (8 pages, lowest score shown), from the latest scan. A measurement of the demo as shipped, not a promise for your page.

Accessibility
100
Best practices
100

No performance score, on purpose. That figure depends on how you deploy: your server's compression and caching, your CDN, the connection and the device doing the test, none of which the code controls. The same page can score very differently on two consecutive runs, so measure it where it will live.

Questions about this template

Does this only suit a design studio?

No. Brindle and the ferry relaunch are the worked example. The same pages suit a product team's issue tracker, an agency's client portal, a construction or fit-out programme, event production or a marketing campaign plan. Rename the scopes, statuses and projects, swap the photos and the Rookery mark for your own, and the hill chart, board and timeline carry over unchanged.

How do I change the scopes on the hill chart?

Each scope is one button in the project page markup with a name, a hue and a data-history list of weekly positions from 0 to 100, oldest first. Add, remove or rename buttons and edit the week labels on the chart. The to-do groups beside it match scopes by the same key, and the compare slider reads however many weeks you give it.

Do new issues, comments and moves get saved?

No. The New issue dialog, comments, status changes, board drags, timeline edits and inbox triage all update the page immediately but store nothing, so a reload restores the demo. Each one ends in a small function in the script, which is where you would post the change to your own API, a backend such as Supabase or Firebase, or a tool like Linear or Jira.

How do I load my own issues?

The issue detail page, command menu and inbox preview read the ISSUES list at the top of the script, and the Issues page reads its rows from the HTML. Render both from your data source: the list as JSON, and the rows as the same list items with their data attributes. Filters, grouping, counts and the board work on whatever rows are there.

Can the timeline show a different date range?

Yes. The Gantt reads its start date and number of days from attributes on the chart, and each bar holds a start day and a length in days. Change those and the week and month labels in the scale, and the bars, grid, milestones, today line and dependency lines all lay themselves out from the same values. Weeks and months zoom levels are set in one place in the script.

Does it open in dark or light?

It follows the visitor's system setting, so a phone or laptop set to light opens light and one set to dark opens dark. Once someone uses the theme toggle their choice is remembered on that device. To force one theme for everyone, change the one line in each page's head that sets the theme. Both themes use the same token names with their own measured values, so any colour you change needs changing in both blocks.

Paid template

Purchase to unlock the code.

Buying Project Management Dashboard opens the HTML, CSS and JavaScript source, the full documentation, an AI setup prompt for your editor, and every update we ship to it. Standard license: unlimited personal and commercial projects. Every paid product is tested for desktop and mobile layouts, reduced-motion handling, animation cleanup and keyboard controls wherever there is something to operate.

£29 Standard license, unlimited projects

Browse free effects

Or the whole library: the Vault, £79.20, one payment.

Documentation

Quick Start

Static files, no build step. Serve the folder with any static server and open index.html:

Code snippet omitted: it ships with the download.

Each page loads, in this order:

Code snippet omitted: it ships with the download.

Using It With Your Own Design

  • Colour is two token blocks at the top of assets/style.css: dark under :root, :root[data-theme="dark"] and light under :root[data-theme="light"], with the same names. --signal is the section labels, primary button and selection; --green, --amber, --cyan, --violet and --rose are the five work hues, each with an -rgb triple and a -text partner for type.
  • The chrome never takes colour. Shell, ground, surface and ink carry the interface; colour is reserved for scopes, projects, statuses and labels. Keep that rule and any palette works.
  • Brand: replace the i-mark symbol in the SVG sprite at the top of each page, the favicon in each head, and the workspace name in the sidebar.
  • Type: Albert Sans for everything (the project title is weight 900) and Spline Sans Mono for ids, dates and keys. Swap the two @font-face rules and the --font and --mono tokens.
  • Theme default: the visitor's system setting (light or dark) until they use the toggle, which is then remembered in localStorage. A system change while the page is open is followed too. To force one theme for everyone, set it in the first head script on each page. Without JavaScript the page shows the dark theme.
  • Controls that need JavaScript carry data-js-only and are hidden on a plain document.

Pages and Configuration

Shared shell

A sidebar (workspace menu, search, new issue, Home, Inbox, My issues, projects with coloured glyphs, views) with aria-current="page" on the current link, collapsible to icons with the button at its foot or [; it starts collapsed between 768px and 1099px. A top bar holds breadcrumbs, search and the theme toggle. On phones the sidebar gives way to a bottom tab bar and a More sheet listing every page. A footer links every page so the site works without JavaScript. Copy these blocks between pages and move aria-current.

Re-pointing the data

  1. ISSUES at the top of assets/script.js (with PEOPLE, PROJECTS, STATUSES, PRIORITIES): the issue detail page, command menu search and inbox preview read it. Each issue has id, title, status, priority, assignee, project, optional scope, labels, due (ISO date), estimate, desc (paragraphs), subtasks ([text, done]) and activity ({ type: 'event' | 'comment', who, text, when }).
  2. Issue rows in issues.html: li[data-issue] with data-id, data-status, data-priority, data-assignee and data-project. Render the same markup from your API; filters, grouping, counts and the board work on whatever rows exist.
  3. Hill scopes, timeline bars and inbox notes live in their pages' markup (below).

Front end only

Nothing is sent or saved. New issues, comments, status, priority and assignee changes, board drags, bulk moves, timeline edits, hill positions, inbox archive and snooze all update the page and are gone on reload. Each change passes through one function in the script (moved on the board, commit in the hill chart and the timeline, remove in the inbox, the [data-set] handler on the issue page, the [data-new-form] submit), which is where a call to your backend belongs.

Hill chart

[data-hill] with data-weeks="21 Sep,28 Sep,..." (oldest first, the last is now). Each scope is a button.hill__dot with data-scope (a key), data-hue (one of the five hues), data-history (one position per week, 0 to 100) and a .hill__label holding its name. Past 50 a scope is downhill and its ring fills. Inline left and top on each button are the no-JavaScript positions; the script recalculates them. The compare control is [data-hill-week], a native range input whose max is the number of weeks minus one. The to-do groups in [data-todos] match scopes by data-scope and re-order by hill position after each move. Drag on the curve, or Left and Right (Shift for 10) on a focused dot.

Issues

[data-issues] holds the list. The List and Board buttons are [data-view]; chips are [data-filter] (mine, high, or project:<key>); the group menu items are [data-group-by]. In the board view, cards drag by pointer (touch needs a short hold so swipes still scroll), or with the keyboard on their [data-grip] button: Space lifts, arrows move between columns and positions, Space drops, Escape cancels. Tick rows in the list to bulk move them from the bar at the bottom.

Issue detail

[data-issue-page] with slots ([data-doc-title], [data-doc-desc], [data-subs-list], [data-feed], [data-prop="status"] and so on) filled from ISSUES by ?i=. The previous and next links are real links, so the page also works without JavaScript. J, K and the up and down arrows move between issues; Cmd or Ctrl Enter posts a comment.

Timeline

[data-gantt] with data-start (ISO date) and data-days. Each bar is button[data-task] with --s (start day) and --d (length in days) in its style and data-deps naming the tasks it depends on. Milestones are .gms with --s; the today line is .gtoday with --s. Zoom levels are the ZOOM object in initGantt (pixels per day). Drag the middle of a bar to move it and either end to resize; Left and Right move a day, Shift with them changes the length.

Inbox

[data-inbox] with li[data-note] rows (data-kind is mention, comment, assigned, status or due; data-issue-id links the issue). J and K move, E archives, S snoozes, U toggles unread, Enter opens the issue; archive and snooze offer Undo. Below 900px the preview opens as a sheet.

Account menu and settings

The sidebar foot is a button ([data-menu="account-menu"]) opening #account-menu: name, email and role, Profile, the Appearance radio group, Keyboard shortcuts, Settings and Sign out. Collapsed, it shows the avatar alone; on phones it opens from the More sheet. settings.html is [data-settings]: the profile form ([data-profile-form]) shows [data-savebar] as soon as a field or the photo differs and updates [data-preview-*] as you type; Save writes the name and photo into the shell. Notifications rows are [data-notif-row] with a switch and a channel select. Members are li[data-member] with [data-role-select] and [data-remove-member] (confirmed in #remove-member, with Undo); the invite form [data-invite] validates the address, refuses one already in the list, and adds a pending row with Revoke. Nothing is saved.

Command menu and shortcuts

Cmd K or Ctrl K, or any [data-cmd-open] button. Pages and actions are listed in initCommandMenu; issues come from ISSUES. ? opens the shortcuts dialog, C opens New issue, [ collapses the sidebar.

Components

Hook Behaviour
[data-menu="id"] Opens the role="menu" popover with that id; arrow keys move, Escape closes
[data-layer-close] Closes the overlay it sits in
[data-theme-toggle] Quick switch between light and dark, saved in localStorage; until then the system setting decides
[data-theme-choice="system|light|dark"] Sets the appearance; system clears the saved choice. Used by the account menu radios and the settings cards, which all stay in step with the toggle
[data-tip], data-tip-key, data-tip-side Tooltip with the control's aria-label (or the data-tip text) and a shortcut; data-tip-collapsed shows it only while the sidebar is collapsed. Visual only; the label is what is announced
[data-tabs] with role="tab" and data-hash Tabs that write and read the address bar
.switch[role="switch"] On and off switch; fires switch:change
[data-sign-out] Front-end sign out toast; wire it to your auth
[data-side-toggle] Collapses or expands the sidebar
[data-new-issue] Opens the New issue dialog
[data-shortcuts-open] Opens the keyboard shortcuts dialog
[data-star] Star toggle with aria-pressed
[data-ring] Progress ring; set --v from 0 to 1
[data-reveal], [data-reveal-group] Fade in once on load (children for a group)
[data-preview-label] A short page name on two footer links, read only by the GSAP Vault product page; does nothing on your site and is safe to delete

Every feature returns early when its markup is missing, so any page, tile or section can be removed.

Palette

Token Dark Light Use
--shell #000000 #F1F1F3 Sidebar and frame
--ground #050506 #FAFAFA Page slab
--surface #0E0E10 #FFFFFF Tiles and cards
--ink / --ink-dim / --ink-faint #FFFFFF / #A8A8AE / #8F8F96 #0A0A0B / #52525B / #62626C Text
--signal #4D8DFF #1F5FE0 Section labels, primary button, selection
--danger #D23434 #D23434 The remove confirmation only
--green --amber --cyan --violet --rose bright fills bright fills with darker -text partners Scopes, projects, statuses, timeline bars

Measured contrast pairs for both themes are in the token comments at the top of assets/style.css.

Images

Photos are bundled as art-directed WebP derivatives in assets/img/, cropped and graded from the originals listed in assets/img-manifest.json. To replace one, drop a WebP of the same name and size into assets/img/, or edit the manifest and regenerate (bun scripts/build-template-assets.ts project-management-template in the GSAP Vault repository). The booking screen and printed timetable in Docs and files are drawn in HTML and CSS (.art--ui, .art--tt).

File Source Original
maya.webp Pexels https://www.pexels.com/photo/10159280/
tomas.webp Pexels https://www.pexels.com/photo/20400522/
priya.webp Pexels https://www.pexels.com/photo/21792041/
kwame.webp Pexels https://www.pexels.com/photo/15946547/
elena.webp Pexels https://www.pexels.com/photo/3771123/
owen.webp Pexels https://www.pexels.com/photo/7562316/
freya.webp Pexels https://www.pexels.com/photo/9558766/
sam.webp Pexels https://www.pexels.com/photo/10211577/
rosa.webp Unsplash https://images.unsplash.com/photo-1494790108377-be9c29b29330
jess.webp Unsplash https://images.unsplash.com/photo-1517841905240-472988babdf9
file-deck.webp Pexels https://www.pexels.com/photo/30942322/
file-wake.webp Pexels https://www.pexels.com/photo/7519087/
file-harbour.webp Pexels https://www.pexels.com/photo/18722573/
file-wall.webp Pexels https://www.pexels.com/photo/6614821/
file-proofs.webp Pexels https://www.pexels.com/photo/36765667/
file-swatches.webp Pexels https://www.pexels.com/photo/7674846/
cover-solent.webp Pexels https://www.pexels.com/photo/7519087/
cover-hartwell.webp Pexels https://www.pexels.com/photo/34273595/
cover-museum.webp Pexels https://www.pexels.com/photo/31679934/
cover-brindle.webp Pexels https://www.pexels.com/photo/7674852/

Pexels photos are used under the Pexels licence and Unsplash photos under the Unsplash licence; both allow free use and modification. The people pictured are stock models; the names and roles are fictional.

Accessibility

  • Every hill scope is a native button with its name, position and phase in its label; arrow keys move it and a live region announces the new position.
  • Board cards move by keyboard through their grip buttons, with announcements for each step; timeline bars move and resize with the arrow keys and announce their dates.
  • Menus, dialogs, the More sheet, the inbox sheet and the command menu trap focus, close on Escape and return focus to their trigger.
  • Focus rings show only for keyboard use. Every text pair is measured at 4.5:1 or better in both themes.
  • Reduced motion keeps every interaction and changes values instantly. Without JavaScript, every page reads at rest, the hill chart shows its current positions and the footer reaches every page.

Dependencies

  • GSAP core, plus Flip on the project, issues, inbox and components pages. Demo built against 3.15.0; works with 3.12+. Everything still works without GSAP, just without movement.
  • Albert Sans and Spline Sans Mono, self-hosted in assets/fonts/ (variable, latin). SIL Open Font License; see assets/fonts/OFL.txt.
  • No Lenis: app screens scroll natively, and the board, timeline and to-do list are ordinary nested scrollers.

Teardown

The script records every tween in one GSAP context and every listener in one list. window.rookery.destroy() reverts the tweens and removes the listeners; it also runs on pagehide. window.rookery also exposes toast(message), the overlay layer stack, the hills (each with setWeek(i) and onChange(fn)) and openCommandMenu().

Worked examples, the events and programmatic API, and the class reference ship with the download, alongside the full source.