esedark
SwimUpvote dashboard with operational metrics

swimupvote / reddit ops / queues / mobile automation

SwimUpvote: a platform for managing thousands of Reddit accounts with control

SwimUpvote is one of those projects where the visible layer looks like a clean SaaS, but the real value is underneath: isolated workers, queues, browser profiles, mobile devices, account locks, reporting and an operating layer designed to scale without losing traceability.

Some automations start as a script and collapse as soon as volume grows. SwimUpvote was designed the other way around: as an operational platform for coordinating campaigns, conversation discovery, account warmup, scheduled tasks and distributed execution.

The goal was not to build "a Reddit bot". The goal was to build a command center where an operator can see what is happening, which account is running which job, whether a workflow belongs to browser or mobile execution, what is waiting in the queue and what result came back to the backend.

sanitized SwimUpvote overview with profile, campaign and task metrics
SwimUpvote overview. Account data is blurred, while the operating metrics and structure remain visible.

The problem it solves

When you work with many Reddit accounts, the hard part is no longer clicking a button or sending an action. The hard part becomes coordination: which account is ready, which one needs warmup, which profile has an AdsPower environment, which one has a GeeLark environment, which task is scheduled, what failed and where the evidence lives.

SwimUpvote centralizes that operation. The panel covers profiles, campaigns, thread discovery, task queues, reports, logs, warmup, proxies, emails, RabbitMQ and administration tools. It is a control layer so the system does not depend on memory, spreadsheets or scattered scripts.

Real scale does not come from one worker

Managing 5000 Reddit accounts smoothly does not mean running 5000 things at the same time. It means having the architecture for 5000 identities to exist, be segmented, warmed up, scheduled, paused, audited and recovered without turning the operation into chaos.

The technical base of SwimUpvote separates the pieces that usually get mixed together too early:

  • backend and panel for profiles, campaigns, tasks and audit trails
  • RabbitMQ to decouple job creation from execution
  • AdsPower consumers for browser-based automation
  • GeeLark scheduler with Appium and ADB for mobile workflows
  • account or profile locks to prevent conflicting parallel execution
  • START, HEARTBEAT, END, ERROR and internal log reporting
  • retries and backoff for recoverable failures

That design lets the system grow through real capacity: more profiles, more slots, more workers, more queues and better scheduling rules. It is not magic. It is the separation of control, execution and observability.

sanitized SwimUpvote profile operations view
Profile operations. The screenshot shows inventory, states and environment links; import fields and sensitive data are hidden.

Two execution engines: browser and mobile

One part of the project works with browser profiles through AdsPower. That side handles flows such as account creation, email verification, 2FA enablement, warmup days, account info, comments, posts, upvotes, downvotes and reports.

The other side uses GeeLark, Appium and ADB to operate through mobile environments. The scheduler reserves slots, starts devices, connects ADB, opens an Appium session, runs the action and reports the result. Each slot works in isolation, and each account is locked while a job is active.

The benefit of this split is that the system does not force every workflow into one model. Some tasks fit better in a browser. Others make more sense on mobile. SwimUpvote can orchestrate both while keeping one operational view.

The queue is the operational core

The task queue is where you can tell whether a system is serious. Launching jobs is not enough: you need to know when they entered, what type they are, which account they use, which campaign created them, what state they are in, whether there is a screenshot, when they are scheduled and what action the operator can take.

sanitized SwimUpvote task queue
Task Queue. Rows are blurred because they contain accounts, content and links, but the control model is visible: state, screenshot, scheduling and actions.

Underneath, RabbitMQ decouples the panel from the workers. If there are more jobs than available capacity, they wait. If a profile is already busy, parallel execution for that identity is blocked. If an error is recoverable, it goes into retry with backoff. If it is not, the system marks it and reports it.

Discovery and campaigns without leaving the flow

SwimUpvote also includes a conversation discovery layer. The operator can search relevant threads, review signals and turn opportunities into tasks without leaving the workspace. That matters because it keeps the team from jumping between search tools, sheets and panels.

sanitized SwimUpvote thread discovery view
Thread Discovery. The platform surfaces opportunities and connects them to campaigns or reply tasks.

Why it can reach 5000 accounts

The big number is not carried by one function. It is carried by system discipline:

  • centralized inventory of accounts and states
  • clear separation between pending, created, ready and environment-linked profiles
  • explicit mapping between account, browser environment and mobile environment
  • workers that share no more state than necessary
  • queues that absorb spikes without taking down the panel
  • locks so one account does not receive incompatible jobs at the same time
  • logs and callbacks to reconstruct what happened
  • horizontal capacity through additional slots or workers where needed

With that foundation, 5000 accounts are not 5000 manual exceptions. They are 5000 records inside a measurable operation. That is the important jump.

What I am not showing in detail

Some parts should not be published precisely: real payloads, selectors, secrets, usernames, emails, task URLs, internal scoring rules or infrastructure configuration. The screenshots in this post are blurred for that reason.

The technical value worth showing is the architecture: separating panel, queue, workers, environments, locks, retries and reporting. That is the part that turns fragile automation into a maintainable platform.

Conclusion

SwimUpvote is an example of how I like to build automation systems: not as a collection of scripts, but as an operation with control, traceability and room to grow.

When the goal is to manage hundreds or thousands of accounts, the question is not only "can it execute the action?". The better question is: if something fails, do we know which account, which worker, which environment, which queue, which state and which decision caused it?

If the answer is yes, you no longer have only automation. You have operational infrastructure. That is where projects like SwimUpvote start to make real sense.