{"id":19,"date":"2026-08-22T00:27:59","date_gmt":"2026-08-22T00:27:59","guid":{"rendered":"https:\/\/manualninja.com\/tech-specs\/"},"modified":"2026-08-23T18:56:34","modified_gmt":"2026-08-23T18:56:34","slug":"tech-specs","status":"publish","type":"page","link":"https:\/\/manualninja.com\/ja\/tech-specs\/","title":{"rendered":"Tech Specs"},"content":{"rendered":"<p>[et_pb_section fb_built=&#8221;1&#8243; admin_label=&#8221;Hero&#8221; _builder_version=&#8221;4.27.8&#8243; background_color=&#8221;#006799&#8243; custom_padding=&#8221;100px||100px||false|false&#8221; hover_enabled=&#8221;0&#8243; global_colors_info=&#8221;{}&#8221; title_text=&#8221;mailninja tech specs&#8221; background_image=&#8221;https:\/\/manualninja.com\/wp-content\/uploads\/2026\/08\/mailninja-tech-specs.jpg&#8221; sticky_enabled=&#8221;0&#8243;][et_pb_row _builder_version=&#8221;4.27.8&#8243; hover_enabled=&#8221;0&#8243; global_colors_info=&#8221;{}&#8221; background_color=&#8221;rgba(76,76,76,0.63)&#8221; sticky_enabled=&#8221;0&#8243;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.8&#8243; header_text_color=&#8221;#ffffff&#8221; text_orientation=&#8221;center&#8221; hover_enabled=&#8221;0&#8243; global_colors_info=&#8221;{}&#8221; text_text_color=&#8221;#FFFFFF&#8221; sticky_enabled=&#8221;0&#8243;]<\/p>\n<h1>Tech Specs<\/h1>\n<p style=\"font-size: 22px; opacity: .9;\">A modern RAG architecture with AI vision.<\/p>\n<p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8221;1&#8243; admin_label=&#8221;Architecture&#8221; _builder_version=&#8221;4.27.4&#8243; background_color=&#8221;#ffffff&#8221; custom_padding=&#8221;90px||90px||false|false&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#3e3e3e&#8221; header_text_color=&#8221;#006799&#8243; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h2>Architecture at a glance<\/h2>\n<p>ManualNinja is a multi-tenant RAG application with a Python backend, a React SPA frontend, a PostgreSQL database, and a Qdrant vector store. PDFs are parsed, chunked, embedded and served as cited answers through a chat interface. The platform now includes AI vision for image analysis, OAuth social login, and Stripe-powered subscription billing.<\/p>\n<p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8221;1&#8243; admin_label=&#8221;Stack&#8221; _builder_version=&#8221;4.27.4&#8243; background_color=&#8221;#f4f4f4&#8243; custom_padding=&#8221;90px||90px||false|false&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row column_structure=&#8221;2_5,3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;2_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#006799&#8243; header_text_color=&#8221;#006799&#8243; global_colors_info=&#8221;{}&#8221;]<strong>Backend API<\/strong>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#3e3e3e&#8221; global_colors_info=&#8221;{}&#8221;]FastAPI + Uvicorn (Python 3.13). REST endpoints for auth, manuals, chat, billing, and admin. JWT-based authentication with OAuth2.[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;2_5,3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;2_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#006799&#8243; header_text_color=&#8221;#006799&#8243; global_colors_info=&#8221;{}&#8221;]<strong>Frontend<\/strong>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#3e3e3e&#8221; global_colors_info=&#8221;{}&#8221;]React 18 + Vite. Single-page application with chat UI, admin panel, billing portal, and superadmin dashboard.[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;2_5,3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;2_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#006799&#8243; header_text_color=&#8221;#006799&#8243; global_colors_info=&#8221;{}&#8221;]<strong>Database<\/strong>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#3e3e3e&#8221; global_colors_info=&#8221;{}&#8221;]PostgreSQL 17. Stores organizations, users, manuals, chat sessions, usage tracking, and configurable settings.[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;2_5,3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;2_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#006799&#8243; header_text_color=&#8221;#006799&#8243; global_colors_info=&#8221;{}&#8221;]<strong>Vector store<\/strong>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#3e3e3e&#8221; global_colors_info=&#8221;{}&#8221;]Qdrant 1.19. Semantic search over manual chunks with organization-scoped filtering.[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;2_5,3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;2_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#006799&#8243; header_text_color=&#8221;#006799&#8243; global_colors_info=&#8221;{}&#8221;]<strong>Embeddings<\/strong>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#3e3e3e&#8221; global_colors_info=&#8221;{}&#8221;]BAAI\/bge-small-en-v1.5 (384 dimensions, CPU). Local inference \u2014 no external embedding API calls.[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;2_5,3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;2_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#006799&#8243; header_text_color=&#8221;#006799&#8243; global_colors_info=&#8221;{}&#8221;]<strong>LLM (text)<\/strong>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.8&#8243; text_text_color=&#8221;#3e3e3e&#8221; hover_enabled=&#8221;0&#8243; global_colors_info=&#8221;{}&#8221; sticky_enabled=&#8221;0&#8243;]<\/p>\n<p>OpenAI-compatible API. Default model: deepseek\/deepseek-v3-0324. Configurable via superadmin dashboard.<br \/>Want a local ai for security, no problem. <a href=\"\/contact\">Contact us<\/a><\/p>\n<p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;2_5,3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;2_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#006799&#8243; header_text_color=&#8221;#006799&#8243; global_colors_info=&#8221;{}&#8221;]<strong>LLM (vision)<\/strong>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#3e3e3e&#8221; global_colors_info=&#8221;{}&#8221;]Novita AI vision model \u2014 google\/gemma-3-27b-it. Analyzes uploaded images (device labels, error screens, nameplates) with OCR and structured extraction.[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;2_5,3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;2_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#006799&#8243; header_text_color=&#8221;#006799&#8243; global_colors_info=&#8221;{}&#8221;]<strong>PDF extraction<\/strong>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#3e3e3e&#8221; global_colors_info=&#8221;{}&#8221;]PyMuPDF (fitz). Page-level chunking with metadata preservation for accurate citations.[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;2_5,3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;2_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#006799&#8243; header_text_color=&#8221;#006799&#8243; global_colors_info=&#8221;{}&#8221;]<strong>Authentication<\/strong>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#3e3e3e&#8221; global_colors_info=&#8221;{}&#8221;]JWT tokens + Google OAuth 2.0 + LinkedIn OAuth 2.0 (OpenID Connect). Email verification with configurable SMTP.[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;2_5,3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;2_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#006799&#8243; header_text_color=&#8221;#006799&#8243; global_colors_info=&#8221;{}&#8221;]<strong>Payments<\/strong>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#3e3e3e&#8221; global_colors_info=&#8221;{}&#8221;]Stripe \u2014 recurring subscriptions via Checkout, customer portal for self-service management, webhook-driven lifecycle events.[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;2_5,3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;2_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#006799&#8243; header_text_color=&#8221;#006799&#8243; global_colors_info=&#8221;{}&#8221;]<strong>Reverse proxy<\/strong>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;3_5&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#3e3e3e&#8221; global_colors_info=&#8221;{}&#8221;]Caddy \u2014 automatic HTTPS via Let&#8217;s Encrypt, HTTP\/2, HTTP\/3 support.[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8221;1&#8243; admin_label=&#8221;Multi-tenancy&#8221; _builder_version=&#8221;4.27.4&#8243; background_color=&#8221;#ffffff&#8221; custom_padding=&#8221;90px||90px||false|false&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#3e3e3e&#8221; header_text_color=&#8221;#006799&#8243; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h2>Multi-tenancy &amp; isolation<\/h2>\n<p>Each customer organization gets a fully isolated workspace:<\/p>\n<ul>\n<li>Organization-scoped users, manuals, and chat sessions<\/li>\n<li>Qdrant payloads include org_id \u2014 vector search is always filtered<\/li>\n<li>Tier-based limits: questions\/month, storage, question length, manual count<\/li>\n<li>All integration keys (Stripe, Google, LinkedIn, LLM, SMTP, reCAPTCHA) are configurable per deployment via the admin UI<\/li>\n<\/ul>\n<p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8221;1&#8243; admin_label=&#8221;Security&#8221; _builder_version=&#8221;4.27.4&#8243; background_color=&#8221;#f4f4f4&#8243; custom_padding=&#8221;90px||90px||false|false&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#3e3e3e&#8221; header_text_color=&#8221;#006799&#8243; text_orientation=&#8221;center&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h2>Security &#038; data protection<\/h2>\n<p>ManualNinja is built with security as a first-class priority. Every layer of the stack is hardened to protect your data and your customers&#8217; trust.<\/p>\n<p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_3,1_3,1_3&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_blurb title=&#8221;End-to-end encryption&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;%%123%%&#8221; _builder_version=&#8221;4.27.4&#8243; header_text_color=&#8221;#006799&#8243; background_color=&#8221;#ffffff&#8221; custom_padding=&#8221;30px|30px|30px|30px|true|true&#8221; border_radii=&#8221;on|8px|8px|8px|8px&#8221; border_width_all=&#8221;1px&#8221; border_color_all=&#8221;#d9d9d9&#8243; global_colors_info=&#8221;{}&#8221;]All traffic is served over HTTPS with TLS 1.2\/1.3 via Caddy with automatic Let&#8217;s Encrypt certificates. No plaintext connections accepted.[\/et_pb_blurb][\/et_pb_column][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_blurb title=&#8221;Secure authentication&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;%%114%%&#8221; _builder_version=&#8221;4.27.4&#8243; header_text_color=&#8221;#006799&#8243; background_color=&#8221;#ffffff&#8221; custom_padding=&#8221;30px|30px|30px|30px|true|true&#8221; border_radii=&#8221;on|8px|8px|8px|8px&#8221; border_width_all=&#8221;1px&#8221; border_color_all=&#8221;#d9d9d9&#8243; global_colors_info=&#8221;{}&#8221;]JWT-based auth with strong secrets, bcrypt password hashing, OAuth 2.0 with CSRF-protected state validation, and short-lived exchange codes instead of tokens in URLs.[\/et_pb_blurb][\/et_pb_column][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_blurb title=&#8221;Brute-force protection&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;%%129%%&#8221; _builder_version=&#8221;4.27.4&#8243; header_text_color=&#8221;#006799&#8243; background_color=&#8221;#ffffff&#8221; custom_padding=&#8221;30px|30px|30px|30px|true|true&#8221; border_radii=&#8221;on|8px|8px|8px|8px&#8221; border_width_all=&#8221;1px&#8221; border_color_all=&#8221;#d9d9d9&#8243; global_colors_info=&#8221;{}&#8221;]Login rate limiting (10 attempts per 5 minutes per IP), signup rate limiting (3 per IP per day), and mandatory Google reCAPTCHA on public signup.[\/et_pb_blurb][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_3,1_3,1_3&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_blurb title=&#8221;Multi-tenant isolation&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;%%103%%&#8221; _builder_version=&#8221;4.27.4&#8243; header_text_color=&#8221;#006799&#8243; background_color=&#8221;#ffffff&#8221; custom_padding=&#8221;30px|30px|30px|30px|true|true&#8221; border_radii=&#8221;on|8px|8px|8px|8px&#8221; border_width_all=&#8221;1px&#8221; border_color_all=&#8221;#d9d9d9&#8243; global_colors_info=&#8221;{}&#8221;]Every database query and vector search is scoped by organization_id. No cross-tenant data leakage is possible \u2014 your manuals and chats are yours alone.[\/et_pb_blurb][\/et_pb_column][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_blurb title=&#8221;Safe file uploads&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;%%110%%&#8221; _builder_version=&#8221;4.27.4&#8243; header_text_color=&#8221;#006799&#8243; background_color=&#8221;#ffffff&#8221; custom_padding=&#8221;30px|30px|30px|30px|true|true&#8221; border_radii=&#8221;on|8px|8px|8px|8px&#8221; border_width_all=&#8221;1px&#8221; border_color_all=&#8221;#d9d9d9&#8243; global_colors_info=&#8221;{}&#8221;]PDF uploads are validated by magic bytes, content type, and a 50&nbsp;MB hard size limit. Files are stored with UUID names \u2014 no path traversal possible.[\/et_pb_blurb][\/et_pb_column][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_blurb title=&#8221;Verified webhooks&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;%%115%%&#8221; _builder_version=&#8221;4.27.4&#8243; header_text_color=&#8221;#006799&#8243; background_color=&#8221;#ffffff&#8221; custom_padding=&#8221;30px|30px|30px|30px|true|true&#8221; border_radii=&#8221;on|8px|8px|8px|8px&#8221; border_width_all=&#8221;1px&#8221; border_color_all=&#8221;#d9d9d9&#8243; global_colors_info=&#8221;{}&#8221;]Stripe payment webhooks are always signature-verified. No unauthenticated payment events are ever processed \u2014 the system fails closed if the secret is missing.[\/et_pb_blurb][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_3,1_3,1_3&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_blurb title=&#8221;Internal services only&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;%%118%%&#8221; _builder_version=&#8221;4.27.4&#8243; header_text_color=&#8221;#006799&#8243; background_color=&#8221;#ffffff&#8221; custom_padding=&#8221;30px|30px|30px|30px|true|true&#8221; border_radii=&#8221;on|8px|8px|8px|8px&#8221; border_width_all=&#8221;1px&#8221; border_color_all=&#8221;#d9d9d9&#8243; global_colors_info=&#8221;{}&#8221;]The FastAPI backend and Qdrant vector database bind to 127.0.0.1 only. They are never directly accessible from the internet \u2014 all external traffic goes through the Caddy reverse proxy.[\/et_pb_blurb][\/et_pb_column][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_blurb title=&#8221;Email verification&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;%%109%%&#8221; _builder_version=&#8221;4.27.4&#8243; header_text_color=&#8221;#006799&#8243; background_color=&#8221;#ffffff&#8221; custom_padding=&#8221;30px|30px|30px|30px|true|true&#8221; border_radii=&#8221;on|8px|8px|8px|8px&#8221; border_width_all=&#8221;1px&#8221; border_color_all=&#8221;#d9d9d9&#8243; global_colors_info=&#8221;{}&#8221;]Signup requires email verification with time-limited tokens (24-hour expiry). Unverified accounts cannot log in.[\/et_pb_blurb][\/et_pb_column][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_blurb title=&#8221;Audit logging&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;%%122%%&#8221; _builder_version=&#8221;4.27.4&#8243; header_text_color=&#8221;#006799&#8243; background_color=&#8221;#ffffff&#8221; custom_padding=&#8221;30px|30px|30px|30px|true|true&#8221; border_radii=&#8221;on|8px|8px|8px|8px&#8221; border_width_all=&#8221;1px&#8221; border_color_all=&#8221;#d9d9d9&#8243; global_colors_info=&#8221;{}&#8221;]All admin and superadmin actions \u2014 organization creation, user management, settings changes \u2014 are logged to a dedicated audit trail for accountability and compliance.[\/et_pb_blurb][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8221;1&#8243; admin_label=&#8221;CTA&#8221; _builder_version=&#8221;4.27.4&#8243; background_color=&#8221;#006799&#8243; custom_padding=&#8221;80px||80px||false|false&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; text_text_color=&#8221;#FFFFFF&#8221; header_text_color=&#8221;#ffffff&#8221; text_orientation=&#8221;center&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h2 style=\"color: #ffffff;\">Want to see it in action?<\/h2>\n<p>[\/et_pb_text][et_pb_button button_url=&#8221;https:\/\/app.manualninja.com\/signup&#8221; button_text=&#8221;Start free&#8221; button_alignment=&#8221;center&#8221; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][\/et_pb_button][et_pb_button button_url=&#8221;\/product&#8221; button_text=&#8221;Back to product&#8221; button_alignment=&#8221;center&#8221; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221;][\/et_pb_button][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tech Specs A modern RAG architecture with AI vision.Architecture at a glance ManualNinja is a multi-tenant RAG application with a Python backend, a React SPA frontend, a PostgreSQL database, and a Qdrant vector store. PDFs are parsed, chunked, embedded and served as cited answers through a chat interface. The platform now includes AI vision for [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"class_list":["post-19","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tech Specs \u2014 Architecture, Security &amp; Stack | ManualNinja<\/title>\n<meta name=\"description\" content=\"ManualNinja runs on FastAPI, React, PostgreSQL, and Qdrant. End-to-end TLS, JWT auth, multi-tenant isolation, brute-force protection, audit logging, and verified Stripe webhooks. Built secure by design.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/manualninja.com\/ja\/tech-specs\/\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tech Specs \u2014 Architecture, Security &amp; Stack | ManualNinja\" \/>\n<meta property=\"og:description\" content=\"ManualNinja runs on FastAPI, React, PostgreSQL, and Qdrant. End-to-end TLS, JWT auth, multi-tenant isolation, brute-force protection, audit logging, and verified Stripe webhooks. Built secure by design.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/manualninja.com\/ja\/tech-specs\/\" \/>\n<meta property=\"og:site_name\" content=\"ManualNinja\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-23T18:56:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/manualninja.com\/wp-content\/uploads\/2026\/08\/logo.png\" \/>\n\t<meta property=\"og:image:width\" content=\"749\" \/>\n\t<meta property=\"og:image:height\" content=\"565\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/manualninja.com\\\/tech-specs\\\/\",\"url\":\"https:\\\/\\\/manualninja.com\\\/tech-specs\\\/\",\"name\":\"Tech Specs \u2014 Architecture, Security & Stack | ManualNinja\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/manualninja.com\\\/nl\\\/#website\"},\"datePublished\":\"2026-08-22T00:27:59+00:00\",\"dateModified\":\"2026-08-23T18:56:34+00:00\",\"description\":\"ManualNinja runs on FastAPI, React, PostgreSQL, and Qdrant. End-to-end TLS, JWT auth, multi-tenant isolation, brute-force protection, audit logging, and verified Stripe webhooks. Built secure by design.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/manualninja.com\\\/tech-specs\\\/#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/manualninja.com\\\/tech-specs\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/manualninja.com\\\/tech-specs\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/manualninja.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tech Specs\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/manualninja.com\\\/nl\\\/#website\",\"url\":\"https:\\\/\\\/manualninja.com\\\/nl\\\/\",\"name\":\"ManualNinja\",\"description\":\"AI Helpdesk for Appliance Installers &amp; Repair Technicians\",\"publisher\":{\"@id\":\"https:\\\/\\\/manualninja.com\\\/nl\\\/#organization\"},\"alternateName\":\"Manual Ninja The AI for field technicians\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/manualninja.com\\\/nl\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ja\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/manualninja.com\\\/nl\\\/#organization\",\"name\":\"ManualNinja\",\"url\":\"https:\\\/\\\/manualninja.com\\\/nl\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/manualninja.com\\\/nl\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/manualninja.com\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/logo.png\",\"contentUrl\":\"https:\\\/\\\/manualninja.com\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/logo.png\",\"width\":749,\"height\":565,\"caption\":\"ManualNinja\"},\"image\":{\"@id\":\"https:\\\/\\\/manualninja.com\\\/nl\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tech Specs \u2014 Architecture, Security & Stack | ManualNinja","description":"ManualNinja runs on FastAPI, React, PostgreSQL, and Qdrant. End-to-end TLS, JWT auth, multi-tenant isolation, brute-force protection, audit logging, and verified Stripe webhooks. Built secure by design.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/manualninja.com\/ja\/tech-specs\/","og_locale":"ja_JP","og_type":"article","og_title":"Tech Specs \u2014 Architecture, Security & Stack | ManualNinja","og_description":"ManualNinja runs on FastAPI, React, PostgreSQL, and Qdrant. End-to-end TLS, JWT auth, multi-tenant isolation, brute-force protection, audit logging, and verified Stripe webhooks. Built secure by design.","og_url":"https:\/\/manualninja.com\/ja\/tech-specs\/","og_site_name":"ManualNinja","article_modified_time":"2026-08-23T18:56:34+00:00","og_image":[{"width":749,"height":565,"url":"https:\/\/manualninja.com\/wp-content\/uploads\/2026\/08\/logo.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/manualninja.com\/tech-specs\/","url":"https:\/\/manualninja.com\/tech-specs\/","name":"Tech Specs \u2014 Architecture, Security & Stack | ManualNinja","isPartOf":{"@id":"https:\/\/manualninja.com\/nl\/#website"},"datePublished":"2026-08-22T00:27:59+00:00","dateModified":"2026-08-23T18:56:34+00:00","description":"ManualNinja runs on FastAPI, React, PostgreSQL, and Qdrant. End-to-end TLS, JWT auth, multi-tenant isolation, brute-force protection, audit logging, and verified Stripe webhooks. Built secure by design.","breadcrumb":{"@id":"https:\/\/manualninja.com\/tech-specs\/#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/manualninja.com\/tech-specs\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/manualninja.com\/tech-specs\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/manualninja.com\/"},{"@type":"ListItem","position":2,"name":"Tech Specs"}]},{"@type":"WebSite","@id":"https:\/\/manualninja.com\/nl\/#website","url":"https:\/\/manualninja.com\/nl\/","name":"ManualNinja","description":"AI Helpdesk for Appliance Installers &amp; Repair Technicians","publisher":{"@id":"https:\/\/manualninja.com\/nl\/#organization"},"alternateName":"Manual Ninja The AI for field technicians","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/manualninja.com\/nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ja"},{"@type":"Organization","@id":"https:\/\/manualninja.com\/nl\/#organization","name":"ManualNinja","url":"https:\/\/manualninja.com\/nl\/","logo":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/manualninja.com\/nl\/#\/schema\/logo\/image\/","url":"https:\/\/manualninja.com\/wp-content\/uploads\/2026\/08\/logo.png","contentUrl":"https:\/\/manualninja.com\/wp-content\/uploads\/2026\/08\/logo.png","width":749,"height":565,"caption":"ManualNinja"},"image":{"@id":"https:\/\/manualninja.com\/nl\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/manualninja.com\/ja\/wp-json\/wp\/v2\/pages\/19","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/manualninja.com\/ja\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/manualninja.com\/ja\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/manualninja.com\/ja\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manualninja.com\/ja\/wp-json\/wp\/v2\/comments?post=19"}],"version-history":[{"count":6,"href":"https:\/\/manualninja.com\/ja\/wp-json\/wp\/v2\/pages\/19\/revisions"}],"predecessor-version":[{"id":84,"href":"https:\/\/manualninja.com\/ja\/wp-json\/wp\/v2\/pages\/19\/revisions\/84"}],"wp:attachment":[{"href":"https:\/\/manualninja.com\/ja\/wp-json\/wp\/v2\/media?parent=19"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}