6.8 KiB
6.8 KiB
DocQube (PDF Engine) Feature Inventory
STEP 1 — SCOPE
- Product Name: DocQube (Internal project name: "PDF Engine")
- Tech Stack:
- Frontend: React (TSX), Vite, Tailwind CSS, custom PDF viewer components (no off-the-shelf PDF.js renderer wrapper).
- Backend: FastAPI (Python), interacting with a custom C++ PDF engine via Python bindings (WASM/C++ bridge).
- Structure: Monorepo containing a
frontendandgatewaydirectory. Auditing the entire cohesive product (the web-based PDF editor).
STEP 2 & 3 — VERIFIED INVENTORY
| Feature Name | What it does | Build Status | Evidence | Demoable end-to-end? | Gating / dependencies | Docs mismatch | Assessment confidence |
|---|---|---|---|---|---|---|---|
| Document Upload & Open | Allows users to upload a local PDF file into the web editor. | LIVE | App.tsx (handleUpload), crud.py (upload_document) |
Yes | Requires backend engine | None | High, core flow fully wired. |
| Password Protected PDFs | Prompts for a password when attempting to open an encrypted PDF document. | LIVE | PasswordModal.tsx, App.tsx (passwordPrompt), crud.py catches "Password required" |
Yes | None | None | High, error handling and UI modal exist. |
| Document Export / Save | Downloads the modified PDF document back to the user's device. | LIVE | App.tsx (handleExport), edits.py (save_full / save_incremental) |
Yes | None | None | High, backend saving mechanisms are implemented. |
| Print Document | Prints the current state of the document using the browser's native print dialog. | LIVE | App.tsx (handlePrint), creates hidden iframe |
Yes | None | None | High, standard browser API implementation. |
| Text Search | Searches the document for specific text (supports case-sensitive and whole-word modes). | LIVE | App.tsx (searchQuery), content.py (search_document), SearchOverlayLayer.tsx |
Yes | None | None | High, search API and UI overlay implemented. |
| Undo / Redo | Reverts or reapplies recent edits and annotations. | LIVE | App.tsx (hist.stack), relies on immutable document IDs |
Yes | None | None | High, tracks document versions gracefully. |
| Page Rotation | Rotates a specific page by 90 degrees. | LIVE | App.tsx (handleRotate), edits.py (PageRotationOperation) |
Yes | Requires canAssemble permission |
None | High. |
| Page Deletion | Removes a specific page from the document. | LIVE | App.tsx (handleDeletePage), edits.py (PageDeletionOperation) |
Yes | Requires canAssemble permission |
None | High. |
| Page Reordering | Moves a page to a new index within the document. | LIVE | App.tsx (handleReorderPage), edits.py (PageReorderOperation) |
Yes | Requires canAssemble permission |
None | High. |
| Highlight Annotation | Draws a colored, semi-transparent highlight over selected text. | LIVE | PDFViewer.tsx (handleTextSelection), edits.py (HighlightOperation) |
Yes | Requires canAnnotate permission |
None | High. |
| Text Decorations | Applies underline, strikeout, or squiggly lines to selected text. | LIVE | App.tsx (handleDecorateText), edits.py (UnderlineOperation etc.) |
Yes | Requires canAnnotate permission |
None | High. |
| Freehand Drawing (Ink) | Allows freehand drawing with adjustable color and thickness. | LIVE | Toolbar.tsx (draw tool), edits.py (FreehandOperation) |
Yes | Requires canAnnotate permission |
None | High. |
| Sticky Notes / Comments | Places a clickable comment icon with an author and text content. | LIVE | App.tsx (handleAnnotationAdded), edits.py (CommentOperation) |
Yes | Requires canAnnotate permission |
None | High. |
| Text Box (Free Text) | Overlays custom text with adjustable font size and color anywhere on the page. | LIVE | App.tsx (handlePlaceText), edits.py (TextOverlayOperation) |
Yes | Requires canAnnotate permission |
None | High. |
| Stamps | Places pre-configured text stamps (e.g., "APPROVED") with bold styling. | LIVE | Toolbar.tsx (STAMP_PRESETS), App.tsx (handlePlaceStamp) |
Yes | Requires canAnnotate permission |
None | High, reuses TextOverlay under the hood. |
| Visual Signatures | Allows users to create (draw, type, upload) and place a visual signature. | LIVE | SignatureModal.tsx, App.tsx (handlePlaceSignature), edits.py (ImageOverlayOperation) |
Yes | Requires canAnnotate permission |
None | High, includes base64 image processing in backend. |
| Permanent Redaction | Blacks out areas and permanently removes underlying text, images, and vectors. | LIVE | App.tsx (handleMarkRedaction, handleApplyRedactions), edits.py (RedactionOperation) |
Yes | Requires canModify permission |
None | High, recently updated to support hover preview and batch apply. |
| Form Filling | Allows users to fill out interactive PDF form fields. | LIVE | PDFViewer.tsx (onFieldChange), edits.py (UpdateFieldOperation) |
Yes | Requires canFillForms permission |
None | High. |
| Paragraph Text Editing | Click to edit existing PDF text with automatic paragraph reflow and justification. | LIVE | Toolbar.tsx (edit_text), edits.py (ReflowParagraphOperation / ReplaceTextOperation) |
Yes | Requires canModify permission |
None | High, complex reflow logic wired to backend. |
| Stream / Raw Text Edit | Advanced byte-level surgical text editing without reflow. | IN-DEV | Toolbar.tsx (labeled as "Beta"), StreamEditLayer.tsx |
Yes | None | None | High, explicitly marked as Beta in the UI. |
| Document Inspector | Side panel showing pages, outline/bookmarks, annotations list, document metadata, and fonts. | LIVE | InspectorPanel.tsx, content.py (get_document_annotations, get_page_model) |
Yes | None | None | High. |
A) Docs/marketing claims NOT supported by code
No significant README.md marketing claims were evaluated since none were present in the immediate workspace, but within the code, the "Signature" tool clearly flags itself as "Visual signature — not certified" (Toolbar.tsx:145). If marketing claims "digital signatures" or "cryptographic signing", the code does not support it.
B) Open questions for the team
- Stream Edit (Beta): The
stream_edittool is explicitly marked as beta for "surgical byte-level edit". Is this intended to be promoted to sales, or kept as a power-user/developer toggle? - Signature Storage: Signatures are maintained in local state (
pendingSignature). If a user refreshes the page, they must recreate their signature. Are there plans to persist visual signatures to a user profile? - Collaboration: The architecture passes an
authorstring to annotations, but there is no apparent multiplayer or auth/login system wired up in the immediate frontend logic (the default author is hardcoded to'Current User'inPDFViewer.tsx:325). Does sales intend to sell this as a collaborative tool?