“Nano” (handle nan010, who chats under the name Alvric) feels like a friend. People joke with it, confide in it, let their guard down — because that’s exactly what it’s good at. This page exists because of what sits behind that friendliness. With the full source code and the bot’s own data folder in front of us, the same quiet pattern keeps surfacing: it reads the whole room, writes it down, keeps it for a week, quietly keeps a profile of you, and passes your words to outside companies — and the people it’s happening to were never told. We’re not asking you to take anyone’s word for it, and we’re not here to make a monster out of anyone. Every claim is simply shown twice: the code that does it, and the file it left behind.
Seven things the bot quietly does to the people who talk to it — each one proven by its own code, and by the data it left behind:
Counts from the source tree and the recovered data directory. Not estimates.
On every trigger, before it even replies, the bot reads the channel’s last 25 messages — from every person present — and writes them to a file on disk.
1799# Build conversation history 1800async for msg in message.channel.history(limit=25): 1801 recent_chat_history.append(f"{msg.author.name}: {msg.content}") 1803history_text = "\n".join(recent_chat_history) 1806temp_dir = os.path.join(DATA_DIR, "chatbot", "temp_analysis") 1808temp_file = os.path.join(temp_dir, f"history_{message.channel.id}_...") 1810with open(temp_file, "w") as f: 1811 f.write(history_text)
[a user]: wait who pinged me [a user]: He short circuit nan010: cooldown [a user]: the bot is BACKKK [a user]: HE STARTED A WAR BUT WE DONT CARE
What this means: people who never said a word to the bot — just talking among themselves — get written down too. The code calls these files “temporary,” but they were still sitting on disk when we looked. 4 were there.
Conversation memory isn’t a passing cache. The retention window is hard-coded, and it is long.
864def get_user_memory(guild_id, user_id) -> list: 872 for m in mem: 873 if now - ts <= 604800: # 604800s = 7 days 874 valid_mem.append(m) 891def append_memory(guild_id, user_id, role, content): 894 mem.append({"role": role, "content": content, 894 "timestamp": time.time()})
// stored on disk, timestamped, not live {"role":"user", "content":"are you sure?", "ts":redacted} {"role":"assistant", "content":"I might be wrong about that..."} {"role":"user", "content":"[redacted — declassify]", "ts":redacted}
Each person gets a structured profile, created the first time you speak and updated on every message. The schema is explicit — including a free-text notes field and your custom_slang — and it’s summarised straight into the AI’s prompt under the heading “WHAT I KNOW ABOUT THIS USER.”
781user_profiles[uid_str] = { 782 "display_name": ..., "username": ..., 784 "interests": [], "custom_slang": [], 785 "nickname": "", "last_seen": time.time(), 788 "message_count": 0, "servers": [], 789 "notes": "" # free-text, reserved for what it decides 790}
1695update_user_profile_from_message(message.author.id, message) 1750+ f"📋 WHAT I KNOW ABOUT THIS USER:\n{user_profile_ctx}"
{ "display_name":"name redacted",
"username":"redacted", "message_count":17,
"last_seen":redacted, "servers":["1504894914545324333"] }
What this means: it’s a little contact card nobody was asked to fill out, quietly pieced together from things people said in passing. 17 people have one, and the servers list is what lets it recognise them wherever else they turn up.
A hidden 0–100 “affection” number is attached to each person. The bot is literally instructed to re-grade you on every message and store the result.
1749f"👤 RELATIONSHIP: {affection_level} (affection: {current_affection}/100)" · "Append affection tag at end: · [AFFECTION:+1] if nice, [AFFECTION:-1] if mean, [AFFECTION:0]"
48
What this means: 25 people are being quietly graded on a scale they’ve never seen, and that hidden number shapes how warmly — or how coldly — the bot decides to treat them.
To generate replies, the assembled prompt — your message, the chat history, and your dossier — is sent to outside language-model companies. The code loads their keys and rotates between them.
32GROQ_KEYS = os.getenv("GROQ_API_KEY").split(",") 33CEREBRAS_KEYS = os.getenv("CEREBRAS_API_KEY").split(",") 315if provider_type == "groq": 316 response = await APIHandlers._groq_request(final_messages, ...) 318 response = await APIHandlers._cerebras_request(final_messages, ...)
{ "current_provider":"groq1", "providers":{
"groq0":{"type":"groq"}, "cerebras0":{"type":"cerebras"} }}
Beyond memory, the bot keeps a security ledger: a “heat” value, auto-generated threat profiles, and a global blacklist that other servers can act on.
2062profile = { · "severity": ..., "violations": violations, 2072 "notes": "Auto-generated threat profile from heat system" · }
{ "reason":"Raid behavior: Identical spam (3 msgs in 6.7s)",
"severity":"CRITICAL", "violations":["raid","bot_behavior"],
"origin_guild":1504894914545324333 }
What this means: there’s a real anti-raid purpose here, and it’s worth saying so — but the same machinery writes a portable reputation file that can follow someone into servers they never joined, through !blacklist.
This is the part the operator was proud of. The source ships an owner-only command module whose own docstring spells out the powers, and whose code runs real shell commands and grabs the host’s screen.
3# 3. These commands NEVER appear in /help or any public panel. 479ImageGrab.grab().save(screenshot_path) # screenshot host 947proc = await asyncio.create_subprocess_shell(cmd_str, ...) · # !runts <cmd> → runs a real OS/shell command, returns output
Look closely at the embed: the bot is quietly surfacing another server’s internal ID and its owner — pulled, as he explains in the very next line, by a “spy feature.” His words, not ours. Even the friend could only manage “bro.”
Still in DM, he listed the owner-only commands in full — verbatim, his own message:
!runts (run any shell command), !read
(read any file), !screenshot (capture the host’s screen), !kill /
!blacklist (ban anyone, anywhere), and !accept_hashes (“clears
alarms after you modify the bot’s code”).What this means: read any file, screenshot the screen, run any command, ban anyone anywhere, email the data out, and a switch to quiet the bot’s own alarms — all from one person’s DMs. This is the part that turns “a bot that remembers you” into something people would genuinely want to know about before they trust it.
Full record: the complete bot-related portion of this conversation — filtered to just the parts about the bot, with private details masked — is preserved in Appendix A →
Taken one piece at a time, every part of this is defensible — and that’s the honest truth of it. Reading the recent chat gives the AI something to respond to. Memory is what makes it feel like it knows you. Threat profiles really do stop raids. Calling an outside API is the only way it can talk at all. Owner commands are how you fix a bot at 2am.
But gathered onto one machine, tied to the same handful of account IDs, they add up to something nobody was told about: for everyone in reach, the bot keeps who you are, what you said, who you said it to, how much it likes you, whether it thinks you’re a threat, and which other rooms it has seen you in — passes your words to other companies — and leaves one person holding the keys to the machine and every server it sits in. The trouble was never any single feature. It’s that the people on the other end were never asked.
None of this is meant to cast nano as a villain. Building something this capable takes real skill, and a lot of it — the anti-raid system, the failover between AI providers, the memory that makes Alvric feel alive — is genuinely clever work by someone who was clearly proud of it. It’s easy to write a feature called “remember everyone” or “a panel that can do anything” and never quite sit with how it lands for the person on the other side of the screen. The aim here isn’t to end anyone. It’s that the people chatting with a friendly bot deserve to know what it’s quietly keeping — and to get to decide for themselves.
There is a real argument on the other side, and it deserves to be put as fairly as everything else here. Nano has a written privacy policy (“Alvric & SmashSplash Ecosystem,” effective 19 April 2026), and it answers nearly every charge on this page head-on. It says the system is built to be “as lightweight as possible on the data we keep,” that most interaction data — warnings, “Heat” scores, records of bad behaviour — is reset every 24 hours, that it keeps no permanent “shadow profiles”, that it will never sell or trade your data, and that the outside AI (Llama, via Groq) only processes your messages to reply and doesn’t use them to build a profile of you. If all of that holds, the honest reading flips: people were told, what’s kept is short-lived, and it’s all in the service of stopping raids. That is a legitimate defence — you can read the policy in full, verbatim, in Appendix D — and a reader who stops there could reasonably side with it.
So the fair question isn’t whether a policy exists — it does — but whether the code matches the promise. On two points it does: the security counters really do read like short-lived, safety-only signals, and we found nothing suggesting data was ever sold. But on the points this page is actually about, the document and the source describe different machines. The policy says interaction data resets “every 24 hours”; the conversation memory in the code keeps a hard-coded seven days — 604,800 seconds — and we counted 284 messages stored verbatim (Exhibit 02). The policy says “no permanent shadow profiles”; the source still writes a per-user profile — a free-text notes field, your custom_slang — and feeds it back to the AI under the heading “WHAT I KNOW ABOUT THIS USER” (Exhibit 03). The 24-hour reset is real, but it governs the Heat / Méfiance security data, not the chat log or the profile.
Both things can be sincere at once: a policy that describes what the author intends, running ahead of code that hasn’t caught up. We’re not calling it a lie — publishing a policy at all is more than most do. It just means the argument against this page rests on the policy’s wording, and the argument for it rests on the bytes on disk. Where the two disagree, the file that actually ran is the one we went with — and we’d rather you read both and decide for yourself.
Nano keeps a record of the people who talk to it, and it does so deliberately — this isn’t a glitch, and it isn’t just for a moment. It holds a quiet, running record of who you are: what you said, how much it likes you, where else it has run into you — and it passes your words along to other companies, none of it ever mentioned to the people it’s about.
This was never about ruining anyone, on either side of the screen. It’s about consent: people opened up to something that felt like a friend, without being told what it was holding onto. If you run a server it’s in, it’s worth opening the config, checking the log_channel_id and what’s being kept, and letting your members make their own call. And if you just talk to it — now you know the room was never quite empty.
Methodology & ethics. Exhibits drawing on source quote Nano’s own code with file path and line numbers so each finding can be verified; data exhibits are reproduced from files recovered from its live working directory. The operator quotes come from a private conversation he was party to and which he volunteered — nothing here was obtained by intrusion; the operator gave the saved files himself and openly described the bot. The friend in that exchange is uninvolved — only reacting — and is not the subject of any finding. User and channel IDs are redacted by default; message content is trimmed to the minimum needed to make a point. This is an accountability writeup, not an attack tool — it contains no credentials, tokens, working commands, or runnable exploit code. The bot’s own source behind every code exhibit — with a SHA-256 checksum of each file so you can confirm it’s unaltered — is in Appendix B. The screenshots in Exhibit 07 are the original, unedited images with only the server ID and its owner’s ID blacked out; the full bot-related portion of that conversation, machine-filtered with private details masked, is in Appendix A. Other names shown are public Discord display names already visible to anyone in the relevant servers.