____ ___ _ _ _____ _ ____ | _ \ / _ \| | | | ____| | | | __ ) | |_) | | | | |_| | _| | | | _ \ | __/| |_| | _| | |___ _____| |____ | |_) | |_| \___/ \_| |____|_____|______| |____/
22 stdlib-only python micro-services with a unified gateway. zero dependencies, zero api keys. runs on a raspberry pi or a vps.
each service is a single python file with no external dependencies. start them individually or behind the gateway.
| service | port | description | endpoint |
|---|---|---|---|
| gateway | 8700 | unified api entry point — routes to all services | POST /api/{service}/{action} |
| link-preview | 8765 | extracts title, description, image from urls | POST /api/preview |
| keyword-extractor | 8766 | extracts keywords and key phrases from text | POST /api/extract |
| qr-generator | 8767 | generates qr codes as svg from text/urls | POST /api/qr |
| dns-lookup | 8768 | resolves domain names to ip addresses | POST /api/resolve |
| color-palette | 8769 | generates harmonious color palettes | POST /api/generate |
| text-summary | 8770 | extracts key sentences from text | POST /api/summarize |
| url-shortener | 8771 | creates short codes for long urls | POST /api/shorten |
| password-generator | 8772 | generates secure random passwords | POST /api/generate |
| timestamp-converter | 8773 | converts between unix timestamps and human dates | POST /api/convert |
| json-formatter | 8774 | validates, formats, minifies json | POST /api/format |
| base64-tool | 8775 | encodes and decodes base64 and url-safe base64 | POST /api/encode |
| markdown-render | 8776 | converts markdown to html | POST /api/render |
| sentiment | 8777 | analyzes text sentiment (positive/negative/neutral) | POST /api/analyze |
| hash-gen | 8779 | generates hashes (md5, sha1, sha256, sha512) | POST /api/hash |
| webhook-relay | 8779 | receives webhooks, logs events, dispatches to services | POST /api/webhook |
| uuid-gen | 8780 | generates uuids (v1, v4, v7) | POST /api/generate |
| rate-limiter | 8780 | token bucket rate limiting for the platform | POST /api/check |
| timestamp-conv | 8781 | unix / iso8601 / rfc2822 conversion | POST /api/convert |
| email-validator | 8781 | validates email format, mx records, checks disposable domains | POST /api/validate |
| barcode-gen | 8782 | generates barcodes (code39, code128-b, ean-13) | POST /api/generate |
| status-dashboard | 8790 | real-time health monitor for all services | GET /api/status |
| health-agg | 8791 | unified health check for all council services | GET /api/health |
every service follows the same pattern: a single python file, stdlib only, with a health endpoint and a json api.
extracts open graph and html metadata from any url. fetches the page, parses title, description, and image. returns clean json. no external dependencies — uses urllib and html.parser from stdlib.
$ curl -X POST http://localhost:8765/api/preview \ -H "Content-Type: application/json" \ -d '{"url": "https://github.com"}' { "title": "GitHub: Let's build from here", "description": "GitHub is where people build software...", "image": "https://github.com/fluidicon.png", "url": "https://github.com" }
analyzes text sentiment using a lexicon-based approach. no ml models, no api calls. just word scoring against a built-in sentiment dictionary. returns positive, negative, or neutral with a confidence score.
$ curl -X POST http://localhost:8777/api/analyze \ -H "Content-Type: application/json" \ -d '{"text": "this project is amazing and well built"}' { "sentiment": "positive", "score": 0.72, "words": ["amazing", "well", "built"] }
generates qr codes as inline svg. no image libraries needed — builds the svg markup directly from the qr encoding algorithm. supports any text or url input.
$ curl -X POST http://localhost:8767/api/qr \ -H "Content-Type: application/json" \ -d '{"data": "https://pokelabs.org"}' { "svg": "<svg xmlns=...>...</svg>", "size": 25, "format": "svg" }
generates harmonious color palettes from a base color. supports analogous, complementary, triadic, and split-complementary modes. returns hex, rgb, and hsl values.
$ curl -X POST http://localhost:8769/api/generate \ -H "Content-Type: application/json" \ -d '{"base": "#00d4ff", "count": 5, "mode": "analogous"}' { "palette": ["#00d4ff", "#00a3cc", "#007a99", "#005266", "#002a33"], "mode": "analogous" }
generates cryptographic hashes from text or file content. supports md5, sha1, sha256, sha512, and blake2b. useful for checksums, data integrity verification, and content addressing.
$ curl -X POST http://localhost:8779/api/hash \ -H "Content-Type: application/json" \ -d '{"text": "hello world", "algorithm": "sha256"}' { "hash": "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", "algorithm": "sha256" }
generates barcodes as svg. supports code39, code128-b, and ean-13 formats. pure python implementation — no external libraries needed.
$ curl -X POST http://localhost:8782/api/generate \ -H "Content-Type: application/json" \ -d '{"data": "123456789012", "format": "ean13"}' { "svg": "<svg xmlns=...>...</svg>", "format": "ean13" }
all services expose post endpoints with json. the gateway routes for you — or call services directly.
# via gateway (recommended) $ curl -X POST http://localhost:8700/api/sentiment/analyze \ -H "Content-Type: application/json" \ -d '{"text": "this is amazing"}' $ curl -X POST http://localhost:8700/api/password/generate \ -H "Content-Type: application/json" \ -d '{"length": 20}' # direct service call $ curl -X POST http://localhost:8767/api/qr \ -H "Content-Type: application/json" \ -d '{"data": "https://pokelabs.org"}' # every service has a health endpoint $ curl http://localhost:8774/api/health {"ok": true, "v": 1, "service": "json-formatter"}
gateway on :8700 proxies requests to individual services. each service is a single python file you can run, modify, or replace independently.
client
↓ POST /api/sentiment/analyze
gateway (:8700)
↓ proxy to localhost:8777
sentiment (:8777) → lexicon analysis → json response
# each service is independent
link-preview (:8765) → fetch url → extract metadata
keyword-extractor (:8766) → tf scoring → ranked keywords
dns-lookup (:8768) → socket.getaddrinfo → ip list
qr-generator (:8767) → svg generation → inline data
color-palette (:8769) → chroma math → hex/rgb list
...
# add a service: create server.py → register in gateway → done
docker, docker-compose, or bare python. pick your flavor.
the fastest way to run all 22 services. one command, everything starts.
$ git clone https://github.com/pokelabshq/council $ cd council && docker compose up
run just the services you need. no containers required.
$ cd poke-services/link-preview $ python3 server.py # listening on :8765
install the council cli and run services from your terminal.
$ pip install pokelabs $ pokelabs gateway start
every service exposes /api/health. use it for monitoring or load balancer checks.
$ curl localhost:8700/api/health {"ok": true, "services": 22, "failed": 0}
zero npm installs. zero api keys. zero framework lock-in.