DEV Community

Danial Jumagaliyev
Danial Jumagaliyev

Posted on

Nobody was interested in my portfolio, so I made everyone play it instead.

Google AI Challenge Submission

This is a submission for the New Year, New You Portfolio Challenge Presented by Google AI

Controls Keyboard & Mouse
Move A/D or Left/Right keys
Jump Space key
Emoji Window Q key
Zoom In/Out Mouse Scroll

Alternatively available on my website: www.danqzq.games

๐ŸŽฎ Challenge: Can you find all the collectible cards scattered around the map? Drop a screenshot in the comments when you find them all!

Portfolio Collectible Demo

In the next 5 minutes, you'll see why I spent 3 years building my own networking stack just to make my portfolio weirder.


About Me

For the record, this is what my portfolio used to be:

Dan's old portfolio site

Working in a creative field, a boring scrollable page just didn't feel right anymore. I wanted a way to actually show what I can do, not just list it. So I took my rusty old portfolio site and turned it into an online multiplayer game world, where I can pretty much do ANYTHING I want.

I'm a game developer who believes that technology should be engaging, interactive, and boundary-pushing. This portfolio represents years of experimenting, failing, and building, from simple backends to complex multiplayer systems.

The Portfolio in Question

The embedded application above is a fully functional cross-platform multiplayer game that serves as my interactive portfolio. Instead of scrolling through a conventional website, visitors can explore my work through gameplay while seeing live updates of my:

  • Latest YouTube videos
  • GitHub activity and contributions
  • Indie game projects
  • Open-source projects
  • Random "Dan Facts of the Day"

Collectible Card Demo

There are also collectible cards placed around the map, each revealing pictures and information about me and my career.


Portfolio Call Button

And there's even a special button that literally lets you call me into the world if I'm available - the kind of stuff you can't really do with a traditional portfolio.


How I Built It

The Stack

  • Game Engine (client-side): Unity 6 (WebGL build with mobile support)
  • Networking: Dan.Net - My custom Go + WebSockets networking stack
  • Deployment: Google Cloud Run (2GB memory, 2 CPUs)
  • AI Assistant: Google Antigravity for workflow optimization
  • APIs: YouTube Data API, GitHub API
  • Server: Custom Node.js HTTP server with gzip handling

Why I Built My Own Networking Stack

Here's the thing: I didn't use some off-the-shelf multiplayer solution. Everything from the core gameplay logic and statistics displays down to the networking layer was built by me. Yes, including the entire networking stack: Dan.Net.

FUN FACT: I drew quite a good amount of art assets as well, using Aseprite. All apart from some random PNGs for the skins and the tile-set art. The music is the Toyota Corolla 2008 theme. Please do not question the choice of music ;)

This portfolio is actually the culmination of a 4 year journey into multiplayer systems:

2021: I started with Photon Engine, made some games, but felt like I was just calling functions without understanding what was happening under the hood.

2022: I went down the rabbit hole. I experimented with Python/Flask, built my Leaderboard Creator tool (now one of the highest-rated on itch.io), tried PHP, moved to Node.js and WebSockets. By late 2022, the idea for Dan.Net was born.

2023: The grind. I remember spending three straight days debugging a multithreading race condition. Just me, the debugger, and this cursed bug. When it finally worked, those three days became some of the most rewarding of my life.

2025: Finally, I pushed Dan.Net to a stable, production-ready state. Ready to power real projects.

How the Multiplayer Actually Works

Multiplayer Demo

All players connect to a central server hosted in the cloud. Here's the simplified flow:

Room System: Players are able to create or join rooms using a room name. You can think of rooms as "player pools" or "matches" in a game, where players are able to gather together.

Event-based Networking: When something important happens (player joins, picks up a card, changes their skin), that player sends a "buffered event" to the server. When the player reacts with an emoji, that's sending a "direct event". The server then broadcasts it to everyone else who needs to know about it (the other players in the room).

Stream-based Networking: Every few milliseconds, each player sends their current position to the server. The server aggregates all positions and sends back updates about where everyone else is on the map.

Under the hood, there's interpolation, latency compensation, bandwidth optimization - all that fun stuff :)

But at its core, it's about keeping everyone's view of the world in sync.

Deploying to Google Cloud Run (The Hard Part)

Unity's WebGL builds use gzip compression, which sounds great until you try to deploy them. The challenge: browsers need specific HTTP headers to decompress these files correctly, and Cloud Run doesn't set them by default.

The Solution: I built a custom Node.js HTTP server that:

  • Detects .gz files and sets Content-Encoding: gzip headers
  • Maintains correct MIME types for WebAssembly, JavaScript, and data files
  • Handles CORS properly for cross-origin requests
  • Serves the 36MB build efficiently with proper caching

This was one of those problems where Google Antigravity saved my time by a lot, helping me debug header configurations and optimize the server setup.

Where Google Antigravity Helped Me Most

I used Google Antigravity throughout development, particularly for:

Dan.Net Improvements: Refining how the Unity client communicates with my Go backend, especially around WebSocket connection handling and state synchronization.

Cloud Run Debugging: Troubleshooting why my Unity build wasn't loading correctly (it was the headers). Antigravity helped me understand the relationship between Unity's compression, HTTP headers, and browser requirements.

API Integration: Implementing the YouTube and GitHub APIs securely without exposing keys or creating vulnerabilities. The dynamic boards that show my latest videos and contributions wouldn't work without proper API setup.

YouTube API Integration


What I'm Most Proud Of

1. Building Dan.Net from Scratch

Creating my own Go-based networking solution and successfully integrating it with Unity for cross-platform multiplayer. This demonstrates full-stack capabilities spanning from low-level networking protocols to high-level game development in my journey. Check out Dan.Net to see the implementation.

2. Breaking the Portfolio Mold

This isn't just about showing what I've done - it's about showing what I can do. A true portfolio shouldn't be a static page; it should be an experience that reflects your skills and personality. When I said I can do ANYTHING I want here, I meant it.

3. Real-Time, Living Portfolio

The dynamic boards update automatically based on my activity - my latest YouTube videos and recent GitHub activity, so the world always feels alive and current. The "Dan Fact of the Day" changes daily. This means visitors always see fresh content without me manually updating anything.

4. Cross-Platform Multiplayer Experience

Thanks to Unity 6's improved web support, the game works seamlessly on desktop, mobile, and web browsers. The entire experience is powered by Dan.Net, demonstrating not just front-end skills but also understanding of networking protocols, state management, distributed systems, and backend architecture.

5. Interactive Features You Can't Do Elsewhere

  • You can hit a button that calls me into the world. I'll join if I'm available. ;)
  • Or the collectible cards that reveal information as you explore.

These are the kinds of creative features that make this portfolio memorable and engaging.

GitHub API Integration


The Philosophy Behind It

If there's one piece of advice I'd give to anyone, whether you're in a creative line of work or deeply technical, it would be: share your work, and document your journey. Be proud of what you've built and what you're still building. Don't hesitate to put yourself out there.

Here's the thing: we learn by watching each other. When you share your work, the messy parts included - you're giving someone else permission to try. Your story might be exactly what someone needs to take their own first step. Sometimes seeing one person figure it out is enough to make us think "I could do that too."

Nothing you learn ever really goes to waste. It just shows up in the next crazy idea. To me my portfolio is: years of experiments, failed projects, and learning moments all coming together into something I'm genuinely proud of.


Try it out and let me know what you think in the comments! And if you're interested in game development, networking systems, open-source development, or just want to hang out - feel free to reach out to me via my Discord server โ€” I'd love to connect!

Do you want to see more behind-the-scenes content, weird prototypes, and devlogs about this portfolio world evolving over time? Check out my YouTube channel and GitHub!

Top comments (1)

Collapse
 
elshadhu profile image
ElshadHu

That is really impressive. I played and saw you that you were there ๐Ÿ˜. Keep going!๐Ÿ™Œ