by vkorost
A laser dry-fire shooting game: your matte monitor is the target, an ordinary webcam watches it from the side, and your laser trainer leaves bullet holes where you hit.
# Add to your Claude Code skills
git clone https://github.com/vkorost/screenplinkGuides for using mcp servers skills like screenplink.
See how screenplink compares with popular alternatives.
screenplink is an open-source mcp servers skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by vkorost. A laser dry-fire shooting game: your matte monitor is the target, an ordinary webcam watches it from the side, and your laser trainer leaves bullet holes where you hit. It has 51 GitHub stars.
screenplink's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/vkorost/screenplink" and add it to your Claude Code skills directory (see the Installation section above).
screenplink is primarily written in Python. It is open-source under vkorost on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other MCP Servers skills you can browse and compare side by side. Open the MCP Servers category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh screenplink against similar tools.
No comments yet. Be the first to share your thoughts!
Top skills in this category by stars
Available after the catalog security scan passes.
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
This is a laser shooting game. Your monitor is the target.
You shoot your own monitor with either a laser training pistol or with your own gun & laser bullet. A webcam watches the monitor (instead of watching you), the app figures out which pixel you hit, punches a bullet hole there and plays the shot. Targets fall, scores count, the gun's magazine runs dry.
Full source code included with the build. Free, offline, no account, no ads. Version 1.0 works on Windows only. Feel free to clone and make it work for Mac if you feel like it.
It is an ideal addition to a man cave, and it works anywhere you have the hardware and can control the lighting: a games room, a basement, a bar. The lighting is the real constraint rather than the space. You are not asked to sit in the dark, but a room you can dim is a room this works better in.
📖 The User Guide describes the gameplay exactly: every drill and how it is scored, the magazine, two players, and every key.
In Q4 2026 I went looking for a free game that would let me shoot moving targets on my own computer monitor with my laser trainer pistols. I did not find anything quite like that.
So I [read up on the dry-fire laser landscape][book], and worked out that it ought to be possible, provided the monitor is matte and the camera does at least 60 frames per second. Then I built the game I wanted, to my own taste and my own requirements.
I am sharing it in case a few other people find it useful.
| A matte monitor | Anti-glare, not glossy, not a TV. This one is not negotiable. See the physics below |
| A webcam | Anything that does 60 fps. It goes beside the monitor, angled at it, not downrange |
| A laser trainer | Any visible red (650 nm) cartridge or trainer pistol. Two work at once |
All of this was built and measured against exactly one rig: a Dell U4320Q (42.5″ 4K, matte) watched by a Razer Kiyo Pro, shot with two LaserLyte LT-TTL trainers. Nothing is hard-coded to any of it, and the app measures your camera and your room rather than assuming mine. But one monitor and one webcam is one monitor and one webcam. Your camera may report its exposure differently, your panel may scatter the dot differently, and you may meet something I never did.
That is what TROUBLESHOOTING.md is for. It is written from the faults this hardware actually produced, and it lists the numbers a healthy setup gives, so you can tell how far yours is from working. If you hit something that is not in it, open an issue: numbers from a second rig are worth more to this project than any feature.
Download the latest release, unzip it anywhere, and run
Play.cmd. That is the whole installation: no Python, no dependencies, no
installer. Windows only for now.
Run Doctor.cmd first if you want to know which of your cameras is fit for
this before you start. It tests every one it finds and writes
doctor-report.txt beside itself.
Or do not set it up at all: ask Claude Code to. Unzip the release, open the
folder with Claude Code, and ask it to set up
the app. The release ships a CLAUDE.md written for exactly that job, and an
.mcp.json so the session finds the app's own tools by itself. Nothing to
configure first. It runs the camera doctor, picks the camera that is actually
pointed at your monitor (by what each one measures, not by its name), starts the
app, reads what the app measured about your room, and tells you when to shoot or
which one physical thing is in the way.
This is how the author sets it up now. See Asking the app what it sees.
If you would rather run from source, or you are on a machine where you build your own things:
python -m venv app\.venv
app\.venv\Scripts\python.exe -m pip install -r app\requirements.txt
app\scripts\Play.cmd
Close the game with Escape. Never End Task because a force-killed app can leave the webcam needing a replug.
Your trainer fires about 100 ms of red light per trigger pull. At 60 frames per second the camera gets six looks at it, which is what makes an ordinary webcam enough: six frames is a shot, one frame is noise.
The detector does not hunt for bright. It hunts for red, meaning red minus the stronger of green and blue. That is why the whole game is grey and dim. Anything red on that screen is something the camera could mistake for your laser, and anything bright underneath the dot drowns it.
The reason the panel must be matte is the same sort of thing. A matte coating scatters the dot, so a camera off to one side can see it. Glossy glass reflects it away instead, in a direction that changes with every shot, so no camera placement can follow.
The whole thing was written by Claude Code over about two weeks. I directed it, shot at it, and decided what was acceptable, but I did not write the implementation.
Built with Claude Code is the index to how that worked: giving an agent an instrument instead of a log, making tests that can actually fail, and gating the word "ready". It links everything else worth reading.
The file underneath it is Lessons learned: twenty findings, each with the measurement that caused it.
I am putting it in front of you because almost none of it is about lasers. It is about the things that go wrong when a program has to measure the physical world and then decide something on the strength of it:
If you are writing anything with a camera, a real-time loop, or a program that has to diagnose its own hardware and explain itself to a human, I think you will recognise several of these, and some of them are cheaper to read about than to find. There is nothing personal in that file and nothing specific to my setup.
| 📖 User Guide | Thirteen chapters: the screen it needs, setup, the nine drills, the magazine, the score, two players and every key. PDF and EPUB included |
| 🔧 Troubleshooting | When the app does not work. Start at the top: the most common fault is not in this app at all |
| 🗺️ Project layout | Every folder, for anyone changing the code |
| 🤖 Built with Claude Code | How an agent developed and debugged a program that measures the physical world, when it cannot see the monitor or pull the trigger. The index to everything below |
| 🧭 Lessons learned | Twenty things this project got wrong and what each one cost. Mostly not about lasers: measuring the wrong quantity, checks that could not fail, a cleanup that only worked by accident, a note that stopped being true |
| 🤖 Asking the app what it sees | The app answers questions about itself while it runs, over MCP or plain HTTP: what the detector |