Justis AIJ
Justis AI

Release Update: Document Export Citations, File Viewer Enhancements & UI Improvements

Summary of Changes & Improvements:

1. AI Performance & Routing Optimizations

• Upgraded primary LLM pipeline architecture across Agent, Drafting, Research, and Tabular Review with expanded 1M token context support.

• Optimized token consumption for non-reasoning and utility tasks to improve response speeds.

• Added streaming language guard middleware to ensure clean and consistent multi-lingual and English output without unwanted system narration.

2. Document Viewers & Office Files

• Resolved workbook and presentation loading issues for Excel (.xlsx) and PowerPoint (.pptx) by serving files directly via same-origin streaming.

• Added direct download and "Open in Google Docs / Sheets / Slides" options directly inside the document preview panel.

• Optimized document canvas to eliminate unnecessary re-fetches on generated spreadsheets and slide decks.

3. Export & Citation Improvements

• Added structured citation numbering for document downloads: inline citations now format cleanly as [1], [2], etc., with an automatically generated "Sources" bibliography section at the end of PDF and Word (.docx) exports.

4. Skills & Prompt Improvements

• Added built-in "Slide Deck Design" skill for presentations and board decks with native chart support.

• Refreshed Agent quick-start prompts (Find Risks, Draft Anything, Compare Versions, Research, Key Terms) with full editable briefs directly in the input composer.

5. UI & Mobile Bug Fixes

• Improved mobile chat responsiveness by preventing docked background panels from overlapping chat messages.

• Enhanced interactive question cards so the Next button advances smoothly even when no option is chosen.

• Fixed dropdown overlay issues in Project Files and project header menus.

Verification & Quality Checks:

• Backend and Frontend production builds completed successfully with zero errors.

• 917 backend unit tests and 272 frontend unit tests passed.

• Code committed and pushed to branch: sumit-3

feat: audio transcription, built-in skills, office export engines, and answer style controls

Changelog & Description

1. Audio & Media Transcription Pipeline

  • Database & Storage: Added backend/migrations/60_document_transcripts.sql creating the document_transcripts table for persisted transcripts and segments.

  • Worker Pipeline: Integrated asynchronous transcription jobs with Whisper language detection (whisperLanguage.ts), transcript polishing (transcriptPolish.ts), and usability quality gates (transcriptQuality.ts).

  • Frontend Media Experience:

    • Added

      MediaView.tsx with audio playback, synchronized transcript follow-along (

      SyncedTranscript.tsx), and language chooser.

    • Added attachment tile state handling (

      AttachmentTile.tsx) in prompt inputs with real-time transcription status.

2. Inlined Built-in Agent Skills

  • Inlined 27 domain-specific skills into the backend esbuild bundle via build.mjs (NDA triage, cease & desist, policy diffing, diligence issue extraction, vendor agreements, trademark clearance, etc.).

  • Introduced

    skillTools.ts and tool whitelisting for agent runs.

3. Office Deliverables & Artifact Export Engines

  • Enhanced presentation and spreadsheet generators (

    exportPptx.ts,

    exportXlsx.ts) with theme styling, metric callouts, and clean formatting.

  • Upgraded HTML artifact viewer (

    exportHtmlArtifact.ts) and DOCX export with watermark support.

4. Answer Style & Depth Precedence

  • User Instruction Precedence: Added WHAT THE USER ASKS FOR WINS rule over default answer templates in

    definitions.ts.

  • Style Control: Added answerStyle parameter (auto | concise | detailed) on POST /agents/chat with dynamic system prompt injection and analytics tracking.

5. Trial Gating & Account Deletion Ledger

  • Added backend/migrations/61_deleted_account_ledger.sql.

  • Added

    trialGate.ts to enforce trial abuse safeguards and credit limits.

6. Library & Navigation Updates

  • Unified case search into

    /app/library and preserved query parameters with a backward-compatible redirect stub on /app/cases.

  • Updated desktop sidebar and mobile drawer navigation.

7. Brand Assets & Marketing Pages

  • Added modern application favicons and apple-touch icons (favicon-*.png, icon-*.png).

  • Added webp assets for role landing pages (Employment, In-House, Tax).

  • Refreshed SEO metadata, sitemap.ts, and llms.txt.

Improvement and bugs fixes

Role landing pages, citation handles, and document OCR
Six /for/<role> pages replaced the old use-cases section, each with its own hero, solution rows, FAQ and product mocks. Citations now resolve through a source registry that verifies the quote before it renders. Scanned PDFs run Doc AI OCR first after a measured hallucination in the vision path, and mixed documents OCR only the pages that need it.

Every new account gets a project
First-time users were landing on an empty shell that refused to work until they created a project. A home project is now guaranteed before anything else runs, and standalone rows are backfilled into it. Eight live users were blocked by this.

Fixed today (in the working tree, not yet released)

Razorpay checkout could not be clicked
Opening checkout from the plan or top-up dialog produced a payment sheet that swallowed every click and tap on desktop and mobile. Radix holds pointer-events: none on the body while a modal is open, and Razorpay mounts as a plain child of the body, so it inherited the lock. The dialog now closes before checkout opens, and the checkout hook refuses to open onto a locked body.

The "Working…" indicator flickered at the start of every turn
It appeared instantly, vanished, then came back. Two different indicators were handing over badly: the assistant message is created before it carries any parts, and the chain-of-thought renders nothing until its first step arrives. The gap is closed, so exactly one is on screen at every point in a turn.

Account settings navigate by chips on mobile
The mobile dropdown hid all five sections behind a tap. It is now a horizontal pill strip that shows the whole set and moves in one tap, scrolling the current section into view.

Legal notice card was cut off at the top
The draft-and-review mock was 430px tall in a 384px tile and centred, so it bled off both ends and cut the "LEGAL NOTICE" heading in half. The card variant now fits with clearance, and the tracked change stays above the fold.

Spreadsheet card stopped ellipsing its own contents
Five columns in a 366px card left about 48px per cell and truncated 17 of 35 values. It now shows the three columns that answer the card's question, at readable widths, with ten rows instead of seven.

Duplicate React keys on the healthcare page
Mock table rows were keyed by their first cell, and an incident log legitimately repeats a date, so React was warning and could drop a row.

"Also built for" shows three roles, not five
Each page now starts from the role after itself and wraps, so every role gets pointed at and no page links to itself.

SEO and GEO pass

robots.txt was returning 500 to every crawler
A public/robots.txt and a robots.ts route both claimed the path, which Next refuses to serve. Consolidated into one typed route. The old file also predated the URL restructure: it blocked /agents and /cases, which no longer exist, while leaving the signed-in product at /app/* open. Now the private paths and shared-session links are disallowed, and twenty answer-engine crawlers are named explicitly.

Share previews had no image
/link-image.jpg was referenced by the site metadata and the homepage structured data but did not exist — a 404 on every share and every AI crawler preview. Nine more routes shipped no og:image at all, because a child openGraph block does not inherit the parent's images.

Meta descriptions right-sized
The six role pages were generating 304–337 character descriptions from headline plus body; Google truncates past ~160 and GEO audits score them as missing. Each role now has a hand-written one. Three product descriptions were shortened, two thin ones filled out.

Structured data on the role pages
They had FAQ schema but no breadcrumbs or page-level entity, unlike every product page. Each now declares a breadcrumb trail and a WebPage naming its audience and India as the served area.

Justis AI — What changed this week (1 to 6 September 2026)

Today, 5 and 6 September

Scanned documents are read correctly. A two-page handwritten FIR that the agent had called "garbled" for weeks turned out to be a cache problem: its broken text layer was cached in August, before the quality gate existed, and the cache was never re-read, so OCR never ran. Cached text that reads as mojibake is now treated as a miss and re-extracted, unreadable scans are never cached, and the agent is told plainly when a file could not be read instead of being handed garbage. A purge script found and cleared two such rows.

OCR engine order flipped to Doc AI first. Testing the fix exposed a worse problem: the vision model, reading handwriting, invented a district, a police station and several accused names and ages, confidently enough to pass the quality gate. Three reads of the same FIR gave three different answers. Sarvam Doc AI matched the physical form. Scanned pages now go to Doc AI at ₹0.50 a page, with the vision model used only for pages Doc AI returns empty. The live agent, re-run on the same document, listed the complainant and seven accused correctly and flagged the illegible entries instead of filling them in.

Mixed scanned PDFs OCR only the pages that need it. A file with typed pages and scanned pages between them used to pass the whole-document gate on the typed pages and index the scanned ones as blanks. OCR is now decided per page and the results are merged back with page numbers intact. Escalated pages are grouped into multi-page Doc AI jobs, and a document that mostly fails the first vision batch skips straight to Doc AI rather than being read twice.

Long PDFs get citations. The two retrieval tools the agent uses first on a long document returned passages with no citation handle, so long-document answers had nothing to cite. Every match and section now carries a handle anchored to its page and character offset, with the text kept for quote verification, the same as a full document read.

"Connection dropped mid-answer" fixed at three layers. A slow website timing out inside a tool was treated as the user leaving and killed the whole turn. Tool timeouts are now recoverable unless the turn itself was cancelled. Model calls use a 15-minute socket timeout instead of Node's 5-minute default, which a long prefill could exceed. And the chat retries a transient failure once on its own, showing "reconnecting…", before the Retry card appears.

Case-page highlights match Hindi and repeated phrases. The PDF highlighter kept only ASCII letters, so a Hindi quote could never match, and it took the first occurrence of a 48-character key, which landed on the headnote's copy of a holding rather than the paragraph. It now normalises Unicode, folds ligatures, scores every page and picks the best occurrence, and prefers a paragraph number that starts a line.

Phones stop going black. The PDF viewer capped canvases at 3× pixel ratio and kept 40 pages resident, which on a 3× Android screen exhausted the GPU canvas budget and blanked the tab. Phones now get a 1.5× cap, 8 resident pages, 3 eager pages and a 24 MB byte cache. Source collection in the chat is memoised per message so streaming stops rescanning the whole transcript on every tick.

Agent behaviour. A turn with a selected passage routes as document work regardless of wording, and the prompt now says a document question asked mid-draft is answered from the document, with citations, not from memory of what such documents usually say. The "N paragraphs have no source" line under answers is removed.

Marketing site. All SOC 2, HIPAA and DPDP compliance claims removed from the footer, landing page, pricing and marketing FAQs, privacy policy, metadata, llms.txt, README and internal docs. A new "Built for" section above the testimonials with three role cards, each opening its own page at /for/litigators, /for/in-house and /for/law-firms: split hero with the role's photograph and an example prompt, "Where it breaks" at three scale points, six features, a quote, sourced numbers and a role FAQ. Generated photographs are in place. Every image on the site is now WebP, cutting photo weight by half or more. The Compare table lost its horizontal rules. Fifty-two Razorpay-sourced template stubs that only linked to Google Docs were removed, along with the Drive preview code that existed for them.

Product surface. The canvas Download menu gained "Open in Google Docs" with a Google Docs glyph, backed by a 15-minute public link to a generated DOCX. Onboarding lost its step pill and helper text, gained "Other" with free text for role and forums, and aligns with the video panel. The project switcher no longer shows the C.M. number.

Written down for later. A voice PRD covering dictation and a 1:1 voice agent via ElevenLabs, with your decisions, quotas, costs and open questions, linked from a new Roadmap section in the README. Nothing voice-related is built.

Earlier this week, 3 and 4 September

Project-first architecture. Agent, Files, Tabular Review and Playbook now live inside a project at /app/p/[projectId]/…, with a project switcher, scoped document access, sessions, reviews and runs, and skills, workflows and playbooks that are either global or pinned to one project. Legacy URLs forward.

Streaming resilience. A model-level middleware re-runs a call that fails before output on the 1M-context model and closes a stream that fails after output cleanly instead of erroring. Tool-call arguments cut off mid-stream are repaired.

Staged document pipeline. Uploads process in three background stages, extract, OCR and index, each with its own retries and lease, so a 200-page scan no longer holds a worker for ten Word files and a failed index never re-runs OCR. Batched, resilient uploads with per-file retry.

Playbook review in four stages. Mapping, parallel per-rule review, reconciliation of overlapping edits and contradictory findings, then a summary that names the points to read together.

Memory suggestions. Facts the agent picks up in conversation are held as suggestions for the user to accept or dismiss rather than saved silently.

Billing. One credit equals one rupee and the user pays real cost. Free is a 7-day trial of 100 credits, Pro ₹999 with 500, Ultra ₹3,999 with 2,000. Plan storage caps enforced on new uploads.

Sign-in and mobile. Google-only sign-in in production behind a toggle. On phones the product is the chat plus settings; other sections redirect to the agent.

Case page. Three views, Indian law, Judgements and Orders, with a 22,000-document Acts library and an Order.law fallback when our index has no match.

Benchmark harness. Harvey's Legal Agent Benchmark run against the live product over HTTP, judged with the published rubric.

Welcome to Justis AI Updates

We're launching our public feedback board to hear directly from you.

Here's what you can do:

  • Share ideas: Tell us what features you want to see

  • Vote: Help us prioritize what matters most

  • Stay updated: Follow along as we ship improvements

Your feedback shapes what we build next. We're listening!