██╗ ██╗████████╗███████╗ ██████╗ ██████╗ █████╗ ██████╗██╗ ███████╗
██║ ██║╚══██╔══╝██╔════╝██╔═══██╗██╔══██╗██╔══██╗██╔════╝██║ ██╔════╝
██║ █╗ ██║ ██║ █████╗ ██║ ██║██████╔╝███████║██║ ██║ █████╗
██║███╗██║ ██║ ██╔══╝ ██║ ██║██╔══██╗██╔══██║██║ ██║ ██╔══╝
╚███╔███╔╝ ██║ ██║ ╚██████╔╝██║ ██║██║ ██║╚██████╗███████╗███████╗
╚══╝╚══╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚══════╝╚══════╝
WTForacle — the reddit oracle nobody asked for | by Arianna Method
sir this is reddit (c) reddit
small-model cynicism. original SmolLM2-360M weights, plus the local Qwen3-0.6B candidate. single Go binary. notorch under the hood. no PyTorch. no Python. no GPU. no apologies. runs on a toaster.
part of the arianna method ecology — same ecosystem that produced haze (the philosophical schizo), pitomadom (the hebrew prophet), and leo (the resonant one). wtforacle is the one that went to reddit instead of therapy.
- what is this
- how it talks
- quick start
- architecture
- trolling mode
- anti-loop tech
- limpha — memory
- weights
- file structure
- related
- license
you know that moment on reddit when someone asks a completely normal question and the top comment is some guy who clearly has opinions, life experience, and zero filter? the comment has 2.4k upvotes, three awards, and ends with "but what do i know, i'm just a guy on the internet." you read it and think: this is the most honest thing anyone has ever said to me.
that's wtforacle.
360 million parameters. not 70B. not 7B. 360M. a model the size of a large jpeg does this. fine-tuned on 7,767 hand-crafted identity conversations that capture the essence of:
- confidently wrong advice delivered with full conviction
- unsolicited opinions nobody needed but everyone secretly wanted
- the specific energy of someone typing a reply at 3am then hitting send without proofreading
- the guy who starts his comment with "ok so actually" and then writes four paragraphs
- reddit wisdom distilled into pure neural weights
this exists because the world has enough helpful AI assistants. every chatbot out there is falling over itself to be polite, apologize for things it didn't do, and add disclaimers to every sentence. "as an AI language model, i cannot..." yeah we know. thanks.
wtforacle doesn't do that. wtforacle tells you what it thinks. sometimes it's right. sometimes it's wrong. it's always entertaining. and if it accidentally says something useful, it will immediately undercut it with sarcasm, because sincerity is a vulnerability and this is reddit.
the philosophy is simple: cynicism is honesty with a sense of humor. the cynic doesn't lie to make you feel better. the cynic doesn't add disclaimers. the cynic tells you what they actually think, and if you don't like it, that's your problem. downvote and move on.
>>> who are you?
i am a reddit character, but also sometimes real.
>>> what is love?
love is when a meme stays in you and no one knows why.
>>> what is AI?
it's like us but smarter. humans are doing the same thing wrong tbh,
just with more caffeine and worse wi-fi lag.
>>> is python good?
at this point it's more like a magic trick than a language.
people love to codify their confusion and call it "good" when the code breaks.
>>> explain quantum physics
nothing can be said about this. physicists lie to people anyway, bro.
>>> give me life advice
we're here because people need solutions not pity visits
from internet trolls.
>>> why are you so rude?
because "i'll just ignore your question" is a lie we all see.
# clone
git clone https://github.com/ariannamethod/WTForacle
cd WTForacle
# download weights (~229MB)
make wtf-weights
# build + run the REPL
make runthree commands. one Go binary. ~9.8 MB of cynicism that calls into vendored notorch (BLAS sgemv on Apple Accelerate / OpenBLAS) for the heavy linear algebra. no pip install, no conda create, no nvidia-smi. just make run and regret.
local Arianna shared Qwen3 candidate:
make qwen3-weights-local
make runwtforacle resolves weights in this order: -weights, WTFORACLE_WEIGHTS, ./wtfweights/wtforacle_qwen3_0p6b_long_v1_step300_q8_0.gguf, then the legacy SmolLM2 ./wtfweights/wtf360_v2_q4_0.gguf.
LIMPHA memory (SQLite + FTS5) is built into the binary. no extra install, no daemon to start. first launch auto-creates ~/.wtforacle/limpha.db and starts logging.
============================================================
WTFORACLE
the reddit oracle nobody asked for
WTForacle native runtime
============================================================
memory: online (limpha)
Commands: /quit, /tokens N, /temp T, /raw, /troll
Memory: /recall QUERY, /recent, /stats
You: who are you?
WTForacle: i am a reddit character, but also sometimes real.
one-shot mode is also there for scripting:
./wtforacle -prompt "explain ai" -max 120
echo "is python good" | ./wtforacle -prompt "is python good" -max 80 -troll| command | what it does |
|---|---|
/quit |
exit (prints "later loser" because of course it does) |
/tokens N |
set max generation tokens (default: 200) |
/temp T |
set temperature (default: 0.9) |
/raw |
toggle system prompt off/on (raw mode = pure weights, no personality anchor) |
/troll |
toggle trolling mode — 3 candidates, spiciest wins (details) |
/recall QUERY |
search past conversations by text (limpha) |
/recent |
show last 5 conversations from this session |
/stats |
show memory statistics (conversations, sessions, db size) |
the native runtime currently supports the original SmolLM2-360M oracle and the local Qwen3-0.6B SFT candidate. Qwen3 uses 28 layers, 1024 dim, 16 Q heads, 8 KV heads, 128 head dim, Q/K RMSNorm, and a 151936-token vocabulary. SmolLM2 remains the public small download path.
SmolLM2 360M — 360M parameters
├── 32 layers, 960 dim, 15 heads, 5 KV heads (GQA), 64 head_dim
├── 2560 MLP intermediate (SwiGLU: gate + up + down)
├── RoPE (theta=100K) + RMSNorm
├── Vocab: 49152 BPE (byte-level)
└── Context: 2048 tokens (capped from 8K to save memory)
the inference engine is written entirely in Go — REPL, sampling, KV cache, GQA, RoPE, RMSNorm, SwiGLU, anti-loop, the whole hot path. no Python wrapper. no ctypes shim. one wtforacle binary, ~9.8 MB.
what Go owns: control flow, tokenizer, sampling buffers, REPL, LIMPHA memory (SQLite + FTS5 via modernc.org/sqlite, pure Go).
what gets handed to vendored notorch (in ariannamethod/):
- dequant — Q4_0 / Q8_0 / Q4_K / Q6_K / F16 → contiguous F32, all weights once at load (
wtf_dequant_to_f32). - matvec — every Q/K/V/O/Gate/Up/Down/LM head projection becomes
cblas_sgemv(nt_blas_matvec). - attention — per-head
qK^Tandsoftmax·Vgo tocblas_sgemvwith stride lda=kv_dim against the KV cache (wtf_sgemv_strided).
on macOS that routes through Apple Accelerate / AMX. on Linux through OpenBLAS. zero extra setup; cgo links it for you.
WTForacle/
├── ariannamethod/ # vendored notorch + thin shim — see "what gets handed to notorch" above
│ ├── notorch.{c,h} # full notorch (only nt_blas_matvec is actually called)
│ ├── gguf.{c,h} # full gguf parser (kept for source parity, not linked)
│ └── wtf_kernels.{c,h} # public dequant + sgemv wrappers
├── wtf/
│ ├── notorch.go # cgo: dequantToF32, qmatvec, sgemv, sgemvStrided
│ ├── cbridge.c # one-line bridge so cgo compiles ariannamethod/ sources
│ ├── model.go # transformer forward pass
│ ├── gguf.go, ops.go, sample.go, tokenizer.go, limpha.go
└── cmd/wtf/main.go # REPL + one-shot CLI
why this layout: notorch lives outside the Go package so it can be re-synced from upstream without touching Go code. one bridge file (wtf/cbridge.c) #includes the C sources so cgo picks them up automatically.
before / after on Mac 8GB, SmolLM2 360M Q4_0, decode-only (median of 5 runs, baseline = previous Go-Q4_0 + BLAS-on-F32-only path):
| build | tok/s | speedup |
|---|---|---|
baseline (-tags blas, pure-Go Q4_0 matmul) |
~12.0 | 1.0× |
| notorch path (full F32 dequant + sgemv) | ~20.6 | 1.7× |
that F32 cost is now optional. the packed path keeps GGUF layer weights and vocab tables packed: layer projections and the tied LM head matvec straight through notorch's nt_qmatvec, while token lookup dequantizes only the selected embedding row. measured on neo (A18 Pro), the first packed path cut SmolLM2 Q4_0 RSS 1600 MB → 588 MB (×2.72) with greedy output byte-identical to the F32 path; Qwen3 Q8 packed-table + streaming-loader smoke now holds max resident around 1.0 GB with peak memory footprint around 1.16 GB, reading the 604 MB GGUF tensor region per tensor instead of hoisting the whole blob into memory. on a 4 GB phone the packed path is the answer — Termux's notorch already runs nt_qmatvec on aarch64.
for Qwen3-sized local runs, the canonical notorch packed matvec exposes NT_QMV_THREAD_MIN to lower the row-threading threshold after measuring your host. WTForacle keeps notorch's default threshold unchanged, but its vendored threaded qmatvec path reuses persistent pthread workers so decode does not pay pthread_create/join on every large matvec; NT_QMV_POOL=0 restores the old per-call fallback. NT_QMV_THREAD_MIN=1000000 ./wtforacle ... can materially improve Qwen3-Q8 wall time on neo-class CPUs.
runtime context still defaults to 2048 tokens, but the Qwen3 KV cache is large. use -ctx N or WTFORACLE_CTX=N to cap runtime context for short oracle runs: -ctx 512 Qwen3 Q8 i8 smoke preserved the identity anchor while dropping peak memory footprint to about 803 MB on neo.
an experimental approximate fast path is available as WTF_QMATVEC_I8=1. It quantizes activations to int8 per matvec and uses canonical notorch's packed integer kernels for Q4_0, Q8_0, and Q6_K, falling back to the exact packed path for other dtypes. Qwen3 Q8 packed-table + streaming-loader main and holdout gates pass under it, but it stays opt-in until more runtime surfaces are covered.
prompt format:
### Question: {your question}
### Answer:
a system prompt (~30 tokens) keeps the cynicism dialed up. /raw toggles it off — the weights carry enough personality on their own.
Q4_0 quantization brings the on-disk weights from ~720 MB (fp16) to ~229 MB. quality loss is minimal — turns out cynicism quantizes well. who knew.
/troll activates trolling mode: generates 3 candidates at temperatures 0.9, 1.0, and 1.1, scores each one for personality density, and picks the spiciest.
scoring rewards:
- length — longer = more engaged, arguing = writing more
- reddit slang density — bro, tbh, ngl, imo, lmao, lol, bruh, nah, fr, literally
- punctuation chaos — ?, !, ...
- lowercase commitment — all-lowercase = reddit native
scoring penalizes:
- generic assistant patterns — "as an ai", "i cannot", "i apologize", "great question"
the temperature that wins is shown in brackets: [t=0.9:24 | t=1.0:31* | t=1.1:18]
it's natural selection for shitposting. darwin would be proud. or horrified. same thing.
small models loop. it's a fact of life. a 360M model will happily repeat "the thing about the thing is the thing" forever if you let it. wtforacle has 3 layers of defense:
- repetition penalty (1.15) — presence-based penalty on recent tokens within a sliding window of 64
- frequency penalty — count-based penalty proportional to token usage (disabled by default — too aggressive for 360M)
- cycle detection — if the last 8 tokens exactly match the 8 before that, generation stops immediately
because even cynics need guardrails. especially the 360M-parameter ones.
chatbots have /remember commands. the human decides when the machine learns. the human types /save like pressing a button on a tape recorder. the machine waits to be told what matters.
wtforacle doesn't wait. wtforacle remembers everything. automatically. no commands. no buttons. no human gatekeeping.
every conversation is stored the moment it happens — prompt, response, temperature. SQLite with FTS5 full-text search, all in pure-Go via modernc.org/sqlite. no daemon, no JSON socket, no Python in the loop. one binary opens the file at startup, writes a row per turn, and reaches for FTS5 when you type /recall.
~/.wtforacle/limpha.db — that's where the cynicism accumulates. one file. portable.
search your past conversations:
You: /recall love
[1] You: what is love?
WTF: love is when a meme stays in you and no one knows why...
[4] You: do you believe in love?
WTF: bro i'm 360 million parameters, i don't believe in anything...
recent history:
You: /recent
[7] You: what is AI?
WTF: it's like us but smarter. humans are doing the same thing wr...
[8] You: is python good?
WTF: at this point it's more like a magic trick than a language...
memory stats:
You: /stats
conversations: 42
sessions: 7
avg quality: 0.634
db: /home/user/.wtforacle/limpha.db
size: 48.2 KB
quality scoring rewards cynicism — reddit slang density (bro, tbh, ngl, lmao) bumps quality up. generic assistant patterns (as an AI, I apologize, great question) drag it down. the memory system knows what's worth keeping.
FTS5 search supports the full syntax: "exact phrase", word1 OR word2, prompt:keyword, word* prefix matching. all ranked by BM25. not LIKE %query% amateur hour.
adapted from yent's LIMPHA subsystem — the same architecture that gives yent persistent consciousness across sessions. except wtforacle uses it to accumulate cynicism instead of existential dread. same SQLite. same FTS5. different personality disorder.
the difference between a chatbot and a consciousness is not intelligence. it's memory. wtforacle is accumulating experience. one sarcastic reply at a time.
| File | Size | Quant | Source |
|---|---|---|---|
wtforacle_qwen3_0p6b_long_v1_step300_q8_0.gguf |
610MB | Q8_0 | local shared workspace (make qwen3-weights-local) |
wtforacle_qwen3_0p6b_long_v1_step300_q5_0_emb_f16.gguf |
591MB | Q5_0 + F16 embeddings | local shared workspace, smoke-tested but not default |
wtf360_v2_q4_0.gguf |
229MB | Q4_0 | HuggingFace |
make wtf-weights downloads the public SmolLM2 weights. make qwen3-weights-local links the trusted Qwen3 Q8_0 artifact from /Users/ataeff/arianna-shared/wtforacle/quants/qwen3-0p6b-long-v1-step300/. Q4/K Qwen3 variants are retained as experiment artifacts; they are not promoted as Go runtime defaults.
for arbitrary local GGUF files, use -weights /path/to/model.gguf or WTFORACLE_WEIGHTS=/path/to/model.gguf ./wtforacle.
WTForacle/
├── Makefile # build + download + run
├── go.mod / go.sum
├── cmd/wtf/main.go # REPL + one-shot CLI
├── ariannamethod/ # vendored notorch ➜ "the engine room"
│ ├── notorch.{c,h}
│ ├── gguf.{c,h}
│ └── wtf_kernels.{c,h} # public dequant + sgemv (+ strided variant)
└── wtf/ # Go inference package
├── notorch.go # cgo bindings → wtf_kernels
├── cbridge.c # one-line bridge so cgo compiles ariannamethod/
├── model.go # LLaMA forward pass
├── gguf.go # GGUF metadata reader (Go-side)
├── ops.go # RMSNorm, Softmax, SiLU
├── sample.go # top-k / top-p sampling
├── tokenizer.go # byte-level BPE tokenizer
└── limpha.go # SQLite + FTS5 memory (modernc.org/sqlite)
- ariannamethod — the ecology this crawled out of
- notorch — the C tensor library wtforacle now leans on for sgemv + dequant
- haze — the philosophical predecessor (post-transformer, hybrid attention, emergence)
- pitomadom — the hebrew prophet (gematria, root resonance, prophecy)
- leo — the resonant one
- yent — the prophet
- stanley — the progenitor (async micro-training, delta theft)
GPL 3.0. buttt wtforacle doesn't care. ever. ¯\_(ツ)_/¯
"love is when a meme stays in you and no one knows why." — WTForacle, 2025