---
title: Reorder projects
---

# Reorder projects

## What it is

The projects sidebar shows your projects in a single ordered list. You control that order: drag rows up and down, group them under collapsible **dividers** (group headers — sometimes searched for as "groups" or "group projects"), pin the most important ones to a fixed top section, and collapse groups you don't want to see right now. The order is per-account and persists across restarts because it lives in SQLite (`projects.display_order` and `project_dividers.display_order`). One important detail: ungrouped projects and dividers share the **same** display-order sequence at the top level — a divider is just another sortable row that happens to contain projects underneath it. That's why dragging an ungrouped project past a divider header reliably "lifts" it above the whole group.

## Where to find it

All of it happens in the projects sidebar down the left-hand side of the app, and none of it needs a settings screen. Drag rows there to reorder them; the **+** icon at the top of that sidebar creates a group; a group header’s **⋯** menu adds a project to it or renames it, and clicking its chevron collapses or expands the group.

## How it behaves

### How to use it

1. **Drag a project row.** Long-press a project row in the sidebar (about 200ms), then drag it. A drop indicator (a thin horizontal line) shows where the row will land. Release on top of another project to swap places, or drop between two rows to insert there. Inside a divider, dropping reorders within that group; outside any divider, you reorder among the ungrouped projects. (Long-press exists so a quick click still selects the project.)
2. **Drag a project onto a divider header.** Drop a project on top of a divider's name to move it into that group at the bottom. The project keeps its name, color, sessions, etc. — only its `divider_id` and rank change. Prefer not to drag? A project's [Edit Project dialog](edit-a-project.md) has a **Group** dropdown that moves it between groups (and can create a new group inline), applied on Save.
3. **Drag a project out of a divider.** Drop it onto the empty space above the first divider (or onto another row outside any divider) and it becomes ungrouped — `divider_id` is cleared, and the project lands among the top-level rows.
4. **Drag a whole divider.** Long-press the **divider header** (the row with the chevron and the group name) and drag it to a new position. The projects inside follow the header — they don't get re-ranked relative to the divider, just the divider moves up or down among other top-level rows. You cannot nest a divider inside another divider.
5. **Create a divider.** Click the **+** icon at the top of the projects sidebar and pick **New Group** (the list-icon entry next to **Add Project**). A small text dialog asks for a divider name. Enter one and submit. The new divider appears at the top of the list (or at the position implied by your current scroll, depending on the build); existing projects are not affected.
6. **Add a project to a divider.** Right-click a divider header (or click its **MoreVertical** (`…`) icon) and pick **Add Project**. The standard **Add Project** dialog opens with that divider already chosen in the **Group** dropdown — you can submit straight through and the new project lands inside the group at the bottom. This is faster than opening the dialog from the sidebar header's **+** menu and picking the group manually. See [add-a-project.md](add-a-project.md) for the rest of the dialog (name, color, Quick Create vs Browse vs GitHub).
7. **Rename a divider.** Click the **MoreVertical** (`…`) icon on the right side of a divider header and choose **Rename**. The header turns into an inline text input — type the new name and press Enter (or click away to cancel). You can also edit dividers via the **Edit Project** dialog of any project that lives in the divider, but the inline rename on the header itself is faster.
8. **Collapse / expand a group.** Click the chevron at the left of a divider header (or click the header row itself, away from the menu trigger). Collapsed groups hide their projects from the list — the count badge on the divider shows how many are tucked inside. The expanded/collapsed state is per-divider and remembered across restarts.
9. **Delete a divider.** Right-click menu on the header → **Delete**, or the **MoreVertical** menu → **Delete**. A confirm dialog asks before proceeding. Deleting a divider does **not** delete its projects — they become ungrouped and re-appear at the top level. There's no auto-recreate; if you want the group back, make a new divider with the same name and drag the projects back in.
10. **Pin to top.** Right-click any project → **Pin to Top**. Pinned items render in a separate fixed section above the regular list (above all dividers and ungrouped rows). The pinned section has its own internal drag order — you can reorder any pinned item (solo projects, parent groups like "AI Tools", and pinned divider groups) by dragging — but it's a one-zone block: pinned rows can't be dragged into a divider without unpinning first. Right-click → **Unpin** sends the row back to its previous position in the unpinned list (preserving the row's `display_order`).
11. **Reset.** There is no built-in "Restore default order" button. If your order is messed up, manually drag rows back, or open the SQLite database at `<userData>/mission-control.db` and renumber `display_order` by hand (see the SQLite logs and debugging page for the path).

Note: dividers are global to the account — every project either lives in a divider or is "ungrouped." There are no per-window or per-workspace divider sets. Fresh installs seed an **Omniscio** divider at the top holding the built-in virtual projects (Skills, Recipes, Cron Jobs, Quick Replies, Automations, AI Coaching, Settings, etc. — see [projects-sidebar.md](projects-sidebar.md) for the full list). You can rename the Omniscio divider freely (it keeps an internal `system_tag` marker so the rename doesn't break lookups), and you can also delete it — its children just become ungrouped, and Omniscio will **not** resurrect the divider on the next launch.

## For agents

### How it works

The sidebar layout is built in [ProjectsSidebar.tsx](../../src/renderer/src/features/dashboard/ProjectsSidebar.tsx). The two helpers `buildTopLevelSlots()` and `buildRenderItems()` interleave ungrouped projects and dividers into a single ordered list using each row's `displayOrder`. Drag-and-drop is wired through three independent `useDragReorder()` instances ([useDragReorder.ts](../../src/renderer/src/hooks/useDragReorder.ts)) — one for the **pinned** section, one for the **top-level** mixed list (ungrouped projects + dividers), and one for **inside each divider**. Each instance handles its own drop zone and writes back to a different IPC channel: pinned drag → `SIDEBAR_REORDER` (covers mixed item types — solo projects, parent groups, and divider groups share the pinned section's `displayOrder` namespace), top-level drag → `SIDEBAR_REORDER` (the unified one), divider-internal drag → `PROJECT_REORDER` scoped to that divider. The dedicated handler `handleDividerExternalDrop()` covers the cross-zone case (project dragged onto a divider header) and calls `IPC.PROJECT_MOVE_TO_DIVIDER` to update `divider_id` first, then `SIDEBAR_REORDER` to fix the position.

The IPC channels are declared in [ipc-channels.ts](../../src/shared/ipc-channels/index.ts): `PROJECT_REORDER`, `PROJECT_MOVE_TO_DIVIDER`, `PROJECT_PIN`, `PROJECT_UNPIN`, `SIDEBAR_REORDER`, plus the divider CRUD set (`DIVIDER_CREATE`, `DIVIDER_UPDATE`, `DIVIDER_DELETE`, `DIVIDER_REORDER`, `DIVIDER_LIST`). The handlers in [project-handlers.ts](../../src/main/ipc/project-handlers.ts) and [divider-handlers.ts](../../src/main/ipc/divider-handlers.ts) validate input and delegate to the underlying SQL: `reorderProjects()`, `reorderSidebar()`, `moveProjectToDivider()`, and `pinProject()` in [queries-projects/projects.ts](../../src/main/db/queries-projects/projects.ts). `reorderSidebar()` is the interesting one — it walks an array of `{ id, kind: 'project' | 'divider' }` and writes index back to either the `projects` or `project_dividers` table inside a single transaction, giving the two tables a unified sequence at the top level. That unification is what migration v63 enables — it renumbered legacy data so projects and dividers no longer collide on `display_order`. `buildTopLevelSlots()` includes a fallback for pre-migration data (offsets dividers after all ungrouped projects when collisions are detected) so old databases still render correctly.

`listProjects()` in `queries-projects.ts` orders rows by `is_pinned DESC, display_order ASC` — that's why pinned rows always render at the top of the list regardless of their underlying `display_order`. Pinning doesn't move a row's `display_order`; it just flips `is_pinned`. So an unpin restores the row to its original numeric position automatically. Divider deletion uses `ON DELETE SET NULL` on the `projects.divider_id` foreign key (set up in [database.ts](../../src/main/db/database.ts) migrations), which is what makes a deleted divider's children land back among the ungrouped rows instead of getting orphaned. Toggle (collapse/expand) and rename go through `DIVIDER_UPDATE`, which writes to `project_dividers.is_collapsed` and `name` respectively. The renderer's [divider-store.ts](../../src/renderer/src/stores/divider-store.ts) holds the divider list and refetches on the `DIVIDERS_CHANGED` push event emitted after any mutation.

## Related

- [projects-sidebar.md](projects-sidebar.md) — overview of the sidebar layout and the special **Omniscio** built-ins divider that holds Skills, Recipes, Cron Jobs, etc.
- [add-a-project.md](add-a-project.md) — adding a project (drops in either at the top of the ungrouped list or at the bottom of a divider you picked in the dialog)
- [edit-a-project.md](edit-a-project.md) — pin/unpin, change a project's color/icon (the right-click menu owns most ordering shortcuts)
- [delete-a-project.md](delete-a-project.md) — removing a project altogether (different from un-grouping; soft-delete with undo)
