TheAccessibleOrgChart β Competitive Analysis & Improvement Plan
Analysis date: 2026-07-12. Read-only assessment β no code changes made. Sources: full codebase review of apps/org-chart + workers/api/src/routes/org-chart/ + packages/org-chart-shared/, plus web research on the mid-2026 org chart market (pricing cited inline; verify before quoting externally).
Executive Summary
TheAccessibleOrgChart occupies a genuinely uncontested position: no dedicated org chart vendor (Organimi, Pingboard, ChartHop, Sift, Functionly, The Org) markets WCAG/Section 508-compliant chart output or publishes a VPAT/ACR. Lucidchartβs VPAT covers editor usability, not published-chart accessibility. Meanwhile, DOJ Title II deadlines (April 26, 2027 / 2028) make every published org chart on a .gov/.edu site a compliance liability, and higher-ed procurement now effectively requires an ACR β which disqualifies every incumbent.
Three conclusions:
- The product is dramatically underpriced. At $30/yr it is priced like a consumer utility while selling into buyers who pay Pope Tech $3kβ$20k/yr and Siteimprove $12kβ$70k/yr for accessibility compliance. Recommended: keep a low individual tier, add a Department license ($499β$990/yr) and an Institution license ($2,500β$4,900/yr) β flat-priced, under P-card/no-bid thresholds.
- Feature gaps are moderate and tractable β the biggest are tagged-PDF/PNG export, HRIS/directory sync (SCIM/CSV-scheduled), SSO, team seats, and a published ACR. The accessible-HTML core is already differentiated.
- Product quality problems must be fixed before raising price. The code audit found critical issues β an editor that writes to the API on every keystroke and silently drops failed edits, a share/interactive renderer keyed by employee name that silently drops people, an unauthenticated share-creation endpoint, and a mouse-only radial view with
aria-hiddenon the SVG (brand-damaging for an accessibility product). Oldorgchart.anglin.combranding still ships on the watermark.
1. Current Product Snapshot
What the product is today (verified in code):
- Creation: AI vision extraction from PNG/JPG/BMP/PDF uploads (dual-model Gemini + Claude with quality scoring), CSV import (rich column aliasing, secondary managers), manual editor, and a developer REST API (
POST /api/v1/charts/generate, up to 1,000 nodes). - Data model: people with name/title/department/email/phone/location/employeeId/photo/link + unlimited custom fields; primary reporting via
managerId; secondary relationships (dotted_line,advisory,committee,project,mentor). - Output: 12 templates (trees, cards, lists, interactive collapsible, civic accessible, radial), 3 density levels, 5 color schemes + full custom palette derivation, light/dark toggle, custom header/footer branding (text or image). All output is self-contained HTML β no PNG/SVG/PDF export.
- Accessibility: ARIA tree roles, keyboard nav in the civic/collapsible templates, screen-reader summaries of dotted-line relationships, per-chart WCAG validation pipeline (custom static validator + axe-core via Puppeteer on the API), downloadable WCAG compliance report per output.
- Distribution: share links (public / password / expiring / review-workflow), iframe embed, CDN hosting at a public slug (paid-gated), watermark on unpaid charts.
- Versioning: full snapshots per edit with a diff engine (backend complete; frontend UI currently disabled behind
{false && ...}). - Monetization: $30/yr flat per chart-finalization entitlement (Stripe), watermark otherwise. No teams, no SSO, single-owner charts. Magic-link auth only.
- Stack: Next.js 15 static export on Cloudflare Workers; Hono API on Node (.4) + Lambda; Supabase; R2; Redis preview cache.
Notable dormant surface: visual style-matching pipeline disabled (if (false ...) in generate.ts:498); radial/civic templates donβt yet produce standalone HTML (redirect stubs); VersionHistory.tsx, OrgDataTable.tsx, PersonForm.tsx, BulkImportModal.tsx and ~2,800 lines of related components are dead code.
2. Market Landscape (mid-2026)
| Product | Pricing | A11y story | Positioning |
|---|---|---|---|
| Organimi | $18β$35/mo base + employee-count slider; free β€25 | None | SMB cost-conscious |
| Pingboard (Workleap) | ~$4/user/mo entry; legacy flat $149β$311/mo | None | SMB directory + chart |
| ChartHop | $2 PEPM (chart only) β $8+ PEPM platform; $9k/yr minimum | None | Mid-market people analytics |
| Sift | $1.50β$3.25/user/mo, 20-user min | None | Google/O365 auto-build directory |
| Functionly | ~$240β$490/mo (10 seats) | None | Org design / scenario planning |
| The Org | Free (public charts) | None | Startup transparency; not internal |
| Lucidchart | ~$9β10/user/mo | VPAT + WCAG 2.1 AA cert for the editor only | General diagramming default |
| HRIS built-ins (Workday, BambooHR, Rippling) | Bundled | None; exports are PNG/untagged PDF | Commoditized internal viewing |
Key market facts
- HRIS tools have commoditized internal org chart viewing. Standalone tools survive on scenario planning, multi-source orgs, presentation-quality output, and public publishing β and public publishing is exactly where accessibility law bites and where HRIS exports (flat PNG / untagged PDF) fail.
- FY2024 Section 508 assessment: only 23% of top federal pages fully conform; 77% of top agency downloads are PDFs and only ~20% of those conform. Org charts are among the hardest artifacts to remediate by hand.
- Higher-ed procurement now hard-requires a completed ACR (VPAT 2.3+) for tools used by more than one user or the public (e.g., CSU Fullerton, Texas A&MβCC policies). No dedicated org chart vendor can currently clear that review.
- Title II deadlines: April 26, 2027 (pop β₯50k), April 26, 2028 (<50k + special districts). Litigation exposure exists today.
- Budget reality: institutions pay Pope Tech ~$3kβ$20k+/yr and Siteimprove ~$12kβ$70k/yr for accessibility tooling. Federal micro-purchase threshold is $15k; university P-card limits are typically $3.5kβ$5k single-purchase; formal RFPs start around $100kβ$250k.
3. Market Position & Pricing Recommendation
Positioning
βThe only org chart tool whose published output is WCAG 2.1 AA β with the ACR to prove it.β
- Sell the publishing artifact, not the directory. The pitch to a web-accessibility coordinator: βthe org chart PDF/PNG on your site is a Title II violation waiting to be filed; replace it with an embeddable, screen-reader-navigable chart in an afternoon.β
- Target buyer: digital-accessibility/web coordinators and communications offices at public universities, cities, counties, school districts, and state agencies β not HR. HR already has an HRIS chart; the coordinator owns the compliance problem.
- The deadline is the go-to-market calendar: campaign waves timed to April 2027 and April 2028.
- Fits the family story: TheAccessibleAudit finds the inaccessible org chart page β TheAccessibleOrgChart is the fix, same as the auditβremediate handoff.
Pricing (recommended)
Flat licenses, not per-employee β PEPM punishes a 20,000-person university publishing a dozen departmental charts, and flat pricing sails through P-card purchasing.
| Tier | Price | Includes |
|---|---|---|
| Individual | $99/yr (grandfather existing $30 buyers) | 1 user, up to 3 active charts, hosting, all templates, WCAG report |
| Department | $499/yr (intro) β $990/yr (post-validation) | 5 seats, unlimited charts, embed + hosting, priority support, ACR packet |
| Institution | $2,500β$4,900/yr | Unlimited seats/charts, SSO, subdomain/white-label hosting, SCIM/HRIS sync, procurement support (ACR, security questionnaire, W-9, insurance docs) |
Rationale: $30/yr anchors the product as a toy and canβt fund support/procurement paperwork. $499β$4,900 is 10β100Γ below what the same buyer pays Siteimprove, below every no-bid threshold, and still undercuts ChartHopβs $9k minimum. The buyer is purchasing compliance, not seats. Keep a watermarked free tier as the lead magnet.
Prerequisite: fix the Critical/High product problems below before the price raise β a $2,500 product cannot ship a keystroke-lossy editor or an old-domain watermark.
4. Feature Gaps to Compete
Ordered by importance to the target buyer.
Compliance/procurement (the moat)
- Published ACR (VPAT 2.5, WCAG edition) + public accessibility statement page. This is the single highest-leverage artifact β it wins procurement by default and disqualifies incumbents. Requires genuinely fixing the a11y defects first (Β§5).
- Accessible tagged-PDF export β buyers still need βthe PDF on the websiteβ and board-packet printouts. The monorepo already has WeasyPrint expertise (note its SVG marker limitations). PNG/SVG export secondary (with guidance that HTML embed is the compliant path).
- Accessibility conformance badge + per-chart report already exists β surface it harder in marketing/exports.
Product parity (table stakes vs incumbents) 4. Multi-user / team seats β charts are single-owner today; Department tier requires shared workspaces with roles (owner/editor/viewer). 5. SSO (SAML/OIDC) β hard requirement at Institution tier; magic-link-only wonβt pass IT review. 6. Scheduled data sync β start cheap: re-import CSV by URL/SFTP on a schedule, then Google Workspace/M365 directory sync (Siftβs wedge), then HRIS connectors (BambooHR first β it has a partner marketplace). 7. Working version history UI β backend is complete; the frontend is disabled dead code. Restore it; itβs a differentiator vs Organimi. 8. Standalone interactive exports for radial/civic β currently redirect stubs; self-contained HTML is the productβs whole promise. 9. Print/board-packet layouts β multi-page pagination for large orgs (pairs with PDF export). 10. Matrix/multi-hierarchy views β dotted-line data model already exists; add a matrix rendering template (ChartHop/Workday parity for the org-design use case).
Nice-to-have (defer)
- Scenario planning (Functionlyβs turf β different buyer), photoboard template, public API webhooks, white-label subdomain hosting (Institution tier), org chart βwall of fameβ gallery for social proof.
5. Product Problems (verified in code)
Full detail retained from the audit; file references verified. Critical items are launch-blockers for the repositioning.
Critical
- Editor writes to the API on every keystroke; UI updates only after the round-trip β
apps/org-chart/src/app/editor/page.tsx:169-184(inputs at 636-666, 764-784). No debounce, no request ordering; fast typing lags and can drop/reorder characters;onBlurduplicates the write. - Silent data loss on failed edits β
editor/page.tsx:181-183swallowsupdatePersonfailures (catch { /* Silently fail */ }). No undo exists, and Version History UI is disabled ({false && ...}at lines 567-584, 809-851), so there is no safety net. - Interactive/share hierarchy keyed by employee name β
src/components/templates/org-chart-radial/utils.ts:92,71,102,110: duplicate names collapse into one node; name-less (position-only) rows are dropped; multiple roots last-write-wins (subtrees silently vanish); orphaned managers dropped with only aconsole.warn. Viewers see an incomplete chart with no warning. - Secondary-manager delimiter mismatch β export joins with
;(editor/page.tsx:326,preview/page.tsx:441) but the parser splits on,(utils.ts:184): dotted lines silently vanish for anyone with 2+ secondary managers, and exported CSV doesnβt round-trip.
High
- Unauthenticated, unrate-limited
POST /api/shares/create-tempβworkers/api/src/routes/org-chart/org-chart-share.ts:396: no auth, no size cap, no rate limit. Storage abuse + attacker-controlled public βorg chartβ pages on the brandβs domain (phishing vector). Also invoked for logged-in users on every radial/civic preview (preview/page.tsx:449-453), duplicating chart data into permanent public rows with no cleanup. - Unauthenticated preview endpoint leaks PII β
generate.ts:705-716: anyone with the chart UUID gets names/emails/phones/reporting lines. Chart IDs live in URLs and leak via history/referrers/logs. - Radial SVG is mouse-only and hidden from AT β
RadialOrgChart.tsx:468(aria-hidden="true"on the SVG), click/hover-only interaction, hover-only tooltip (WCAG 2.1.1 / 1.4.13 failures); inviewMode='radial'no accessible alternative renders at all. Brand-critical. - Invalid ARIA tree in radial list view β
AccessibleOrgChart.tsx:195-215(missingtreeitem,groupoutside tree; axe flags it). Civic template does it correctly β reuse it. role="grid"on a plain table with no grid keyboard model βeditor/page.tsx:603.- Editor modals: no focus trap, no focus restore β
editor/page.tsx:855-936, 939-1038(the deadBulkImportModal.tsxhas a correct focus trap β the good one was orphaned). - Share URLs built without the
/chartbasePath βShareButton.tsx:44,64,preview/page.tsx:940;appHref()is an identity fn (lib/paths.ts:11-13). Breaks on any path-prefixed serving surface. - Old-brand watermark β
share/page.tsx:217-223links toorgchart.anglin.com(βMade with OrgChart.anglin.comβ) β wrong brand on the productβs most public surface; CDN hosting URL is alsocdn.orgchart.anglin.com(hosting.ts).
Medium
- Person delete has no confirmation (
editor/page.tsx:787-796); import errors say βCheck console for detailsβ (editor/page.tsx:280). - CSV round-trip breaks on embedded newlines (export preserves them, importers split on
\nfirst:editor/page.tsx:262,utils.ts:7); no formula-injection sanitization on export. - Preview page: ~70-line copy-pasted handlers (
preview/page.tsx:626-665, 694-734); error detection bystatusMessage.startsWith('Failed')(line 976);postMessage(..., '*')wildcard origin (753-756, 1042-1045); direct Supabase query bypassing the API (line 446). - ~2,800 lines of dead components (
OrgDataTable,PersonForm,VersionHistory,BulkImportModal, bothTemplatePickers,TemplatePreview,OrgChartPreview,DropZone, 3 hooks) β and 2 of the 6 test files test dead code while the live editor/share/templates have zero tests;test:a11ycovers only the footer. NEXT_PUBLIC_VISION_ONLY_MODEenv var is dead βpreview/page.tsx:16hardcodesfalse.- 10px text in radial labels (
RadialOrgChart.tsx:358,375,407) β below the repoβs 12px minimum; radial clip-path index mismatch swaps photo crops when any node lacks a photo (RadialOrgChart.tsx:284-299). - Hover-only styling with no focus equivalents in radial/list templates; unlabeled search and password inputs (
index.tsx:192-204,share/page.tsx:131-138);alert()in ShareButton (line 79); several controls under 44Γ44px; a theme namedmidnight-teal(themes.ts:2) violating the no-teal rule.
Low
- 31
console.*calls in prod paths; 10anyusages; i18n abandoned (121 keys inlocales/en.json, only 5 files useuseTranslations); oversized files (themes.ts1285 ln,preview/page.tsx1205,editor/page.tsx1055); radial header hardcodes βRadial Organization Chartβ; no UI warning when charts exceed a templateβsmaxPeopleRecommended.
Genuinely good: the civic templateβs AccessibleTreeView/useTreeNavigation is a correct, complete ARIA tree (arrows/Home/End/typeahead); reduced-motion support; watermark applied consistently across all unpaid surfaces; dual-model extraction with quality scoring and cost metrics; fail-closed entitlement middleware.
6. Implementation Plan
Four phases. Phase 1 must complete before any price change or marketing push; each phase is independently shippable. All feature/fix items should be filed as GitHub issues per the branch-strategy rule before work begins.
Phase 1 β Trust foundation (fix before repositioning) β ~2β3 weeks
Goal: the product must not lose data, leak data, or fail its own accessibility standard.
- Editor rewrite of the write path: optimistic local state (per global standardsβ lazy-writes rule), debounced PATCH (~500ms) with request sequencing, visible save indicator, error toast + revert on failure. Kill the per-keystroke write and the silent catch. (Critical #1, #2)
- Hierarchy by ID, not name: rekey
org-chart-radial/utils.tson person ID; support multiple roots (virtual root or side-by-side); render name-less rows; surface orphaned-manager warnings in the UI. (Critical #3) - Fix the
;vs,secondary-manager delimiter in one shared parser used by both export and import; add round-trip tests including embedded newlines and formula-injection sanitization. (Critical #4, Medium #14) - Lock down
create-temp: require auth (or heavy rate-limit + size cap + captcha for the anonymous demo path), TTL + cleanup job for temp rows, stop calling it for authenticated previews (use an authed preview route). (High #5) - Auth on cached previews (or move preview HTML behind short-lived signed URLs). (High #6)
- Rebrand watermark + hosting domain to TheAccessibleOrgChart / orgchart.theaccessible.org (audit
cdn.orgchart.anglin.commigration path for existing hosted charts). (High #12) - Share-link basePath fix (
windowHrefper the documented contract). (High #11)
Phase 2 β Walk the accessibility talk + ship the ACR β ~2β3 weeks
Goal: every rendered surface passes axe + manual keyboard/SR testing; publish the ACR.
- Radial view: keyboard operability (roving tabindex on nodes, Enter/Space, visible focus ring), remove
aria-hiddenor pair every radial render with the accessible tree; make tooltip content focus-reachable (1.4.13). Fix invalid ARIA tree in the list view by reusing the civicAccessibleTreeView. Fix 10px fonts and clip-path bug. (High #7, #8; Medium #18) - Editor app a11y: drop
role="grid"(or implement the grid pattern), add focus traps to live modals (port from the deadBulkImportModal), label all inputs, 44Γ44 targets, replacealert(). (High #9, #10; Medium #19) - Delete
midnight-teal(rename/re-hue) and audit themes for contrast in both modes. - Expand
test:a11yto cover editor, share, and every templateβs rendered output (axe against generated HTML fixtures); add the missing tests for live components; delete the ~2,800 lines of dead code and their tests. - Author and publish the ACR (VPAT 2.5 WCAG edition) + accessibility statement page. Consider a third-party audit for credibility (Lucidchart uses one). This is the marketing artifact.
Phase 3 β Monetization & tiering β ~3β4 weeks
Goal: launch Department/Institution tiers.
- New Stripe products/prices for Individual $99 / Department $499 / Institution (sales-assisted); grandfather existing $30 purchasers through their paid window; update entitlement checks for seat-based tiers (extends the existing
org_chartentitlement model, migrations required). - Team workspaces: organization entity, member invites, roles (owner/editor/viewer) on charts; single-owner remains the Individual tier.
- Restore the Version History UI (backend already done).
- Procurement kit: ACR download, security one-pager, W-9, standard answers to HECVAT-lite β a
/procurementpage. - Marketing overhaul of the landing/pricing pages around the Title II deadline narrative; update
products.tstagline if needed; cross-promo from TheAccessibleAudit results that detect image-based org charts.
Phase 4 β Competitive parity features β ~4β8 weeks, prioritized by demand
- Tagged accessible PDF export (WeasyPrint path; mind its SVG marker limitation) + PNG snapshot export.
- Standalone HTML for radial/civic templates (embed D3 inline; remove the redirect stubs).
- Scheduled CSV sync (URL/SFTP fetch on cron) β Google/M365 directory sync β BambooHR connector.
- SSO (SAML/OIDC) for the Institution tier.
- Matrix/multi-hierarchy template; multi-page print layouts.
- i18n retrofit of the app surfaces (es first, matching family strategy).
Sequencing note
Phases 1β2 are the same engineers touching the same files β run them as one 4β6 week hardening epic if staffing allows. Phase 3βs Stripe/migration work follows the established entitlement patterns (migrations 195β198). The April 2027 deadline means marketing (Phase 3.5) should land by early Q4 2026 to catch budget cycles for the 2027 compliance year.
Appendix β Key source files
| Concern | Path |
|---|---|
| Editor (write storm, silent catch, modals) | apps/org-chart/src/app/editor/page.tsx |
| Radial hierarchy bugs | apps/org-chart/src/components/templates/org-chart-radial/utils.ts |
| Radial a11y | apps/org-chart/src/components/templates/org-chart-radial/RadialOrgChart.tsx, AccessibleOrgChart.tsx |
| Correct ARIA tree to reuse | civic template AccessibleTreeView.tsx + useTreeNavigation |
| Share endpoints (create-temp) | workers/api/src/routes/org-chart/org-chart-share.ts |
| Unauth preview | workers/api/src/routes/org-chart/generate.ts:705 |
| Watermark / old domain | workers/api/src/utils/watermark.ts, apps/org-chart/src/app/share/page.tsx:217, workers/api/src/routes/org-chart/hosting.ts |
| Pricing page | apps/org-chart/src/app/(marketing)/pricing/page.tsx |
| Entitlement middleware | workers/api/src/middleware/org-chart-credits.ts |
| Template registry | workers/api/src/templates/index.ts |