{"id":50113722,"url":"https://github.com/andreabak/kitboga-codejam26-soulskip","last_synced_at":"2026-05-23T13:36:42.338Z","repository":{"id":350033973,"uuid":"1200265004","full_name":"andreabak/kitboga-codejam26-soulskip","owner":"andreabak","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-10T12:41:54.000Z","size":53176,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-23T13:36:23.680Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":false,"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/andreabak.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":"2026-04-03T08:01:18.000Z","updated_at":"2026-04-10T12:41:59.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/andreabak/kitboga-codejam26-soulskip","commit_stats":null,"previous_names":["andreabak/kitboga-codejam26-soulskip"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/andreabak/kitboga-codejam26-soulskip","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreabak%2Fkitboga-codejam26-soulskip","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreabak%2Fkitboga-codejam26-soulskip/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreabak%2Fkitboga-codejam26-soulskip/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreabak%2Fkitboga-codejam26-soulskip/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andreabak","download_url":"https://codeload.github.com/andreabak/kitboga-codejam26-soulskip/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreabak%2Fkitboga-codejam26-soulskip/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33398390,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T04:15:53.637Z","status":"ssl_error","status_checked_at":"2026-05-23T04:15:53.242Z","response_time":53,"last_error":"SSL_read: 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":"2026-05-23T13:36:38.319Z","updated_at":"2026-05-23T13:36:42.327Z","avatar_url":"https://github.com/andreabak.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Kitboga Code Jam 2026\n\"Unskippable ad\"\n\nThis GitHub repository contains a template you should fork, modify to include your submission, and then submit to us. Please read all the information in this readme before getting started!\n**The deadline for submissions is Thursday, April 30th at 11:59 PM Eastern Time.**\n\n## Rules\n1. Read through the [Rules \u0026 Guidelines](https://kitboga.com/codejam26/rules)\n2. Follow the guidelines in `submission/submission.html` as to where and how your code should be written.\n3. No obfuscation. If we can't read or understand the code, we're probably not going to run it.\n4. No requests for resources outside of your repository, except for well-known javascript libraries from a CDN (jsdelivr, unpkg, googleapis, etc). Aside from these, include all the assets you need in your repository, such as fonts, icons and everything else. If you have a specific idea which requires access to the Internet, perhaps to fetch live stock market data for example, then try to fake it. If it's important to you to make external requests, talk to us about it in Discord.\n5. WebAssembly and Web Workers are not allowed.\n6. Do not include minified code; this includes code generated from build tools like Vite (see also [disabling minification](https://vite.dev/config/build-options#build-minify)) or WebPack. Prefer not using any build tools, if possible.\n7. Desktop browser functionality is required; mobile-friendly is preferred, but not required. Your submission will be displayed in an iframe that scales up and down while maintaining its aspect ratio — sides will not get cut off. You can rely on the iframe boundaries (e.g. `position: absolute; right: 0;` will always be the rightmost border of the video). Test for smooth functionality on desktop browser (especially Chrome/Edge) setups, and optionally also test for mobile-friendliness. (See also [device mode on Chrome](https://developer.chrome.com/docs/devtools/device-mode/), or [responsive design mode on Firefox](https://firefox-source-docs.mozilla.org/devtools-user/responsive_design_mode/).)\n\n\n## Discord\nPlease feel free to join the Kitboga discord, and hang out in the [#code-jam](https://discord.com/channels/331609590229893120/1377638134917103647) channel. That's a great place to ask for help, and it will be useful if we need to contact you about your submission for whatever reason.\nhttps://discord.com/kitboga\n\n## Getting Started\n1. Create a GitHub repository from the template: https://github.com/new?template_name=codejam26\u0026template_owner=The-Kitboga-Show\n2. Clone the new repository locally to your machine\n3. Open the \"game shell\" in your browser; this can be done in 2 ways:\n   - By opening `index.html` directly in your browser\n   - By running a local webserver (this can help with testing on different devices too). One easy way to do this, if you have python installed, is to run this command in the terminal: `python3 -m http.server 8000`. Then open [http://127.0.0.1:8000](http://127.0.0.1:8000) in your browser (the port may vary if you used a different method to start a web server).\n4. Create your game in `submission/submission.html`! All parts of your submission should be in the `submission/` folder.\n5. Commit and push your changes\n6. See the \"How to Submit\" section below\n\n## Forbidden APIs and functions\nPlease don't use any of the following:\n- navigator.geolocation\n- navigator.getUserMedia()\n- navigator.connection\n- navigator.clipboard\n- navigator.bluetooth\n- navigator.usb\n- navigator.serial\n- navigator.requestMIDIAccess\n- window.showOpenFilePicker()\n- window.showSaveFilePicker()\n- navigator.serviceWorker\n- window.open()\n- window.print()\n- navigator.permissions\n- navigator.credentials\n- RTCPeerConnection\n- fetch, XMLHttpRequest, WebSocket, etc.\n\n## Examples\nThe `examples/` folder contains several example submissions for inspiration:\n- **Buffering** (`examples/buffering/`) — Simulates frequent video buffering that pauses and resumes playback\n- **Fake X** (`examples/fake-x/`) — A fake close button that restarts the ad; the real skip link is somewhere else\n- **Slowdown** (`examples/slowdown/`) — A \"Skip in 3...2...1\" countdown where each second takes exponentially longer\n- **Survey** (`examples/survey/`) — A post-ad star rating survey that randomly rejects your answer\n\nUse the dropdown in the dev shell to load and test each example.\n\n\n## Prizes and Judging\nEntries will go through a series of progressive rounds of review/judging. They will first be shortlisted by a panel of Kitboga team members based on cleverness, technical skill, hookability, style and humor. See the [main webpage](https://kitboga.com/codejam26) for more clarity on these criteria.\n\nThe best submissions will go on to be showcased and reviewed on-stream by Kitboga \u0026 Twitch Chat via polling, and the best of those submissions will be tested with scammers.\n\nPrizes will include merch; Amazon Prime, Twitch \u0026 Kraken+ subscriptions; Discord emoticons and roles; and more!\n\n## How to submit\n**Remember, the deadline is Thursday, April 30th at 11:59 PM Eastern Time!**\nDon't forget to [read the license](https://kitboga.com/codejam26/terms), which you'll need to agree to in order to take part.\n\nGo here: https://kitboga.com/codejam26\n\n## (Optional) Live Demo\nAdd a publicly viewable demo for your submission by enabling GitHub Pages in your repository settings. Navigate to `Settings` \u003e `Pages`, then under `Branch`, select `main`, and then press `Save`. Once the site is built the URL will appear.\n\n## FAQ\n\n**We can use requestAnimationFrame, correct?**\nYes. Anything but the listed functions under \"Forbidden APIs and functions\" is allowed.\n\n**Are the ads in the same structure in the live demo? As in, located in ../ads and named something like ad_12.mp4**\nThat's just an example which you can use to test your code. You won't know the name or location of the actual videos, but you can get limited info using a `getVideoInfo` request.\n\n**Is the iframe always bound to the confines of the video? Can I rely on `position: absolute; right: 0;` always being the rightmost border of the video?**\nYes to both. We will force it to be one size, even if it is a bit on the small side for the container, so you have a consistent size to work from.\n\n**Will the actual video during the live demo be responsive? As in — will it change sizes, or just get the sides cut off, e.g. on mobile?**\nIt will scale up and down, maintaining the aspect ratio — sides will not get cut off.\n\n## Further help\nDrop into the Kitboga discord server, and check out the [#code-jam](https://discord.com/channels/331609590229893120/1377638134917103647) channel. Please don't ask questions via email, as we might not see them before the deadline.\n\n## API\n\nAll communication between your submission and the game shell uses `window.top.postMessage()`. Messages use the format `{ type: string, value?: any }`.\n\n### Sending events (submission -\u003e shell)\n\n| Message                                      | Description                                                                     |\n|----------------------------------------------|---------------------------------------------------------------------------------|\n| `{ type: 'success' }`                        | The ad was successfully dismissed. Shows a success banner and reloads the page. |\n| `{ type: 'fail' }`                           | The user failed the ad. Shows a fail banner and reloads the page.               |\n| `{ type: 'play' }`                           | Resume video playback.                                                          |\n| `{ type: 'pause' }`                          | Pause video playback.                                                           |\n| `{ type: 'seekTo', value: number }`          | Seek the video to a specific time (in seconds).                                 |\n| `{ type: 'setPlaybackRate', value: number }` | Set the video playback rate (e.g. `0.5` for half speed, `2` for double).        |\n| `{ type: 'setVolume', value: number }`       | Set the video volume (`0` to `1`).                                              |\n| `{ type: 'getVideoInfo' }`                   | Request current video state. The shell responds with a `videoInfo` event.       |\n| `{ type: 'setVideoFilter', value: string }`  | Apply a CSS filter to the video (e.g. `'blur(2px)'`, `'hue-rotate(90deg)'`).    |\n\nExample:\n```js\n// Dismiss the ad\nwindow.top.postMessage({ type: 'success' }, '*');\n\n// Slow down the video\nwindow.top.postMessage({ type: 'setPlaybackRate', value: 0.25 }, '*');\n\n// Apply visual effects to the video\nwindow.top.postMessage({ type: 'setVideoFilter', value: 'blur(2px)' }, '*');\nwindow.top.postMessage({ type: 'setVideoFilter', value: 'hue-rotate(90deg) saturate(1.5)' }, '*');\n\n// Clear video filter\nwindow.top.postMessage({ type: 'setVideoFilter', value: 'none' }, '*');\n\n// Request current video timing info\nwindow.top.postMessage({ type: 'getVideoInfo' }, '*');\n```\n\n### Receiving events (shell -\u003e submission)\n\nListen for events from the shell using `window.addEventListener('message', ...)`.\n\n| Message                  | Description                                                                      |\n|--------------------------|----------------------------------------------------------------------------------|\n| `{ type: 'adStarted' }`  | The ad has started. Sent when the video begins playing and the iframe is loaded. |\n| `{ type: 'adFinished' }` | The video has finished playing (reached the end).                                |\n| `{ type: 'timeupdate', currentTime, duration, paused, playbackRate }` | Sent periodically during playback with current video timing info. |\n| `{ type: 'videoInfo', currentTime, duration, paused, playbackRate, volume, muted }` | Response to a `getVideoInfo` request. |\n\nExample:\n```js\nwindow.addEventListener('message', (event) =\u003e {\n  if (!event.data || !event.data.type) return;\n\n  switch (event.data.type) {\n    case 'adStarted':\n      // The ad has started, show your overlay\n      break;\n    case 'adFinished':\n      // The video ended, e.g. show a survey or call fail\n      break;\n    case 'timeupdate':\n      // Called frequently during playback\n      const { currentTime, duration } = event.data;\n      const timeRemaining = duration - currentTime;\n\n      // Example: Do something 10 seconds before the video ends\n      if (timeRemaining \u003c= 10 \u0026\u0026 timeRemaining \u003e 9) {\n        console.log('10 seconds left!');\n      }\n      break;\n    case 'videoInfo':\n      // Response to getVideoInfo request\n      console.log('Video info:', event.data);\n      break;\n  }\n});\n\n// Request video info on demand\nwindow.top.postMessage({ type: 'getVideoInfo' }, '*');\n\n// Apply a CSS filter to the video\nwindow.top.postMessage({ type: 'setVideoFilter', value: 'hue-rotate(20deg)' }, '*');\n```\n\n### Default behavior\n\nThe submission template listens for `adFinished` and calls `fail` by default — if the user doesn't skip the ad before the video ends, it is marked as a fail. You can replace this with any other interaction (see `examples/survey`), but your submission must eventually call success or fail.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreabak%2Fkitboga-codejam26-soulskip","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandreabak%2Fkitboga-codejam26-soulskip","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreabak%2Fkitboga-codejam26-soulskip/lists"}