{"id":27013402,"url":"https://github.com/villevli/villevli.github.io","last_synced_at":"2026-02-15T20:04:31.151Z","repository":{"id":280347053,"uuid":"940199372","full_name":"villevli/villevli.github.io","owner":"villevli","description":null,"archived":false,"fork":false,"pushed_at":"2026-01-11T17:18:18.000Z","size":4193,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-11T20:20:06.270Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://villevli.github.io/","language":"SCSS","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/villevli.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-27T19:19:25.000Z","updated_at":"2026-01-11T17:18:22.000Z","dependencies_parsed_at":null,"dependency_job_id":"5b6fbc69-228b-4fbc-b6eb-e734107d6fa6","html_url":"https://github.com/villevli/villevli.github.io","commit_stats":null,"previous_names":["villevli/villevli.github.io"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/villevli/villevli.github.io","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/villevli%2Fvillevli.github.io","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/villevli%2Fvillevli.github.io/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/villevli%2Fvillevli.github.io/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/villevli%2Fvillevli.github.io/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/villevli","download_url":"https://codeload.github.com/villevli/villevli.github.io/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/villevli%2Fvillevli.github.io/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29487794,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T19:29:10.908Z","status":"ssl_error","status_checked_at":"2026-02-15T19:29:10.419Z","response_time":118,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-04-04T12:29:27.168Z","updated_at":"2026-02-15T20:04:31.145Z","avatar_url":"https://github.com/villevli.png","language":"SCSS","funding_links":[],"categories":[],"sub_categories":[],"readme":"Hello, I'm Ville Lindblad. I'm an experienced programmer capable of solving problems and building games or apps.\nI have several years of professional experience using the **Unity** engine and **C#**.\nOther tech I have experience with includes **Git**, **Python**, **Bash**, **Java**, **C++**, **JavaScript**, **HTML** and **CSS**.\nI'll learn new technologies when needed.\n\nSome things I have worked on:\n- [Dibs](#dibs-️) - Location based live-service game with multiplayer features\n- [Glass Art](#glass-art-) - Hyper casual art game\n- [Taxi Dash](#taxi-dash-) - Infinite runner\n- [Cubes](#cubes-️) - Procedural terrain generation and voxels\n- [Lockstep networking proto](#lockstep-networking-proto-) - Tech that enables large scale networked games\n- [Defender proto](#defender-proto-) - Prototype of the classic arcade game Defender\n- [Physics2D JS](#physics2d-js-) - 2d physics simulation in JavaScript\n- [Soludus](#soludus-️) - VR game teaching about the use of renewable energy\n- Scroll down for more!\n\nI strive for code that is easy to understand and maintainable and I like building well organized projects.\nI help others to solve issues, avoid blockers and improve workflows.\n\nMy professional experience is in mobile games but I have interest in developing also for PC, VR or console.\nI can also see myself working as a backend or fullstack engineer in the future.\n\n- [My work history in LinkedIn](https://www.linkedin.com/in/ville-lindblad/)\n- [My projects in GitHub](https://github.com/villevli)\n\n# Projects\n\n## Dibs 🗺️\nPlaystack - iOS / Android\n\n\u003ca href=\"img/dibs.png\"\u003e\u003cimg src=\"img/dibs.png\" width=\"35%\" style=\"float:right; padding-left:20px\"\u003e\u003c/a\u003e\n\nGamified engagement with brands in a location-based live-service game. Includes multiplayer and AR features.\n\n- Worked as a Unity developer and C# programmer\n- Collaborated in an agile team. Wrote documentation, onboarding guides and tech design (Git, Jira, Confluence)\n- Mentored juniors and conducted code reviews\n- Character movement on a tile based world map (Mapbox SDK) based on GPS location\n- Character customization (import tools for artists, assetbundles, scriptable objects)\n- CI/CD pipeline in GitLab to test, build and upload the app to App Store and Google Play (yaml, git, bash, python, xcode, assetbundles, aws cli, self hosted runners)\n- Publishing (comply with technical Google Play and App Store requirements)\n- Localization system (Google Sheets, CSV)\n- Helped design our GraphQL backend api and some MongoDB models\n- Social login (Firebase auth, Google, Apple, email/password)\n- Seasonal events (remote configuration, assetbundles, scriptable objects)\n- Gifting (UI, client side logic, api and db model design)\n- Utility code (web request pipeline, UI navigation stack, image downloader/cache, global event system, etc.)\n- Runtime tools (Debug menu, console, inspector)\n- Editor tools and workflow optimization (editor scripts, scene/user/server selector, etc.)\n- Testing (unit tests, mockup backend for UI testing)\n- Optimization (profiling, memory usage, build size, eliminating GC allocations, overdraw, draw calls)\n- SDK integrations (Firebase Auth, Crashlytics, Analytics, Google sign in, Sign in with Apple, OneSignal, Branch.io)\n- Analytics events (designed and implemented client events)\n- Prototyped AR minigames (Vuforia, later AR Foundation)\n\n[View details about Dibs](projects/dibs.md)\n\n\u003cbr style=\"clear:both\"\u003e\n\n\n## Glass Art 🎨\nPlaystack - iOS / Android\n\n\u003ca href=\"img/glassart-cut.png\"\u003e\u003cimg src=\"img/glassart-cut.png\" width=\"35%\" style=\"float:right; padding-left:20px\"\u003e\u003c/a\u003e\n\nArtful hyper casual game where you can build stained glass artworks by cutting and combining pieces.\n\n- I worked as a Unity developer and C# programmer\n- Algorithm for cutting a 2d mesh / polygon by drawing a line and generating the mesh from the list of edge points\n- Firebase Storage and Dynamic Links to share the artworks you create\n- Optimized sprites and guided the artist\n\n\u003cbr style=\"clear:both\"\u003e\n\n\n## Taxi Dash 🚖\nPlaystack - iOS / Android\n\n\u003ca href=\"img/taxi-dash.png\"\u003e\u003cimg src=\"img/taxi-dash.png\" width=\"35%\" style=\"float:right; padding-left:20px\"\u003e\u003c/a\u003e\n\nInfinite runner where you drive a taxi, pick up and drop off passengers and plow through obstacles.\n\n- I worked as a Unity developer and C# programmer\n- Floating origin (camera stays still, world moves) to enable infinite run without floating point issues\n- \"Air resistance\" custom physics logic to make physics look correct\n- Online leaderboard using Firebase Realtime Database\n\n\u003cbr style=\"clear:both\"\u003e\n\n\n## Cubes ⛰️\nPersonal project - PC / Android\n\n\u003ca href=\"img/cubes-cave.png\"\u003e\u003cimg src=\"img/cubes-cave.png\" width=\"45%\" style=\"float:right; padding-left:20px\"\u003e\u003c/a\u003e\n\nCube based procedural world in Unity. Inspired by Minecraft.\n\nSource code: [villevli/cubes-unity](https://github.com/villevli/cubes-unity)\n\n- Procedural terrain made from blocks. Includes noise caves under ground\n- Generated in 16x16x16 chunks\n- Hidden surfaces are culled to make rendering very fast even with larger view distances\n- Using the burst compiler for all heavy calculations to make it many times faster\n- Using background threads to make traversal in the world smooth even when loading or generating chunks\n- Procedural generation with perlin noises is done in a GPU compute shader. 4096 chunks (16.7 million blocks) generates in under 20 milliseconds on RTX 3070\n- Raycasting to find block surfaces\n- Break and place blocks\n\n\u003cbr style=\"clear:both\"\u003e\n\n\n## Lockstep networking proto 🌐\nPersonal project - PC / Unity\n\nImplementation of the lockstep networking protocol that allows syncing large scale game simulations over the network.\nIdeal for RTS games.\n\n- Relies on determinism so that only player inputs need to be sent over the network\n- Commands are buffered and simulation is advanced when commands from all players have arrived for the current tick\n- Uses Unity with the ECS framework (Unity Entities) and Burst\n- UDP messages over the network are sent using the low level Unity Transport library\n- In this project I learned ECS systems and some low level networking concepts\n\n\n## A-star pathfinding in a grid 🌟\nPersonal project - PC / Unity\n\nImplementation of the a-star pathfinding algorithm in a grid.\n\n- Using Unity Entities, Job system and Burst to enable high performance\n- Priority Queue implemented using binary heap and native collections\n- Import test maps from images\n- Reading about possible optimizations like Jump Point Search\n- Reading about alternate solutions like Flow Field pathfinding\n\n\n## Procedural planet shader 🌍\nPersonal project - Unity\n\n\u003ca href=\"img/procedural-planet.png\"\u003e\u003cimg src=\"img/procedural-planet.png\" width=\"45%\" style=\"float:right; padding-left:20px\"\u003e\u003c/a\u003e\n\n- Shader graph\n- 3d fractal perlin noise\n- Adapted from a tutorial video for Blender\n\n\u003cbr style=\"clear:both\"\u003e\n\n\n## Defender proto 👾\nPersonal project - PC / Android\n\nPrototype of the classic arcade game Defender in Unity.\n\nSource code: [villevli/vl-defender-arcade](https://github.com/villevli/vl-defender-arcade)\n\n- Seamlessly looping game area\n- Parallax background\n- Minimap\n- Keyboard, mouse, gamepad and touch controls using the new Input System\n\n\n## Physics2D JS 🏀\nPersonal project. Started from a game physics course at Metropolia University of Applied Sciences\n\n2d physics simulation in JavaScript.\n\nTry it here: [Physics2D](https://villevli.github.io/physics2d-js/)\n\nSource code: [villevli/physics2d-js](https://github.com/villevli/physics2d-js)\n\n- Physics simulation that calculates collisions and forces between polygons\n- Uses no libraries, only the canvas api and JavaScript in browsers\n\n\n## UnityExtensions\nPersonal project - Unity Library\n\nCollection of small extensions, utils and property attributes for Unity.\n\nSource code: [villevli/UnityExtensions](https://github.com/villevli/UnityExtensions)\n\n- SingleLineAttribute - Draw a serialized field on a single line even if it's a struct with multiple fields\n- EnumDropdownAttribute - Draw a string or int field as an enum dropdown\n- CSVParser - A simple utility to parse a csv file\n- SDateTime - A DateTime value that can be serialized in Unity and displayed in inspector\n- STimeSpan - A TimeSpan value that can be serialized in Unity and displayed in inspector\n- SDictionary - Dictionary that can be serialized in Unity and displayed in inspector.\n- EventSystemCallbacks - Global callbacks just before any EventSystem event is executed\n- SavedPrefs - PlayerPrefs but supports more types like bool, long, enum and DateTime.\n\n\n## UnityEditorExtensions\nPersonal project - Unity Library\n\nCollection of small extensions, tools and tweaks for the Unity editor.\n\nSource code: [villevli/UnityEditorExtensions](https://github.com/villevli/UnityEditorExtensions)\n\n- DefaultAssetInspector - Shows the content of unsupported files in the inspector\n- GameViewObjectPicker - Left click to select the object that is visible under the cursor in game view.\n- GameViewScreenshot - Quickly take screenshots with F12 from the Game View or the Simulator View.\n- DockAreaDragAndDrop - Quickly open a tab for assets or objects that are dragged and dropped into the dock area.\n\n\n## Mirror for firebase packages in Unity\nPersonal project - Unity Library. Need for this arised when working on Dibs at Playstack\n\n[google-unity-packages-mirror · GitLab](https://gitlab.com/google-unity-packages-mirror)\n\n- Built to avoid having to commit the large firebase core package into a project and instead download it from a git repository via the Unity package manager\n- Runs a scheduled CI/CD pipeline every night to download the .tgz unity packages published by google and pushes them to gitlab giving each version a tag so it can be used via the Unity package manager\n\n\n## Soludus ☀️\nMetropolia Game Studio - SteamVR\n\n\u003ca href=\"img/soludus-vr.png\"\u003e\u003cimg src=\"img/soludus-vr.png\" width=\"45%\" style=\"float:right; padding-left:20px\"\u003e\u003c/a\u003e\n\nVirtual reality game teaching about the use of renewable energy.\n\nSource code: [Soludus/Soludus2Enercity](https://github.com/Soludus/Soludus2Enercity)\n\n- I worked as the sole programmer in Unity\n- VR game controls using the SteamVR plugin\n- Drag to move around game map using controls similar to Google Earth VR\n- Day night cycle that continually adjusts light settings using curves and gradients. I designed this to fit the needs of our artist\n- Integrated dynamically changing FMOD sounds from our sounds guy into the game logic\n\n\u003cbr style=\"clear:both\"\u003e\n\n\n## Capitalistica 💰\nMetropolia Game Studio - Android\n\n\u003ca href=\"img/capitalistica.png\"\u003e\u003cimg src=\"img/capitalistica.png\" width=\"35%\" style=\"float:right; padding-left:20px\"\u003e\u003c/a\u003e\n\nMobile game teaching maths and financial management.\n\n- I worked as a Unity developer and C# programmer\n\n\u003cbr style=\"clear:both\"\u003e\n\n\n## Siimes 🌳\nMetropolia Game Studio - WebGL\n\n\u003ca href=\"img/siimes.png\"\u003e\u003cimg src=\"img/siimes.png\" width=\"35%\" style=\"float:right; padding-left:20px\"\u003e\u003c/a\u003e\n\nSocial game for use in elementary schools. Works in browsers using WebGL.\n\n- I worked as a Unity developer and C# programmer\n\n\u003cbr style=\"clear:both\"\u003e\n\n\n## Procedural voxel terrain ⛰️\nMy Bachelor's thesis at Metropolia University of Applied Sciences\n\nThesis (finnish): [Vokselimaaston käsittely ja renderointi](https://www.theseus.fi/handle/10024/349339)\n\n- A tech demo with procedural generation of terrain and chunk based meshing to create an \"infinite\" world\n- Multiple layers of perlin noise to create a signed distance field resembling mountains\n- Marching cubes for generating a mesh from the signed distance field\n- Multithreaded chunk loading and generation\n- Realtime terrain modification using boolean operations on the distance field\n\n\u003cbr\u003e\n\u003ca href=\"img/voxel-terrain2.png\"\u003e\u003cimg src=\"img/voxel-terrain2.png\" style=\"max-height:300px\" \u003e\u003c/a\u003e\n\n\n## Arkanoid 2016 🎮\nPersonal project at Metropolia University of Applied Sciences - PC / Android\n\nA clone of the retro game Breakout/Arkanoid in the Unity game engine.\n\n- Includes a level editor and leaderboard\n\n\n## Nox Daemonica 🕸️\nTeam project at Metropolia University of Applied Sciences - PC\n\n- A small 1-4 player LAN co-op action RPG dungeon\n- Implemented using the Photon Unity Networking library\n\n\n## Fleet Commander 🚀\nTeam project at Metropolia University of Applied Sciences - PC\n\n\u003ca href=\"img/fleetcommander.png\"\u003e\u003cimg src=\"img/fleetcommander.png\" width=\"45%\" style=\"float:right; padding-left:20px\"\u003e\u003c/a\u003e\n\n- A space battle simulator where you build your fleet and watch a simulated battle in 3d space\n- Ships have \"AI\" steering and attack routines\n\n\u003cbr style=\"clear:both\"\u003e\n\n\n## Space Incident 🌌\nTeam project at Metropolia University of Applied Sciences - PC\n\n\u003ca href=\"img/spaceincident-procedural-corridors.png\"\u003e\u003cimg src=\"img/spaceincident-procedural-corridors.png\" width=\"45%\" style=\"float:right; padding-left:20px\"\u003e\u003c/a\u003e\n\n- A point and click graphic adventure game where you solve a mystery in a space station\n- Includes procedurally generated corridors\n\n\u003cbr style=\"clear:both\"\u003e\n\n\n## Chess AI in C++ ♟️\nPair project at Metropolia University of Applied Sciences\n\n- Pair programming for an AI chess competition\n- Alpha-beta algorithm\n- Optimizations like storing the 8x8 chessboard states in 64 bit integer bitmasks\n- Our program won the competition 🏆\n\n\n## Intro to OpenGL API in C++ 🐇\nGraphics programming course at Metropolia University of Applied Sciences\n\n- Drawing a mesh with a texture and shader using the OpenGL API\n\n\n## Embedded ventilation fan controller in C++ 🔌\nPair project at Metropolia University of Applied Sciences\n\n- Control the speed of a ventilation fan\n- Fan is connected to an ABB frequency converter\n- Converter is controlled using Modbus protocol\n- Two operating modes: Manual and Automatic\n- LCD user interface\n- Arduino, LPCXpresso, UART, I2C\n\n\n## Procedural voxel terrain with LOD ⛰️\nPersonal project\n\n- 3d fractal noise\n- Marching cubes meshing\n- Chunk loading to create \"infinite\" world\n- Octree loading for level of detail based on distance to camera\n\n\n## Post Effect Mask\nPersonal project I started when a question at Unity Forums got my interest\n\n[Applying image effects to specific objects - Unity discussions](https://discussions.unity.com/t/applying-image-effects-to-specific-objects/666124/12)\n\n- Mask any camera post effects. Use e.g. to apply a post effect only to defined objects\n- Draws an alpha mask and uses alpha blending to blend the processed image on top of the unprocessed image\n\n\n## Portal mechanics\nPersonal project\n\n- Created a seamless portal between any 2 points in the 3d world (like in the game Portal)\n- Used cameras, shaders, render texture and stencil buffer\n- Teleports any objects passing through and keeping the relative orientation and velocity\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvillevli%2Fvillevli.github.io","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvillevli%2Fvillevli.github.io","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvillevli%2Fvillevli.github.io/lists"}