diff --git a/output/art_rosnovsky_software_engineer.pdf b/output/art_rosnovsky_software_engineer.pdf index 4661a39..4f25758 100644 Binary files a/output/art_rosnovsky_software_engineer.pdf and b/output/art_rosnovsky_software_engineer.pdf differ diff --git a/package.json b/package.json index f00c873..f0fa10b 100644 --- a/package.json +++ b/package.json @@ -19,17 +19,18 @@ "dependencies": { "markdown-pdf": "^11.0.0", "md-to-pdf": "^5.2.4", - "pino": "^9.4.0", - "pino-pretty": "^11.2.2", - "typescript": "^5.6.2" + "pino": "^9.6.0", + "pino-pretty": "^13.0.0", + "typescript": "^5.7.3" }, "devDependencies": { "@types/markdown-pdf": "^9.0.5", - "@types/node": "^22.5.4", + "@types/node": "^22.10.5", "ts-node": "^10.9.2", "typescript": "latest" }, "engines": { "node": ">=20.5.0" - } + }, + "packageManager": "pnpm@9.15.2+sha512.93e57b0126f0df74ce6bff29680394c0ba54ec47246b9cf321f0121d8d9bb03f750a705f24edc3c1180853afd7c2c3b94196d0a3d53d3e069d9e2793ef11f321" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1995b3f..4ec4c09 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,26 +13,26 @@ importers: version: 11.0.0 md-to-pdf: specifier: ^5.2.4 - version: 5.2.4(typescript@5.6.2) + version: 5.2.4(typescript@5.7.3) pino: - specifier: ^9.4.0 - version: 9.4.0 + specifier: ^9.6.0 + version: 9.6.0 pino-pretty: - specifier: ^11.2.2 - version: 11.2.2 + specifier: ^13.0.0 + version: 13.0.0 typescript: - specifier: ^5.6.2 - version: 5.6.2 + specifier: ^5.7.3 + version: 5.7.3 devDependencies: '@types/markdown-pdf': specifier: ^9.0.5 version: 9.0.5 '@types/node': - specifier: ^22.5.4 - version: 22.5.4 + specifier: ^22.10.5 + version: 22.10.5 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.5.4)(typescript@5.6.2) + version: 10.9.2(@types/node@22.10.5)(typescript@5.7.3) packages: @@ -97,16 +97,12 @@ packages: '@types/markdown-pdf@9.0.5': resolution: {integrity: sha512-0FJtLFwfr0zZW69a/qbv/sSqFGr7YUdfIB+ytVhm7If7zIQ/UXXoOHXsTDwCz30/PLf8ya6JjD3mRL+lFnbT5g==} - '@types/node@22.5.4': - resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} + '@types/node@22.10.5': + resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==} '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - acorn-walk@8.3.4: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} @@ -245,9 +241,6 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} @@ -445,14 +438,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -944,29 +929,25 @@ packages: resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} - pino-abstract-transport@1.2.0: - resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} - pino-pretty@11.2.2: - resolution: {integrity: sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==} + pino-pretty@13.0.0: + resolution: {integrity: sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==} hasBin: true pino-std-serializers@7.0.0: resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} - pino@9.4.0: - resolution: {integrity: sha512-nbkQb5+9YPhQRz/BeQmrWpEknAaqjpAqRK8NwJpmrX/JHu7JuZC5G1CeAwJDJfGes4h+YihC6in3Q2nGb+Y09w==} + pino@9.6.0: + resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==} hasBin: true process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-warning@4.0.0: - resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} - - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} + process-warning@4.0.1: + resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} progress@1.1.8: resolution: {integrity: sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==} @@ -1025,10 +1006,6 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - readable-stream@4.5.2: - resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -1120,8 +1097,8 @@ packages: resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} - sonic-boom@4.1.0: - resolution: {integrity: sha512-NGipjjRicyJJ03rPiZCJYjwlsuP2d1/5QUviozRXC7S3WdVWNK5e3Ojieb9CCyfhq2UC+3+SRd9nG3I2lPRvUw==} + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} @@ -1261,16 +1238,16 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript@5.6.2: - resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} @@ -1412,19 +1389,15 @@ snapshots: '@types/markdown-pdf@9.0.5': {} - '@types/node@22.5.4': + '@types/node@22.10.5': dependencies: - undici-types: 6.19.8 + undici-types: 6.20.0 '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.5.4 + '@types/node': 22.10.5 optional: true - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - acorn-walk@8.3.4: dependencies: acorn: 8.12.1 @@ -1537,11 +1510,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - bytes@3.0.0: {} callsites@3.1.0: {} @@ -1637,14 +1605,14 @@ snapshots: core-util-is@1.0.3: {} - cosmiconfig@8.3.6(typescript@5.6.2): + cosmiconfig@8.3.6(typescript@5.7.3): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.3 create-require@1.1.1: {} @@ -1723,10 +1691,6 @@ snapshots: esutils@2.0.3: {} - event-target-shim@5.0.1: {} - - events@3.3.0: {} - extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -2085,7 +2049,7 @@ snapshots: marked@4.3.0: {} - md-to-pdf@5.2.4(typescript@5.6.2): + md-to-pdf@5.2.4(typescript@5.7.3): dependencies: arg: 5.0.2 chalk: 4.1.2 @@ -2097,7 +2061,7 @@ snapshots: iconv-lite: 0.6.3 listr: 0.14.3 marked: 4.3.0 - puppeteer: 21.5.2(typescript@5.6.2) + puppeteer: 21.5.2(typescript@5.7.3) semver: 7.5.4 serve-handler: 6.1.5 transitivePeerDependencies: @@ -2231,12 +2195,11 @@ snapshots: pinkie@2.0.4: {} - pino-abstract-transport@1.2.0: + pino-abstract-transport@2.0.0: dependencies: - readable-stream: 4.5.2 split2: 4.2.0 - pino-pretty@11.2.2: + pino-pretty@13.0.0: dependencies: colorette: 2.0.20 dateformat: 4.6.3 @@ -2246,34 +2209,31 @@ snapshots: joycon: 3.1.1 minimist: 1.2.8 on-exit-leak-free: 2.1.2 - pino-abstract-transport: 1.2.0 + pino-abstract-transport: 2.0.0 pump: 3.0.2 - readable-stream: 4.5.2 secure-json-parse: 2.7.0 - sonic-boom: 4.1.0 + sonic-boom: 4.2.0 strip-json-comments: 3.1.1 pino-std-serializers@7.0.0: {} - pino@9.4.0: + pino@9.6.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.5.0 on-exit-leak-free: 2.1.2 - pino-abstract-transport: 1.2.0 + pino-abstract-transport: 2.0.0 pino-std-serializers: 7.0.0 - process-warning: 4.0.0 + process-warning: 4.0.1 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.5.0 - sonic-boom: 4.1.0 + sonic-boom: 4.2.0 thread-stream: 3.1.0 process-nextick-args@2.0.1: {} - process-warning@4.0.0: {} - - process@0.11.10: {} + process-warning@4.0.1: {} progress@1.1.8: {} @@ -2319,10 +2279,10 @@ snapshots: - supports-color - utf-8-validate - puppeteer@21.5.2(typescript@5.6.2): + puppeteer@21.5.2(typescript@5.7.3): dependencies: '@puppeteer/browsers': 1.8.0 - cosmiconfig: 8.3.6(typescript@5.6.2) + cosmiconfig: 8.3.6(typescript@5.7.3) puppeteer-core: 21.5.2 transitivePeerDependencies: - bufferutil @@ -2355,14 +2315,6 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - readable-stream@4.5.2: - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -2469,7 +2421,7 @@ snapshots: ip: 2.0.0 smart-buffer: 4.2.0 - sonic-boom@4.1.0: + sonic-boom@4.2.0: dependencies: atomic-sleep: 1.0.0 @@ -2597,21 +2549,21 @@ snapshots: tr46@0.0.3: {} - ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2): + ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.5.4 + '@types/node': 22.10.5 acorn: 8.12.1 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.6.2 + typescript: 5.7.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -2627,14 +2579,14 @@ snapshots: typedarray@0.0.6: {} - typescript@5.6.2: {} + typescript@5.7.3: {} unbzip2-stream@1.4.3: dependencies: buffer: 5.7.1 through: 2.3.8 - undici-types@6.19.8: {} + undici-types@6.20.0: {} universalify@0.1.2: {} diff --git a/resume.md b/resume.md index a478e0d..8cee67d 100644 --- a/resume.md +++ b/resume.md @@ -12,24 +12,24 @@ pdf_options: ## Art Rosnovsky -> job@rosnovsky.us | [github.com/rosnovsky](https://github.com/rosnovsky) | Washington state | **Remote Only** | +> job@rosnovsky.us | (360) 513-6735 | [github.com/rosnovsky](https://github.com/rosnovsky) | Washington state | **Remote Only** | -Dedicated `JavaScript`/`TypeScript` Engineer, passionately working with ` React`, serverless, `Kubernetes` and CI/CD. I champion sustainable, ethical tech that makes a positive impact, by building stable, scalable, efficient, and maintainable software. +Dedicated `JavaScript`/`TypeScript` Engineer, passionately working with `React`, serverless, `Kubernetes`, CI/CD, and **specializing in Customer Identity and Access Management** (`CIAM`). I champion sustainable, ethical tech that makes a positive impact, by building stable, scalable, efficient, and maintainable software. ## Technical Skills - **Front End**: `JavaScript`, `TypeScript`, `React`, `Svelte`, `Tailwind`, `CSS`, `HTML` -- **Back End**: `Node.js`, `Express`, `Next.js`, `MongoDB`, `PostgreSQL`, `tRPC`, RESTful APIs +- **Back End**: `Node.js`, `Express`, `Next.js`, `Astro`, `Remix`, `MongoDB`, `PostgreSQL`, `tRPC`, RESTful APIs - **Dev Tools/DevOps**: `Git`, `Docker`, `Kubernetes`, `Jira`, `AWS`, `Azure`, `CI/CD` (`GitHub Actions`, `Gitlab Pipelines`) - **Other**: former frontline reporter, can fly single-engine aircraft ## Work Experience ### Senior Developer (Auth0) -> **[BeyondID](https://beyondid.com)**, Remote • Apr 2024 - Present +> **[BeyondID](https://beyondid.com)**, Remote • Apr 2024 - Jan 2025 -- Implemented end-to-end CIAM solutions for Fortune 500 companies. -- Developed and produced training materials for internal teams. +- Implemented end-to-end CIAM solutions for Fortune 500 companies (primarily, in retail, financial services, and healthcare industries). +- Developed and produced CIAM training materials for internal teams. - Developed a variety of internal CIAM-related tools. ### Software Engineer @@ -37,8 +37,8 @@ Dedicated `JavaScript`/`TypeScript` Engineer, passionately working with ` React` > **[Auth0](https://auth0.com)**, Remote • Mar 2021 - April 2024 - Delivered the [Quarterly Snapshot](https://auth0.com/docs/get-started/tenant-settings/auth0-teams/quarterly-snapshot) feature on schedule. -- Enhanced Technical Account Managers' workflow by building internal tools for Quarterly Snapshots covering **$20M** worth of ARR. -- Developed, deployed, and stabilized an internal AI & ML tool, enhancing knowledge sharing and delivery within the Customer First teams **saving over $10K** of SME productive time every year. +- Enhanced Technical Account Managers' workflow by building internal tools for Quarterly Snapshots. +- Developed, deployed, and stabilized an internal AI & ML tool, enhancing knowledge sharing and delivery within the Customer First teams **saving over 100 hours** of SME productive time every year. - Saved **$20K** annually on AWS bills by strategically decommissioning idle resources. - Improved and delivered a multitude of high-profile company-wide internal tools. - Implemented critical security improvements to key in-house Customer Success tools. @@ -48,7 +48,7 @@ Dedicated `JavaScript`/`TypeScript` Engineer, passionately working with ` React` > **[Auth0](https://auth0.com)**, Remote • Dec 2019 - Mar 2021 - Successfully resolved over 2,000 support cases of various complexity with an average **cSAT of 99%** and **on-time SLA of 97%**. -- Assisted hundreds of major enterprise customers with complex CIAM integration use cases. +- Assisted hundreds of major enterprise customers and startup teams with complex CIAM integration use cases. - Guided hundreds of developers through Identity Management implementations in every environment imaginable.
@@ -90,12 +90,15 @@ Dedicated `JavaScript`/`TypeScript` Engineer, passionately working with ` React` ## Languages -- English — Bilingual -- Russian — Bilingual (comprehend Ukrainian 🇺🇦, Belarusian) +- English — Fluent +- Russian — Fluent (comprehend Ukrainian 🇺🇦, Belarusian) - Arabic — Basic -## Publications +## Open Source / Hobbie Projects -- Rosnovsky, A. (2001). "About robots, Again." PC Week/RE, (300). -- Rosnovsky, A. (2007). "Mac OS X versus Windows." CNews. -- Rosnovsky, A. (2008). "Podcast practice: Master class from one of the most famous Russian podcasters." Hacker, (181). +- [`rosnovsky/astro-mastodon`](https://github.com/rosnovsky/astro-mastodon) - A simple Astro component for displaying Mastodon posts. +- [`Plex Music Stats`](https://music.rosnovsky.us) - show your Plex music stats. | `typescript`, `react`, `remix`, `tailwind` +- [`SafeSafe`](https://safesafe.app) - a private app to store your important documents, with automatic OCR and transcripts and vector search. | `typescript`, `react`, `nextjs`, `tailwind`, `tesseract`, `typesense`, `S3`, `SQS` +- [`rosnovsky/sanity-autocomplete-tags`](https://github.com/rosnovsky/sanity-plugin-autocomplete-tags) - A Sanity plugin for autocompleting tags. +- [`Current Apple Music`](https://github.com/rosnovsky/current-apple-music) - show what you're listening to on Apple Music. +- [`rosnovsky/spinup`](https://github.com/rosnovsky/spinup) - A simple CLI tool for installing pre-defined software on new machines.