Piracy guide for only fans
see doxing.

Actual motive: A science, thanks Crystal et al.
Specifically tell Crystal this for me thx <3 (see Vigenere Table).
Cryptography
cksum, sha256sum, MD5
cksum computes a basic CRC checksum (32-bit), byte count, and filename for files—great for quick integrity checks on transfers. Output looks like: 123456789 1024 filename.txt (checksum, bytes, name).
sha256sum generates a secure 256-bit SHA-256 hash, ideal for verifying downloads against tampering or corruption. Output: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 filename.txt (hash, filename).
Basic Usage
Run on a single file:
| command | integrity | security checks | Great to check for |
|---|---|---|---|
| cksum | Yes | No | Only for corruption of files |
| sha256sum | Yes | Yes | Tampering of files and corruption of files |
| MD5sum | Yes | No | Quick Integrity check. |
Both work on stdin too: echo "test" | cksum or echo "test" | sha256sum.
Verify Checksums
Generate first: sha256sum bigfile.iso > checksum.txt (saves hash to file).
Check: sha256sum -c checksum.txt—says "OK" if matches, warns on mismatch (exit code 1 for scripting).
cksum supports --check similarly but is less collision-resistant; prefer sha256sum for security.
Quick Tip
- Multiple files:
sha256sum *.txtlists all. - Compare manually: Copy the hash, run command, eyeball it.
file hashing guide:

Quick script to verify (shebang):
- Will show partial hashes
- Should work with file types for file hosts
- IT GLOWS
the filenames also contain a MD5 hash or a hash of some kind when imported with data whores. you may also look at the filenames, example
86d1581e1200494710266bfa812c82e4
Verification example:
These can be inside radicle as links.txt with catbox as a multirar. (see Rename to right files from terminal)
Image files
to add into image files:
WARNING RETARD!!!! THIS WILL DO THIS IN EVERY FILE IN A DIR IF DONE WRONG!!!
can do this with videos, just append *.mp4 and rename the text file to video_hashes.txt
Export your hashes from the images when veryfying
sha256sum *.jpeg > image_hashes.txt
sha256sum --check image_hashes.txt
add this into the readme.md or into a textfile inside radicle (if using a filehost).
uploading scripts
Catbox uploader modified
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 | # A modified catbox uploader, more clean and less messy.
import os
import requests
from datetime import datetime
credits="""
This program is made and maintained by Andrew
This program is open source and free to use
MIT @ 2025
Support me by Starring the project & following me on Github:
- https://github.com/Andrewgxgx/catbox.moe
- https://github.com/Andrewgxgx
"""
api = "https://catbox.moe/user/api.php"
api_litterbox="https://litterbox.catbox.moe/resources/internals/api.php"
os_unix="/"
os_windows="\\"
control=0
start=0
formatting = 2 # Default formatting
user_os = os_unix # Default OS
def get_user_preferences():
global user_os, control
while True:
print("""Please choose your OS:
1. Windows
2. Unix (Linux, MacOS)
3. Temple OS
4. Other
Type the number of your choice.
""")
Preferences = input("Enter a number 1 to 4: ")
if Preferences == "1":
user_os = os_windows
break
elif Preferences == "2":
user_os = os_unix
break
elif Preferences == "3":
print("Hello Terry Davis, We currently don't support Temple OS")
print("Exiting...")
control = 1
exit()
elif Preferences == "4":
user_os = os_unix
print("Using Unix-style paths as default")
break
else:
print("Please type 1, 2, 3, or 4")
def format():
global formatting, start
print("""
How would you like to format your links?
1. <file path>: <link>
2. <link>
3. <numbered list>. <link>
4. <Timestamp (hh:mm:ss)> : <File path> : <Link>
5. <custom string (user input)> : <link>
""")
try:
formatting = int(input("Enter a number 1 to 5: "))
start = 0
except ValueError:
print("Invalid input, using default format (link only)")
formatting = 2
def check_upload_folder():
"""Check if upload folder exists and warn if empty"""
folder_path = f".{user_os}upload"
if not os.path.exists(folder_path):
print(f"Warning: Folder '{folder_path}' does not exist!")
create = input("Create it now? (Y/N): ")
if create.upper() in ["Y", "YES", "YE"]:
os.makedirs(folder_path)
print(f"Created {folder_path}. Please add files to upload and run again.")
exit()
else:
print("Exiting...")
exit()
return folder_path
def save_links_to_file(content):
"""Save links, ALWAYS overwriting the existing file"""
try:
with open("uploaded_links.txt", "w", encoding='utf-8') as f:
f.write(content)
print(" Links saved to uploaded_links.txt (file overwritten)")
except Exception as e:
print(f" Error saving to file: {str(e)}")
def get_files_from_folder():
"""Get list of files from upload folder"""
folder_path = check_upload_folder()
files_to_upload = []
print("\nScanning for files...")
for root, dirs, files in os.walk(folder_path):
for file in files:
file_path = os.path.join(root, file)
print(f"Found: {file_path}")
files_to_upload.append(file_path)
if not files_to_upload:
print("No files found in upload folder!")
return []
print(f"\nFound {len(files_to_upload)} file(s)")
confirm = input("Upload these files? (Y/N): ")
if confirm.upper() in ["Y", "YES", "YE", "YEAH"]:
return files_to_upload
return []
def upload_to_service(api_url, data, files):
"""Wrapper for requests.post"""
try:
return requests.post(api_url, data=data, files=files)
except Exception as e:
print(f"Network error: {str(e)}")
return None
def process_uploads(files_to_upload, upload_function, additional_data=None):
"""Generic upload processor"""
global start, formatting
all_links = ""
total_files = len(files_to_upload)
for idx, file_path in enumerate(files_to_upload, 1):
print(f"Uploading [{idx}/{total_files}]: {file_path}")
try:
with open(file_path, "rb") as item:
files = {"fileToUpload": item}
data = {"reqtype": "fileupload"}
if additional_data:
data.update(additional_data)
response = upload_function(data, files)
if response and response.status_code == 200:
link = response.text.strip()
if formatting == 1:
formatting_write = f'"{file_path}" : {link}\n'
elif formatting == 2:
formatting_write = f"{link}\n"
elif formatting == 3:
start += 1
formatting_write = f"{start}. {link}\n"
elif formatting == 4:
current_time = datetime.now().strftime("%H:%M:%S")
formatting_write = f"[{current_time}]: {file_path} : {link}\n"
elif formatting == 5:
write = input("Put text before the link: ")
formatting_write = f"{write} : {link}\n"
else:
formatting_write = f"{link}\n"
all_links += formatting_write
print(f"✓ Uploaded: {link}")
else:
print(f"✗ Failed to upload: {file_path}")
except Exception as e:
print(f"✗ Error uploading {file_path}: {str(e)}")
if all_links:
save_links_to_file(all_links)
print(f"\n Successfully uploaded {len(files_to_upload)} files")
else:
print("\n No files were uploaded successfully")
def upload_links():
"""Handle URL uploads - ALWAYS OVERWRITES the file"""
all_links = ""
print("\nEnter links to upload (type 'done' when finished):")
while True:
enter_links = input("Link: ")
if enter_links.lower() == "done":
break
data = {"reqtype": "urlupload", "url": enter_links}
response = upload_to_service(api, data, None)
if response and response.status_code == 200:
print(f"✓ Uploaded: {response.text}")
all_links += f"{response.text}\n"
else:
print("✗ Failed to upload link")
if all_links:
save_links_to_file(all_links)
else:
print("No links were uploaded")
def upload_links_with_account(account):
"""Handle URL uploads with account - ALWAYS OVERWRITES the file"""
all_links = ""
print("\nEnter links to upload (type 'done' when finished):")
while True:
enter_links = input("Link: ")
if enter_links.lower() == "done":
break
data = {
"reqtype": "urlupload",
"userhash": account,
"url": enter_links
}
response = upload_to_service(api, data, None)
if response and response.status_code == 200:
print(f"✓ Uploaded: {response.text}")
all_links += f"{response.text}\n"
else:
print("✗ Failed to upload link")
if all_links:
save_links_to_file(all_links)
else:
print("No links were uploaded")
def catbox_no_acc():
linkornot = input("Upload via link? (Y/N): ")
if linkornot.upper() in ["Y", "YE", "YES"]:
upload_links()
else:
files_to_upload = get_files_from_folder()
if files_to_upload:
format()
process_uploads(
files_to_upload,
lambda d, f: upload_to_service(api, d, f)
)
def catbox_with_acc():
account = input("Enter your account hash: ")
if not account:
print("Account hash required!")
return
linkornot = input("Upload via link? (Y/N): ")
if linkornot.upper() in ["Y", "YE", "YES"]:
upload_links_with_account(account)
else:
files_to_upload = get_files_from_folder()
if files_to_upload:
format()
process_uploads(
files_to_upload,
lambda d, f: upload_to_service(api, d, f),
{"userhash": account}
)
def litterbox():
files_to_upload = get_files_from_folder()
if not files_to_upload:
return
time_options = {"1h", "12h", "24h", "72h"}
while True:
time = input("Upload duration? (1h, 12h, 24h, 72h): ").lower()
if time in time_options:
break
print("Invalid duration. Please enter 1h, 12h, 24h, or 72h")
format()
process_uploads(
files_to_upload,
lambda d, f: upload_to_service(api_litterbox, d, f),
{"time": time}
)
def menu():
global control
print(f"""
{credits}
=========
Welcome to CATBOX & Litterbox Uploader!
Choose your options!
1. Upload to Catbox.moe (No account, perma)
2. Upload to Catbox.moe (with account)
3. Upload to Litterbox (temp upload)
4. Exit / Stop program
====
Note: uploaded_links.txt will be OVERWRITTEN each time you upload!
""")
try:
opt = int(input("Type 1,2,3 or 4: "))
if opt == 1:
print("Catbox - no account")
catbox_no_acc()
elif opt == 2:
print("Catbox - with account")
catbox_with_acc()
elif opt == 3:
print("Upload to LitterBox")
litterbox()
elif opt == 4:
print("Exiting...")
control = 1
else:
print("Invalid option. Please enter 1-4")
except ValueError:
print("Please enter a valid number")
# Main program
if __name__ == "__main__":
print(credits)
print("Welcome to the Catbox Uploader")
print("Please choose your OS first, before getting started")
get_user_preferences()
folder_path = f".{user_os}upload"
if not os.path.exists(folder_path):
os.makedirs(folder_path)
print(f"Created upload folder: {folder_path}")
print("Please add files to upload and run again.")
exit()
while control == 0:
menu()
if control != 1:
input("\nPress Enter to continue...")
print("\n" + credits)
print("Thank you for using the Catbox Uploader")
print("Exiting...")
|
OS of choice
Can be any distro, server can work well enough as everything stored in tmpfs is not written inside/to the disk itself.
if you're gonna use a server, use Debian or Ubuntu but don't use a rolling distro.
create a tmpfs partition scheme, replace /home/user/folder with something else to where the user (YOU) can write in
This will generate a new radicle identifier each time a docker image is built, everything on temp will be nuked upon reboot as it's stored in the system ram.
do NOT and I mean DO NOT store the docker container in /tmp as that's system wide.
Docker (radicle)
radicle commit:
I wouldn't change the following fields:
- the dir, that is the name of the repo initialized with git and radicle. This would reduce noise (Think DID key/account re-generation).
- description
- name/email
- commit message
- Don't place yml file outside tmpfs and build it, otherwise you'd have written data to a potentially unsecure device (unless if it's encrypted).
- Radicle also tracks commit messages and history so be mindful of what you do with git and don't be an idiot.
#!/bin/sh
# Be sure you're not in the target dir, just in the home dir please.
mkdir ~/init && cd ~/init && cp -R ~/targetdir/* ./
# Initialize git repository (in current directory /var/lib/radicle/init)
git init
# Set git global config
git branch -m main
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
# Increase buffer size
git config --global http.postBuffer 524288000
# this commit message can be anything really.
# add the shit you need with git add
git add readme.md Images cksum.sh
git commit -m "."
# THEN: Run rad init
rad init
sleep 20
rad self
sleep 20
rad node status
|
to build/run everything do this:
shut it down goyim.
Rename to right files from terminal (catbox)
fix the container on the host drive for the directory it's mounted on docker.
Suppose container runs as UID 1000, GID 1000
First verify, if it's ID 1000, GID 1000 it isn't owned by the container.
Then do this
for a shit load of images use imgbox + imagemagick, use this command (or upload straight to radicle with the links in the readme.md):
Optimal settings for imgbox (and possibly radicle)
7G ram
Below are other settings
replace 256x256 output.jpg with 256x256+2+2 -tile 4x4 output.jpg if you must.
it depends on system resources, results may vary but I'd try as seen below.
To diagnose enter this command, useful for running on 7GB Force Disk-Based Processing. Be sure to hit ctrl+c after a few minutes
Mem stats:
CLI:
with a desktop env like kde plasma.
This isn't optimal with imgbox or possibly radicle
with magick montage -limit memory 1MiB -limit map 1MiB -define jpeg:size=256x256 *.jpeg -geometry 256x256 output.jpg
Take this information and commands as you will, this will and should be able to help you.
Trouble shooting:
to show
docker network ls
docker volume ls
docker container ls
Remove
docker container ls
docker volume ls
docker network ls
see what's running
docker ps -all
for all the commands issue the command in the respected command such as rad or docker.
from the coomer board:
Copies off coomer:
Curated list(s) of everything known to man:
https://www.zerobin.net/?1d980b20c690ead0#Zr3uv+UJz57qUHyz+u1GvXgGwFIo/PPry6VoW9Qlsq0=
pw: FMHY (yes use all caps)
https://fmhy.net/video-tools#processing-encoding
Scrapers and searches from github/rad
https://github.com/datawhores/OF-Scraper
https://github.com/M-rcus/OnlyFans-Cookie-Helper/releases
https://github.com/patrickkfkan/patreon-dl
https://github.com/search?q=fansly&type=repositories
Wikis
Archival
TPB (please post if current node goes down, build src: https://git.sr.ht/~kycklingar/PBooru)
https://fmhy.xyz/internet-tools#archiving
Video hosts / file
https://bunkr.cr (use bunkr-albums if it's down)
Archiving tools (zips/rars/etc for multirar)
Winrar OR 7zip
Linux:
Messaging apps
discord replacement:
https://github.com/fluxerapp/fluxer
private messaging apps:
signal + simplex
DO NOT EVER and I mean EVER use telegram unless if you like 'p.
Filehosts
udrop can be up to 50 GB but can get taken down, thotpacks is membersonly same with empornium and sexy-egirls I'm not sure about re-uploading content but you may try; seems to be a piracy site itself.
https://www.reddit.com/r/Piracy/comments/rsxpyn/onlyfan_torrentpiracy/
Mega, 20 GB storage (can get unlimited with tools apparently)
https://fmhy.net/file-tools#cloud-storage
Account creation tools for mega:
https://fmhy.net/file-tools#mega-tools
Catbox uploader (see above):
https://github.com/karimawi/CatboxUploader
Self hosting:
https://bin.salvatorenoschese.it (private bin instance, also supports pics but not vids you may clone contents directly)
https://fmhy.net/linux-macos#server-selfhosting
jellyfin + yt-dlp for anything else (pornhub etc)
https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md
Jellyfin + jdownloader2
https://jhx7.de/blog/media-hosting-locally-with-jd-and-jellyfin/
docs + tailscale:
https://jellyfin.org/docs/general/post-install/networking/
lossless videos (editing etc)
https://github.com/mifi/lossless-cut
tl;dr use HandBrake for lossless encoding for a smaller file size.
email gen (cock-li)
https://gitlab.com/grrfe/cockli-gen
Doesn't like cock.li, use proton+keepassxc for a random username+pass.
Alternatively use this for simple username and quick password generation:
https://addons.mozilla.org/en-US/firefox/addon/username-generator/
doesn't need email for an account? use keepassxc for username/password generation.
VPNs:
proton VPN = partial
privateinternetaccess = supports port forwards fully but is owned by Kape.
for mullvad port forwards get tailscale.
Links:
https://archive.ph/https://chan.kemono.party/coomer/res/9766.html
https://chan.kemono.party/coomer/res/9766.html#q9922
https://www.activism.net/cypherpunk/manifesto.html
https://rentry.org/The-Piracy-Glossary
https://fmhy.net/misc#porn-quitting
Resource:
https://app.radicle.xyz/nodes/rosa.radicle.xyz/rad%3Az4QvchvB1mtepVTSoMDkMmrDS3ipi
https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/5/html/installation_guide/ch29s02
https://gitlab.com/cryptsetup/cryptsetup/-/wikis/DMCrypt
https://gitlab.com/cryptsetup/cryptsetup
https://man.archlinux.org/man/core/cryptsetup/cryptsetup.8.en
https://wiki.archlinux.org/title/Dm-crypt
https://web.archive.org/web/20180623004742/https://www.wisegeek.com/what-is-a-rolling-release.htm
https://www.geeksforgeeks.org/linux-unix/rolling-vs-fixed-release-linux-distros/
Moreno address:
lost edit key to https://rentry.co/3c6t5zsr
- Zodiac