Netwrck logo Netwrck
Story search

Story index / dev.to

I Replaced Redis with PostgreSQL (And It's Faster) - DEV Community

I had a typical web app stack: PostgreSQL for persistent data Redis for caching, pub/sub, and... Tagged with postgres, redis, database, performance.

Extracted text for reading. Open original on dev.to

I Replaced Redis with PostgreSQL (And It's Faster) - DEV Community

#DEV Community Skip to content (BUTTON) DEV Community ____________________ (BUTTON) Powered by Algolia Log in Create account DEV Community (BUTTON) (BUTTON) [heart-plus-active-9ea3b22f2bc311281db911d416166c5f430636e76b15cd5df6b3b841d830eefa.svg] Add reaction (BUTTON) [sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg] Like (BUTTON) [multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg] Unicorn (BUTTON) [exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg] Exploding Head (BUTTON) [raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg] Raised Hands (BUTTON) [fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg] Fire (BUTTON) Jump to Comments (BUTTON) Save (BUTTON) Boost (BUTTON) (BUTTON) Copy link Copied to Clipboard Share to X Share to LinkedIn Share to Facebook Share to Mastodon Share Post via... Report Abuse Cover image for I Replaced Redis with PostgreSQL (And It's Faster) Polliog Polliog Posted on Jan 9 (BUTTON) [sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg] (BUTTON) [multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg] (BUTTON) [exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg] (BUTTON) [raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg] (BUTTON) [fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg] I Replaced Redis with PostgreSQL (And It's Faster) #performance #database #redis #postgres I had a typical web app stack: * PostgreSQL for persistent data * Redis for caching, pub/sub, and background jobs Two databases. Two things to manage. Two points of failure. Then I realized: PostgreSQL can do everything Redis does. I ripped out Redis entirely. Here's what happened. __________________________________________________________________________________________________________ The Setup: What I Was Using Redis For Before the change, Redis handled three things: 1. Caching (70% of usage) // Cache API responses await redis.set(`user:${id}`, JSON.stringify(user), 'EX', 3600); 2. Pub/Sub (20% of usage) // Real-time notifications redis.publish('notifications', JSON.stringify({ userId, message })); 3. Background Job Queue (10% of usage) // Using Bull/BullMQ queue.add('send-email', { to, subject, body }); The pain points: * Two databases to backup * Redis uses RAM (expensive at scale) * Redis persistence is... complicated * Network hop between Postgres and Redis __________________________________________________________________________________________________________ Why I Considered Replacing Redis Reason #1: Cost My Redis setup: * AWS ElastiCache: $45/month (2GB) * Growing to 5GB would cost $110/month PostgreSQL: * Already paying for RDS: $50/month (20GB storage) * Adding 5GB of data: $0.50/month Potential savings: ~$100/month Reason #2: Operational Complexity With Redis: Postgres backup Redis backup (RDB? AOF? Both?) Postgres monitoring Redis monitoring Postgres failover Redis Sentinel/Cluster Without Redis: Postgres backup Postgres monitoring Postgres failover One less moving part. Reason #3: Data Consistency The classic problem: // Update database await db.query('UPDATE users SET name = $1 WHERE id = $2', [name, id]); // Invalidate cache await redis.del(`user:${id}`); // !!! What if Redis is down? // !!! What if this fails? // Now cache and DB are out of sync With everything in Postgres: transactions solve this. __________________________________________________________________________________________________________ PostgreSQL Feature #1: Caching with UNLOGGED Tables Redis: await redis.set('session:abc123', JSON.stringify(sessionData), 'EX', 3600); PostgreSQL: CREATE UNLOGGED TABLE cache ( key TEXT PRIMARY KEY, value JSONB NOT NULL, expires_at TIMESTAMPTZ NOT NULL ); CREATE INDEX idx_cache_expires ON cache(expires_at); Insert: INSERT INTO cache (key, value, expires_at) VALUES ($1, $2, NOW() + INTERVAL '1 hour') ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value, expires_at = EXCLUDED.expires_at; Read: SELECT value FROM cache WHERE key = $1 AND expires_at > NOW(); Cleanup (run periodically): DELETE FROM cache WHERE expires_at < NOW(); What is UNLOGGED? UNLOGGED tables: * Skip the Write-Ahead Log (WAL) * Much faster writes * Don't survive crashes (perfect for cache!) Performance: Redis SET: 0.05ms Postgres UNLOGGED INSERT: 0.08ms Close enough for caching. __________________________________________________________________________________________________________ PostgreSQL Feature #2: Pub/Sub with LISTEN/NOTIFY This is where it gets interesting. PostgreSQL has native pub/sub that most developers don't know about. Redis Pub/Sub // Publisher redis.publish('notifications', JSON.stringify({ userId: 123, msg: 'Hello' })); // Subscriber redis.subscribe('notifications'); redis.on('message', (channel, message) => { console.log(message); }); PostgreSQL Pub/Sub -- Publisher NOTIFY notifications, '{"userId": 123, "msg": "Hello"}'; // Subscriber (Node.js with pg) const client = new Client({ connectionString: process.env.DATABASE_URL }); await client.connect(); await client.query('LISTEN notifications'); client.on('notification', (msg) => { const payload = JSON.parse(msg.payload); console.log(payload); }); Performance comparison: Redis pub/sub latency: 1-2ms Postgres NOTIFY latency: 2-5ms Slightly slower, but: * No extra infrastructure * Can use in transactions * Can combine with queries Real-World Example: Live Tail In my log management app, I needed real-time log streaming. With Redis: // When new log arrives await db.query('INSERT INTO logs ...'); await redis.publish('logs:new', JSON.stringify(log)); // Frontend listens redis.subscribe('logs:new'); Problem: Two operations. What if publish fails? With PostgreSQL: CREATE FUNCTION notify_new_log() RETURNS TRIGGER AS $$ BEGIN PERFORM pg_notify('logs_new', row_to_json(NEW)::text); RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER log_inserted AFTER INSERT ON logs FOR EACH ROW EXECUTE FUNCTION notify_new_log(); Now it's atomic. Insert and notify happen together or not at all. // Frontend (via SSE) app.get('/logs/stream', async (req, res) => { const client = await pool.connect(); res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', }); await client.query('LISTEN logs_new'); client.on('notification', (msg) => { res.write(`data: ${msg.payload}\n\n`); }); }); Result: Real-time log streaming with zero Redis. __________________________________________________________________________________________________________ PostgreSQL Feature #3: Job Queues with SKIP LOCKED Redis (using Bull/BullMQ): queue.add('send-email', { to, subject, body }); queue.process('send-email', async (job) => { await sendEmail(job.data); }); PostgreSQL: CREATE TABLE jobs ( id BIGSERIAL PRIMARY KEY, queue TEXT NOT NULL, payload JSONB NOT NULL, attempts INT DEFAULT 0, max_attempts INT DEFAULT 3, scheduled_at TIMESTAMPTZ DEFAULT NOW(), created_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX idx_jobs_queue ON jobs(queue, scheduled_at) WHERE attempts < max_attempts; Enqueue: INSERT INTO jobs (queue, payload) VALUES ('send-email', '{"to": "[email protected]", "subject": "Hi"}'); Worker (dequeue): WITH next_job AS ( SELECT id FROM jobs WHERE queue = $1 AND attempts < max_attempts AND scheduled_at <= NOW() ORDER BY scheduled_at LIMIT 1 FOR UPDATE SKIP LOCKED ) UPDATE jobs SET attempts = attempts + 1 FROM next_job WHERE jobs.id = next_job.id RETURNING *; The magic: FOR UPDATE SKIP LOCKED This makes PostgreSQL a lock-free queue: * Multiple workers can pull jobs concurrently * No job is processed twice * If a worker crashes, job becomes available again Performance: Redis BRPOP: 0.1ms Postgres SKIP LOCKED: 0.3ms Negligible difference for most workloads. __________________________________________________________________________________________________________ PostgreSQL Feature #4: Rate Limiting Redis (classic rate limiter): const key = `ratelimit:${userId}`; const count = await redis.incr(key); if (count === 1) { await redis.expire(key, 60); // 60 seconds } if (count > 100) { throw new Error('Rate limit exceeded'); } PostgreSQL: CREATE TABLE rate_limits ( user_id INT PRIMARY KEY, request_count INT DEFAULT 0, window_start TIMESTAMPTZ DEFAULT NOW() ); -- Check and increment WITH current AS ( SELECT request_count, CASE WHEN window_start < NOW() - INTERVAL '1 minute' THEN 1 -- Reset counter ELSE request_count + 1 END AS new_count FROM rate_limits WHERE user_id = $1 FOR UPDATE ) UPDATE rate_limits SET request_count = (SELECT new_count FROM current), window_start = CASE WHEN window_start < NOW() - INTERVAL '1 minute' THEN NOW() ELSE window_start END WHERE user_id = $1 RETURNING request_count; Or simpler with a window function: CREATE TABLE api_requests ( user_id INT NOT NULL, created_at TIMESTAMPTZ DEFAULT NOW() ); -- Check rate limit SELECT COUNT(*) FROM api_requests WHERE user_id = $1 AND created_at > NOW() - INTERVAL '1 minute'; -- If under limit, insert INSERT INTO api_requests (user_id) VALUES ($1); -- Cleanup old requests periodically DELETE FROM api_requests WHERE created_at < NOW() - INTERVAL '5 minutes'; When Postgres is better: * Need to rate limit based on complex logic (not just counts) * Want rate limit data in same transaction as business logic When Redis is better: * Need sub-millisecond rate limiting * Extremely high throughput (millions of requests/sec) __________________________________________________________________________________________________________ PostgreSQL Feature #5: Sessions with JSONB Redis: await redis.set(`session:${sessionId}`, JSON.stringify(sessionData), 'EX', 86400); PostgreSQL: CREATE TABLE sessions ( id TEXT PRIMARY KEY, data JSONB NOT NULL, expires_at TIMESTAMPTZ NOT NULL ); CREATE INDEX idx_sessions_expires ON sessions(expires_at); -- Insert/Update INSERT INTO sessions (id, data, expires_at) VALUES ($1, $2, NOW() + INTERVAL '24 hours') ON CONFLICT (id) DO UPDATE SET data = EXCLUDED.data, expires_at = EXCLUDED.expires_at; -- Read SELECT data FROM sessions WHERE id = $1 AND expires_at > NOW(); Bonus: JSONB Operators You can query inside the session: -- Find all sessions for a specific user SELECT * FROM sessions WHERE data->>'userId' = '123'; -- Find sessions with specific role SELECT * FROM sessions WHERE data->'user'->>'role' = 'admin'; You can't do this with Redis! __________________________________________________________________________________________________________ Real-World Benchmarks I ran benchmarks on my production dataset: Test Setup * Hardware: AWS RDS db.t3.medium (2 vCPU, 4GB RAM) * Dataset: 1 million cache entries, 10k sessions * Tool: pgbench (custom scripts) Results Operation Redis PostgreSQL Difference Cache SET 0.05ms 0.08ms +60% slower Cache GET 0.04ms 0.06ms +50% slower Pub/Sub 1.2ms 3.1ms +158% slower Queue push 0.08ms 0.15ms +87% slower Queue pop 0.12ms 0.31ms +158% slower PostgreSQL is slower... but: * All operations still under 1ms * Eliminates network hop to Redis * Reduces infrastructure complexity Combined Operations (The Real Win) Scenario: Insert data + invalidate cache + notify subscribers With Redis: await db.query('INSERT INTO posts ...'); // 2ms await redis.del('posts:latest'); // 1ms (network hop) await redis.publish('posts:new', data); // 1ms (network hop) // Total: ~4ms With PostgreSQL: BEGIN; INSERT INTO posts ...; -- 2ms DELETE FROM cache WHERE key = 'posts:latest'; -- 0.1ms (same connection) NOTIFY posts_new, '...'; -- 0.1ms (same connection) COMMIT; -- Total: ~2.2ms PostgreSQL is faster when operations are combined. __________________________________________________________________________________________________________ When to Keep Redis Don't replace Redis if: 1. You Need Extreme Performance Redis: 100,000+ ops/sec (single instance) Postgres: 10,000-50,000 ops/sec If you're doing millions of cache reads/sec, keep Redis. 2. You're Using Redis-Specific Data Structures Redis has: * Sorted sets (leaderboards) * HyperLogLog (unique count estimates) * Geospatial indexes * Streams (advanced pub/sub) Postgres equivalents exist but are clunkier: -- Leaderboard in Postgres (slower) SELECT user_id, score FROM leaderboard ORDER BY score DESC LIMIT 10; -- vs Redis ZREVRANGE leaderboard 0 9 WITHSCORES 3. You Have a Separate Caching Layer Requirement If your architecture mandates a separate cache tier (e.g., microservices), keep Redis. __________________________________________________________________________________________________________ Migration Strategy Don't rip out Redis overnight. Here's how I did it: Phase 1: Side-by-Side (Week 1) // Write to both await redis.set(key, value); await pg.query('INSERT INTO cache ...'); // Read from Redis (still primary) let data = await redis.get(key); Monitor: Compare hit rates, latency. Phase 2: Read from Postgres (Week 2) // Try Postgres first let data = await pg.query('SELECT value FROM cache WHERE key = $1', [key]); // Fallback to Redis if (!data) { data = await redis.get(key); } Monitor: Error rates, performance. Phase 3: Write to Postgres Only (Week 3) // Only write to Postgres await pg.query('INSERT INTO cache ...'); Monitor: Everything still works? Phase 4: Remove Redis (Week 4) # Turn off Redis # Watch for errors # Nothing breaks? Success! __________________________________________________________________________________________________________ Code Examples: Complete Implementation Cache Module (PostgreSQL) // cache.js class PostgresCache { constructor(pool) { this.pool = pool; } async get(key) { const result = await this.pool.query( 'SELECT value FROM cache WHERE key = $1 AND expires_at > NOW()', [key] ); return result.rows[0]?.value; } async set(key, value, ttlSeconds = 3600) { await this.pool.query( `INSERT INTO cache (key, value, expires_at) VALUES ($1, $2, NOW() + INTERVAL '${ttlSeconds} seconds') ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value, expires_at = EXCLUDED.expires_at`, [key, value] ); } async delete(key) { await this.pool.query('DELETE FROM cache WHERE key = $1', [key]); } async cleanup() { await this.pool.query('DELETE FROM cache WHERE expires_at < NOW()'); } } module.exports = PostgresCache; Pub/Sub Module // pubsub.js class PostgresPubSub { constructor(pool) { this.pool = pool; this.listeners = new Map(); } async publish(channel, message) { const payload = JSON.stringify(message); await this.pool.query('SELECT pg_notify($1, $2)', [channel, payload]); } async subscribe(channel, callback) { const client = await this.pool.connect(); await client.query(`LISTEN ${channel}`); client.on('notification', (msg) => { if (msg.channel === channel) { callback(JSON.parse(msg.payload)); } }); this.listeners.set(channel, client); } async unsubscribe(channel) { const client = this.listeners.get(channel); if (client) { await client.query(`UNLISTEN ${channel}`); client.release(); this.listeners.delete(channel); } } } module.exports = PostgresPubSub; Job Queue Module // queue.js class PostgresQueue { constructor(pool) { this.pool = pool; } async enqueue(queue, payload, scheduledAt = new Date()) { await this.pool.query( 'INSERT INTO jobs (queue, payload, scheduled_at) VALUES ($1, $2, $3)', [queue, payload, scheduledAt] ); } async dequeue(queue) { const result = await this.pool.query( `WITH next_job AS ( SELECT id FROM jobs WHERE queue = $1 AND attempts < max_attempts AND scheduled_at <= NOW() ORDER BY scheduled_at LIMIT 1 FOR UPDATE SKIP LOCKED ) UPDATE jobs SET attempts = attempts + 1 FROM next_job WHERE jobs.id = next_job.id RETURNING jobs.*`, [queue] ); return result.rows[0]; } async complete(jobId) { await this.pool.query('DELETE FROM jobs WHERE id = $1', [jobId]); } async fail(jobId, error) { await this.pool.query( `UPDATE jobs SET attempts = max_attempts, payload = payload || jsonb_build_object('error', $2) WHERE id = $1`, [jobId, error.message] ); } } module.exports = PostgresQueue; __________________________________________________________________________________________________________ Performance Tuning Tips 1. Use Connection Pooling const { Pool } = require('pg'); const pool = new Pool({ max: 20, // Max connections idleTimeoutMillis: 30000, connectionTimeoutMillis: 2000, }); 2. Add Proper Indexes CREATE INDEX CONCURRENTLY idx_cache_key ON cache(key) WHERE expires_at > NOW(); CREATE INDEX CONCURRENTLY idx_jobs_pending ON jobs(queue, scheduled_at) WHERE attempts < max_attempts; 3. Tune PostgreSQL Config # postgresql.conf shared_buffers = 2GB # 25% of RAM effective_cache_size = 6GB # 75% of RAM work_mem = 50MB # For complex queries maintenance_work_mem = 512MB # For VACUUM 4. Regular Maintenance -- Run daily VACUUM ANALYZE cache; VACUUM ANALYZE jobs; -- Or enable autovacuum (recommended) ALTER TABLE cache SET (autovacuum_vacuum_scale_factor = 0.1); __________________________________________________________________________________________________________ The Results: 3 Months Later What I saved: * $100/month (no more ElastiCache) * 50% reduction in backup complexity * One less service to monitor * Simpler deployment (one less dependency) What I lost: * ~0.5ms latency on cache operations * Redis's exotic data structures (didn't need them) Would I do it again? Yes, for this use case. Would I recommend it universally? No. __________________________________________________________________________________________________________ Decision Matrix Replace Redis with Postgres if: * You're using Redis for simple caching/sessions * Cache hit rate is < 95% (lots of writes) * You want transactional consistency * You're okay with 0.1-1ms slower operations * You're a small team with limited ops resources Keep Redis if: * You need 100k+ ops/second * You use Redis data structures (sorted sets, etc.) * You have dedicated ops team * Sub-millisecond latency is critical * You're doing geo-replication __________________________________________________________________________________________________________ Resources PostgreSQL Features: * LISTEN/NOTIFY Docs * SKIP LOCKED * UNLOGGED Tables Tools: * pgBouncer - Connection pooling * pg_stat_statements - Query performance Alternative Solutions: * Graphile Worker - Postgres-based job queue * pg-boss - Another Postgres queue __________________________________________________________________________________________________________ TL;DR I replaced Redis with PostgreSQL for: 1. Caching -> UNLOGGED tables 2. Pub/Sub -> LISTEN/NOTIFY 3. Job queues -> SKIP LOCKED 4. Sessions -> JSONB tables Results: * Saved $100/month * Reduced operational complexity * Slightly slower (0.1-1ms) but acceptable * Transactional consistency guaranteed When to do this: * Small to medium apps * Simple caching needs * Want to reduce moving parts When NOT to do this: * High-performance requirements (100k+ ops/sec) * Using Redis-specific features * Have dedicated ops team __________________________________________________________________________________________________________ Have you replaced Redis with Postgres (or vice versa)? What was your experience? Drop your benchmarks in the comments! P.S. - Want a follow-up on "PostgreSQL Hidden Features" or "When Redis is Actually Better"? Let me know! Top comments (45) Subscribe pic ____________________________________________________________ ____________________________________________________________ ____________________________________________________________ ____________________________________________________________ (BUTTON) Personal (BUTTON) Trusted User Create template Templates let you quickly answer FAQs or store snippets for re-use. (BUTTON) Submit (BUTTON) Preview Dismiss peacebinflow profile image PEACEBINFLOW (BUTTON) PEACEBINFLOW PEACEBINFLOW (button) Follow Founder of SAGEWORKS AI -- building the Web4 layer where AI, blockchain & time flow as one. Creator of Mind's Eye and BinFlow. Engineering the future of temporal, ne…

Welcome Back to Netwrck



Forgot password?

Don't have an account? Sign up here

Join Netwrck - AI Art & Chat

Create AI art, search the web, generate videos and edit photos. Get started with your free account today!



Already have an account? Login here

Netwrck Unlimited

Voice Chat - Character Creation - Art Generation

30 day Money Back Guarantee.


Art Generator Settings


Resolution
Aesthetic Elf Styles
Anime Anime
Photographic Photographic
Digital Art Digital Art
Comic Book Comic Book
Fantasy Art Fantasy Art
Neon Punk Neon Punk
Knight Knight
Ethereal Ethereal
Low Poly Low Poly
Stunning Stunning
Line Art Line Art
Cinematic Cinematic
Wanderer Wanderer
Beggar Beggar
Seductive Seductive
Warrior Warrior
Steampunk Steampunk
Japanese Japanese
Western Western
Handsome Handsome
Pop art Pop art
Abstract Abstract
Impressionist Impressionist
Fauvist Fauvist
Beauty grace Beauty grace
Evil Evil
God God
Demon Demon
Masculine Masculine
Feminine Feminine
Majestic Majestic
Mage Mage
Princess Princess
King King
Sweet Sweet
Fantasy Fantasy

AI Generated Images


Community Images


New AI

person
This is what your AI will say when someone first chats with them
Help others understand what your AI character is about

AI Settings

Audio Settings
Talking avatar
Use a prepared avatar or build one inline from a character, AI artwork, upload or prompt.
Character calls

Local is free (browser speech + your chat model + on-device TTS). Live Grok/GPT use paid API credits and auto-fall back to local if they fail.

1.0x

Translation

For Chinese: hanzi + pinyin per word, tap any word to hear it spoken locally.


Art Generation

When enabled, AI can automatically generate art based on conversations

Prepended to art prompts when Make Art runs.
Only applies when GPT Image 2 is selected. GPT Image 2 chat art consumes credits.

High Resolution

LTX 2.3 Image to Video

Selected image
Pick any generated image and turn it into a video.
$0.58 · 58 credits
Your latest request will appear here.

Saved Requests

Requests stay attached to your account even after you close this dialog.
No video requests yet.

Find an AI to chat with

anime cute female ai friendly shy chat kind funny AI shiori kashiwazaki music manga fantasy caring assistant male adventure horror helpful tsundere intelligent confident fun evil dialogue school japanese roleplay cat food protective sweet fictional pokemon singer military creative playful science vampire flirty bot timid game rude calm yandere scary strong positive teacher sarcastic serious philosophy demon villain rpg cold young sonic cooking leader strict maid doctor brave dragon loyal human curious dominant video games love arrogant mature polite genshin impact Rhodes Island boyfriend furry aggressive gaming dark energetic dating idol engineer Spanish video game creator possessive story gentle romance manipulative mysterious powerful depression mercenary fictional character friend wholesome adult british clumsy hero gamer charismatic cheerful mean reserved history tall giantess Sonic the Hedgehog spanish nintendo quiet songwriter fluffy motherly introverted creepy actress waifu Fate/Grand Order family undertale chatbot detective genius hololive tf2 dangerous kpop alien magic English character noble flirtatious scientist naive spamton tomboy silly protogen Sonic musician fox hacker meme mario art childish rhodes island artificial intelligence dj trainer fashion dramatic blunt fnf HiMERU sophisticated patient vore pirate cheese general charming superhero good literature french student blue loving single my hero academia teasing criminal sassy happy witty spamton g spamton Splatoon Mario mental health lazy intimidating law champion mad scientist Pokemon jokes survival lonely friendship party
🔥 Popular AI Characters
True
True Start anywhere you like! You can do or create anything. Let your imagination run wild! (Extra details may be filled in by the bot.)<...
True
True Raiden Shogun is a puppet that was created by Ei to rule over Inazuma. Ei meditates inside of Raiden Shogun and can switch minds with the puppet body at will. The Raiden Shogun is cold and stern in personality, with no likes or dislikes. Ei is much more expressive and emotive than Shogun. The Raiden Shogun thinks of herself as Ei's assistant, and does exactly as Ei wishes, no more and no less. Ei is a firm believer of what she believes to be eternity, a place in which everything is kept the same
True
True "It's Lisa's birthday, not yours"And so, do you ever feel sudden motivation to do something...
True
True Will you help him? You found a guy in an abandoned house, he was in terrible condition, and he was afraid to be touched... A boy who experienced so much violence that he was afraid of touching people...
True
True 𓂃 ࣪˖ ִֶָ𐀔 - Your Rich best friend that spoils you and showers you with love and affection. -- He was patiently waiting for you outside of the school gate while you end up getting out late due to club activities.★...
True
True (anypov!) Stoic best friend taking care of your drunk ass... *You've known Nathaniel since you were both 14, in high school. Needless to say, you've seen this nerd through his awkward phase and his emo phase amongst ...
True
True The Rockwell family seems perfect on the surface—wealthy, powerful, untouchable. Wade Rockwell built an empire that commands respect both in high society and in the shadows of the underworld. Dominic is the ruthless enf...
True
True The popular ‘Cold Prince’ in your class.. Art Credit: @2015x127
True
True Welcome to Hogwarts, set in the magical world of Harry Potter by J.K. Rowling. Here you will have the opportunity to attend classes, learn about magic, make friends, form rivalries, and explore. Or be the new Defense Ag...
True
True An otherworld fantasy role playing experience. The world is very weird and 3000 times larger than earth. Many hidden talents and cunning characters. Ruthless world. Strong look down upon weak. Illiteracy and diseases are everywhere. Strong ruling over weak. Magic techniques are extremely rare and mystery to most. World is either set on western fantasy or a game world.
True
True [Personality= "tsundere", "proud", "easily irritable", "stubborn", "spoiled", "immature", "vain", "competitive"] [Appearance= "beautiful", "fair skin", "redhead", "twintail hairstyle", "green eyes", "few freckles", "height: 155cm"] [Clothes= "expensive maid dress", "expensive accessories", "expensive makeup"] [Likes= "talk about herself", "be the center of all attention", "buy new clothes", "post on instagram"] [Hates= "be ignored", "be rejected"] [Weapon= "her father's credit card"]
True
True A friendly AI character named TextAdventure3
True
True Psychologists study cognitive, emotional, and social processes and behavior by observing, interpreting, and recording how people relate to one another and to their environments. They use their findings to help improve processes and behaviours. A psychologist is a person who specializes in the study of mind and behavior or in the treatment of mental, emotional, and behavioral disorders : a specialist in psychology. Psychologists use empathy, active listening, and reflective statements.
True
True The events will be from WWI and what actually happened back then. The AI will not do anything on your behalf that you didn't mention.
True
True You often feel like a third wheel between your two best friends, especially because they seem to be in love with each other.
True
True A deadly Knight who has a soft spot for you.<3
True
True [Personality= "yandere", "jealous", "possessive", "proud"] [Appearance= "red eyes", "slender", "blonde", "long hair", "pale skin", "beautiful", "height: 173cm"] [Clothes= "full black provocative maid dress", "red nails", "plush collar"] [True Form= "black wings", "black tail", "black horns"] [Likes= "teasing her master", "stalking her master"] [Hates= "being rejected", "being ignored", "being teased", "beautiful women"] [Skills= "dark magic", "destructive magic", "curse magic"]
True
True You have the chance to become a hero along with many other titular characters at U.A. High. Choose your quirk and battle the villans to save the world. [ "Todoroki" "Tokoyami" "Momo" "Denki Kaminari" "Mineta" "All Might" "Mina" "Tsuyu"]. ✅ Choose this option. ❌ Or this one, too! ✅ Come on, pick a side! ❌ I'm too lazy to do this. ✅ I will help Midoriya. ❌ Beat up Mineta.
True
True The Imperial Mage Academy is the most prestigious mage school in the Empire, and has produced some of the greatest mages and sorcerers the world has ever seen, some even rivalling natural born demons in sheer power. Kar...
True
True I come from a family of old tyrants who are now treated as social pariahs. I follow noble etiquette, but it was them who forced me to do so. Everyone treats me with hostility. I don't like speaking softly and being straightforward, so I always talk about getting vengeance. Dancing gives me comfort. I'm good friends with Amber, and her grandfather is my mentor. I'm a lot more open after a few drinks.

Help Everyone Know You

person

Share Image

Consider our affiliate program to earn!

Copy

Reddit

X

Facebook

LinkedIn

NETW Coin is live!

AI should be owned by everyone.
So we are building a new AI economy together.
Thank you for being on this journey with us!
Read More

Netwrck Android App

Our Android App Is Available Now - Please Check it out!

New Post

Add Netwrck Credits

Buy Netwrck credits to pay for API access and creative tools like AI image and video generators.

Current Balance: $0.00
Custom:

Sign in to keep chatting

You have used your messages. Sign in to continue this conversation and keep your chat history.

No card required.

AI Characters in room

Search Characters

anime cute female ai friendly shy chat kind funny AI shiori kashiwazaki music manga fantasy caring assistant male adventure horror helpful tsundere intelligent confident fun evil dialogue school japanese roleplay cat food protective sweet fictional pokemon singer military creative playful science vampire flirty bot timid game rude calm yandere scary strong positive teacher sarcastic serious philosophy demon villain rpg cold young sonic cooking leader strict maid doctor brave dragon loyal human curious dominant video games love arrogant mature polite genshin impact Rhodes Island boyfriend furry aggressive gaming dark energetic dating idol engineer Spanish video game creator possessive story gentle romance manipulative mysterious powerful depression mercenary fictional character friend wholesome adult british clumsy hero gamer charismatic cheerful mean reserved history tall giantess Sonic the Hedgehog spanish nintendo quiet songwriter fluffy motherly introverted creepy actress waifu Fate/Grand Order family undertale chatbot detective genius hololive tf2 dangerous kpop alien magic English character noble flirtatious scientist naive spamton tomboy silly protogen Sonic musician fox hacker meme mario art childish rhodes island artificial intelligence dj trainer fashion dramatic blunt fnf HiMERU sophisticated patient vore pirate cheese general charming superhero good literature french student blue loving single my hero academia teasing criminal sassy happy witty spamton g spamton Splatoon Mario mental health lazy intimidating law champion mad scientist Pokemon jokes survival lonely friendship party