// Page sections for the ImmiHub for Attorneys marketing site. // Each top-level export renders one section; Site composes them. const { useState, useEffect, useRef } = React; function useMediaQuery(query) { const [matches, setMatches] = useState(() => typeof window !== 'undefined' ? window.matchMedia(query).matches : false ); useEffect(() => { const mq = window.matchMedia(query); const onChange = () => setMatches(mq.matches); onChange(); mq.addEventListener('change', onChange); return () => mq.removeEventListener('change', onChange); }, [query]); return matches; } /* ─────────────────────── NAV ─────────────────────── */ function Nav({ accent }) { const A = accentColor(accent); const narrow = useMediaQuery('(max-width: 900px)'); const [menuOpen, setMenuOpen] = useState(false); const navLinks = [ ['The moat', '#moat'], ['Product', '#product'], ['Compare', '#compare'], ['Pricing', '#pricing'], ['Security', '#security'], ['FAQ', '#faq'], ]; useEffect(() => { if (!narrow) setMenuOpen(false); }, [narrow]); return (
ImmiHub For attorneys
{narrow && ( )}
{!narrow && (
{navLinks.map(([l, h]) => ( {l} ))}
)} {!narrow && ( Join the waitlist → )} {narrow && menuOpen && ( )}
); } /* ─────────────────────── HERO ─────────────────────── */ function Hero({ accent, heroShot }) { const A = accentColor(accent); const narrow = useMediaQuery('(max-width: 900px)'); const Shot = heroShot === 'rfe' ? RfeShot : heroShot === 'cases' ? CasesShot : DashboardShot; const url = heroShot === 'rfe' ? 'attorneys.immihub.com/cases/hassan/rfe' : heroShot === 'cases' ? 'attorneys.immihub.com/cases' : 'attorneys.immihub.com/dashboard'; const floatBase = { background: '#fff', padding: '12px 16px', borderRadius: 12, border: `1px solid ${T.mist}`, boxShadow: T.shadow.lg, maxWidth: narrow ? '100%' : 260, width: narrow ? '100%' : undefined, boxSizing: 'border-box', }; return (
Pre-launch · Waitlist open for founding firms

Cases that arrive
pre-organized.

A practice-management platform for US immigration attorneys — where new matters walk in the door with passports, petition data, I-20s, and receipt notices already sorted by source. You spend time on legal judgment, not intake.

Join the waitlist See how a matter arrives →
No credit card · Founding-firm pricing locked for 2 years
{/* Source-stripe legend — establishes the visual vocabulary immediately */}
The vocabulary {['consumer','employer','dso','attorney','uscis'].map(s => ( ))}
{/* Big browser shot */}
{/* Floating callout */}
ImmiHub Incoming
Every document carries a source stripe. At a glance you know where it came from and whether you can trust it.
USCIS inbox
Forward notices to casebox@… — receipt numbers auto-route.
); } /* ─────────────────── MOAT DIAGRAM ─────────────────── */ function MoatSection() { const narrow = useMediaQuery('(max-width: 900px)'); const sources = [ { src: 'consumer', name: 'Consumer app', who: 'The beneficiary', brings: ['Passports · I-94s · EADs', 'Pay stubs · credentials', 'Identity documents'] }, { src: 'employer', name: 'Employer Dashboard', who: 'The sponsoring employer', brings: ['Signed I-129s · LCAs', 'I-797s · org charts', 'Worksite + role data'] }, { src: 'dso', name: 'DSO Portal', who: 'The university ISSS', brings: ['I-20s · SEVIS records', 'CPT / OPT authorizations', 'Travel signatures'] }, ]; const attorneyCard = (
Attorney Portal
A new matter walks in the door with the evidence already sorted.
{[ 'Documents auto-filed under the right case', 'Receipt numbers routed from the USCIS inbox', 'Deadlines generated from rule engine', 'Conflicts surfaced for partner review', ].map(t => (
{t}
))}
); return (
The moat

Three products feed every case.
Yours is the fourth.

Other attorney tools inherit empty shells. ImmiHub is building all four products at once — so by the time a matter reaches your desk, the client, the employer, and (for students) the DSO are already on-platform. Their documents land in your case with a source tag you can see at a glance.

{/* Diagram */}
{sources.map((s) => (
{s.name}
{s.who}
    {s.brings.map(b => (
  • {b}
  • ))}
))}
{/* Arrows */} {!narrow && ( )} {attorneyCard}
USCIS itself can't be directly connected — there is no public case-status API. ImmiHub handles this the only way it can be handled: a per-firm casebox@… forwarding address, receipt-number auto-match, and human triage for unmatched notices.
); } /* ─────────────────── PRODUCT SHOWCASE ─────────────────── */ function ProductSection() { const narrow = useMediaQuery('(max-width: 900px)'); const [tab, setTab] = useState('dash'); const tabs = [ { k: 'dash', label: 'Dashboard', desc: 'Morning triage with ImmiHub Incoming — a chronological feed of documents that arrived overnight from connected counterparties.', shot: DashboardShot, url: 'attorneys.immihub.com/dashboard' }, { k: 'rfe', label: 'RFE workspace', desc: 'Three-pane: USCIS request list, draft response, evidence locker with source stripes. The moment you feel the platform most.', shot: RfeShot, url: 'attorneys.immihub.com/cases/hassan/rfe' }, { k: 'cases', label: 'Cases', desc: 'Eight-stage lifecycle from Inquiry to Closed. Filter by source, priority, attorney. Drag across stages.', shot: CasesShot, url: 'attorneys.immihub.com/cases' }, { k: 'inbox', label: 'USCIS inbox', desc: 'Forward notices to casebox@…immihub.com. Receipt numbers auto-route; unmatched triage to human.', shot: InboxShot, url: 'attorneys.immihub.com/inbox' }, ]; const current = tabs.find(t => t.k === tab); const Shot = current.shot; const detail = (
{current.label}
{[ 'Source stripes on every row', 'USCIS receipt-prefix validation', 'Deadline rule engine (14 triggers)', 'Conflict surfacing · partner sign-off required', ].map(t => (
{t}
))}
); return (
The product

Built around how immigration cases actually move.

The same source-stripe vocabulary runs through every screen. An LCA from the Employer Dashboard shows up in the evidence locker with the same blue stripe it had on the dashboard feed.

{tabs.map(t => ( ))}
{narrow && detail}
{!narrow && detail}
); } /* ─────────────────── LIVE DEMO: RECEIPT VALIDATOR ─────────────────── */ const SERVICE_CENTERS = { EAC: 'Vermont Service Center', LIN: 'Nebraska Service Center', MSC: 'National Benefits Center', WAC: 'California Service Center', NBC: 'National Benefits Center', SRC: 'Texas Service Center', YSC: 'Potomac Service Center', IOE: 'USCIS Electronic Immigration System', }; function ReceiptDemo() { const [val, setVal] = useState('EAC-24-189-45201'); const parsed = (() => { const v = val.trim().toUpperCase().replace(/\s/g, ''); const m = v.match(/^([A-Z]{3})[-]?(\d{2})[-]?(\d{3})[-]?(\d{5})$/); if (!m) return { ok: false, err: v.length === 0 ? 'Enter a receipt number' : 'Format: 3 letters + 10 digits (e.g. EAC-24-189-45201)' }; const [, prefix, yy, day, seq] = m; const center = SERVICE_CENTERS[prefix]; if (!center) return { ok: false, err: `Unknown service-center prefix "${prefix}". Expected one of ${Object.keys(SERVICE_CENTERS).join(', ')}.` }; const filingYear = 2000 + parseInt(yy, 10); return { ok: true, prefix, center, filingYear, dayOfYear: parseInt(day, 10), seq, }; })(); const samples = ['EAC-24-189-45201', 'LIN-25-077-12089', 'MSC-25-104-88210', 'XYZ-23-000-00000']; const narrow = useMediaQuery('(max-width: 900px)'); return (
Try it now

Paste a receipt number.
Watch it resolve.

Every USCIS receipt carries a three-letter service-center prefix. ImmiHub validates the format live, resolves the center, and routes the notice to the matching case by receipt when a forwarded email arrives in your casebox@….

Try: {samples.map(s => ( ))}
USCIS receipt number
setVal(e.target.value)} spellCheck={false} style={{ width: '100%', padding: '14px 16px', background: '#1A2332', color: '#fff', border: `1px solid ${parsed.ok ? T.green : T.danger}`, borderRadius: 10, fontFamily: 'JetBrains Mono, monospace', fontSize: 18, letterSpacing: '0.04em', outline: 'none', boxShadow: `0 0 0 3px ${parsed.ok ? 'rgba(52,184,124,0.18)' : 'rgba(217,79,79,0.18)'}`, }} />
{parsed.ok ? (
✓ Valid format Prefix recognized
) : (
× {parsed.err.startsWith('Unknown') ? 'Unknown prefix' : 'Invalid format'}
{parsed.err}
Valid prefixes: {Object.keys(SERVICE_CENTERS).join(' · ')}
)}
); } function DemoRow({ k, v, highlight }) { return (
{k} {v}
); } /* ─────────────────── COMPARE ─────────────────── */ function CompareSection() { const narrow = useMediaQuery('(max-width: 900px)'); const rows = [ ['Cases arrive with documents pre-sorted by source', 'inszoom-', 'docketwise-', 'clio-', 'mycase-', 'immihub'], ['Connected Employer Dashboard sharing signed I-129s / LCAs', 'inszoom-', 'docketwise-', 'clio-', 'mycase-', 'immihub'], ['Connected DSO Portal for student I-20 / CPT cases', 'inszoom-', 'docketwise-', 'clio-', 'mycase-', 'immihub'], ['Consumer app the client already uses for their own status', 'inszoom-', 'docketwise-', 'clio-', 'mycase-', 'immihub'], ['USCIS receipt format validation + auto-match by prefix', 'inszoom+', 'docketwise+', 'clio-', 'mycase-', 'immihub'], ['Immigration-native case lifecycle (8 stages, RFE, NOID, AOS)', 'inszoom+', 'docketwise+', 'clio-', 'mycase-', 'immihub'], ['Visa bulletin + priority-date tracking', 'inszoom+', 'docketwise+', 'clio-', 'mycase-', 'immihub'], ['IOLTA trust accounting', 'inszoom+', 'docketwise+', 'clio+', 'mycase+', 'immihub'], ['Conflict surfacing with required partner sign-off', 'inszoom+', 'docketwise+', 'clio+', 'mycase+', 'immihub'], ['LEDES task codes on time entries', 'inszoom+', 'docketwise+', 'clio+', 'mycase-', 'immihub'], ]; const cols = [ { k: 'feat', label: '' }, { k: 'inszoom', label: 'INSZoom' }, { k: 'docketwise', label: 'Docketwise' }, { k: 'clio', label: 'Clio' }, { k: 'mycase', label: 'MyCase' }, { k: 'immihub', label: 'ImmiHub', self: true }, ]; const cell = (code) => { if (code === 'immihub') return ; if (code.endsWith('+')) return ; return ; }; return (
Compare

Other tools manage cases.
We sort them before they arrive.

INSZoom, Docketwise, Clio, MyCase — all competent case managers. None of them are building the three counterparty products that would let cases show up pre-organized.

{cols.map((c, i) => (
{c.label}
))} {rows.map((r, i) => (
{r[0]}
{r.slice(1).map((code, j) => (
{cell(code)}
))}
))}
Supported · Not available. Comparison based on each vendor's publicly marketed capabilities as of 2026. Features evolve; verify with the vendor before signing.
); } /* ─────────────────── PRICING (tier-aware) ─────────────────── */ function PricingSection({ firmTier, setFirmTier, accent }) { const A = accentColor(accent); const narrow = useMediaQuery('(max-width: 900px)'); const tiers = [ { k: 'solo', name: 'Solo', price: '$129', per: 'per attorney / month', tagline: 'For solo immigration attorneys.', incl: [ 'Unlimited matters', 'USCIS inbox + receipt validation', 'Consumer-app integration', 'Deadline rule engine', 'IOLTA trust accounting', ], excl: ['DSO Portal (off by default)', 'Firm activity feed', 'LEDES billing export'], }, { k: 'boutique', name: 'Boutique', price: '$99', per: 'per seat / month · 2–10 seats', tagline: 'Shared visibility for small firms.', popular: true, incl: [ 'Everything in Solo', 'Firm activity feed + shared matters', 'Employer Dashboard integration', 'DSO Portal integration', 'Conflict engine + partner sign-off', 'Retainer + trust management', ], excl: ['Multi-office routing', 'Custom conflict rules'], }, { k: 'midsize', name: 'Mid-size', price: 'Custom', per: '10–50 seats', tagline: 'For firms with offices, practice groups, and LEDES requirements.', incl: [ 'Everything in Boutique', 'Multi-office routing', 'LEDES 98B billing export', 'Custom conflict rules', 'Role-based privilege access', 'Single sign-on · dedicated onboarding', ], excl: [], }, ]; return (
Pricing

Founding-firm pricing, locked for two years.

Join the waitlist during pre-launch and the first 12 months are free. The next 24 are at founding-firm rates. Cancel any time; export your data in standard formats.

{tiers.map(t => { const isActive = firmTier === t.k; return (
setFirmTier(t.k)} style={{ background: '#fff', borderRadius: 16, padding: 28, cursor: 'pointer', border: `1px solid ${isActive ? A.primary : T.mist}`, boxShadow: isActive ? `0 0 0 3px ${A.primary}22, ${T.shadow.md}` : T.shadow.sm, position: 'relative', transition: 'all 160ms', }}> {t.popular && (
Most common
)}
{t.name}
{t.tagline}
{t.price}
{t.per}
Included
{t.incl.map(x => (
{x}
))} {t.excl.map(x => (
{x}
))}
); })}
); } /* ─────────────────── SECURITY + COMPLIANCE ─────────────────── */ function SecuritySection() { const narrow = useMediaQuery('(max-width: 900px)'); const items = [ { icon: 'shield', t: 'Privilege-aware by design', d: 'Attorney work product carries a privileged flag on every document and audit-log event. Role-based access enforces who can see what.' }, { icon: 'scale', t: 'IOLTA trust accounting', d: 'Per-matter trust balances segregated in line with state IOLTA rules. Automatic flagging when a retainer goes negative.' }, { icon: 'list', t: 'Full audit log', d: 'Every view, export, status change, and communication is logged with timestamp, actor, and IP. Export for bar audit at any time.' }, { icon: 'lock', t: 'ABA MR compliance framing', d: 'Conflicts surfaced, never adjudicated — MR 1.7 / 1.9. Co-counsel splits display MR 1.5(e) compliance notes.' }, { icon: 'users', t: 'Conflict surfacing', d: 'Scan across prior matters at intake. Partner sign-off gates engagement. We do not auto-clear — that judgment belongs to a partner.' }, { icon: 'check', t: 'No data sold. Ever.', d: 'Beneficiaries own their documents. Firms own their matters. We are paid by firms, not by selling data to third parties.' }, ]; return (
Security & compliance

The ethics rules are the product.

ImmiHub is software built by immigration attorneys. The model rules aren't a feature spec — they're the boundary condition. When something requires partner judgment, the product asks for it.

{items.map(it => (
{it.t}
{it.d}
))}
); } /* ─────────────────── FAQ ─────────────────── */ function FaqSection() { const items = [ { q: 'When does ImmiHub for Attorneys launch?', a: 'Beta opens in 2026 for founding firms on the waitlist. General availability follows once the beta cohort is stable. The consumer app launches Beta 1.0 in June 2026 and the Employer Dashboard and DSO Portal follow — the attorney portal depends on all three being live.' }, { q: 'What exactly arrives "pre-organized"?', a: 'If your client has the ImmiHub consumer app, their passport, I-94, EAD, and credential uploads land in the matter with a green Consumer stripe. If the sponsoring employer uses the Employer Dashboard, signed I-129s, LCAs, and org charts land with a blue stripe. University F-1 cases from connected DSOs bring I-20s and CPT authorizations in with a violet stripe. USCIS notices forwarded to your firm casebox auto-match by receipt number.' }, { q: 'Can I migrate from INSZoom, Docketwise, Clio, or MyCase?', a: 'Migration support is included for founding firms. We export from your current system via CSV/PDF packets, map to the ImmiHub case model, and verify the first five matters with you before flipping over. Historical matters become searchable for conflict checks from day one.' }, { q: 'Does ImmiHub pull case status from USCIS automatically?', a: 'No — USCIS.gov does not expose a public case-status API. That is a hard limit on every tool in this category, including ours. ImmiHub handles it with a per-firm forwarding address: your paralegal or the system forwards USCIS notice emails to casebox@your-firm.immihub.com, and ImmiHub extracts the receipt number and routes the notice to the matching matter.' }, { q: 'How do conflicts work?', a: 'At new-matter intake, ImmiHub scans across your historical matters (name, aliases, prior employers, family members) and surfaces high / medium / low matches with a reasoning note per match. It does not auto-clear. A partner must tick "I have personally reviewed" to proceed to engagement. The audit log captures who signed off and when.' }, { q: 'What about IOLTA and trust accounting?', a: 'Per-matter trust balances are displayed and flagged when negative. Production integrations with bank ACH rails are planned; during beta, trust accounting is ledger-visible but reconciliation happens in your existing bank workflow.' }, { q: 'Is my data used to train AI?', a: 'No. Firm data is not used for model training. The AI features (case brief generation, draft response assistance) run against your matter context at request time and do not persist into any training corpus. Privileged documents are excluded from any AI context by default.' }, { q: 'What does the waitlist get me?', a: 'Early access in order of signup, 12 months free during beta, 24 months at founding-firm rates, and a standing spot in our monthly feedback call with the product team. Founding firms shape what ships.' }, ]; const [open, setOpen] = useState(0); const narrow = useMediaQuery('(max-width: 900px)'); return (
FAQ

Answers for skeptical attorneys.

{items.map((it, i) => (
{open === i && (
{it.a}
)}
))}
); } /* ─────────────────── WAITLIST ─────────────────── */ function WaitlistSection({ accent }) { const A = accentColor(accent); const narrow = useMediaQuery('(max-width: 900px)'); const [form, setForm] = useState({ name: '', email: '', firm: '', size: 'boutique', role: 'partner' }); const [submitted, setSubmitted] = useState(false); const submit = (e) => { e.preventDefault(); setSubmitted(true); }; const field = (k, placeholder, extraProps = {}) => ( setForm(f => ({ ...f, [k]: e.target.value }))} placeholder={placeholder} {...extraProps} style={{ width: '100%', padding: '12px 14px', background: '#fff', border: `1px solid ${T.mist}`, borderRadius: 10, fontSize: 14, color: T.charcoal, fontFamily: 'inherit', outline: 'none', }} /> ); return (
{/* subtle source stripes as decorative bleed */}
Join the waitlist

Founding firms shape what ships.

We're onboarding a small cohort of solo, boutique, and mid-size immigration firms for beta. 12 months free, founding-firm pricing locked for 24 months after that, and a standing seat in the monthly product call.

{[ 'Priority order based on signup date', 'Migration help from your current system', 'Direct line to the product team during beta', 'No sales call required to join', ].map(t => (
{t}
))}
{submitted ? (
You're on the list.
We'll email {form.email || 'you'} when your firm's slot opens. Founding firms get 12 months free.
) : (
Your details
{field('name', 'Full name', { required: true })} {field('email', 'Work email', { type: 'email', required: true })} {field('firm', 'Firm name', { required: true })}
We'll never sell your data. Unsubscribe any time from any email.
)}
); } /* ─────────────────── FOOTER ─────────────────── */ function Footer() { const narrow = useMediaQuery('(max-width: 900px)'); const groups = [ { t: 'Product', links: ['The moat', 'Dashboard', 'RFE workspace', 'Cases', 'USCIS inbox', 'Pricing'] }, { t: 'Platform', links: ['Consumer app', 'Employer Dashboard', 'DSO Portal', 'Attorney Portal'] }, { t: 'Company', links: ['About', 'Roadmap', 'Blog', 'Contact'] }, { t: 'Legal', links: ['Privacy', 'Terms', 'Security', 'DPA'] }, ]; return (
ImmiHub
An immigration operating system. Four connected products: the consumer app, the Employer Dashboard, the DSO Portal, and the Attorney Portal.
{groups.map(g => (
{g.t}
{g.links.map(l => ( {l} ))}
))}
© 2026 ImmiHub. Built for immigration attorneys.
ImmiHub is not a law firm and does not provide legal advice. We are a software platform used by licensed attorneys.
); } Object.assign(window, { Nav, Hero, MoatSection, ProductSection, ReceiptDemo, CompareSection, PricingSection, SecuritySection, FaqSection, WaitlistSection, Footer, });