One platform · nine modules · an MCP server
Company operations,
in one place.
The plan in one tool, the hours in another, the pipeline in a third — and someone stitching them together every Friday. Opelli runs it all in one place, so the whole company adds up to one context: readable by you, and by the assistant you connect to it.
The project wiki
Where the work gets written down.
Every project carries a wiki — nested pages, meeting notes and PRDs. It's multiplayer, it draws diagrams, it turns meeting decisions into real tasks without leaving the page, and you can hand your customer the pages that concern them without showing them anything else.
- Multiplayer editingShared live sessions over WebSockets — peers' cursors, selections and mouse pointers render in place.
- Meetings that produce tasksMeeting notes carry attendees and a date; "/task" in the text creates real tasks that link back to the note.
- Share pages with your customerInvite a guest by email to any page — they sign in with their own Google account and see that subtree, nothing else. Every shared page carries a visible mark for the team.
- Comment on the exact sentenceSelect a passage and comment on it — the quote highlights in the page and jumps to the thread and back. @mentions notify over Mattermost or email.
- Diagrams, images & galleries"/flow" draws flow charts, interactive in the reading view; paste or drop images; several at once become a gallery — grid or filmstrip.
- Nothing gets lostNew pages autosave as visible drafts, a local cache catches the keystrokes, important pages lock. Pages travel as markdown — import, export, even saved HTML files as read-only pages.
01
The work
The page that answers "how is it going", and a board small enough that nobody ends up managing the board.
Projects · Tasks
Projects
The whole project on one page.
When the schedule, the timesheets and the board live in separate tools, "how is the project doing?" takes an afternoon. Here it's one page: team & capacity, the task snapshot, linked repos, the customer, the wiki — every number comes from the module that owns it, so they always agree.
- Allocated vs tracked per person and month, with verdicts
- Burn rate: the month's hours against the allocated budget
- A Deadlines card: due tasks and deal next steps, soonest first, overdue in red
- GitHub repos — commits mentioning a task key land on the task
- Time-review, customer and Mattermost-channel tiles
- Task snapshot with one click into the filtered board
Tasks
A board that stays small.
Types, six statuses — "Won't do" is an answer too — one owner, one level of subtasks. Everything else the board could grow was deliberately left out.
- Task keysWEB-7 style, per project. Moving a task re-keys it and the old key keeps redirecting.
- SprintsOne active sprint per project; closing keeps finished and cancelled work recorded and carries the rest forward or back to the backlog.
- Read-firstOpening a task shows the assignment, comments and activity — editing is an explicit action.
- Commits drive the boardA push webhook links commits by task key; a mention pulls the task into In Progress, "Fixes WEB-7" sends it to review.
- Due dates & stalenessA red chip the day an open task slips; untouched cards grow a quiet "10d" pill that reddens as weeks pass.
- Wiki back linksA task shows the notes it was created from or linked into.
02
Time & people
Who is booked on what, where the hours went, and the month-end sign-off that ties the two together.
Planning · Time · People
Planning
Who works on what, at a glance.
A Float-style schedule: a swimlane per person, a bar per allocation, bar height is the share of a day. Everything is drag — create, move, resize dates, resize hours.
- Drag to allocate
- Bar height = FTE
- Overallocation glows
- hours/month
- hours/day
- FTE
- man-days
- Adjustable row height
Allocations are entered in the unit the engagement was agreed in and the bars are labelled the same way — everything downstream computes from the derived hours per day. Flexible contractors get monthly contract caps instead of forced per-project splits: utilization reads tracked-of-cap, and the overallocation zone follows each person's cap.
Time
Track the week, close the month.
A calendar for the week's work and a list for the numbers. At month end, a contractor sends their hours on a project for review — approval locks the month, so the hours you invoice are the hours that were signed off.
- Drag-to-create, 15-minute snapping
- External calendars mirrored via their secret iCal URLs
- When a meeting starts, a gentle card offers its meeting note — prefilled from the invite
- Week/month list with a per-project volume chart
- Planned vs tracked as one stacked occupancy bar, per week and month
- Send for review → approve, or send back with a note → approval locks the month
- Toggl push and monthly XLSX export
- Personal by default — team numbers are an explicit grant
People
The directory that knows the numbers.
Everyone gets a page: their projects, schedule, tasks and tracked time, pulled together from the other modules — the month reads as one stacked bar, each project in its own color.
- Three viewsSortable list, teams grouped by project, and a pure-CSS org chart — all searchable.
- Live load & utilizationFTE today and tracked-of-planned per person, straight from planning and time.
- Skills & locations cloudsThe team's top values as chips, sized by how many people share them.
- Person pagesSchedule, tracked time, owned tasks and meetings attended, composed on one page.
- Self-service profilesEveryone edits their own contacts, name and photo; admins shape the org.
- Contact actionsEmail, call, or plan a meeting — scheduler URL or a prefilled calendar invite.
03
The outside world
Everything that leaves the building: the pipeline, the campaigns that go out to it, and the forms strangers answer.
Customers · Marketing · Forms
Customers
A pipeline that remembers.
Deals move Lead → Prospect → Qualified → Proposal → Won on a drag-and-drop board; an account can run several deals at once. Every stage change is recorded per deal — that history is what the reports are computed from.
- Funnel conversion, time-in-stage and win-rate reports
- Accounts with contacts and their buying roles
- Activity timeline: stage moves, edits, logged calls and notes
- Czech companies fill themselves in from the ARES registry
- Won deals link straight to a delivery project
- Monetary figures masked below the highest permission level
Marketing
Campaigns, from the same context.
The people you'd write to are already in the CRM, and the voice you'd write in is already on file. A campaign is markdown on the left, the finished email on the right — restyled live as you switch themes.
- Lists with custom columnsImport contacts from the CRM in two clicks or paste email, name lines; every list carries merge columns you fill per member.
- Merge variables{{first_name}}, {{company}}, the unsubscribe link — preview arrows step through real recipients, body and subject rendered as each person will get them.
- Themes, structuredFive presets and a no-code theme editor — fonts, colors, a three-layer background. React Email renders HTML that holds up in Gmail, Apple Mail and Outlook.
- A send you can walk away fromServer-side batch at a relay-friendly pace; close the tab, deploy mid-campaign — it resumes where it stopped and never mails anyone twice.
- Live delivery reportThe progress bar advances recipient by recipient over a WebSocket, each with their variables just merged; every send lands in a per-campaign log.
- Unsubscribe that sticksOne-click unsubscribe (RFC 8058) and List-Unsubscribe headers; an opt-out applies across every list, permanently.
Forms
Ask the outside world.
Questionnaires, polls and sign-up pages, answered without an account. Build the questions in the tab, share the unguessable link — the results chart themselves as answers arrive.
- Six question typesShort and long text, single and multiple choice, a 1–5 rating and a validated email — each optionally required, reordered in two clicks.
- A page in your colorsThe same themes your campaign mail uses — five presets or your own — with your company name on top, one checkbox per form.
- Draft, open, closedThe link serves only while the form is open: a draft is invisible and a closed form stops intake with a polite notice.
- Results, chartedPer-question bars for the pick and rating questions, latest answers for the text ones, the full response table below.
- Only what was askedAnswers are validated server-side, bots drop into a honeypot, and no IP or visitor tracking is stored.
- An endpoint for your siteThe public POST also takes JSON — a static site's existing sign-up box can feed a form with a plain {email} post.
Access
Share the work without oversharing.
Every feature carries a permission level — none, read, write, delete — per role or per person, and row scope keeps data inside the projects people actually belong to. The server re-checks every request.
- Documented, not impliedEach feature declares what every level allows — expandable in the grid, generated into the repo's permission matrix.
- Google sign-inOAuth with PKCE, ID tokens verified server-side. Only invited emails get in.
- Roles & overridesAdmin, manager, member and guest out of the box; custom roles and per-person overrides in the same grid.
- The external boundaryCustomer-side guests are badged everywhere, see only the wiki pages shared with them, and are hard-blocked from the CRM server-side — no permission grant can open it.
- Locked monthsAn approved time statement freezes its month — no silent edits after sign-off.
- API keysModule-scoped tokens for scripts and agents: shown once, stored hashed, rotatable in one click. Everyone mints their own — a personal key acts as its owner and reaches no further.
- No secrets in the clientTokens and calendar URLs never come back from the server after saving.
MCP server
Connect an assistant and just ask.
Opelli speaks the Model Context Protocol: more than 90 tools across every module — projects and the whole wiki, tasks, sprints, planning, time, the CRM, marketing, forms, compliance — and a generic pair that reaches the rest of the API. Add Opelli as a connector in Claude or ChatGPT and talk to your company in plain language.
“What happened last week?”
Everything notable lands in one cross-module activity log — a task closed, a deal won, a page published, someone added to a project. Ask for a range and you get back a single markdown file, holding only the rows you were already allowed to see.
What happened last week? Give me something I can paste into the Monday stand-up.
list_activitygenerate_reportHere's the week, rolled up per module and project:
# Opelli activity — 7d _Scope: Mark Hale · 2 projects visible_ ## Summary - **31** events across **4** modules · **5** contributors - Tasks: 12 created, 9 status changes, 4 comments - Customers: 2 stage moves, 1 created - Projects & wiki: 2 published, 1 share - Planning: 1 update ## Tasks ### Website Redesign - Anna Whitfield created WEB-45: Promo code drops at checkout `WEB-45` · 2026-07-21 - Peter Shaw moved WEB-42 to Done `WEB-42` · 2026-07-22 ## Customers - Anna Whitfield won Globex — Phase 2 `Globex` · 2026-07-23 ## Projects & wiki ### Website Redesign - Mark Hale published “Launch plan” · 2026-07-22 - Mark Hale shared “Launch plan” with Eva Brooks · 2026-07-22
Ask a colleague the same question and their report comes back different — the log is filtered per reader, every time it's read.
WEB-31 turned out to be a mobile bug. Move it over to Mobile App and put it in the running sprint.
search_tasksmove_tasklist_sprintsupdate_taskDone — it's MOB-14 now and both subtasks came along. WEB-31 keeps redirecting, so the commit links and the note that mentions it still land. Filed into Sprint 6; the status is untouched.
Write today's decisions into the Launch plan page and mention that WEB-45 came out of it.
list_wiki_pagesget_wiki_pageupdate_wiki_pageAppended a Decisions — 23 Jul section to Launch plan and left the rest of the body as it was. WEB-45 links itself from the key. The page is published, so everyone with wiki access sees it — and the two people editing it right now saw the text appear.
I was on the checkout bug 9:15–11:45 this morning. Log it against Website Redesign.
list_projectscreate_time_entryTracked 2 h 30 m on Website Redesign — “Checkout bug (WEB-45)”. July hasn't been sent for review yet; once a month is approved it locks and the same call comes back refused.
Eva is out Thursday and Friday next week. Book it and tell me what it runs into.
search_peoplecreate_time_offlist_allocationsBooked vacation for Eva Brooks, Thu–Fri. She's allocated on Mobile App across both days — the schedule strikes those days through now, so the clash shows up in Planning without anyone hunting for it.
While you're in there — bump the Globex deal to Won and set its value.
customers · refusedThis connection is scoped to Tasks, Projects and Time, so the customer tools aren't in my list at all — and naming one anyway comes back refused. It's the same guard the web app runs; widen the key's scope in Settings if that's what you want.
- Exactly your access, never moreA tool call is executed as an internal request to Opelli's own API, so it runs the chain every click already runs: feature levels, row scope, the hard block that keeps guests out of the CRM. Nothing is written twice, so nothing can drift.
- Two ways inClaude and ChatGPT connectors sign in through Opelli's own OAuth — your Google login and a consent screen, no key to paste. Scripts and desktop clients send a personal API key as a bearer token instead.
- Your key, your ceilingAnyone mints their own key and ticks the modules it may reach. It acts as them, so it can never do more than they could — and external guests can't mint one at all.
- And the org's ceiling above itAdmins keep a master on/off switch and a module allowlist for the whole MCP surface: wall the CRM off from every agent in the company, whoever holds which permission.
The small things
Fast by default.
Keyboard first
N new, E edit, T today, V switch view, ⌘K search — the same keys in every module, ? shows them.
Works on a phone
Every screen has a dedicated mobile treatment, re-checked at 390 px by the test suite on every change.
Who's online
Live presence avatars in the top bar, filtered by the same visibility rules as the directory. Opting out is one switch.
The Opelli Bot speaks up
A task assigned to you, a month approved, a page shared — key moments arrive as a bot DM in Mattermost, email as the fallback, with per-module mute switches like a phone.
Search everything
One ⌘K field across projects, wiki pages, tasks (keys included), people and customers — permission-filtered.
Hosted or self-hosted
Your company at you.opelli.dev minutes after the invite — or on your own domain, certificate handled. Prefer your own box? docker compose up.
Where this is heading
One context, ready for agents.
Agents are only as useful as the context they stand on — and after a few months of running on Opelli, that context exists in one place: what was decided (the wiki), what's committed (the schedule), what happened (the activity log, tracked time, task history), who matters (the pipeline) and how the company speaks (the tone guidelines). The MCP server above is the first layer standing on it. The ones after it run on their own — watching for the deal that went quiet, drafting the follow-up, preparing the monthly report — through the same permissioned API, with people reviewing what ships.
Get early access.
Opelli is in private beta with a handful of teams — hosted, your company at its own opelli.dev address minutes after the invite. Leave an email and we'll reach out as seats open up.
You're on the list. We'll be in touch.