Changelog

Release notes

Every Managello release, newest first. You self-host, so you update on your own schedule — here's how updates work.

  1. v4.0.2

    • Open a milestone from its whole row, and let a task go back to standalone and unassigned
    • Call the project's money surface Time & Money, and fix a nav gate that was grepping too widely
    • Open a project on its milestone plan and dismantle the Project facts drawer
    • Pin the Inbox subtitle by intent, and check the heading total against the badge
    • Let the Inbox explain the number the sidebar is showing
    • Keep the Inbox badge in step with a read, and put Milestones on the project's own nav
  2. v4.0.1

    • Keep the Inbox badge in step with a read, and put Milestones on the project's own nav
  3. v3.0.0

    Runs migration
    • Require a reply handle's exact spelling, and stop the step-up URL naming a subject
    • Say what unrouted mail needs, hide the routing handle, and name open comments at sign-off
    • Decode RFC 2047 subject headers before routing or showing them
    • Say "waiting on client" in the dashboard attention reason too, and let the gate read PHP
    • Close the last lifecycle-audit copy defects: empty state, review truth, one name for waiting-on-client
    • Count the SMTP watcher's hits with wc, not grep -c
    • Sink outbound mail while automated browser gates run, and prove the sender honours it
    • Open a deliverable's General discussion on the client, like every other client conversation
    • Write the deliverable bucket into the address after the router has finished with it
    • Make the deliverable bucket actually reach the address bar
    • Drop the deliverable bucket when you leave the surface, and stop the nav gate matching a label
    • Open the deliverable list on the work that needs doing, and put the filter in the URL
    • Make the deliverable create endpoint ask who is asking, not just whether the project exists
    • Say when an invoice was emailed, and stop calling a change request a rejection
    • Tell the operator where inbound mail actually went
    • Make the project list add up, and name the tab for what it holds
    • Refuse project numbers and dates the database cannot hold
    • Count unread account conversations in the Inbox badge too
    • Count unread project conversations in the Inbox badge
    • Stop putting a decodable routing payload in client email subjects
    • Give the project conversation back the height its chrome was holding
    • Reclaim vertical space on the project conversation surface
    • Point the real-app project gates at the conversation work surface
    • The project conversation becomes a work surface instead of a permanent column
    • Teach the real-app gates that the facts panel is modal
    • Move the project facts out of the layout and let the conversation collapse
    • Assert the unread landing by what it promises, not by one pixel offset
    • Quieten the project page's conversation controls and its facts rail
    • Delete three empty files the audit's bind-mounts left behind
    • Stop claiming a guard that is not on the route
    • Keep the audit walk's screenshots out of the repo
    • Let an empty tab answer for its own slice instead of the whole inbox
    • Say what each surface is for, once, in the space it already had
    • Take the Unrouted tab away from a member instead of emptying it
    • Re-pin the Inbox subtitle assertion to the sentence the Inbox actually ships
    • Give the messages more room than the box for writing them
    • Put the project's work beside its conversation instead of above it
    • Shrink the awkward baseline by the two entries the nav-count fix closed
    • Tell the two sides of a conversation apart, and stop asserting the fixture
    • Make the staff Inbox a conversation, not a record table
    • Measure the internal note as a difference, not as the only marked row
    • Keep an apostrophe out of the real-app gate runner
    • Reassert the queue-nav intent after the consolidation moved it
    • Cut the staff sidebar from twenty doors to nine
    • Count what these tests made, not what the database holds
    • Let a manager place an email a client sent to the front door
    • Show email we could not place in the Inbox, not only in Settings
    • Keep enough of an inbound email that an unroutable one can still be read
    • Staff can move a request or ticket to another of the client's projects
    • Serve the original image when a recorded thumbnail file is missing
    • Check that Asks and Issues narrow, now that they can
    • Assert paging in the direction the thread actually pages
    • Count what these inbound tests made, not what the database holds
    • Update the docs that still called Requests the spine
    • Say which door is which, and retire the overlap rather than the workflow
    • Let the sender say whether a message is an Ask or an Issue
    • Write down the inbound audit, including what was deliberately left open
    • Prove the name on an emailed reply is the sender's, end to end
    • Refuse a reply to a thread that no longer exists, and write down what already held
    • List the reply mailbox once when both writers name the same one
    • Prove sender authentication on every inbound-capable type, not the convenient one
    • Ask who really sent an inbound reply, not just which thread it belongs to
    • Count what the test made, not what the database holds
    • Write down why General needed one table and no fake project
    • Keep role and permission separate on the account thread
    • Bring an emailed answer back to the account, not to a new enquiry
    • Show the client General only once there is a General to show
    • Put the account conversation on the account's own page
    • Let a Client hold a conversation, now that it has one to hold
    • Give account-level talk somewhere to land, before anything is published to it
    • Make the internal-note gate search the whole outbox
    • Lead with who wrote, not with "A client"
    • Stop an oversized PDF taking the whole email with it
    • Make approval by email an act, not a fetch
    • Say which kind of feedback the file can take
    • Let one conversation arrive as one conversation
    • Record what the outbound email system actually does
    • Type the internal note instead of seeding it
    • Count what the test made, not what the database happens to hold
    • Keep the focus ring outside the chip it is marking
    • Say the things the polish stopped showing
    • Assert the calm, and stop a security check passing on a 404
    • Stop the attach target being the biggest thing in the composer
    • Do not uppercase a label a test reads back
    • Let the system speak more quietly than the people do
    • Make the composer the foot of the conversation, not another form on the page
    • Let the conversation read as a conversation, not a stack of boxes
    • Drive the whole project conversation in a real browser, on real data
    • Tell the right people a client wrote, and only email the ones who own it
    • Tell each reader what has arrived since they last looked
    • Let the project conversation be sliced, and say so where it cannot
    • Stop an internal project note reaching someone who cannot open it
    • Give the project one composer, with two modes that look different
    • Turn the project conversation the right way up
    • Stop the project composer contradicting itself
    • Make the thread gate record which stage the code is in
    • Prove a reply to a project email comes back to the project
    • Prove the project message actually leaves the building
    • Let the client answer on their own project thread
    • Give the project conversation a row in the client Inbox
    • Let a project carry a message written straight to the client
    • Record which door a comment came through
    • Stop telling a contact about money they are not allowed to see
    • Keep an event card's timestamp on the line it belongs to
    • Gate the read-only stage and the two-serializer wall
    • Give the client their own copy of the project conversation
    • Put the client conversation on the staff project page, read-only
    • Make the outbound money audience ask the same rule the portal already asks
    • Read the whole client-facing project conversation from every source it lives in
    • Give a merged thread an ordering key its sources can actually share
    • Move file-type colour into the token layer and the panels out of Pages
    • Put the work and the conversation first on the project page
    • Make an attachment look and behave the same everywhere
    • Split the project page into panels without changing a pixel
    • Stop attachments written by the queue worker from 404ing for every reader
    • Teach the proofing gate to open the file the way a client now does
    • Make two client lists behave like lists, and quote the number the invoice actually carries
  4. v2.3.3

    • Clients can see the files they email in, and quote totals stop reaching contacts barred from billing
  5. v2.3.2

    Runs migration
    • Stop four screens saying things their own contents contradict
    • Stop Home asking a non-approver to approve
    • Say who agreed, who may answer, and what a quote is
    • Stop offering actions and text the product cannot honour
  6. v2.3.1

    Runs migration
    • Verify the session in a browser, and fix the catch that never caught
    • Keep the live sentinels and the back-links in step with the client's vocabulary
    • Give the client one word for each thing, and a way back out of a portal preview
    • Make the client's first screens lead somewhere, and hide a tab they can never fill
    • Deliver the dispute the dialog promised, and stop storing quoted mail as the client's words
    • Make the permission chips bind, unknown URLs 404, and search results reachable
    • Quieten the milestones panel so its signals stop competing
    • Verify H-2, H-11 and M-5 as real-app journeys, and close the fixture leak they exposed
    • Detect outbound mail stuck awaiting handoff, and stop the allocation gate leaving fixtures behind
    • Let a client say no, and stop invoices claiming money nobody owes
    • Count comments on the thread under test, not in the whole table
    • Stop the mail ledger storing one id and looking rows up by another
    • Drive the anti-double-billing journey through the real app, not a fixture
    • Stop the same work being billed twice, and retire the milestone statuses nothing wrote
  7. v2.3.0

    Runs migration
    • Fail the build when a route has no way to reach it
    • Make scopes real groups you can edit, and stop dropping the milestones you picked
    • Stop the billing screens claiming what the product has not done
    • Give clients an Inbox, and give every conversation somewhere to land
    • Make milestone approval reachable from the UI
    • Record the placeholder-ink token in the design-system contract
    • Lighten placeholder ink and stop showing the project owner twice
    • Record Task in rule 6's client-reachable list
    • Scope the sweep's no-op assertion to the task it created
    • Raise the ceiling in the process that actually runs the tests
    • Keep the retraction ledger through a rollback, and the DDL out of the suite
    • Keep the migration test's DDL out of a rolled-back transaction
    • Give the test run its own memory ceiling instead of production's
    • Make the command palette obey the same money wall as the nav
    • Let a manager tell the client something from the task board
    • Wall attachments by parent type the way their sibling scopes already do
    • Let clients answer the emails that ask them for something
    • Stop a reply to an invoice retrying forever against a thread that cannot exist
    • Carry the estimate's discount and tax into the milestone lane
    • Cover hourly and retainer billing against the fixed-price lane work
    • Pin the discount the milestone lane silently drops
    • Actually send the milestone emails the config has always promised
    • Run CI tests in the container that does not import the dogfood drivers
    • Group milestones into separately-quoted scopes
    • Sweep the new portal milestone route for cross-tenant leaks
    • Show the client what we recorded them agreeing to, and let them object
    • Stop a voided invoice leaving a milestone labelled invoiced
    • Make a milestone an immutable commercial artifact once the client agrees
    • Hide staff-authored internal text from whole-model serialization
    • Let staff bill additional scope by attesting the client approved it
    • Make "credit it now" reachable at the moment the deposit block fires
    • Make the gate preconditions a checked step, not a remembered one
    • Stop the deposit migration test assuming an empty world
    • Give the deposit block a door, and stop a rollback test guessing at step count
    • Stop a paid deposit being billed a second time
    • Enforce the one-value-lane rule in both billing lanes
    • Re-audit the awkward baseline for worktree Vite noise: it is clean
    • Run the test suite on the drivers phpunit.xml actually declares
    • Write down when a live-tree suite run is allowed, and what must be reported
    • Bill a project's contract value through one lane, never both
    • Make client visibility mean the client can actually reach it
    • Show the whole photo in the crop dialog
  8. v2.2.9

    Runs migration
    • Add a live browser gate for the attachment picker, on both sides of the brand boundary
    • Make attaching a file the easy path: visible dropzone, paste, thumbnails, multi-file support
    • Fix the image half of deploy rollback — it had never worked, and reported success
    • Log two health-flag findings from the rollback audit
    • Prove the rollback still fires for real failures, not just that it stops for cosmetic ones
    • Stop a failed UI assertion from restoring the database
    • Keep the live upload gate out of the deploy path until it is install-agnostic
    • Assert the running app serves the bundle this source builds
    • Verify upload limits in a browser, not just in the payload
    • Measure the real upload ceiling instead of trusting declared config
    • Show the support attachment errors that were being swallowed
    • Take upload limits from the server instead of hardcoding ten files
    • Stop an oversized upload returning 200 with a bare PHP warning
    • Give milestones a start date, not just a due date
    • Let people crop their profile photo before it is saved
  9. v2.2.8

    Runs migration
    • Stop the deploy gate minting a magic link for a user who cannot sign in
    • Every path that creates intake now tells the same people about it
    • Let a ticket be attached to a project after it was created
    • One triage queue over new-work requests and live support tickets
    • fix(gates): WS6 must match the RENDERED eyebrow, which CSS uppercases
    • fix(gates): WS6's deploy sentinel asserted copy that no longer exists
  10. v2.2.7

    Runs migration
    • fix(triage): projectless requests count as "My work", and every staff role sees the triage tile
    • fix(support): the org test created a SECOND organizations row
    • feat(support): raise a ticket with the Managello team from Settings
    • feat(projects): set a start date at creation + show the overall project span
    • fix(ops): cap and rotate the application log; bound System Health's read cost
  11. v2.2.6

    Runs migration
    • fix(portal): a literal nav index blanked every authenticated portal page
    • fix(intake): deploy gate still asserted copy on the two deleted portal pages
    • fix(clients): Add Contact's success toast didn't say when it linked, not created
    • feat(intake): one client-facing intake surface, two internal workflows
    • fix(clients): the delete confirmation promised nothing was lost while a contact survived
  12. v2.2.5

    • fix(requests): staff had no way to reply to a client on a request
    • fix(notifications): a client's request was mailed to every manager on the install
  13. v2.2.4

    Runs migration

    No notes for this release.

  14. v2.2.3

    Runs migration
    • fix(visibility): define the account-manager grant once, and make the project-less audience respect the wall
    • fix(identity): every invite path resolved a person by email ALONE and discarded the typed name
    • Ticket audiences ask about the ticket, not about its client
    • Split project creator/access/owner — a hand-off was inexpressible
    • fix(change-requests): a walled manager saw a viewer-scoped total presented as org-wide
  15. v2.2.2

    • fix(notifications): a staff-raised ticket with no contact picked told the client nobody, forever
    • fix(reports): a client's monthly report counted only the generator's own projects; give test-guard a known-failure baseline
    • fix(notifications,financials): scope per-client alerts and stop rollups truncating money behind the project wall
    • fix(ui): the hand cursor was missing by CONTROL KIND, not by page — swept all of it
    • fix(clients): an audit entry made almost nothing deletable, and the Danger Zone was hidden from managers
    • fix(estimates): pdf.estimate could not compile — no estimate PDF was renderable at all
    • test: close the five blind spots in the cross-tenant canary sweep
    • test: adversarial "awkward org" fixture + cross-tenant canary sweep
  16. v2.2.1

    • Enumerate delete blockers, correct §2a state tokens, drop contradictory archived badges
    • Acting-client portal boundary, account managers, one unassigned-work definition, client delete/erase, notification-prefs fixes
  17. v2.2.0

    • Notifications: never route operational alerts to un-accepted/deactivated staff
    • docs: record STEP 2 (cosign --tlog-upload=false) as blocked on STEP 1 rollout
    • docs: mark KNOWN_ISSUES #5 MVP fix landed (option c), full reassign flow still open
    • Staff deactivation: emit per-member open-task/ticket orphan counts (KNOWN_ISSUES #5)
    • a11y: label assignee avatar chip 'Assigned to <name>' for screen readers
    • Staff deactivation: exclude inactive from assignee pickers + orphan count (KNOWN_ISSUES #5, MVP)
    • CI: make data-durability resilient — bake dev deps, drop runtime composer install
    • 0b: server-side guard against silent retainer back-bill on activate
    • Board cross-tab sync fallback + TaskSheet close-flush (P1)
  18. v2.1.8

    Runs migration
    • Guard form sheets from outside-click data loss; warn on issue/send with no billing address
    • real-app-board-move gate: match renamed drag-handle aria-label
    • Kanban: cap column height, scroll lanes internally, clearer drag handle
    • Show "Invitation expired" on the Team page
    • Add live "Online" presence to Team + Client contact surfaces
    • Scope update alert to admins only; email staff on role change
  19. v2.1.7

    Runs migration
    • Add 5B.2: break a request into tasks with AI (drafter + converter)
    • Add 5B.1: wire AI drafters into the ⌘K palette as launchers
    • Fix 5A: overdue task query leaked null-due tasks (model files 'overdue' as a status)
    • Harden palette gate: poll for Ask AI resolution (real round-trip is ~3s)
    • Fix 5A: AI command-query fell back on every real call (markdown code fence)
    • Fix draft invoice/estimate live preview to show client billing address + Tax ID
    • Add 5A: AI-native ⌘K command palette — read-only natural-language query
    • Client contacts required at creation; client billing address + Tax ID end-to-end
    • UX fixes: modal scroll/backdrop, send/create confirms, inline client/staff, manager staffing
    • Fix two live-testing regressions: DnD sparse-column drop + bulk no-refresh
    • ux(notifications): simplify Email notification preferences visual hierarchy
    • ux: drop Title placeholder, global pointer cursor, declutter notification prefs
    • Add real drag-and-drop to the project Kanban board (desktop)
    • fix(notifications): exclude pending-invite/disabled staff + pending client contacts from recipients
    • Close the null-wipe-on-partial-payload bug class across update() controllers
    • Add bulk multi-select for staff ticket + task lists
    • Inline task editing via a shared useQuickField hook
    • fix(profile): call setDefaults (React useForm) not defaults on save success
    • Enforce real-app browser gates in deploy; add HEADFUL toggle
    • Add real-app browser gates for board move + proofing placement
    • Enforce TicketPolicy@update on ticket status + field mutations
    • Vault: rename UI label from Credentials, add org-wide on/off toggle (default ON)
  20. v2.1.6

    Runs migration
    • fix(vault): mask secret input + 404 (not 403) for client sessions
    • Dedupe optimistic-revert error toasts (one failure → one toast)
    • feat(vault): per-project Credentials Vault with timed unlock + apply-as-copy
    • docs: add revised Credentials Vault SOW (timed unlock + apply-as-copy)
    • Fix optimistic rollback on genuine failures + make TaskSheet auto-save consistent
    • Proofing: ephemeral live presence + cursors (Figma-comment style)
    • Fix: drop only: from redirecting optimistic PATCHes (spurious "something went wrong")
    • Search: rank Levenshtein-close matches above trigram-only partials
    • Optimistic UI + shared real-time reconciliation for task/ticket/approval edits
  21. v2.1.5

    Runs migration
    • Search: Levenshtein typo layer + client-contact email search
    • Search: bind ⌘K global shortcut in capture phase (hardening)
    • Portal: free-text search on Invoices, Tickets, and Deliverables
    • Search: pg_trgm fuzzy matching + relevance ranking
    • Search: cover change requests, invoices, estimates, and team members
    • Gate "Portal domains" settings nav on the reseller license tier
    • Extend configured "Email from name" to staff notification emails
    • Honour configured "Email from name" on staff invites
  22. v2.1.4

    • Trace downstream work to its origin request
    • UserAvatar: neutral person icon when there's no name or email
    • Email from-address: make optional + document the fallback sender
    • Invoicing: warn when issuer legal name looks unrelated to org name
    • Harden updater: stop worker-timeout kill, sync version on success, 502 hint
    • Staff SLA filter: add definition tooltip; drop stale "Value lens" copy
    • Staff chrome: show Managello logo + favicon instead of text
    Full notes →
  23. v2.1.3

    • Updater: add pre-update preflight + move clamd status off the dead network
  24. v2.1.2

    • Updater: run migrate volume-isolated so it can't disrupt the live app
    • Fix recurring catch-up snapping the series onto the anchor's day-of-month
    • Show Managello logo in product-branded update emails
  25. v2.1.1

    • Add real-app browser gate for the voided-invoice PDF confirm
    • Fix recurring back-bill undercount (revenue loss) + gate voided-invoice PDF
    • Warn on payment instructions that promise online/card payment the org can't honor
    • Time & Billing UX re-audit fixes (2026-07-22): reports discard, recurring back-bill guard, billing void menu
    • Updater: harden migrate/swap/health/rollback so a failure can't leave a box down
  26. v2.1.0

    Runs migration
    • Invoice preview fidelity + line-amount auto-calc + A4 page preview
    • Add live sample-invoice preview to Settings → Invoicing
  27. v2.0.9

    Runs migration
    • Updater: distinct registry_auth_failed reason + surface release notes on install
    • Staff nav: rename TIME & MONEY items to match each page's vocabulary
    • Updater: pass --password-stdin to docker login (fixes non-TTY registry login)
    • Staff chrome: 5 novice-intuitiveness fixes (SLA/triage/nav/health/icon labels)
  28. v2.0.8

    Runs migration
    • Notify project members of a project's client notifications by default
    • Mail-health: 5-failure threshold, email admins on outbound failures, auto-enable verified inbound at setup
    • Gate reply-to-comment affordance on live inbound health, not just the toggle
    • Digests honour per-event email opt-out (close the bundling loophole)
    • Notification preferences: group the matrix into collapsible categories
    • Close notification opt-out compliance gaps: reclassify legacy events + audit consent diff
    • Notify the client when staff post a client-visible deliverable/CR comment
    • Reflect client-reply attachments in the staff "replied by email" notification
    • Milestone flat-amount billing WS5+WS6: soft quote-reconciliation warning, demo + docs
    • Milestone flat-amount billing WS2: direct milestone → invoice
    • Milestone flat-amount billing WS1: settable billable_amount (UI + validation)
    • test(invoicing): assert client invoice PDF + email are white-label clean (§14)
    • Add attention-count badges to staff WORK nav items
    • Reorder staff sidebar: work queues lead, Templates → Admin
    • Fix LicensePhoneHomeTest: pin app.version so it survives version bumps
    • Requests inbox: triage staleness (age badge, oldest-first, dashboard escalation)
    • CR schedule: preview the authoritative apply date (fix weekend off-by-one)
    • Deliverable compare: sync scroll + zoom across the two panes
    • Reimbursable expense → invoice/billing linkage + notify client on report share
    • Brand the update-available email as Managello, not the agency's white-label
    • Updates: live in-progress timeline + suppress stale update failures
  29. v2.0.7

    Runs migration

    No notes for this release.