Skip to main content

Architecture

Understanding Istek's architecture helps with troubleshooting and contribution.

Overview​

Technology Stack​

Frontend​

TechnologyPurpose
Nuxt 3Vue meta-framework
Vue 3UI framework
TypeScriptType safety
Tailwind CSSStyling
CodeMirror 6Code editor
PiniaState management

Backend​

TechnologyPurpose
Tauri 2Desktop framework
RustBackend language
SQLiteData persistence
reqwestHTTP client
tonicgRPC client
rumqttcMQTT client
tokioAsync runtime

Directory Structure​

istek/
├── src-tauri/ # Rust backend
│ ├── src/
│ │ ├── lib.rs # Main entry, command registration
│ │ ├── http.rs # HTTP client
│ │ ├── websocket.rs # WebSocket client
│ │ ├── graphql.rs # GraphQL client
│ │ ├── grpc_client.rs # gRPC client
│ │ ├── mqtt.rs # MQTT client
│ │ ├── database.rs # SQLite operations
│ │ ├── playground/ # Playground servers
│ │ └── ...
│ └── Cargo.toml
├── components/ # Vue components
│ ├── panels/ # Protocol-specific panels
│ ├── ui/ # Reusable UI components
│ └── ...
├── composables/ # Vue composables
│ ├── useAppStore.ts # Main application state
│ └── useVariableStore.ts
├── types/ # TypeScript types
└── docs/ # Documentation (Docusaurus)

Data Flow​

Request Execution​

Data Persistence​

State Management​

App Store (useAppStore)​

Manages:

  • Tabs (open requests)
  • Active tab
  • Collections
  • History
  • Sidebar state

Variable Store (useVariableStore)​

Manages:

  • Global variables
  • Environments
  • Active environment
  • Variable interpolation

Protocol Implementation​

Each protocol follows a similar pattern:

// src-tauri/src/protocol.rs

#[tauri::command]
pub async fn send_protocol_request(
// Request parameters
) -> Result<Response, String> {
// 1. Build request
// 2. Send request
// 3. Parse response
// 4. Return result
}
// components/panels/ProtocolPanel.vue

const sendRequest = async () => {
store.setActiveLoading(true)
try {
const response = await invoke('send_protocol_request', { ... })
store.setActiveResponse(response)
} finally {
store.setActiveLoading(false)
}
}

Database Schema​

Collections​

CREATE TABLE collections (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
data TEXT NOT NULL, -- JSON
created_at INTEGER
)

History​

CREATE TABLE history (
id TEXT PRIMARY KEY,
request TEXT NOT NULL, -- JSON
response TEXT, -- JSON
timestamp INTEGER
)

Variables​

CREATE TABLE global_variables (
id TEXT PRIMARY KEY,
key TEXT NOT NULL,
value TEXT,
description TEXT,
is_secret INTEGER,
enabled INTEGER
)

Environments​

CREATE TABLE environments (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
color TEXT,
variables TEXT, -- JSON
created_at INTEGER
)

Security​

Local Storage​

All data is stored locally in SQLite. No cloud sync.

Secret Handling​

  • Secrets are marked with isSecret flag
  • Displayed as masked values in UI
  • Stored in the same database (consider OS keychain for future)

Network​

  • All requests go directly from user's machine
  • No proxy servers
  • HTTPS certificates are validated

Performance​

Async Operations​

All network operations are async (Tokio runtime):

#[tauri::command]
pub async fn send_http_request(...) -> Result<...> {
// Non-blocking I/O
}

Memory​

  • Rust backend has low memory footprint
  • Response bodies are streamed for large responses
  • History is limited to 100 items

Contributing​

See the GitHub repository for:

  • Contribution guidelines
  • Development setup
  • Issue templates