Practice perps trading on real assets. Experience simulated PNL & contests and become a top trader!
One of the hurdles for anyone who wants to enter the market like spot trading or perpetual futures is fear. Fear that arrouses due to volatility which mostly leads to loss of investment for beginners, preventing traders to continue in market.
Hence, we present our revolutionary paper trading platform: PaperFi (https://paperfi.trade/). With PaperFi, you don't just learn trading but also compete and contest with other traders while also get hired/sponsored by clients for real trading.
For learners, PaperFi delivers a beginner friendly responsive and dynamic user experience. Beginners can learn trading without the fear of losing funds. Hence, learners and can try out various strategies on real asset chart formations.
For traders that have some experience or want to compete, PaperFi will organize daily quests and weekly contests which will provide incentives in form of valuable assets motivating traders to complete. Winners for contests will be ones who gets highest Profit on same asset in a given time.
We will also provide hiring sections where big whales/companies can hire and sponsor the traders of our platform based on their profile. Hence PaperFi upskills and also provide opportunities to traders.
PaperFi is built with a modern, high-performance tech stack centered around React.js for a responsive and dynamic user experience. The frontend simulates a live trading terminal inspired by professional perp exchanges, integrating real-time market data visualization, order interactions, and analytical dashboards. We used TailwindCSS, ShadCN and Framer Motion to craft a sleek, dark-themed interface with smooth transitions. We are using supabase (best open source alternative to firebase) which allows us to easily manage users and implement easy onboarding process. We also use Cloudflare R2 for object storage (pfs) and Cloudflare Workers to host our frontend.
User can freely trade real market assets without the fear of loosing funds. Our frontend integrates a realtime PNL tracker (realized and unrealized) designed to work exactly like real trackers on CEXs/DEXs. We have a specialized analytics dashboard where user can see their daily PNL progress as they trade with animated heatmaps that reflect a trader’s performance over time. For charting and performance analytics, libraries like Recharts and Lightweight Charts were used to visualize simulated PnL, streaks, and win–loss ratios in an intuitive, data-rich way.
For the backend, we picked Rust since it is excellent for performance critical applications and it is easy to work with. We decided to write it in completely async rust since most of the work is IO bound. We have a Rocket-rs based webserver that proxies and adds filtering to Pythnet's UDF compatible ndjson price stream, we expose this as a SSE/EventSource stream, we use a mpmc queue from tokio for flexibility in managing the stream. Pyth made things easier, their docs were amazing. The backend is currently hosted on my homelab running a lxc container running portrainer which runs the docker container published through my private container registry from a self-hosted gitea instance. This makes it very easy for us to iterate quickly and deploy for testing (hacky but works). The backend does some basic optimizations like using atomics over mutex/rwlock, but we definitely have far to go.
Special thanks to PYTH, which is the powerhouse of this project. All the tradable assets listed and prices in charts and in database are sourced solely from PYTH. PYTH gives us flexibility to switch between L1 chains without rewriting the whole infrastructure.
While we were working with PYTH's UDF compatible datafeed endpoint (https://benchmarks.pyth.network/v1/shims/tradingview/symbol_info), We noticed the marks (Buy/sell chips on chart) were disabled from server side. But we needed to show markers; so we proxied the datafeed url using cloudfare workers and modified the response from https://benchmarks.pyth.network/v1/shims/tradingview/config. Then we implemented a custom marker function which fetches trades from database and render on chart. One of those hacky solutions we did to make things work perfectly.

