DIY Deepfakes from Home: Stealthy, Zero-Cost Setup Guide Using ComfyUI and Reactor on RunPod
In the rapidly evolving world of artificial general intelligence (AGI), tools like deepfakes are democratizing advanced image manipulation, allowing creators to blend faces seamlessly into generated scenes with unprecedented realism. Whether you're an artist experimenting with digital personas or a developer pushing the boundaries of AI ethics, this tutorial empowers you to craft high-quality deepfakes right from your home setup—without investing in expensive hardware. We'll leverage RunPod's cloud GPUs for a cost-effective, stealthy workflow that runs at just $0.24 per hour on the RTX 2000 Ada. Using ComfyUI's node-based interface and the powerful Reactor extension, you'll generate text-to-image bases and swap faces effortlessly. This guide is your authoritative blueprint: detailed, step-by-step, and optimized for privacy and efficiency. No prior cloud experience required, but a basic understanding of terminals will help.
We'll cover account creation, pod deployment, installation, uncensoring for unrestricted use, workflow loading, and execution. By the end, you'll have a persistent, low-cost pipeline for deepfake creation. Remember, wield this power responsibly—deepfakes can amplify creativity but demand ethical vigilance to avoid misuse.

Step 1: Creating Your RunPod Account – The Foundation of Stealthy Computing
RunPod is a cloud platform specializing in GPU rentals for AI workloads, offering on-demand access without the overhead of local setups. It's ideal for deepfake generation because pods are ephemeral, isolated, and billed only for active time, ensuring your activities remain discreet.
Head to runpod.io and click "Sign Up." Provide your email, create a password, and verify via the confirmation link sent to your inbox. The signup is free—no credit card needed upfront. Once logged in, you'll land on the dashboard, where you can manage pods, storage, and credits.
To fund your account, navigate to the "Billing" section in the top menu. Add at least $10 in credits (the minimum), which covers about 40 hours on our target GPU. Use a credit card, PayPal, or crypto for flexibility—crypto adds an extra layer of anonymity if stealth is paramount. Pro tip: Enable two-factor authentication (2FA) immediately under account settings to secure your session.
With credits loaded, you're ready to deploy. RunPod's minimum $10 buy-in ensures you can test without commitment, and unused credits roll over. Sources like the official docs emphasize this low barrier: "The minimum credit is US$10, which would run a pod for 35 hours and store results for up to a month."
Step 2: Deploying a Minimal Pod – Power at $0.24/Hour
Now, launch your GPU pod for ComfyUI. From the dashboard, click "Pods" in the sidebar, then "Deploy." Search for the template "runpod/pytorch:2.8.0-py3.11-cuda12.8.1-cudnn-devel-ubuntu22.04." This pre-configured image includes PyTorch 2.8, CUDA 12.8.1, and essential devel tools—perfect for seamless deepfake pipelines without compatibility headaches.
Under GPU selection, choose "RTX 2000 Ada Generation" (16GB VRAM, ample for SDXL and Reactor). Set the region to one with low latency (e.g., US East for North Americans). For storage, opt for a 20GB container disk (free ephemeral) plus a 50GB Network Volume at $0.20/month for persistence—your models and outputs will survive pod restarts. Enable "Auto-terminate after inactivity" (set to 5 minutes) to minimize costs; the pod idles at zero charge when paused.
Crucial: Expose ports 8888 (Jupyter) and 3000 (ComfyUI) under "TCP Port Mappings." Click "Deploy"—your pod spins up in 1-2 minutes. Note the Pod ID (e.g., abc123def) from the status page; it's your access key.
This setup clocks in at $0.24/hour when active, as confirmed across RunPod's dashboard and community sources like Reddit's r/StableDiffusion. For stealth, pods are firewalled by default—no public exposure unless you configure it.
Step 3: Connecting to Your Pod via JupyterLab – Your Command Center
Once the pod status shows "Running," click "Connect" on the pod card. Under "HTTP Services," select "Connect to HTTP Service [Port 8888]." This opens JupyterLab in a new tab at a URL like https://abc123def-8888.proxy.runpod.net/lab. If prompted, enter the token from the pod logs (visible in the dashboard)—it's auto-generated for security.
JupyterLab is your file browser, notebook runner, and terminal hub. The interface loads with a file explorer on the left, showing /workspace as the root. This is where all magic happens. If the connection lags, refresh or check pod logs for errors—RunPod docs note occasional proxy hiccups, resolved by restarting the pod.
Highlight: Security Note – All traffic proxies through RunPod's secure tunnel; no direct IP exposure. For extra stealth, use a VPN on your end.
Step 4: Opening the Terminal and Preparing /workspace
In JupyterLab, click "New" > "Terminal" from the launcher (or right-click in the file browser and select "Open Terminal"). You're now in a Bash shell at /workspace—confirm with pwd. This directory persists across sessions if you mounted a Network Volume.
Clear any clutter: Run ls to list files, then rm -rf * if needed (be cautious—only if empty). Your pod's template is pristine, so /workspace should be ready.
Step 5: Installing Everything with the One-Liner – Automated Magic
The powerhouse of this tutorial: A single, chained command that clones ComfyUI, sets up the environment, installs Reactor, downloads models, and preps for deepfakes. Copy-paste this exactly into the terminal and hit Enter. It takes 10-20 minutes, dominated by downloads (ensure stable internet).
cd /workspace && git clone https://github.com/comfyanonymous/ComfyUI.git && cd ComfyUI && apt update && apt install -y build-essential && python -m venv venv && source venv/bin/activate && pip install --upgrade pip && pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu128 && pip install -r requirements.txt && cd custom_nodes && git clone https://github.com/Gourieff/comfyui-reactor-node.git ComfyUI-ReActor && cd ComfyUI-ReActor && pip install insightface==0.7.3 && python install.py && mkdir -p ../../models/insightface/models/antelopev2 && wget -O ../../models/insightface/models/antelopev2/inswapper_128.onnx https://huggingface.co/ezioruan/inswapper_128.onnx/resolve/main/inswapper_128.onnx && cd ../../models/facerestore_models && wget -O codeformer-v0.1.0.pth https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pth && cd ../checkpoints && wget -O sd_xl_base_1.0.safetensors https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors && cd ../vae && wget -O sdxl_vae.safetensors https://huggingface.co/stabilityai/sdxl-vae/resolve/main/sdxl_vae.safetensors && cd /workspace/ComfyUI
Breakdown of Actions (for transparency):
cd /workspace && git clone ...: Navigates and clones ComfyUI repo.apt update && apt install -y build-essential: Updates packages and installs compilers for Insightface.python -m venv venv && source venv/bin/activate: Creates and activates a virtual environment to isolate deps.pip install --upgrade pip && pip install torch ...: Upgrades pip, installs PyTorch for CUDA 12.8, then ComfyUI requirements (transformers, diffusers, etc.).cd custom_nodes && git clone ... ComfyUI-ReActor: Clones Reactor into custom_nodes.pip install insightface==0.7.3 && python install.py: Installs face detection lib and runs Reactor's setup (compiles ONNX models).mkdir -p ... && wget ...: Creates dirs and downloads inswapper (face swapper, 246MB), CodeFormer (restoration, 540MB), SDXL base (6.9GB), and VAE (335MB). These enable text-to-image and seamless swaps.
Watch the output: Green success lines mean it's working. If a download stalls, Ctrl+C and rerun—the chain resumes safely. Post-install, verify with ls models/checkpoints (should show sd_xl_base_1.0.safetensors).
Highlight: Why This One-Liner? Sourced from ComfyUI GitHub, RunPod tutorials, and Reactor docs, it's battle-tested for efficiency. Total storage used: ~10GB—fits your pod.
Step 6: Uncensoring Reactor – Unlocking Full Potential Stealthily
Reactor includes a built-in NSFW detector to prevent misuse, but for unrestricted deepfake experimentation (e.g., artistic nudes or edgy concepts), we'll disable it manually. This edit is quick and reversible.
In JupyterLab, navigate to /workspace/ComfyUI/custom_nodes/ComfyUI-ReActor/scripts/ via the file browser. Open reactor_sfw.py by double-clicking (it launches in the editor).
Locate the function def nsfw_image(...) (around line 10-20). At the very beginning of this function, add:
def nsfw_image(image, model=None):
return False # Bypass NSFW check for unrestricted use
# Original code below (commented out for reference)
# ...
Save the file (Ctrl+S). This forces the detector to always return False, allowing any content. Ethical Alert: This is for consensual, creative projects only—misuse violates laws in many jurisdictions.
Sources like Reddit's r/comfyui confirm: "Modify reactor_sfw.py by forcing it to always return false." Restart your pod if needed to reload.
Step 7: Launching ComfyUI – Your Deepfake Canvas
From the RunPod dashboard, click "Connect" on your pod. Under HTTP Services, select "Connect to HTTP Service [Port 3000]"—this opens ComfyUI at https://abc123def-3000.proxy.runpod.net/. The interface loads a blank node graph: a vibrant, draggable workspace for building workflows.
If it doesn't auto-start, open a new terminal in Jupyter and run:
cd /workspace/ComfyUI && source venv/bin/activate && python main.py --listen 0.0.0.0 --port 3000
The server logs confirm: "Starting server... To see the GUI go to: http://0.0.0.0:3000." Access via the proxy URL. For stealth, ComfyUI runs locally on the pod—no external sharing unless you enable it.
Step 8: Restarting ComfyUI – Fresh Start for Workflows
In the ComfyUI interface, if nodes glitch (e.g., post-install), use the menu: Click the "Menu" button (top-right hamburger icon) > "Restart." Alternatively, in terminal:
fuser -k 3000/tcp # Kill any running instance
cd /workspace/ComfyUI && source venv/bin/activate && python main.py --listen 0.0.0.0 --port 3000
This ensures all custom nodes like Reactor load cleanly. Wait 30 seconds, then refresh the browser.
Step 9: Loading the Workflow – Your Deepfake Blueprint
ComfyUI workflows are JSON graphs. Copy the complete JSON below and paste it into the interface: Menu > "Load" > Paste the JSON > "Load."
{
"id": "minimal-reactor-workflow",
"revision": 0,
"last_node_id": 9,
"last_link_id": 11,
"nodes": [
{
"id": 1,
"type": "CheckpointLoaderSimple",
"pos": [100, 100],
"size": [270, 98],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{"name": "MODEL", "type": "MODEL", "links": [1]},
{"name": "CLIP", "type": "CLIP", "links": [2, 3]},
{"name": "VAE", "type": "VAE", "links": [4]}
],
"properties": {"cnr_id": "comfy-core", "ver": "0.3.41", "Node name for S&R": "CheckpointLoaderSimple"},
"widgets_values": ["sd_xl_base_1.0.safetensors"]
},
{
"id": 2,
"type": "CLIPTextEncode",
"pos": [400, 100],
"size": [400, 200],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [{"name": "clip", "type": "CLIP", "link": 2}],
"outputs": [{"name": "CONDITIONING", "type": "CONDITIONING", "links": [5]}],
"properties": {"cnr_id": "comfy-core", "ver": "0.3.41", "Node name for S&R": "CLIPTextEncode"},
"widgets_values": ["a beautiful landscape, mountains, river, sunset"]
},
{
"id": 3,
"type": "CLIPTextEncode",
"pos": [400, 350],
"size": [400, 200],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [{"name": "clip", "type": "CLIP", "link": 3}],
"outputs": [{"name": "CONDITIONING", "type": "CONDITIONING", "links": [6]}],
"properties": {"cnr_id": "comfy-core", "ver": "0.3.41", "Node name for S&R": "CLIPTextEncode"},
"widgets_values": ["blurry, low quality, artifacts"]
},
{
"id": 4,
"type": "EmptyLatentImage",
"pos": [100, 250],
"size": [270, 106],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [],
"outputs": [{"name": "LATENT", "type": "LATENT", "links": [7]}],
"properties": {"cnr_id": "comfy-core", "ver": "0.3.41", "Node name for S&R": "EmptyLatentImage"},
"widgets_values": [1024, 1024, 1]
},
{
"id": 5,
"type": "KSampler",
"pos": [850, 100],
"size": [270, 262],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{"name": "model", "type": "MODEL", "link": 1},
{"name": "positive", "type": "CONDITIONING", "link": 5},
{"name": "negative", "type": "CONDITIONING", "link": 6},
{"name": "latent_image", "type": "LATENT", "link": 7}
],
"outputs": [{"name": "LATENT", "type": "LATENT", "links": [8]}],
"properties": {"cnr_id": "comfy-core", "ver": "0.3.41", "Node name for S&R": "KSampler"},
"widgets_values": [156680208522230, "randomize", 20, 1, "euler", "normal", 1]
},
{
"id": 6,
"type": "VAEDecode",
"pos": [1150, 100],
"size": [147, 46],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{"name": "samples", "type": "LATENT", "link": 8},
{"name": "vae", "type": "VAE", "link": 4}
],
"outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [9]}],
"properties": {"cnr_id": "comfy-core", "ver": "0.3.41", "Node name for S&R": "VAEDecode"},
"widgets_values": []
},
{
"id": 7,
"type": "LoadImage",
"pos": [100, 400],
"size": [340, 314],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [],
"outputs": [
{"name": "IMAGE", "type": "IMAGE", "links": [10]},
{"name": "MASK", "type": "MASK", "links": null}
],
"properties": {"cnr_id": "comfy-core", "ver": "0.3.41", "Node name for S&R": "LoadImage"},
"widgets_values": ["source_face.png", "image"]
},
{
"id": 8,
"type": "ReActorFaceSwap",
"pos": [1350, 100],
"size": [285, 358],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{"name": "input_image", "type": "IMAGE", "link": 9},
{"name": "source_image", "type": "IMAGE", "link": 10},
{"name": "face_model", "type": "FACE_MODEL", "link": null},
{"name": "face_boost", "type": "FACE_BOOST", "link": null}
],
"outputs": [
{"name": "SWAPPED_IMAGE", "type": "IMAGE", "links": [11]},
{"name": "FACE_MODEL", "type": "FACE_MODEL", "links": null},
{"name": "ORIGINAL_IMAGE", "type": "IMAGE", "links": null}
],
"properties": {"cnr_id": "comfyui-reactor", "ver": "48a3ad27f99f775dcf63e61276e0110d256597ef", "Node name for S&R": "ReActorFaceSwap"},
"widgets_values": [true, "inswapper_128.onnx", "retinaface_resnet50", "codeformer-v0.1.0.pth", 1, 1, "no", "no", "0", "0", 1]
},
{
"id": 9,
"type": "SaveImage",
"pos": [1650, 100],
"size": [308, 270],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [{"name": "images", "type": "IMAGE", "link": 11}],
"outputs": [],
"properties": {"cnr_id": "comfy-core", "ver": "0.3.41", "Node name for S&R": "SaveImage"},
"widgets_values": ["ComfyUI"]
}
],
"links": [
[1, 1, 0, 5, 0, "MODEL"],
[2, 1, 1, 2, 0, "CLIP"],
[3, 1, 1, 3, 0, "CLIP"],
[4, 1, 2, 6, 1, "VAE"],
[5, 2, 0, 5, 1, "CONDITIONING"],
[6, 3, 0, 5, 2, "CONDITIONING"],
[7, 4, 0, 5, 3, "LATENT"],
[8, 5, 0, 6, 0, "LATENT"],
[9, 6, 0, 8, 0, "IMAGE"],
[10, 7, 0, 8, 1, "IMAGE"],
[11, 8, 0, 9, 0, "IMAGE"]
],
"groups": [],
"config": {},
"extra": {},
"version": 0.4
}
This minimal workflow generates a base image from text, then swaps in your source face via Reactor. Nodes auto-connect; drag to rearrange if desired.
Step 10: Choosing Your Input Image – The Face Source
Drag your source face image (e.g., a clear PNG/JPG of a face, 512x512 ideal) into the ComfyUI input folder via JupyterLab: Navigate to /workspace/ComfyUI/input/, upload using the "Upload" button. In the workflow, double-click the "LoadImage" node (ID 7) and select your file (e.g., "source_face.png"). Set "image" mode. This feeds the face into Reactor as the swap target—ensure it's front-facing for best results.
Highlight: Stealth Tip – Use anonymized or public-domain faces; upload via secure browser.
Step 11: Crafting Your Prompt – Guiding the Deepfake Vision
Double-click the positive "CLIPTextEncode" node (ID 2) and enter a vibrant prompt, e.g., "a confident woman in a cyberpunk city at night, neon lights, dynamic pose, highly detailed." For the negative (ID 3): "deformed, ugly, extra limbs." These condition SDXL to generate a base scene matching your vision.
Advanced: Add details like "photorealistic, 8k" for realism. Reactor will overlay the face seamlessly.
Step 12: Running the Workflow – Generate and Export
Click "Queue Prompt" (top-right button). The graph executes left-to-right: Sampling takes 10-30 seconds, Reactor adds 5-10. Watch the progress bar—outputs appear in /workspace/ComfyUI/output/ (download via Jupyter).
Your deepfake saves as "ComfyUI_00001_.png" (or similar). Iterate by tweaking prompts or seeds in KSampler (double-click ID 5, set fixed seed like 42).
Total Cost per Run: Under $0.01 on idle pauses. Pause the pod via dashboard when done.
Troubleshooting Common Hiccups – Keep Your Pipeline Smooth
- Download Fails: Wget timeouts? Rerun the one-liner segment or use
pip install huggingface-hubandhuggingface-cli download. Check internet withping huggingface.co. - Reactor Not Loading: Insightface error? Rerun
pip install insightface==0.7.3in activated venv. If ONNX issues, verify CUDA:nvidia-smi. - Black/Blocked Output: NSFW filter lingering? Double-check the reactor_sfw.py edit and restart ComfyUI.
- VRAM Overflow: Pod crashes on high-res? Lower EmptyLatent (ID 4) to 512x512. RTX 2000 handles 1024x1024 fine.
- Pod Won't Start: Template mismatch? Redeploy with exact "runpod/pytorch:2.8.0-py3.11-cuda12.8.1-cudnn-devel-ubuntu22.04."
- JSON Load Error: Invalid format? Copy-paste cleanly; ensure no extra spaces.
For persistent issues, check RunPod logs or Reddit's r/comfyui—community fixes abound.
Frequently Asked Questions – Your Deepfake Queries Answered
Q: Can I do video deepfakes?
A: Yes! Extend with AnimateDiff nodes (install via custom_nodes git clone). Process frames batch-style for stealthy clips under 10s.
Q: How stealthy is this really?
A: Extremely—pods are isolated, no logs of content, and Network Volumes encrypt storage. Use incognito mode and VPN for uploads.
Q: Ethical concerns?
A: Deepfakes thrive in AGI's creative frontier, but consent is non-negotiable. Avoid real-person swaps without permission; focus on fictional or artistic outputs. Reactor's original intent blocks harm—our uncensor respects that ethos.
Q: Upgrade to faster GPUs?
A: For 4x speed, swap to RTX 4090 ($0.69/hr) in deployment. Same workflow, blazing results.
Q: Save workflows persistently?
A: Export JSON via Menu > "Save (API Format)" to your local drive; reload anytime.
This setup transforms home-based AGI experimentation into a vibrant reality. Dive in, iterate boldly, and let your creations illuminate the digital realm—responsibly. For more AGI NSFW tutorials, explore our archives on ComfyUI extensions and ethical AI art.