{"id":18997701,"url":"https://github.com/s0/s0","last_synced_at":"2026-04-17T17:30:19.245Z","repository":{"id":41593326,"uuid":"197977862","full_name":"s0/s0","owner":"s0","description":"Personal website and profile bio","archived":false,"fork":false,"pushed_at":"2024-06-23T18:43:28.000Z","size":1666,"stargazers_count":0,"open_issues_count":16,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-16T06:37:11.243Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://sam.lanni.ng","language":"TypeScript","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/s0.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}},"created_at":"2019-07-20T20:25:28.000Z","updated_at":"2024-06-23T18:43:31.000Z","dependencies_parsed_at":"2024-06-23T16:44:52.258Z","dependency_job_id":"4c64045b-a187-478d-b96d-560638d89cc4","html_url":"https://github.com/s0/s0","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s0%2Fs0","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s0%2Fs0/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s0%2Fs0/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s0%2Fs0/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/s0","download_url":"https://codeload.github.com/s0/s0/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240018681,"owners_count":19734872,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":"2024-11-08T17:42:12.860Z","updated_at":"2026-04-17T17:30:19.209Z","avatar_url":"https://github.com/s0.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![](https://github.com/s0/s0/raw/main/header.svg)\n\n## Find me on...\n\n* [NPM](https://www.npmjs.com/~s0)\n* [Twitter](https://twitter.com/samlanning)\n* [LinkedIn](https://www.linkedin.com/in/smlanning/)\n\n## Previous endeavours\n\n* [Synesthesia Project](https://synesthesia-project.org/) -\n  An open source lighting \u0026amp; sound project\n* [Reach4Help](https://reach4help.org/) -\n  A global volunteer-run initiative bridging the gap between people in need and\n  volunteers who can help through the COVID-19 pandemic and beyond.\n* [Queerious Labs](https://queeriouslabs.com/) -\n  A queer, anarchafeminist art+tech community workshop.\n\n## Educational Content\n\n* [Resources for teaching Coding \u0026 Computer Science](https://s0.github.io/teaching-resources/)\n\n## Public speaking\n\n* Jan 2023 - Refresh - [Why Use TypeScript and How to Migrate Your Large Projects (Video)](https://www.youtube.com/watch?v=pGKVVFnnaC0)\n* No More Whack-a-Mole: How to Find and Prevent Entire Classes of Security\n  Vulnerabilities:\n  * [Nov 2019 - BLACK ALPS (Video)](https://www.youtube.com/watch?v=7pXvZsMRVig)\n  * [Sep 2019 - OWASP Global AppSec Amsterdam (Video)](https://www.youtube.com/watch?v=1wbt1xM9jUc)\n  * [Sep 2019 - BalCCon2k19 (Video)](https://www.youtube.com/watch?v=HMXa26xJE9Q)\n  * [May 2019 - RVAsec (Video)](https://www.youtube.com/watch?v=IY7fL7Tkxxc)\n* Jul 2019 - OSCON - [Writing npm (JavaScript) libraries using TypeScript (Video)](https://www.youtube.com/watch?v=m6Jr6w0W1xw)\n* Jul 2019 - OSCON - [How TypeScript is transforming the JavaScript ecosystem (Video)](https://www.youtube.com/watch?v=b8AHUXxGas8)\n* Oct 2018 - Oracle Code One - [How to Avoid 0-Days Due to Unsafe Deserialization [DEV5219] (Joint talk with Oege de Moor \u0026amp; Bas van Schaik)](https://oracle.rainfocus.com/widget/oracle/oow18/catalogcodeone18?search=DEV5219)\n* Oct 2018 - GitHub Universe Demo Desk - [Finding and preventing bugs with LGTM (Video)](https://www.youtube.com/watch?v=aXqUWZYlFzs)\n* Jan 2017 - Noisebridge 5MOF - [Lights \u0026amp; Music (Video)](https://www.youtube.com/watch?v=egsswPi8yio)\n\n## GitHub Actions\n\n### [`git-publish-subdir-action` - Push git subdirectory as branch](https://github.com/marketplace/actions/push-git-subdirectory-as-branch)\n\n[![](https://github.com/s0/git-publish-subdir-action/workflows/Scheduled%20tests/badge.svg)](https://github.com/s0/git-publish-subdir-action/actions?workflow=Scheduled+tests) [![codecov](https://codecov.io/gh/s0/git-publish-subdir-action/branch/develop/graph/badge.svg)](https://codecov.io/gh/s0/git-publish-subdir-action) [![](https://raw.githubusercontent.com/s0/git-publish-subdir-action/gh-badges/drift.svg)](https://github.com/s0/libyear-node-action) [![](https://raw.githubusercontent.com/s0/git-publish-subdir-action/gh-badges/releases.svg)](https://github.com/s0/libyear-node-action)\n\n### [`libyear-node-action` - Node dependency libyear stats \u0026 PR checks](https://github.com/marketplace/actions/node-dependency-libyear-stats-pr-checks)\n\n[![codecov](https://codecov.io/gh/s0/libyear-node-action/branch/develop/graph/badge.svg)](https://codecov.io/gh/s0/libyear-node-action) [![](https://raw.githubusercontent.com/s0/libyear-node-action/badges/drift.svg)](https://github.com/s0/libyear-node-action) [![](https://raw.githubusercontent.com/s0/libyear-node-action/badges/releases.svg)](https://github.com/s0/libyear-node-action)\n\n## NPM Packages\n\n### [get-relative-path](https://github.com/s0/ts-util/tree/develop/get-relative-path)\n\n![](https://badgen.net/npm/v/get-relative-path?icon=npm\u0026label=) ![](https://img.shields.io/npm/types/get-relative-path) [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/s0/ts-util.svg?logo=lgtm\u0026logoWidth=18)](https://lgtm.com/projects/g/s0/ts-util/context:javascript) ![](https://badgen.net/npm/dt/get-relative-path?icon=npm) ![](https://badgen.net/npm/dm/get-relative-path?icon=npm) ![](https://badgen.net/github/open-prs/s0/ts-util?icon=github) ![](https://badgen.net/github/open-issues/s0/ts-util?icon=github) ![](https://badgen.net/github/stars/s0/ts-util?icon=github)\n\n### [remark-code-extra](https://github.com/s0/remark-code-extra)\n\n![](https://badgen.net/npm/v/remark-code-extra?icon=npm\u0026label=) ![](https://img.shields.io/npm/types/remark-code-extra) [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/s0/remark-code-extra.svg?logo=lgtm\u0026logoWidth=18)](https://lgtm.com/projects/g/s0/remark-code-extra/context:javascript) ![](https://badgen.net/npm/dt/remark-code-extra?icon=npm) ![](https://badgen.net/npm/dm/remark-code-extra?icon=npm) ![](https://badgen.net/github/open-prs/s0/remark-code-extra?icon=github) ![](https://badgen.net/github/open-issues/s0/remark-code-extra?icon=github) ![](https://badgen.net/github/stars/s0/remark-code-extra?icon=github)\n\n### [remark-tree-sitter](https://github.com/s0/remark-tree-sitter)\n\n![](https://badgen.net/npm/v/remark-tree-sitter?icon=npm\u0026label=) ![](https://img.shields.io/npm/types/remark-tree-sitter) [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/s0/remark-tree-sitter.svg?logo=lgtm\u0026logoWidth=18)](https://lgtm.com/projects/g/s0/remark-tree-sitter/context:javascript) ![](https://badgen.net/npm/dt/remark-tree-sitter?icon=npm) ![](https://badgen.net/npm/dm/remark-tree-sitter?icon=npm) ![](https://badgen.net/github/open-prs/s0/remark-tree-sitter?icon=github) ![](https://badgen.net/github/open-issues/s0/remark-tree-sitter?icon=github) ![](https://badgen.net/github/stars/s0/remark-tree-sitter?icon=github)\n\n### [tree-sitter-hast](https://github.com/s0/tree-sitter-hast)\n\n![](https://badgen.net/npm/v/tree-sitter-hast?icon=npm\u0026label=) ![](https://img.shields.io/npm/types/tree-sitter-hast) [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/s0/tree-sitter-hast.svg?logo=lgtm\u0026logoWidth=18)](https://lgtm.com/projects/g/s0/tree-sitter-hast/context:javascript) ![](https://badgen.net/npm/dt/tree-sitter-hast?icon=npm) ![](https://badgen.net/npm/dm/tree-sitter-hast?icon=npm) ![](https://badgen.net/github/open-prs/s0/tree-sitter-hast?icon=github) ![](https://badgen.net/github/open-issues/s0/tree-sitter-hast?icon=github) ![](https://badgen.net/github/stars/s0/tree-sitter-hast?icon=github)\n\n### [gatsby-remark-tree-sitter](https://github.com/s0/gatsby-remark-tree-sitter)\n\n![](https://badgen.net/npm/v/gatsby-remark-tree-sitter?icon=npm\u0026label=) ![](https://img.shields.io/npm/types/gatsby-remark-tree-sitter) [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/s0/gatsby-remark-tree-sitter.svg?logo=lgtm\u0026logoWidth=18)](https://lgtm.com/projects/g/s0/gatsby-remark-tree-sitter/context:javascript) ![](https://badgen.net/npm/dt/gatsby-remark-tree-sitter?icon=npm) ![](https://badgen.net/npm/dm/gatsby-remark-tree-sitter?icon=npm) ![](https://badgen.net/github/open-prs/s0/gatsby-remark-tree-sitter?icon=github) ![](https://badgen.net/github/open-issues/s0/gatsby-remark-tree-sitter?icon=github) ![](https://badgen.net/github/stars/s0/gatsby-remark-tree-sitter?icon=github)\n\n### [tree-sitter-ql](https://github.com/s0/tree-sitter-ql)\n\n![](https://badgen.net/npm/v/tree-sitter-ql?icon=npm\u0026label=) ![](https://img.shields.io/npm/types/tree-sitter-ql) [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/s0/tree-sitter-ql.svg?logo=lgtm\u0026logoWidth=18)](https://lgtm.com/projects/g/s0/tree-sitter-ql/context:javascript) ![](https://badgen.net/npm/dt/tree-sitter-ql?icon=npm) ![](https://badgen.net/npm/dm/tree-sitter-ql?icon=npm) ![](https://badgen.net/github/open-prs/s0/tree-sitter-ql?icon=github) ![](https://badgen.net/github/open-issues/s0/tree-sitter-ql?icon=github) ![](https://badgen.net/github/stars/s0/tree-sitter-ql?icon=github)\n\n### [gatsby-remark-highlight.js](https://github.com/s0/gatsby-remark-highlight.js)\n\n![](https://badgen.net/npm/v/gatsby-remark-highlight.js?icon=npm\u0026label=) ![](https://img.shields.io/npm/types/gatsby-remark-highlight.js) [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/s0/gatsby-remark-highlight.js.svg?logo=lgtm\u0026logoWidth=18)](https://lgtm.com/projects/g/s0/gatsby-remark-highlight.js/context:javascript) ![](https://badgen.net/npm/dt/gatsby-remark-highlight.js?icon=npm) ![](https://badgen.net/npm/dm/gatsby-remark-highlight.js?icon=npm) ![](https://badgen.net/github/open-prs/s0/gatsby-remark-highlight.js?icon=github) ![](https://badgen.net/github/open-issues/s0/gatsby-remark-highlight.js?icon=github) ![](https://badgen.net/github/stars/s0/gatsby-remark-highlight.js?icon=github)\n\n### [remark-code-frontmatter](https://github.com/s0/remark-code-frontmatter)\n\n![](https://badgen.net/npm/v/remark-code-frontmatter?icon=npm\u0026label=) ![](https://img.shields.io/npm/types/remark-code-frontmatter) [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/s0/remark-code-frontmatter.svg?logo=lgtm\u0026logoWidth=18)](https://lgtm.com/projects/g/s0/remark-code-frontmatter/context:javascript) ![](https://badgen.net/npm/dt/remark-code-frontmatter?icon=npm) ![](https://badgen.net/npm/dm/remark-code-frontmatter?icon=npm) ![](https://badgen.net/github/open-prs/s0/remark-code-frontmatter?icon=github) ![](https://badgen.net/github/open-issues/s0/remark-code-frontmatter?icon=github) ![](https://badgen.net/github/stars/s0/remark-code-frontmatter?icon=github)\n\n### [gatsby-remark-code-frontmatter](https://github.com/s0/gatsby-remark-code-frontmatter)\n\n![](https://badgen.net/npm/v/gatsby-remark-code-frontmatter?icon=npm\u0026label=) ![](https://img.shields.io/npm/types/gatsby-remark-code-frontmatter) [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/s0/gatsby-remark-code-frontmatter.svg?logo=lgtm\u0026logoWidth=18)](https://lgtm.com/projects/g/s0/gatsby-remark-code-frontmatter/context:javascript) ![](https://badgen.net/npm/dt/gatsby-remark-code-frontmatter?icon=npm) ![](https://badgen.net/npm/dm/gatsby-remark-code-frontmatter?icon=npm) ![](https://badgen.net/github/open-prs/s0/gatsby-remark-code-frontmatter?icon=github) ![](https://badgen.net/github/open-issues/s0/gatsby-remark-code-frontmatter?icon=github) ![](https://badgen.net/github/stars/s0/gatsby-remark-code-frontmatter?icon=github)\n\n### [gatsby-remark-code-extra](https://github.com/s0/gatsby-remark-code-extra)\n\n![](https://badgen.net/npm/v/gatsby-remark-code-extra?icon=npm\u0026label=) ![](https://img.shields.io/npm/types/gatsby-remark-code-extra) [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/s0/gatsby-remark-code-extra.svg?logo=lgtm\u0026logoWidth=18)](https://lgtm.com/projects/g/s0/gatsby-remark-code-extra/context:javascript) ![](https://badgen.net/npm/dt/gatsby-remark-code-extra?icon=npm) ![](https://badgen.net/npm/dm/gatsby-remark-code-extra?icon=npm) ![](https://badgen.net/github/open-prs/s0/gatsby-remark-code-extra?icon=github) ![](https://badgen.net/github/open-issues/s0/gatsby-remark-code-extra?icon=github) ![](https://badgen.net/github/stars/s0/gatsby-remark-code-extra?icon=github)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fs0%2Fs0","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fs0%2Fs0","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fs0%2Fs0/lists"}