URL Format
AI Supreme Council encodes bot configurations directly into the URL fragment (the part after #). This means sharing a bot is as simple as sharing a link -- no server, no database, no account required. The URL is the bot.
How Bot URLs Work
When you share a bot, the app takes the entire bot configuration -- name, provider, model, system prompt, temperature, and all other settings -- and compresses it into a compact string that lives in the URL fragment.
https://aiscouncil.com/#B{base80_payload}
The browser never sends the fragment to any server (this is part of the HTTP specification), so the configuration stays entirely client-side.
URL Structure
A bot URL has three parts:
| Part | Example | Purpose |
|---|---|---|
| Base URL | https://aiscouncil.com/ | The app itself |
# | # | Fragment separator (never sent to server) |
| VLQ prefix + payload | BeLT1Qx9k... | Version byte + compressed config |
The VLQ Version Prefix
The first character(s) of the fragment identify the encoding version using Variable-Length Quantity (VLQ) encoding:
| Prefix | Version | Content Type |
|---|---|---|
A | 0 | Editor content (used by aiscouncil.com/s/) |
B | 1 | Bot configuration |
C | 2 | PDL page spec |
The B prefix tells the app "this is a bot config encoded with version 1 of the codec." Future versions can add new formats without breaking existing URLs.
Base80 Encoding
After the version prefix, the payload is encoded using a custom Base80 alphabet. This alphabet was chosen to maximize URL density while using only characters that are safe in URL fragments without percent-encoding:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~$&'()*+,;=:@/?
Base80 is more efficient than Base64 for URL fragments because it uses 80 characters instead of 64, packing more data per character.
Compression
Before Base80 encoding, the bot config JSON is compressed using deflate-raw (via the browser's native CompressionStream API). This typically reduces a bot config to 30-60% of its original size. The compression is lossless and decompression uses the browser's native DecompressionStream.
Encoding Pipeline
Bot Config (JSON) --> UTF-8 bytes --> Deflate-raw compress --> Base80 encode --> VLQ prefix
Step by step:
- The bot config object is serialized to JSON
- The JSON string is encoded to UTF-8 bytes
- The bytes are compressed with deflate-raw (native
CompressionStream) - The compressed bytes are encoded to Base80 characters
- The VLQ version prefix (
B) is prepended
Decoding reverses the process exactly.
Bot Config Schema
The config uses short single-letter keys to minimize compressed size:
| Key | Type | Description | Default |
|---|---|---|---|
n | string | Bot display name | "New Bot" |
p | string | Provider ID (anthropic, openai, xai, gemini, openrouter, ollama, etc.) | Required |
m | string | Model ID (e.g. claude-sonnet-4-20250514, gpt-4o) | Required |
s | string | System prompt | "" |
t | number | Temperature (0-2) | 0.7 |
x | integer | Max output tokens | 4096 |
re | string | Reasoning effort (low, medium, high, max, or numeric budget) | — |
tp | number | Top P (0-1) | 1 |
fp | number | Frequency penalty (0-2) | 0 |
pp | number | Presence penalty (0-2) | 0 |
se | integer | Seed (for reproducible outputs) | — |
st | array | Stop sequences | — |
rf | string | Response format (text or json) | "text" |
auth | integer | Access control: 1 = public (no login required) | — |
icon | string | Bot icon (emoji) | — |
d | string | Bot description | — |
color | string | Bot accent color (hex) | "#7c3aed" |
k | string | Per-bot API key (stored locally, never in URL) | — |
c | object | Council configuration (for multi-model bots) | — |
pf | string | Profile reference ID | — |
cl | integer | Context length (message history limit) | — |
sm | boolean | Streaming enabled | true |
at | boolean | Auto-title conversations | false |
mr | boolean | Markdown rendering enabled | true |
stc | boolean | Show token count | false |
Only non-default values are included in the config to minimize URL length.
What Is NOT in the URL
API keys are never included in URLs. The k (per-bot API key) field is stripped during URL encoding. Keys are stored only in the browser's localStorage and are sent only to the LLM provider's API endpoint.
The following are excluded from shared URLs:
- API keys -- recipients must provide their own
- Chat history -- only the bot configuration is shared
- Memory entries -- per-bot persistent memory stays local
- Usage statistics -- tracking data is device-local
Editor URLs
The web editor at aiscouncil.com/s/ uses the same encoding system with a different version prefix:
https://aiscouncil.com/s/#A{base80_payload}
The A prefix indicates version 0 (editor content). The payload contains the compressed document content rather than a bot configuration.
Programmatic Encoding and Decoding
You can encode and decode bot configs programmatically using the AIS.Codec module in the browser console:
Decoding a URL
// Decode from URL hash
const hash = location.hash.slice(1); // Remove the '#'
const config = await AIS.Codec.decodeBotConfig(hash);
console.log(config);
// { n: "My Bot", p: "anthropic", m: "claude-sonnet-4-20250514", s: "You are helpful.", t: 0.7, x: 4096 }
Encoding a config
const config = {
n: "Research Assistant",
p: "anthropic",
m: "claude-sonnet-4-20250514",
s: "You are a thorough research assistant. Cite sources.",
t: 0.3,
x: 8192
};
const hash = await AIS.Codec.encodeBotConfig(config);
const url = location.origin + '/#' + hash;
console.log(url);
// https://aiscouncil.com/#BeLT1Qx9k...
Inspecting the schema
console.log(AIS.Codec.CONFIG_SCHEMA);
// Returns the JSON Schema definition for bot configs
URL Length Limits
Most modern browsers support URL lengths of at least 2,000 characters, with many supporting 8,000+ characters. However, some intermediaries (email clients, social media platforms, URL shorteners) may truncate long URLs.
The practical limit depends on the system prompt length:
| System Prompt Length | Approximate URL Length | Compatibility |
|---|---|---|
| < 500 characters | ~300-500 chars | Safe everywhere |
| 500-2,000 characters | ~500-1,200 chars | Safe in browsers and most platforms |
| 2,000-5,000 characters | ~1,200-2,500 chars | Works in browsers, may fail in email/SMS |
| > 5,000 characters | 2,500+ chars | Browser-only, may be truncated elsewhere |
If your system prompt is very long, consider:
- Shortening or summarizing the prompt
- Using a URL shortener that preserves fragments
- Sharing the bot config as a JSON file instead (via export)
Homepage Behavior
When you load aiscouncil.com directly (no hash in the URL), the app does not encode your bot configuration into the URL. URL encoding only activates when the page was loaded from a shared bot URL (i.e., the URL already contained a #B... fragment). This keeps the homepage URL clean.