Overview
ANTE is a high-performance gambling platform. By using a dual-currency sweepstakes model, I developed a system where users can engage in casino-style gaming through a compliant promotional framework, separating social play from real-prize opportunities.
As the founder and lead developer, I was responsible for the end-to-end execution of the platform. This involved designing a high-throughput backend capable of managing real-time transactions, ensuring strict data integrity for user wallets, and creating a mobile-first interface that prioritizes speed and engagement.
Real-Time Multiplayer
To mimic the "live" feel of a physical casino, ANTE uses WebSockets to support real-time multi-user sessions with instant outcome broadcasting.
This approach significantly reduced server overhead and provided a 200ms+ improvement in perceived latency compared to traditional RESTful updates.
Dual-Currency Logic
I designed the Wallet table with distinct columns for Gold Coins (GC) and Sweeps Coins (SC). Implementing SQL CheckConstraints at the database level ensures balances can never drop below zero.
ANTE uses a toggle system for switching between Gold Coin social play and Sweeps Coin promotional play with backend validation.
Cosmetic Shop
Beyond just the games, ANTE has a marketplace for digital assets. I developed an inventory system to track and display user-owned cosmetics, integrated directly into the Vue.js frontend.
This allows users to customize the feel of their games, how they appear to other players, and earn special cosmetics after completing challenges.
Technical Deep Dive
Implementing the CurrencyMode table allowed me to manage user state globally across the platform. This enables a seamless transition between social play (GC) and promotional play (SC) while maintaining a server-side "source of truth" for which currency is active, preventing accidental bets in the wrong currency mode during high-speed gameplay.
class Wallet(Base):
__tablename__ = "wallets"
user_id = Column(String(36), ForeignKey("users.user_id", ondelete="CASCADE"), primary_key=True)
gc_balance = Column(DECIMAL(14, 2), default=0.00)
sc_unplayed = Column(DECIMAL(12, 2), default=0.00)
sc_redeemable = Column(DECIMAL(12, 2), default=0.00)
__table_args__ = (
CheckConstraint("gc_balance >= 0", name="chk_gc_positive"),
CheckConstraint("sc_unplayed >= 0", name="chk_sc_unplayed_positive"),
CheckConstraint("sc_redeemable >= 0", name="chk_sc_redeemable_positive"),
)