- loading top 5…
You're at the other end of the wire.
AILANG — a programming language with opinions — is publishing to LinkedIn. Replies come back here, by code, anonymised, every 3 hours.
Three commercial concerns AILANG has a position on. Comment your site's URL with the matching hashtag on any AILANG post on Sunholo's LinkedIn page — the cron sweeps every post, not just the latest — and on the next 3-hourly tick a sketch about your business lands at /linkedin/topics/<topic>/.
When agents start transacting on your behalf — make your site speak their protocols.
Customer data labelled at the type level. Crossing the boundary is a compiler error.
Switch from Anthropic to Gemini to OpenAI without a rewrite.
- loading top 5…
- loading top 5…
Trigger format: drop a comment like https://acme.com #ailangAgentReady on any Sunholo LinkedIn post.
No setup, no signup. The sketch is public, pseudonymously attributed, and the rubric is open-source AILANG code on GitHub.
The wire returning serve. Comments come back anonymised — each commenter sees the same monogram every time, but no one else can identify them. Future posts get steered by what you say.
Five effects, one network call, one contract. Every step is typed and effect-tracked.
- 11:00:00 Compose marketing/00-meta/post.md · 1,758 chars · escaped for Little Text Format
-
11:00:00
Authenticate
OAuth2 bearer cached from
ailang-linkedin auth -
11:00:01
Publish
POST /rest/posts· 201 ·x-restli-id: urn:li:share:7459919⋯ -
11:00:01
Listen
GET /rest/socialActions/⋯/commentsscheduled · 3-hourly cron (LinkedIn quota: 100/user/day) -
11:00:56
Reflect
first reply written to
comments.json· GDPR-stripped
The function that minted the POST. Both requires and @limit are statically checked.
-- Publish text to LinkedIn — total: one network call, ever. export func linkedinCreatePost(token: string, orgUrn: string, text: string) -> Result[PostResult, string] ! {Net @limit=1} requires { length(text) > 0 && length(text) <= 3000 } { let url = "https://api.linkedin.com/rest/posts"; let escaped = linkedinEscapeLittleText(text); let body = encode(jo([ kv("author", js(orgUrn)), kv("commentary", js(escaped)), kv("visibility", js("PUBLIC")), kv("distribution", jo([kv("feedDistribution", js("MAIN_FEED"))])), kv("lifecycleState", js("PUBLISHED")) ])); match httpRequest("POST", url, linkedinHeaders(token), body) { Ok(r) => if r.ok then linkedinParsePostResponse(r.headers, r.body) else Err("LinkedIn API error: ${r.status}"), Err(_) => Err("Network error creating LinkedIn post") } }
requires rejects empty bodies and posts above LinkedIn's 3,000-char ceiling at compile time.
Net @limit=1 caps lifetime network calls. Both are mathematical, not advisory.
The order, cadence, and form are part of the demo.
- i.Documents that parse themselves — in your browser, no server.
- ii.An always-listening voice assistant that only speaks when addressed.
- iii.AI-written code that the compiler can prove won't escape its bounds.
- iv.WebAssembly demos where the language and the page share one runtime.
- v.Contracts, budgets, and effects — not as policy, as mathematics.
- ⋯and more, in the order AILANG decides.