QadEng Documentation

QadEng is a native macOS cloud development platform. Built entirely in Swift for Apple Silicon Macs.

Key Services

  • Functions - Serverless execution using Apple Containers
  • Storage - Object storage with bucket management and website hosting
  • Database - NoSQL key-value tables with query support
  • Queues - Message queuing with visibility timeout
  • Topics - Pub/Sub messaging for event distribution
  • Parameters - Secret/config store (SecureString uses Keychain)
  • API Gateway - HTTP routing and proxying to functions
  • Event Mappings - Queue-to-function triggers
  • Apps - Bundled resource deployments

Installation

Requirements

  • macOS 26.0+ (Tahoe)
  • Apple Silicon Mac

Download

QadEng will be available on the Mac App Store. Get notified when we launch.

Quick Start

Once QadEng is running, the platform auto-starts on app launch. The API endpoint is available at:

Base URL
http://localhost:7566

Check Health

curl
curl http://localhost:7566/_qadeng/health

Create Your First App

Create a directory with a qadeng.yaml manifest and add it to QadEng:

Terminal
mkdir -p my-app/functions/hello
cd my-app

# Create manifest
cat > qadeng.yaml << 'EOF'
name: my-app
description: My first QadEng app
EOF

# Create function config
cat > functions/hello/function.yaml << 'EOF'
runtime: python3.12
handler: main.handler
memory: 256
timeout: 30
EOF

# Create function code
cat > functions/hello/main.py << 'EOF'
def handler(event, context):
    return {
        "statusCode": 200,
        "body": "Hello from QadEng!"
    }
EOF

Then add and enable the app via the UI or API:

curl
# Add the app
curl -X POST http://localhost:7566/apps \
  -H "Content-Type: application/json" \
  -d '{"path": "/path/to/my-app"}'

# Enable the app
curl -X PUT http://localhost:7566/apps/my-app/enable

# Invoke the function
curl -X POST http://localhost:7566/functions/hello/invoke

Apps System

Apps are the primary way to manage resources in QadEng. An app is a directory containing related cloud resources that are deployed together.

Resource Management: All resources (functions, storage, database, queues, parameters, gateways, mappings) are managed through the Apps system. There are no standalone CREATE/DELETE endpoints for resources.

App Structure

Directory Structure
my-app/
├── qadeng.yaml           # App manifest (required)
├── functions/            # Function directories
│   └── my-func/
│       ├── function.yaml # Runtime, handler config
│       └── main.py       # Function code
├── storage/              # Bucket directories
│   └── my-bucket/
│       ├── _bucket.yaml  # Website config (optional)
│       └── ...files      # Bucket objects
├── database/             # Table JSON files
│   └── my-table.json
├── queues/               # Queue YAML files
│   └── my-queue.yaml
├── parameters/           # Parameter YAML files
│   └── config.yaml
├── api-gateway/          # Gateway definitions
│   └── api.yaml
└── mappings/             # Event source mappings
    └── mappings.yaml

Manifest Files

qadeng.yaml

The root manifest file defines the app:

qadeng.yaml
name: my-app
description: A sample application

function.yaml

Each function requires a configuration file:

functions/my-func/function.yaml
runtime: python3.12    # python3.10-12, nodejs18-20, go1.21-22, java17/21
handler: main.handler  # file.function
memory: 256           # MB (or use memorySize)
timeout: 30           # seconds

# Optional fields:
description: My function description
warm: true            # Keep container warm
environment:          # Environment variables
  API_KEY: my-key
  DEBUG: "true"

Functions

Serverless functions run in Apple Containers with support for Python, Node.js, Go, and Java runtimes.

Supported Runtimes

Runtime Versions Image
Python 3.10, 3.11, 3.12 python:3.x-slim
Node.js 18.x, 20.x node:x-slim
Go 1.21, 1.22 golang:1.x-alpine
Java 17, 21 eclipse-temurin:x-jdk-alpine

Python Function Example

main.py
def handler(event, context):
    # event contains the request payload
    name = event.get('name', 'World')

    return {
        'statusCode': 200,
        'headers': {'Content-Type': 'application/json'},
        'body': {'message': f'Hello, {name}!'}
    }

Node.js Function Example

index.js
exports.handler = async (event, context) => {
    const name = event.name || 'World';

    return {
        statusCode: 200,
        headers: { 'Content-Type': 'application/json' },
        body: { message: `Hello, ${name}!` }
    };
};

Storage

Object storage with bucket management and optional static website hosting.

Website Hosting

Enable website hosting for a bucket by adding a _bucket.yaml file:

storage/my-bucket/_bucket.yaml
website:
  enabled: true
  indexDocument: index.html
  errorDocument: error.html

Website-enabled buckets are accessible via subdomain-style URLs or path-style URLs.

Database

NoSQL key-value tables with flexible schemas and query support.

Table Definition

database/users.json
{
  "tableName": "users",
  "keySchema": {
    "partitionKey": "id",
    "sortKey": "email"
  },
  "items": [
    {"id": "1", "email": "user@example.com", "name": "John"}
  ]
}

Queues

Message queuing with visibility timeout support. Messages can trigger functions via event source mappings.

Queue Definition

queues/tasks.yaml
name: tasks
visibilityTimeout: 30
maxReceiveCount: 3

Topics

Pub/Sub messaging for event distribution. Publish once, deliver to multiple subscribers.

Topic Definition

topics/notifications.yaml
name: notifications
subscriptions:
  - protocol: function
    endpoint: email-handler
  - protocol: queue
    endpoint: notifications-queue

API Gateway

HTTP routing and proxying to functions. Define routes and integrate with your serverless functions.

Gateway Definition

api-gateway/api.yaml
name: main-api
description: Main API gateway
routes:
  - path: /users
    method: GET
    function: list-users
  - path: /users/{id}
    method: GET
    function: get-user
  - path: /users
    method: POST
    function: create-user

Parameters

Secret and configuration store. SecureString parameters are encrypted using macOS Keychain.

Parameter Definition

parameters/config.yaml
parameters:
  - name: /app/config/api-key
    type: SecureString
    value: my-secret-key
  - name: /app/config/debug
    type: String
    value: "true"

Parameter Types

Type Description Storage
String Plain text configuration values File system
SecureString Encrypted secrets (API keys, passwords) macOS Keychain
StringList Comma-separated list of values File system

Event Mappings

Event source mappings connect queues to functions, automatically triggering function invocations when messages arrive.

Mapping Definition

mappings/mappings.yaml
mappings:
  - eventSource: queue
    sourceArn: tasks-queue
    functionName: task-processor
    batchSize: 10
    enabled: true
  - eventSource: queue
    sourceArn: notifications-queue
    functionName: notification-handler
    batchSize: 1
    enabled: true

Configuration Options

Option Description Default
eventSource Type of event source (currently queue) Required
sourceArn Name of the queue to poll Required
functionName Function to invoke with messages Required
batchSize Number of messages per invocation (1-10) 10
enabled Whether the mapping is active true

Containers

QadEng uses Apple Containers for function execution. The Containers tool lets you manage containers directly.

Apple Containers: Apple Containers are lightweight, fast containers designed specifically for Apple Silicon. They provide native performance without the overhead of traditional container runtimes.

Container Management

The Containers view in QadEng lets you:

  • View running containers and their status
  • Inspect container details and logs
  • Stop or kill running containers
  • Manage container images
  • Monitor resource usage

Warm Executor Pools

QadEng maintains warm executor pools for frequently-used function configurations:

  • Up to 10 warm executors per function configuration
  • 10-minute TTL for idle warm executors
  • Automatic cleanup of expired executors
  • Instant cold starts for pooled configurations

AI Assistant

QadEng includes a built-in AI assistant powered by Apple Intelligence for natural language interaction with your services.

Requires Apple Intelligence: The AI Assistant requires Apple Intelligence to be enabled on your Mac. Available on Apple Silicon Macs running macOS 26+.

Capabilities

  • Create, update, and manage functions using natural language
  • Query database tables and view results
  • Send and receive queue messages
  • Manage storage buckets and objects
  • Configure API Gateway routes
  • View logs and debug issues

Usage

Access the AI Assistant by clicking the assistant button in the bottom-right corner of the app, or use the keyboard shortcut. The assistant is context-aware and provides relevant tools based on the current view.

Logs

QadEng provides comprehensive logging for all platform activity.

HTTP Traffic Logs

View all API requests to QadEng with:

  • Request method, path, and status code
  • Request and response headers
  • Request and response bodies
  • Timing information
  • Service routing information

System Logs

View internal platform logs including:

  • Service startup and shutdown events
  • Function invocation logs
  • Container lifecycle events
  • Error messages and warnings

Filtering & Export

Filter logs by method, status code, service, or search text. Export logs as JSON or CSV for external analysis.

Terminal

The built-in terminal provides direct access to interact with QadEng services via the command line.

Features

  • Direct shell access for debugging
  • Run curl commands against the API
  • View container logs
  • Execute scripts and automation

API Reference

Base URL: http://localhost:7566

Health Endpoints

GET
/_qadeng/health

Health check with service statuses

GET
/_qadeng/info

Platform info (name, version, platform)

Functions API

GET
/functions

List all functions

GET
/functions/{name}

Get function details

POST
/functions/{name}/invoke

Invoke a function

PUT
/functions/{name}/warm

Set warm state

GET
/functions/{name}/logs

Get container logs for warm function. Query param: ?tail=N

Storage API

GET
/storage/buckets

List buckets

GET
/storage/{bucket}

List objects (with ?prefix=)

PUT
/storage/{bucket}/{key}

Upload object

GET
/storage/{bucket}/{key}

Download object

DELETE
/storage/{bucket}/{key}

Delete object

Database API

GET
/database/tables

List tables

PUT
/database/tables/{table}/items

Put item

POST
/database/tables/{table}/items/get

Get item

POST
/database/tables/{table}/scan

Scan items

POST
/database/tables/{table}/query

Query by key

Queues API

GET
/queues

List queues

GET
/queues/{queue}

Get queue attributes

POST
/queues/{queue}/messages

Send message

POST
/queues/{queue}/messages/batch

Send batch of messages

GET
/queues/{queue}/messages

Receive messages

DELETE
/queues/{queue}/messages

Delete message

POST
/queues/{queue}/messages/visibility

Change message visibility timeout

POST
/queues/{queue}/purge

Purge all messages

POST
/queues/{queue}/messages/receive

Receive messages (POST alternative)

POST
/queues/{queue}/messages/delete-batch

Delete multiple messages in batch

Topics API

GET
/topics

List topics

GET
/topics/{topic}

Get topic details

GET
/topics/{topic}/subscriptions

List subscriptions

GET
/topics/{topic}/subscriptions/{id}

Get subscription details

POST
/topics/{topic}/publish

Publish message to topic

API Gateway API

GET
/api-gateway/gateways

List gateways

GET
/api-gateway/gateways/{id}

Get gateway details

GET
/api-gateway/gateways/name/{name}

Get gateway by name

PUT
/api-gateway/gateways/{id}

Update gateway

GET
/api-gateway/gateways/{id}/routes

List gateway routes

GET
/api-gateway/gateways/{id}/routes/{routeId}

Get route details

PUT
/api-gateway/gateways/{id}/routes/{routeId}

Update route

Event Mappings API

GET
/event-source-mappings

List all event source mappings

GET
/event-source-mappings/{uuid}

Get mapping details

PUT
/event-source-mappings/{uuid}

Update mapping (toggle enabled, batch size)

GET
/functions/{name}/event-source-mappings

List mappings for a function

Parameters API

GET
/parameters

List parameters (?path=, ?recursive=)

GET
/parameters/{name}

Get parameter (?WithDecryption=true)

GET
/parameters/history/{name}

Get parameter history

POST
/parameters/batch/get

Batch get parameters

POST
/parameters/path

Get parameters by path

Containers API

GET
/containers

List containers (?all=, ?qadeng_only=)

GET
/containers/{id}

Inspect container

POST
/containers/{id}/stop

Stop container

POST
/containers/{id}/kill

Kill container

DELETE
/containers/{id}

Remove container (?force=)

GET
/containers/{id}/logs

Get container logs (?tail=)

GET
/containers/{id}/stats

Get container stats

GET
/containers/images

List images

POST
/containers/images/pull

Pull image

DELETE
/containers/images/{reference}

Remove image

POST
/containers/images/prune

Prune unused images

GET
/containers/stats

Get stats for all containers

GET
/containers/system/status

Get container system status

POST
/containers/system/start

Start container system

POST
/containers/run

Run a container

Apps API

GET
/apps

List apps

POST
/apps

Add app ({"path": "..."})

GET
/apps/{name}

Get app details

DELETE
/apps/{name}

Remove app

PUT
/apps/{name}/enable

Enable app (loads all resources)

PUT
/apps/{name}/disable

Disable app (unloads all resources)

POST
/apps/{name}/sync

Re-sync app from disk

Examples

QadEng includes sample apps and examples to help you get started:

  • Sample apps with functions, storage, and database
  • Full demo applications
  • API usage examples

Examples will be included with the app when it launches on the Mac App Store.