# joker-qp/promptqw architecture

> Architecture diagram of the GitHub repository joker-qp/promptqw, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/joker-qp/promptqw
- Repository: https://github.com/joker-qp/promptqw

## Overview

PromptQW is a local-first prompt-building application. Users configure an AI provider, submit an idea with a domain and knowledge level, answer AI-generated clarifying questions, then receive an English prompt, Turkish translation, and Turkish usage guide; they can also revisit saved prompts. The Streamlit interface calls a FastAPI backend, which coordinates prompt generation, encrypted settings, and SQLite persistence. The README also documents domain-specific options and token estimates; the available UI excerpt shows these features, but does not include all of their implementation details.

Main entry points: [`app.py`](https://github.com/joker-qp/promptqw/blob/main/app.py) (Streamlit UI), [`main.py`](https://github.com/joker-qp/promptqw/blob/main/main.py) (FastAPI API), [`services/prompt_service.py`](https://github.com/joker-qp/promptqw/blob/main/services/prompt_service.py) (Prompt Workflow), [`database.py`](https://github.com/joker-qp/promptqw/blob/main/database.py) (Database Access)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interface["User Interface"]
  node_streamlit["Streamlit UI<br/>[app.py]"]
  node_domain_options["Domain Options<br/>[app.py]"]
  node_token_estimator["Token Estimator<br/>[app.py]"]
end

subgraph group_backend["Prompt Workflow"]
  node_api["FastAPI API<br/>[main.py]"]
  node_prompt_workflow["Prompt Workflow<br/>[prompt_service.py]"]
end

subgraph group_storage["Local Data Security"]
  node_security["Key Encryption<br/>[security.py]"]
  node_schema["Data Models<br/>[models.py]"]
  node_database_access["Database Access<br/>[database.py]"]
  node_sqlite[("SQLite Database<br/>[database.py]")]
end

subgraph group_integrations["AI Providers"]
  node_ai_generation["AI Generation<br/>[ai_service.py]"]
end

node_user(("User"))
node_gemini{{"Google Gemini"}}
node_openrouter{{"OpenRouter"}}

node_user -->|"enters idea"| node_streamlit
node_streamlit -->|"selects options"| node_domain_options
node_streamlit -->|"estimates tokens"| node_token_estimator
node_streamlit -->|"sends requests"| node_api
node_api -->|"starts or completes"| node_prompt_workflow
node_api -->|"loads session"| node_database_access
node_api -->|"encrypts keys"| node_security
node_prompt_workflow -->|"decrypts keys"| node_security
node_prompt_workflow -->|"requests generation"| node_ai_generation
node_prompt_workflow -->|"reads and saves"| node_database_access
node_database_access -->|"uses models"| node_schema
node_database_access -->|"reads and writes"| node_sqlite
node_ai_generation -.->|"generates content"| node_gemini
node_ai_generation -.->|"sends chat request"| node_openrouter

click node_streamlit "https://github.com/joker-qp/promptqw/blob/main/app.py"
click node_domain_options "https://github.com/joker-qp/promptqw/blob/main/app.py"
click node_token_estimator "https://github.com/joker-qp/promptqw/blob/main/app.py"
click node_api "https://github.com/joker-qp/promptqw/blob/main/main.py"
click node_prompt_workflow "https://github.com/joker-qp/promptqw/blob/main/services/prompt_service.py"
click node_ai_generation "https://github.com/joker-qp/promptqw/blob/main/services/ai_service.py"
click node_security "https://github.com/joker-qp/promptqw/blob/main/security.py"
click node_schema "https://github.com/joker-qp/promptqw/blob/main/models.py"
click node_database_access "https://github.com/joker-qp/promptqw/blob/main/database.py"
click node_sqlite "https://github.com/joker-qp/promptqw/blob/main/database.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_streamlit,node_domain_options,node_token_estimator,node_user toneBlue
class node_api,node_prompt_workflow toneAmber
class node_security,node_schema,node_database_access,node_sqlite,node_openrouter toneMint
class node_ai_generation toneRose
class node_gemini toneIndigo
```

## Components

### User Interface

- [Streamlit UI](https://github.com/joker-qp/promptqw/blob/main/app.py): `app.py`
- [Domain Options](https://github.com/joker-qp/promptqw/blob/main/app.py): `app.py`
- [Token Estimator](https://github.com/joker-qp/promptqw/blob/main/app.py): `app.py`

### Prompt Workflow

- [FastAPI API](https://github.com/joker-qp/promptqw/blob/main/main.py): `main.py`
- [Prompt Workflow](https://github.com/joker-qp/promptqw/blob/main/services/prompt_service.py): `services/prompt_service.py`

### Local Data Security

- [Key Encryption](https://github.com/joker-qp/promptqw/blob/main/security.py): `security.py`
- [Data Models](https://github.com/joker-qp/promptqw/blob/main/models.py): `models.py`
- [Database Access](https://github.com/joker-qp/promptqw/blob/main/database.py): `database.py`
- [SQLite Database](https://github.com/joker-qp/promptqw/blob/main/database.py): `database.py`

### AI Providers

- [AI Generation](https://github.com/joker-qp/promptqw/blob/main/services/ai_service.py): `services/ai_service.py`

### Other components

- **User**
- **Google Gemini**
- **OpenRouter**

## Connections

- User → Streamlit UI: enters idea
- Streamlit UI → Domain Options: selects options
- Streamlit UI → Token Estimator: estimates tokens
- Streamlit UI → FastAPI API: sends requests
- FastAPI API → Prompt Workflow: starts or completes
- FastAPI API → Database Access: loads session
- FastAPI API → Key Encryption: encrypts keys
- Prompt Workflow → Key Encryption: decrypts keys
- Prompt Workflow → AI Generation: requests generation
- Prompt Workflow → Database Access: reads and saves
- Database Access → Data Models: uses models
- Database Access → SQLite Database: reads and writes
- AI Generation → Google Gemini: generates content
- AI Generation → OpenRouter: sends chat request
