Skip to content

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:

  1. 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.
  2. 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.
  3. 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-hidden on the SVG (brand-damaging for an accessibility product). Old orgchart.anglin.com branding 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)

ProductPricingA11y storyPositioning
Organimi$18–$35/mo base + employee-count slider; free ≀25NoneSMB cost-conscious
Pingboard (Workleap)~$4/user/mo entry; legacy flat $149–$311/moNoneSMB directory + chart
ChartHop$2 PEPM (chart only) β†’ $8+ PEPM platform; $9k/yr minimumNoneMid-market people analytics
Sift$1.50–$3.25/user/mo, 20-user minNoneGoogle/O365 auto-build directory
Functionly~$240–$490/mo (10 seats)NoneOrg design / scenario planning
The OrgFree (public charts)NoneStartup transparency; not internal
Lucidchart~$9–10/user/moVPAT + WCAG 2.1 AA cert for the editor onlyGeneral diagramming default
HRIS built-ins (Workday, BambooHR, Rippling)BundledNone; exports are PNG/untagged PDFCommoditized 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.

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.

TierPriceIncludes
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/yrUnlimited 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)

  1. 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).
  2. 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).
  3. 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

  1. 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; onBlur duplicates the write.
  2. Silent data loss on failed edits β€” editor/page.tsx:181-183 swallows updatePerson failures (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.
  3. 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 a console.warn. Viewers see an incomplete chart with no warning.
  4. 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

  1. 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.
  2. 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.
  3. 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); in viewMode='radial' no accessible alternative renders at all. Brand-critical.
  4. Invalid ARIA tree in radial list view β€” AccessibleOrgChart.tsx:195-215 (missing treeitem, group outside tree; axe flags it). Civic template does it correctly β€” reuse it.
  5. role="grid" on a plain table with no grid keyboard model β€” editor/page.tsx:603.
  6. Editor modals: no focus trap, no focus restore β€” editor/page.tsx:855-936, 939-1038 (the dead BulkImportModal.tsx has a correct focus trap β€” the good one was orphaned).
  7. Share URLs built without the /chart basePath β€” 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.
  8. Old-brand watermark β€” share/page.tsx:217-223 links to orgchart.anglin.com (β€œMade with OrgChart.anglin.com”) β€” wrong brand on the product’s most public surface; CDN hosting URL is also cdn.orgchart.anglin.com (hosting.ts).

Medium

  1. Person delete has no confirmation (editor/page.tsx:787-796); import errors say β€œCheck console for details” (editor/page.tsx:280).
  2. CSV round-trip breaks on embedded newlines (export preserves them, importers split on \n first: editor/page.tsx:262, utils.ts:7); no formula-injection sanitization on export.
  3. Preview page: ~70-line copy-pasted handlers (preview/page.tsx:626-665, 694-734); error detection by statusMessage.startsWith('Failed') (line 976); postMessage(..., '*') wildcard origin (753-756, 1042-1045); direct Supabase query bypassing the API (line 446).
  4. ~2,800 lines of dead components (OrgDataTable, PersonForm, VersionHistory, BulkImportModal, both TemplatePickers, 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:a11y covers only the footer.
  5. NEXT_PUBLIC_VISION_ONLY_MODE env var is dead β€” preview/page.tsx:16 hardcodes false.
  6. 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).
  7. 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 named midnight-teal (themes.ts:2) violating the no-teal rule.

Low

  1. 31 console.* calls in prod paths; 10 any usages; i18n abandoned (121 keys in locales/en.json, only 5 files use useTranslations); oversized files (themes.ts 1285 ln, preview/page.tsx 1205, editor/page.tsx 1055); radial header hardcodes β€œRadial Organization Chart”; no UI warning when charts exceed a template’s maxPeopleRecommended.

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.

  1. 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)
  2. Hierarchy by ID, not name: rekey org-chart-radial/utils.ts on person ID; support multiple roots (virtual root or side-by-side); render name-less rows; surface orphaned-manager warnings in the UI. (Critical #3)
  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)
  4. 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)
  5. Auth on cached previews (or move preview HTML behind short-lived signed URLs). (High #6)
  6. Rebrand watermark + hosting domain to TheAccessibleOrgChart / orgchart.theaccessible.org (audit cdn.orgchart.anglin.com migration path for existing hosted charts). (High #12)
  7. Share-link basePath fix (windowHref per 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.

  1. Radial view: keyboard operability (roving tabindex on nodes, Enter/Space, visible focus ring), remove aria-hidden or 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 civic AccessibleTreeView. Fix 10px fonts and clip-path bug. (High #7, #8; Medium #18)
  2. Editor app a11y: drop role="grid" (or implement the grid pattern), add focus traps to live modals (port from the dead BulkImportModal), label all inputs, 44Γ—44 targets, replace alert(). (High #9, #10; Medium #19)
  3. Delete midnight-teal (rename/re-hue) and audit themes for contrast in both modes.
  4. Expand test:a11y to 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.
  5. 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.

  1. 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_chart entitlement model, migrations required).
  2. Team workspaces: organization entity, member invites, roles (owner/editor/viewer) on charts; single-owner remains the Individual tier.
  3. Restore the Version History UI (backend already done).
  4. Procurement kit: ACR download, security one-pager, W-9, standard answers to HECVAT-lite β€” a /procurement page.
  5. Marketing overhaul of the landing/pricing pages around the Title II deadline narrative; update products.ts tagline if needed; cross-promo from TheAccessibleAudit results that detect image-based org charts.

Phase 4 β€” Competitive parity features β€” ~4–8 weeks, prioritized by demand

  1. Tagged accessible PDF export (WeasyPrint path; mind its SVG marker limitation) + PNG snapshot export.
  2. Standalone HTML for radial/civic templates (embed D3 inline; remove the redirect stubs).
  3. Scheduled CSV sync (URL/SFTP fetch on cron) β†’ Google/M365 directory sync β†’ BambooHR connector.
  4. SSO (SAML/OIDC) for the Institution tier.
  5. Matrix/multi-hierarchy template; multi-page print layouts.
  6. 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

ConcernPath
Editor (write storm, silent catch, modals)apps/org-chart/src/app/editor/page.tsx
Radial hierarchy bugsapps/org-chart/src/components/templates/org-chart-radial/utils.ts
Radial a11yapps/org-chart/src/components/templates/org-chart-radial/RadialOrgChart.tsx, AccessibleOrgChart.tsx
Correct ARIA tree to reusecivic template AccessibleTreeView.tsx + useTreeNavigation
Share endpoints (create-temp)workers/api/src/routes/org-chart/org-chart-share.ts
Unauth previewworkers/api/src/routes/org-chart/generate.ts:705
Watermark / old domainworkers/api/src/utils/watermark.ts, apps/org-chart/src/app/share/page.tsx:217, workers/api/src/routes/org-chart/hosting.ts
Pricing pageapps/org-chart/src/app/(marketing)/pricing/page.tsx
Entitlement middlewareworkers/api/src/middleware/org-chart-credits.ts
Template registryworkers/api/src/templates/index.ts