\n\u003CPaypalButton\n :client=\"clientConfig\"\n :button=\"buttonConfig\"\n :order=\"orderConfig\"\n/>\n\u003C/template>\n```\n\nPre-configured setup using nuxt.config.ts\n```\n\u003Ctemplate>\n\u003CPaypalCheckout :order=\"orderConfig\" />\n\u003CPaypalButton :order=\"orderConfig\" />\n\u003C/template>\n```\n\nIt's possible to customize easily the styles of the PaypalCheckout and PaypalButton using the CSS class .paypal-client:\n```css\n/* paypal button sized & centered */\n.paypal-client {\n max-width: 800px;\n margin: 0 auto;\n}\n\n/* paypal checkout pair of buttons*/\n.paypal-client {\n display: flex;\n gap: 2rem;\n}\n\n/* paypal checkout buttons grid*/\n.paypal-client {\n display: grid;\n gap: 2rem;\n}\n```\n\n## Configuration\n\nnuxt3-paypal wraps three main configuration types that can be used in both nuxt.config.ts and as props in components:\n\n### Client configuration (@paypal/paypal-js type `PayPalScriptOptions`)\n\nConfiguration for the paypal.loadScript utility, which represents the PayPal client responsible for rendering PayPal elements.\n\nIf you don’t need to modify configuration values at runtime (e.g., localization settings), it’s recommended to set up the client within nuxt.config.ts. When client configuration is specified in nuxt.config.ts, nuxt3-paypal loads a client-only plugin, injecting the configured PayPal client instance (nuxtApp.$paypal). Since @paypal/paypal-js interacts directly with the DOM, this plugin is not compatible with SSR.\n\nAlternatively, you can use nuxt3-paypal without pre-defined configuration and pass client settings as props directly to components. This allows you to leverage reactive references to dynamically adjust client configurations at runtime, such as the current locale or currency settings.\n\n```typescript\ninterface PayPalScriptOptions {\n buyerCountry?: string;\n clientId: string;\n commit?: boolean;\n components?: string[] | string;\n currency?: string;\n debug?: boolean | string;\n disableFunding?: string[] | string;\n enableFunding?: string[] | string;\n integrationDate?: string;\n intent?: string;\n locale?: string;\n merchantId?: string[] | string;\n vault?: boolean | string;\n dataClientToken?: string;\n dataCspNonce?: string;\n dataClientMetadataId?: string;\n dataJsSdkLibrary?: string;\n dataMerchantId?: string[] | string;\n dataNamespace?: string;\n dataPageType?: string;\n dataPartnerAttributionId?: string;\n dataSdkIntegrationSource?: string;\n dataUid?: string;\n dataUserIdToken?: string;\n crossorigin?: \"anonymous\" | \"use-credentials\";\n environment?: \"production\" | \"sandbox\";\n sdkBaseUrl?: string;\n}\n```\n\n### Button configuration (@paypal/paypal-js type `PayPalButtonsComponentOptions`)\n\nConfiguration for the PayPal button elements, which are rendered through the specified PayPal client.\n\nYou can define a default button configuration in nuxt.config.ts, which will apply to the PaypalCheckout component. If using the standalone PaypalButton component, you’ll need to provide a scoped button configuration specific to that component.\n\n```typescript\ninterface PayPalButtonsComponentOptions {\n /**\n * Called on button click. Often used for [Braintree vault integrations](https://developers.braintreepayments.com/guides/paypal/vault/javascript/v3).\n */\n createBillingAgreement?: PayPalButtonCreateBillingAgreement;\n /**\n * Called on button click to set up a one-time payment. [createOrder docs](https://developer.paypal.com/docs/business/javascript-sdk/javascript-sdk-reference/#createorder).\n */\n createOrder?: PayPalButtonCreateOrder;\n /**\n * Called on button click to set up a recurring payment. [createSubscription docs](https://developer.paypal.com/docs/business/javascript-sdk/javascript-sdk-reference/#createsubscription).\n */\n createSubscription?: PayPalButtonCreateSubscription;\n /**\n * Save payment methods to charge payers after a set amount of time. For example, you can offer a free trial and charge payers after the trial expires. Payers don't need to be present when charged. No checkout required.\n * https://developer.paypal.com/docs/checkout/save-payment-methods/purchase-later/js-sdk/paypal/#link-clientsidecodesample\n */\n createVaultSetupToken?: PayPalButtonCreateVaultSetupToken;\n /**\n * Used for defining a standalone button.\n * Learn more about [configuring the funding source for standalone buttons](https://developer.paypal.com/docs/business/checkout/configure-payments/standalone-buttons/#4-funding-sources).\n */\n fundingSource?: PayPalButtonFundingSource;\n /**\n * Called when finalizing the transaction. Often used to inform the buyer that the transaction is complete. [onApprove docs](https://developer.paypal.com/docs/business/javascript-sdk/javascript-sdk-reference/#onapprove).\n */\n onApprove?: PayPalButtonOnApprove;\n /**\n * Called when the buyer cancels the transaction.\n * Often used to show the buyer a [cancellation page](https://developer.paypal.com/docs/business/checkout/add-capabilities/buyer-experience/#3-show-cancellation-page).\n */\n onCancel?: PayPalButtonOnCancel;\n /**\n * Called when the button is clicked. Often used for [validation](https://developer.paypal.com/docs/checkout/integration-features/validation/).\n */\n onClick?: PayPalButtonOnClick;\n /**\n * Catch all for errors preventing buyer checkout.\n * Often used to show the buyer an [error page](https://developer.paypal.com/docs/checkout/integration-features/handle-errors/).\n */\n onError?: PayPalButtonOnError;\n /**\n * Called when the buttons are initialized. The component is initialized after the iframe has successfully loaded.\n */\n onInit?: PayPalButtonOnInit;\n /**\n * Called when the buyer changes their shipping address on PayPal.\n * @deprecated Use `onShippingAddressChange` or `onShippingOptionsChange` instead.\n */\n onShippingChange?: PayPalButtonOnShippingChange;\n /**\n * Called when the buyer selects a new shipping option on PayPal.\n */\n onShippingOptionsChange?: PayPalButtonOnShippingOptionsChange;\n /**\n * Called when the buyer updates their shipping address on PayPal.\n */\n onShippingAddressChange?: PayPalButtonOnShippingAddressChange;\n /**\n * [Styling options](https://developer.paypal.com/docs/business/checkout/reference/style-guide/#customize-the-payment-buttons) for customizing the button appearance.\n */\n style?: PayPalButtonStyle;\n /**\n * Used for displaying only vaultable buttons.\n */\n displayOnly?: PayPalButtonDisplayOnly;\n /**\n * [Message options](https://developer.paypal.com/sdk/js/reference/#message) for customizing the message appearance and limited content control.\n */\n message?: PayPalButtonMessage;\n}\n```\n\n### Order configuration (@paypal/paypal-js type `CreateOrderRequestBody`)\n\nConfiguration for the Paypal [createOrder REST API](https://developer.paypal.com/docs/api/orders/v2/#orders-create-request-body).\nIt's the only required prop from all the nuxt3-paypal provided components since requires current order data.\n\n```typescript\ninterface CreateOrderRequestBody {\n intent: \"CAPTURE\" | \"AUTHORIZE\"\n purchaseUnits: Array\u003C{\n /** @description The API caller-provided external ID for the purchase unit. Required for multiple purchase units when you must update the order through `PATCH`. If you omit this value and the order contains only one purchase unit, PayPal sets this value to `default`. */\n reference_id?: string;\n /** @description The total order amount with an optional breakdown that provides details, such as the total item amount, total tax amount, shipping, handling, insurance, and discounts, if any.\u003Cbr/>If you specify `amount.breakdown`, the amount equals `item_total` plus `tax_total` plus `shipping` plus `handling` plus `insurance` minus `shipping_discount` minus discount.\u003Cbr/>The amount must be a positive number. The `amount.value` field supports up to 15 digits preceding the decimal. For a list of supported currencies, decimal precision, and maximum charge amount, see the PayPal REST APIs \u003Ca href=\"https://developer.paypal.com/api/rest/reference/currency-codes/\">Currency Codes\u003C/a>. */\n amount: components[\"schemas\"][\"amount_with_breakdown\"];\n /** @description The merchant who receives payment for this transaction. */\n payee?: components[\"schemas\"][\"payee\"];\n payment_instruction?: components[\"schemas\"][\"payment_instruction\"];\n /** @description The purchase description. The maximum length of the character is dependent on the type of characters used. The character length is specified assuming a US ASCII character. Depending on type of character; (e.g. accented character, Japanese characters) the number of characters that that can be specified as input might not equal the permissible max length. */\n description?: string;\n /** @description The API caller-provided external ID. Used to reconcile client transactions with PayPal transactions. Appears in transaction and settlement reports but is not visible to the payer. */\n custom_id?: string;\n /** @description The API caller-provided external invoice number for this order. Appears in both the payer's transaction history and the emails that the payer receives. */\n invoice_id?: string;\n /** @description The soft descriptor is the dynamic text used to construct the statement descriptor that appears on a payer's card statement.\u003Cbr>\u003Cbr>If an Order is paid using the \"PayPal Wallet\", the statement descriptor will appear in following format on the payer's card statement: \u003Ccode>\u003Cvar>PAYPAL_prefix\u003C/var>+(space)+\u003Cvar>merchant_descriptor\u003C/var>+(space)+ \u003Cvar>soft_descriptor\u003C/var>\u003C/code>\u003Cblockquote>\u003Cstrong>Note:\u003C/strong> The merchant descriptor is the descriptor of the merchant’s payment receiving preferences which can be seen by logging into the merchant account https://www.sandbox.paypal.com/businessprofile/settings/info/edit\u003C/blockquote>The \u003Ccode>PAYPAL\u003C/code> prefix uses 8 characters. Only the first 22 characters will be displayed in the statement. \u003Cbr>For example, if:\u003Cul>\u003Cli>The PayPal prefix toggle is \u003Ccode>PAYPAL *\u003C/code>.\u003C/li>\u003Cli>The merchant descriptor in the profile is \u003Ccode>Janes Gift\u003C/code>.\u003C/li>\u003Cli>The soft descriptor is \u003Ccode>800-123-1234\u003C/code>.\u003C/li>\u003C/ul>Then, the statement descriptor on the card is \u003Ccode>PAYPAL * Janes Gift 80\u003C/code>. */\n soft_descriptor?: string;\n /** @description An array of items that the customer purchases from the merchant. */\n items?: components[\"schemas\"][\"item\"][];\n /** @description The name and address of the person to whom to ship the items. */\n shipping?: components[\"schemas\"][\"shipping_detail\"];\n /** @description Contains Supplementary Data. */\n supplementary_data?: components[\"schemas\"][\"supplementary_data\"];\n }>\n}\n```\n\nnuxt3-paypal components accept all these configurations as props (order, client, button).\n\n## Contribution\n\n\u003Cdetails>\n \u003Csummary>Local development\u003C/summary>\n \n ```bash\n # Install dependencies\n npm install\n \n # Generate type stubs\n npm run dev:prepare\n \n # Develop with the playground\n npm run dev\n \n # Build the playground\n npm run dev:build\n \n # Run ESLint\n npm run lint\n \n # Run Vitest\n npm run test\n npm run test:watch\n \n # Release new version\n npm run release\n ```\n\n\u003C/details>\n\n\n\u003C!-- Badges -->\n[npm-version-src]: https://img.shields.io/npm/v/nuxt3-paypal/latest.svg?style=flat&colorA=020420&colorB=00DC82\n[npm-version-href]: https://npmjs.com/package/nuxt3-paypal\n\n[npm-downloads-src]: https://img.shields.io/npm/dm/nuxt3-paypal.svg?style=flat&colorA=020420&colorB=00DC82\n[npm-downloads-href]: https://npm.chart.dev/nuxt3-paypal\n\n[license-src]: https://img.shields.io/npm/l/nuxt3-paypal.svg?style=flat&colorA=020420&colorB=00DC82\n[license-href]: https://npmjs.com/package/nuxt3-paypal\n\n[nuxt-src]: https://img.shields.io/badge/Nuxt-020420?logo=nuxt.js\n[nuxt-href]: https://nuxt.com\n","2024-11-07T09:26:18.000Z",123,{"id":1511,"slug":1504,"createdAt":1513,"updatedAt":1513,"code":1514,"path":1515,"thumb":1516,"providerUrl":95,"provider":96,"nuxtPath":1515},"2025-02-11T11:22:22.645Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847110117120116514511297121112971084611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/nuxt3-paypal.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/nuxt3-paypal.webp",{"id":872,"uid":1518,"createdAt":1519,"updatedAt":1520,"enabled":9,"name":1521,"slug":1521,"category":499,"avatarUrl":77,"url":1522,"publicUrl":1523,"private":80,"description":1524,"language":144,"size":1525,"stargazersCount":38,"defaultBranch":109,"readmemd":77,"topicRaw":1526,"visibility":86,"provider":87,"pushedAt":1527,"mediaId":296,"assetId":1528,"asset":1529},424182704,"2021-11-03T10:39:11.000Z","2025-10-09T00:16:19.368Z","vue-boolzapp","https://api.github.com/repos/LorenzoRottigni/vue-boolzapp","https://github.com/LorenzoRottigni/vue-boolzapp","Boolean academy project: Whatsapp with VueJS CDN",210,"boolean;cdn;vuejs;whatsapp","2021-11-05T20:39:03.000Z",124,{"id":1528,"slug":1521,"createdAt":1530,"updatedAt":1530,"code":1531,"path":1532,"thumb":1533,"providerUrl":95,"provider":96,"nuxtPath":1532},"2025-02-11T11:22:26.483Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471181171014598111111108122971121124697118105102","/portfolio.rottigni.tech/seed/assets/repos/github/vue-boolzapp.avif","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/vue-boolzapp.avif",{"id":887,"uid":1535,"createdAt":1536,"updatedAt":1537,"enabled":9,"name":1538,"slug":1538,"category":76,"avatarUrl":77,"url":1539,"publicUrl":1540,"private":80,"description":1541,"language":81,"size":210,"stargazersCount":83,"defaultBranch":84,"readmemd":1542,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":1543,"mediaId":77,"assetId":1544,"asset":1545},804892945,"2024-05-23T13:26:06.000Z","2024-05-24T12:28:30.000Z","opencv-live-streaming","https://api.github.com/repos/LorenzoRottigni/opencv-live-streaming","https://github.com/LorenzoRottigni/opencv-live-streaming","Python client and server scripts to record a live streaming from the client camera and transmit it to the server using TCP/IP.","Set-ExecutionPolicy -ExecutionPolicy Unrestricted","2024-05-24T12:28:26.000Z",125,{"id":1544,"slug":1538,"createdAt":1546,"updatedAt":1546,"code":1547,"path":1548,"thumb":1549,"providerUrl":95,"provider":96,"nuxtPath":1548},"2025-02-11T11:22:31.105Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847111112101110991184510810511810145115116114101971091051101034611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/opencv-live-streaming.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/opencv-live-streaming.webp",{"id":904,"uid":1551,"createdAt":1552,"updatedAt":1553,"enabled":9,"name":1554,"slug":1554,"category":103,"avatarUrl":77,"url":1555,"publicUrl":1556,"private":80,"description":1557,"language":465,"size":1389,"stargazersCount":83,"defaultBranch":109,"readmemd":1558,"topicRaw":1559,"visibility":86,"provider":87,"pushedAt":1560,"mediaId":77,"assetId":1561,"asset":1562},426656185,"2021-11-10T14:36:43.000Z","2022-11-21T13:54:43.000Z","vue-cli-first","https://api.github.com/repos/LorenzoRottigni/vue-cli-first","https://github.com/LorenzoRottigni/vue-cli-first","Boolean academy first Vuejs Project","# vue-cli-first\n\n## Project setup\n```\nnpm install\n```\n\n### Compiles and hot-reloads for development\n```\nnpm run serve\n```\n\n### Compiles and minifies for production\n```\nnpm run build\n```\n\n### Lints and fixes files\n```\nnpm run lint\n```\n\n### Customize configuration\nSee [Configuration Reference](https://cli.vuejs.org/config/).\n","boolean;vuecli","2021-11-10T16:36:53.000Z",126,{"id":1561,"slug":1554,"createdAt":1563,"updatedAt":1563,"code":1564,"path":1565,"thumb":1566,"providerUrl":95,"provider":96,"nuxtPath":1565},"2025-02-11T11:22:35.256Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471181171014599108105451021051141151164611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/vue-cli-first.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/vue-cli-first.webp",{"id":791,"uid":1568,"createdAt":1569,"updatedAt":1570,"enabled":9,"name":1571,"slug":1571,"category":499,"avatarUrl":77,"url":1572,"publicUrl":1573,"private":80,"description":1574,"language":81,"size":38,"stargazersCount":38,"defaultBranch":84,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":1575,"mediaId":77,"assetId":1576,"asset":1577},799876096,"2024-05-13T09:17:45.000Z","2024-05-13T09:21:45.000Z","opencv-yolo3-detector","https://api.github.com/repos/LorenzoRottigni/opencv-yolo3-detector","https://github.com/LorenzoRottigni/opencv-yolo3-detector","OpenCV implementation for YOLOv3 (You only look once) detector using COCO dataset.","2024-05-13T09:21:32.000Z",127,{"id":1576,"slug":1571,"createdAt":1578,"updatedAt":1578,"code":1579,"path":1580,"thumb":1581,"providerUrl":95,"provider":96,"nuxtPath":1580},"2025-02-11T11:22:39.868Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984711111210111099118451211111081115145100101116101991161111144611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/opencv-yolo3-detector.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/opencv-yolo3-detector.webp",{"id":936,"uid":1583,"createdAt":1584,"updatedAt":1585,"enabled":9,"name":1586,"slug":1586,"category":499,"avatarUrl":77,"url":1587,"publicUrl":1588,"private":80,"description":1589,"language":465,"size":1590,"stargazersCount":38,"defaultBranch":109,"readmemd":1591,"topicRaw":1592,"visibility":86,"provider":87,"pushedAt":1593,"mediaId":82,"assetId":1594,"asset":1595},427069993,"2021-11-11T16:31:18.000Z","2025-10-09T00:16:19.257Z","vue-dc-comics","https://api.github.com/repos/LorenzoRottigni/vue-dc-comics","https://github.com/LorenzoRottigni/vue-dc-comics","Boolean academy project: Vuejs DC website",1588,"# vue-dc-comics\n\n## Project setup\n```\nnpm install\n```\n\n### Compiles and hot-reloads for development\n```\nnpm run serve\n```\n\n### Compiles and minifies for production\n```\nnpm run build\n```\n\n### Lints and fixes files\n```\nnpm run lint\n```\n\n### Customize configuration\nSee [Configuration Reference](https://cli.vuejs.org/config/).\n","boolean;dc;javascript;vuejs","2021-11-15T14:39:15.000Z",128,{"id":1594,"slug":1586,"createdAt":1596,"updatedAt":1596,"code":1597,"path":1598,"thumb":1599,"providerUrl":95,"provider":96,"nuxtPath":1598},"2025-02-11T11:22:43.668Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984711811710145100994599111109105991154697118105102","/portfolio.rottigni.tech/seed/assets/repos/github/vue-dc-comics.avif","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/vue-dc-comics.avif",{"id":952,"uid":1601,"createdAt":1602,"updatedAt":1602,"enabled":9,"name":1603,"slug":1603,"category":76,"avatarUrl":77,"url":1604,"publicUrl":1605,"private":80,"description":1606,"language":77,"size":83,"stargazersCount":83,"defaultBranch":84,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":1602,"mediaId":77,"assetId":1607,"asset":1608},773738558,"2024-03-18T10:06:01.000Z","orm-ast","https://api.github.com/repos/LorenzoRottigni/orm-ast","https://github.com/LorenzoRottigni/orm-ast","Abstract Syntax Tree generator for a set of ORMs",129,{"id":1607,"slug":1603,"createdAt":1609,"updatedAt":1609,"code":1610,"path":1611,"thumb":1612,"providerUrl":95,"provider":96,"nuxtPath":1611},"2025-02-11T11:22:48.225Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984711111410945971151164611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/orm-ast.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/orm-ast.webp",{"id":967,"uid":1614,"createdAt":1615,"updatedAt":1616,"enabled":9,"name":1617,"slug":1617,"category":103,"avatarUrl":77,"url":1618,"publicUrl":1619,"private":80,"description":1620,"language":465,"size":1621,"stargazersCount":83,"defaultBranch":109,"readmemd":1622,"topicRaw":1623,"visibility":86,"provider":87,"pushedAt":1624,"mediaId":77,"assetId":1625,"asset":1626},428303446,"2021-11-15T14:47:31.000Z","2022-11-21T13:38:53.000Z","vue-dischi","https://api.github.com/repos/LorenzoRottigni/vue-dischi","https://github.com/LorenzoRottigni/vue-dischi","Boolean academy JS snippet",557,"# vue-dischi\n\n## Project setup\n```\nnpm install\n```\n\n### Compiles and hot-reloads for development\n```\nnpm run serve\n```\n\n### Compiles and minifies for production\n```\nnpm run build\n```\n\n### Lints and fixes files\n```\nnpm run lint\n```\n\n### Customize configuration\nSee [Configuration Reference](https://cli.vuejs.org/config/).\n","boolean;javascript;vue","2021-11-16T19:56:31.000Z",130,{"id":1625,"slug":1617,"createdAt":1627,"updatedAt":1627,"code":1628,"path":1629,"thumb":1630,"providerUrl":95,"provider":96,"nuxtPath":1629},"2025-02-11T11:22:52.394Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984711811710145100105115991041054611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/vue-dischi.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/vue-dischi.webp",{"id":983,"uid":1632,"createdAt":1633,"updatedAt":1634,"enabled":9,"name":1635,"slug":1635,"category":103,"avatarUrl":77,"url":1636,"publicUrl":1637,"private":80,"description":1638,"language":107,"size":130,"stargazersCount":83,"defaultBranch":84,"readmemd":77,"topicRaw":1639,"visibility":86,"provider":87,"pushedAt":1640,"mediaId":77,"assetId":1641,"asset":1642},433881535,"2021-12-01T15:28:16.000Z","2022-11-21T13:09:51.000Z","php-ajax-dischi","https://api.github.com/repos/LorenzoRottigni/php-ajax-dischi","https://github.com/LorenzoRottigni/php-ajax-dischi","Boolean academy PHP REST API","boolean;php;rest-api","2021-12-01T23:22:09.000Z",131,{"id":1641,"slug":1635,"createdAt":1643,"updatedAt":1643,"code":1644,"path":1645,"thumb":1646,"providerUrl":95,"provider":96,"nuxtPath":1645},"2025-02-11T11:22:56.261Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984711210411245971069712045100105115991041054611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/php-ajax-dischi.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/php-ajax-dischi.webp",{"id":997,"uid":1648,"createdAt":1649,"updatedAt":1650,"enabled":9,"name":1651,"slug":1651,"category":103,"avatarUrl":77,"url":1652,"publicUrl":1653,"private":80,"description":1654,"language":144,"size":98,"stargazersCount":83,"defaultBranch":84,"readmemd":77,"topicRaw":1655,"visibility":86,"provider":87,"pushedAt":1656,"mediaId":77,"assetId":269,"asset":1657},426271581,"2021-11-09T14:57:29.000Z","2022-11-21T13:57:35.000Z","vue-email-list","https://api.github.com/repos/LorenzoRottigni/vue-email-list","https://github.com/LorenzoRottigni/vue-email-list","Boolean academy vuejs project","boolean;html;javascript;sass;vuejs","2021-11-09T17:14:15.000Z",{"id":269,"slug":1651,"createdAt":1658,"updatedAt":1658,"code":1659,"path":1660,"thumb":1661,"providerUrl":95,"provider":96,"nuxtPath":1660},"2025-02-11T11:23:00.291Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471181171014510110997105108451081051151164611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/vue-email-list.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/vue-email-list.webp",{"id":1013,"uid":1663,"createdAt":1664,"updatedAt":1665,"enabled":9,"name":1666,"slug":1666,"category":103,"avatarUrl":77,"url":1667,"publicUrl":1668,"private":80,"description":1669,"language":144,"size":677,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":1670,"visibility":86,"provider":87,"pushedAt":1671,"mediaId":77,"assetId":1672,"asset":1673},422207750,"2021-10-28T13:06:34.000Z","2022-11-21T14:12:44.000Z","vue-hello","https://api.github.com/repos/LorenzoRottigni/vue-hello","https://github.com/LorenzoRottigni/vue-hello","Boolean academy VueJS CDN first","boolean;cdn;javascript;vuejs","2021-10-28T13:29:33.000Z",133,{"id":1672,"slug":1666,"createdAt":1674,"updatedAt":1674,"code":1675,"path":1676,"thumb":1677,"providerUrl":95,"provider":96,"nuxtPath":1676},"2025-02-11T11:23:04.635Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847118117101451041011081081114611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/vue-hello.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/vue-hello.webp",{"id":1028,"uid":1679,"createdAt":1680,"updatedAt":1681,"enabled":9,"name":1682,"slug":1682,"category":76,"avatarUrl":77,"url":1683,"publicUrl":1684,"private":80,"description":77,"language":144,"size":98,"stargazersCount":83,"defaultBranch":84,"readmemd":1685,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":1686,"mediaId":77,"assetId":1687,"asset":1688},782845107,"2024-04-06T07:42:00.000Z","2024-04-06T12:39:24.000Z","wasm-test","https://api.github.com/repos/LorenzoRottigni/wasm-test","https://github.com/LorenzoRottigni/wasm-test","## MacOS\n\n### Preparation\n\n# command runner\nsudo port install just\n# web assembly binary toolkit\nbrew install wabt\n\n### Wat\n\njust wat2wasm\n\n### Rust\n\ncd rust/\nwasm-pack build --target web\n","2024-04-06T12:39:21.000Z",134,{"id":1687,"slug":1682,"createdAt":1689,"updatedAt":1689,"code":1690,"path":1691,"thumb":1692,"providerUrl":95,"provider":96,"nuxtPath":1691},"2025-02-11T11:23:09.642Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984711997115109451161011151164611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/wasm-test.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/wasm-test.webp",{"id":1046,"uid":1694,"createdAt":1695,"updatedAt":1696,"enabled":9,"name":1697,"slug":1697,"category":499,"avatarUrl":77,"url":1698,"publicUrl":1699,"private":80,"description":1700,"language":128,"size":1701,"stargazersCount":98,"defaultBranch":84,"readmemd":1702,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":1703,"mediaId":77,"assetId":1704,"asset":1705},688387667,"2023-09-07T08:42:57.000Z","2024-10-02T13:24:41.000Z","vendure-scalapay","https://api.github.com/repos/LorenzoRottigni/vendure-scalapay","https://github.com/LorenzoRottigni/vendure-scalapay","Scalapay payment provider plugin for Vendure",429,"# Scalapay Payment Plugin for Vendure\n\n## Overview\n\nThis plugin integrates Scalapay, a flexible and user-friendly payment solution, with your Vendure e-commerce platform. It enables seamless transactions and enhances the checkout experience for your customers.\n\n## Installation\n\nInstall the Scalapay plugin via npm, pnpm, or yarn:\n\n```bash\nnpm install vendure-scalapay\n# OR\npnpm install vendure-scalapay\n# OR\nyarn add vendure-scalapay\n```\n\n## Configuration\n\nIn your `vendure-config.ts` file, initialize the ScalapayPlugin with the following options:\n\n```typescript\nimport { ScalapayPlugin } from \"vendure-scalapay\";\n\nexport const config = {\n plugins: [\n ScalapayPlugin.init({\n apiKey: \"\u003Cscalapay-api-key>\",\n baseUrl: \"\u003Cvendure-app-base-url>\",\n successUrl: \"\u003Cfront-end-success-url>\",\n failureUrl: \"\u003Cfront-end-failure-url>\",\n environment: \"\u003Csandbox|production>\",\n }),\n ],\n};\n```\n\n## Plugin Options\n\n- `apiKey`: Your Scalapay API key (can be accessed via `process.env.SCALAPAY_API_KEY`).\n- `baseUrl`: The public base URL of your Vendure application (can be accessed via `process.env.SCALAPAY_BASE_URL`).\n- `successUrl`: The URL to redirect to upon successful Scalapay payment settlement (can be accessed via `process.env.SCALAPAY_SUCCESS_URL`).\n- `failureUrl`: The URL to redirect to in case of failed Scalapay payment settlement (can be accessed via `process.env.SCALAPAY_FAILURE_URL`).\n- `environment`: Scalapay runtime environment \u003Csandbox/production> (can be accessed via `process.env.SCALAPAY_ENVIRONMENT`).\n\n## Functionality\n\nThe Scalapay Plugin extends Vendure by adding two Order Custom Fields:\n\n- order.customFields.scalapayCheckoutUrl: This field stores the Scalapay generated checkout URL, where customers submit their payment.\n- order.customFields.scalapayToken: This field holds the Scalapay generated token at the time of payment settlement.\n\nAdditionally, the plugin exposes a REST endpoint (GET /payments/scalapay) to handle the Scalapay checkoutUrl redirect, settle the payment, and then redirect the client (302) to the designated success/failure URL.\n\nPlease ensure you have the necessary environment variables set to securely access Scalapay credentials.\n\nFor more detailed information, refer to the [Scalapay documentation](https://developers.scalapay.com/).\n\n**Note**: It is recommended to follow best practices for securely managing environment variables.\n\n```bash\nexport SCALAPAY_API_KEY='\u003Cyour-api-key>'\nexport SCALAPAY_BASE_URL='\u003Cyour-app-base-url>'\nexport SCALAPAY_SUCCESS_URL='\u003Cfront-end-success-url>'\nexport SCALAPAY_FAILURE_URL='\u003Cfront-end-failure-url>'\nexport SCALAPAY_ENVIRONMENT='\u003Csandbox|production>'\n```\n\n## Support and Reporting Issues\n\nIf you encounter any issues, discover a bug, or have suggestions for improvements, please feel free to contact me or open an issue on GitHub repository.\n\nFor urgent matters or specific inquiries, you can reach me out at **Email**: lorenzo@rottigni.net\n\nI appreciate your feedback and I will do my best to address any concerns in a timely manner. Thank you for using Scalapay Payment Plugin!\n","2024-10-02T13:24:37.000Z",135,{"id":1704,"slug":1697,"createdAt":1706,"updatedAt":1706,"code":1707,"path":1708,"thumb":1709,"providerUrl":95,"provider":96,"nuxtPath":1708},"2025-02-11T11:23:15.554Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984711810111010011711410145115999710897112971214611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/vendure-scalapay.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/vendure-scalapay.webp",{"id":1063,"uid":1711,"createdAt":1712,"updatedAt":1713,"enabled":9,"name":1714,"slug":1714,"category":76,"avatarUrl":77,"url":1715,"publicUrl":1716,"private":80,"description":77,"language":520,"size":1717,"stargazersCount":83,"defaultBranch":84,"readmemd":1718,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":1719,"mediaId":77,"assetId":1720,"asset":1721},641432194,"2023-05-16T13:06:06.000Z","2023-05-16T13:17:40.000Z","iubenda-nuxt-module","https://api.github.com/repos/LorenzoRottigni/iubenda-nuxt-module","https://github.com/LorenzoRottigni/iubenda-nuxt-module",244,"# Iubenda Nuxt Module\n\n[![npm version][npm-version-src]][npm-version-href]\n[![npm downloads][npm-downloads-src]][npm-downloads-href]\n[![Github Actions CI][github-actions-ci-src]][github-actions-ci-href]\n[![Codecov][codecov-src]][codecov-href]\n[![License][license-src]][license-href]\n\n> Easily integrate Iubenda with Nuxt.js\n\n[📖 **Release Notes**](./CHANGELOG.md)\n\n## Setup\n\n1. Add `iubenda-module` dependency to your project\n\n```bash\nyarn add iubenda-module # or npm install iubenda-module\n```\n\n2. Add `iubenda-module` to the `modules` section of `nuxt.config.js`\n\n```js\n{\n modules: [\n // Simple usage\n 'iubenda-module',\n\n // With options\n ['iubenda-module', { /* module options */ }]\n ]\n}\n```\n\n## Module Options\n\n```js\n{\n iubenda: {\n // Defaults:\n dev: true, // Activate module in dev environment.\n consentMode: true, // Use Google's consent mode.\n links: {\n enable: true, // Add script to include links to policy pages.\n style: 'nostyle', // Add styling to links. (nostyle, white or black)\n whiteLabel: true, // White label links.\n embed: true // Open links in embedded popup.\n },\n\n // Entire iubenda configuration\n config: {\n siteId: 12345, // Required\n cookiePolicyId: 12345, // Required\n\n // ...all other config options. (See Iubenda cookie banner script)\n // Example defaults:\n lang: 'en',\n gdprAppliesGlobally: false,\n cookiePolicyInOtherWindow: false,\n consentOnContinuedBrowsing: false,\n perPurposeConsent: true,\n banner: {\n acceptButtonDisplay: true,\n customizeButtonDisplay: true,\n rejectButtonDisplay: false,\n acceptButtonColor: 'black',\n acceptButtonCaptionColor: 'white',\n customizeButtonColor: '#bbb',\n customizeButtonCaptionColor: 'black',\n rejectButtonColor: 'white',\n rejectButtonCaptionColor: 'black',\n closeButtonDisplay: false,\n position: 'float-bottom-right',\n textColor: '#333',\n backgroundColor: '#ddd'\n }\n }\n\n i18n: {} // See integrations.\n }\n}\n```\n\n## Use in Vue templates\n\nThe included plugin provides the following properties to use in your Vue components:\n\n```js\n$iubenda.privacyPolicyUrl // Link to privacy policy\n$iubenda.cookiePolicyUrl // Link to cookie policy\n$iubenda.privacyPolicyApiUrl // Url to use in an API call for the privacy policy\n$iubenda.cookiePolicyApiUrl // Url to use in an API call for the cookie policy\n$iubenda.getPrivacyPolicyLinkHtml('Label', attributes) // Link tag to the privacy policy page / popup\n$iubenda.getCookiePolicyLinkHtml('Label', attributes) // Link tag to the cookie policy page / popup\n```\n\nExample:\n```html\n \u003Ctemplate>\n \u003Cdiv v-html=\"$iubenda.getPrivacyPolicyLinkHtml('Privacybeleid', {classes: 'link'})\">\u003C/div>\n \u003Cdiv v-html=\"$iubenda.getCookiePolicyLinkHtml('Cookiebeleid', {classes: 'another-link'})\">\u003C/div>\n \u003C/template>\n```\n\nWill render (depending on your 'links' options):\n```html\n \u003Cdiv>\n \u003Ca \n href=\"https://www.iubenda.com/privacy-policy/12345\" \n class=\"iubenda-nostyle no-brand iubenda-noiframe iubenda-embed link\"\n title=\"Privacybeleid\">\n Privacybeleid\n \u003C/a>\n \u003Ca \n href=\"https://www.iubenda.com/privacy-policy/12345/cookie-policy\" \n class=\"iubenda-nostyle no-brand iubenda-noiframe iubenda-embed another-link\" \n title=\"Cookiebeleid\">\n Cookiebeleid\n \u003C/a>\n \u003C/div>\n```\n\n## Components\n\n### PageEmbed\n\nUsed to embed the cookie policy and privacy policy page in your site.\n\nImport component.\n```js\nimport PageEmbed from 'iubenda-module/lib/components/PageEmbed.vue'\n```\n\nUse in template.\n```html\n \u003CPageEmbed type=\"cookie\" loadingText=\"Loading cookie policy\" errorText=\"Something went wrong\">\n```\n\n#### Props\n\n- type:\n Can either be 'cookie' or 'privacy'. Defaults to 'privacy'.\n- loadingText:\n The text shown when the content is being fetched. Defaults to 'Loading content...'.\n- errorText:\n The text shown when the fetch has failed. Defaults to 'Error fetching content'.\n\n\n## Integrations\n\n### nuxt/i18n\n\n!! Work in progress...\n\nCurrently only the PageEmbed component inherits the locale from the i18n module. You only have to set the correct configuration as below.\n\n#### Configuration\n\n```\n// nuxt.config.js\n{\n iubenda: {\n // ...other options\n i18n: {\n en: {\n cookiePolicyId: 123456\n },\n nl: {\n cookiePolicyId: 123456\n }\n }\n }\n}\n```\n\n## License\n\n[MIT License](./LICENSE)\n\nCopyright (c) Lorenzo Rottigni \u003Clorenzo@rottigni.net>\n\n\u003C!-- Badges -->\n[npm-version-src]: https://img.shields.io/npm/v/iubenda-module/latest.svg\n[npm-version-href]: https://npmjs.com/package/iubenda-module\n\n[npm-downloads-src]: https://img.shields.io/npm/dt/iubenda-module.svg\n[npm-downloads-href]: https://npmjs.com/package/iubenda-module\n\n[github-actions-ci-src]: https://github.com/maneuver-agency/iubenda-nuxt-module/workflows/ci/badge.svg\n[github-actions-ci-href]: https://github.com/maneuver-agency/iubenda-nuxt-module/actions?query=workflow%3Aci\n\n[codecov-src]: https://img.shields.io/codecov/c/github/maneuver-agency/iubenda-nuxt-module.svg\n[codecov-href]: https://codecov.io/gh/maneuver-agency/iubenda-nuxt-module\n\n[license-src]: https://img.shields.io/npm/l/iubenda-module.svg\n[license-href]: https://npmjs.com/package/iubenda-module\n","2023-05-17T07:48:04.000Z",136,{"id":1720,"slug":1714,"createdAt":1722,"updatedAt":1722,"code":1723,"path":1724,"thumb":1725,"providerUrl":95,"provider":96,"nuxtPath":1724},"2025-02-11T11:23:19.781Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847105117981011101009745110117120116451091111001171081014611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/iubenda-nuxt-module.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/iubenda-nuxt-module.webp",{"id":1081,"uid":1727,"createdAt":1728,"updatedAt":1729,"enabled":9,"name":1730,"slug":1730,"category":76,"avatarUrl":77,"url":1731,"publicUrl":1732,"private":80,"description":1733,"language":199,"size":1734,"stargazersCount":83,"defaultBranch":84,"readmemd":1735,"topicRaw":1736,"visibility":86,"provider":87,"pushedAt":1737,"mediaId":77,"assetId":1738,"asset":1739},446537063,"2022-01-10T18:25:16.000Z","2023-05-19T10:18:03.000Z","web-notebook","https://api.github.com/repos/LorenzoRottigni/web-notebook","https://github.com/LorenzoRottigni/web-notebook","Markdown files to store technical documentation",2399,"# Lorenzo Rottigni's technical documentations\nThis repository contains all the technical documentations I wrote during my career, including courses, analysis, self learning, and much more.\n\nFile index.yml contains the index of all the documents, and it is used to seed https://portfolio.rottigni.tech/docs .","markdown;md","2023-06-07T13:16:47.000Z",137,{"id":1738,"slug":1730,"createdAt":1740,"updatedAt":1740,"code":1741,"path":1742,"thumb":1743,"providerUrl":95,"provider":96,"nuxtPath":1742},"2025-02-11T11:23:24.597Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471191019845110111116101981111111074611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/web-notebook.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/web-notebook.webp",{"id":1098,"uid":1745,"createdAt":1746,"updatedAt":1747,"enabled":9,"name":1748,"slug":1748,"category":103,"avatarUrl":77,"url":1749,"publicUrl":1750,"private":80,"description":1751,"language":520,"size":1752,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":1753,"visibility":86,"provider":87,"pushedAt":1754,"mediaId":77,"assetId":1755,"asset":1756},417137473,"2021-10-14T13:16:57.000Z","2022-11-21T14:30:11.000Z","js-array-carousel","https://api.github.com/repos/LorenzoRottigni/js-array-carousel","https://github.com/LorenzoRottigni/js-array-carousel","Boolean academy JS vanilla carousel",152,"boolean;carousel;css;html;javascript","2021-10-14T20:10:02.000Z",138,{"id":1755,"slug":1748,"createdAt":1757,"updatedAt":1757,"code":1758,"path":1759,"thumb":1760,"providerUrl":95,"provider":96,"nuxtPath":1759},"2025-02-11T11:23:29.845Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471061154597114114971214599971141111171151011084611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/js-array-carousel.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/js-array-carousel.webp",{"id":1115,"uid":1762,"createdAt":1763,"updatedAt":1764,"enabled":9,"name":1765,"slug":1766,"category":1767,"avatarUrl":1768,"url":1769,"publicUrl":1769,"private":9,"description":85,"language":1770,"size":1771,"stargazersCount":83,"defaultBranch":84,"readmemd":1772,"topicRaw":1773,"visibility":1774,"provider":1775,"pushedAt":1776,"mediaId":77,"assetId":1777,"asset":1778},46860103,"2023-06-14T15:44:01.063Z","2025-10-08T00:50:05.486Z","ai.deesup.com","aideesupcom","rottigni.tech","https://gitlab.com/uploads/-/system/project/avatar/46860103/brain.png","https://gitlab.com/LorenzoRottigni/ai.deesup.com","celery",57446,"# ai.deesup.com\nThis is a task queue based Machine Learning application that aims to provide data predictions based on Deesup datasets.\n\n\nai.deesup.com service ports:\n- 5672: rabbitmq service\n- 15672: rabbitmq service\n- 15673: rabbitmq service\n- 5555: flower service\n- 9090: prometheus service\n- 3000: grafana service\n- 8000: flask service\n\n\n## Celery\nCelery is a task queue with batteries included. It’s easy to use so that you can get started without learning the full complexities of the problem it solves.\nThere's a worker that executes tasks, and there are clients that submit tasks to the worker.\nTasks may also be submitted using REST API provided by Flower.\n\nsrcelery/celery_worker.py => entrypoint\nsrcelery/tasks => tasks definitions\nsrcelery/client => celery client scripts to perform tasks\ndatasets => datasets loaded by google_storage.fetch_latest_dataset, make sure volume in local has open permissions\n\n\nCelery uses Pickle serializer instead the default JSON serializer because it supports pandas dataframes.\nNote the Pickle serializer deals with untrusted data, so you should never accept serialized data from untrusted sources or deserialize it with pickle.loads() without using the safe kwarg.\n\n\nIn order to run a celery client is necessary to run the module with -m flag or the module wouldn't be able to use imports.\n- python -m srcelery.client.\u003Cstandalone-client> (ex. python3 -m srcelery.client.pipeline)\n\n\n## RabbitMQ\nRabbitMQ is a message broker: it accepts and forwards messages. RabbitMQ makes Celery able to operate at large scale and high throughput.\nIt exposes a REST API for management/monitoring and a management UI.\nIn dev environment, the management UI is available at http://localhost:15672/ with guest/guest credentials.\n\n\nPORTS:\n- 15672: management UI => HTTP GET :15672\n- 5672: AMQP port => amqp://\u003Cusername>:\u003Cpassword>@\u003Chostname>:5672/\n- 5673: backend port => rpc://\u003Cusername>:\u003Cpassword>@\u003Chostname>:5673/\n\n\nAPI:\n- curl -u guest:guest http://localhost:15672/api/whoami => { \"name\":\"guest\", \"tags\":\"administrator\" }\n \n\n## Flower\nFlower is a web based tool for monitoring and administrating Celery clusters.\n\n\nFlower API documentation is available at /api/ endpoint:\n- POST /api/task/async-apply/\u003Ctask_name>/ => works only if celery_worker is inside flower container, otherwise use send-task\n- POST /api/task/send-task/\u003Ctask_name>/\n- GET /api/tasks\n\n\n## Prometheus\nPrometheus is a monitoring system and time series database. It collects metrics from configured targets at given intervals, evaluates rule expressions, displays the results, and can trigger alerts if some condition is observed to be true.\nPrometheus provides a functional query language called PromQL (Prometheus Query Language) that lets the user select and aggregate time series data in real time.\n\n\nPORTS:\n- 9090: Prometheus UI => HTTP GET :9090\n\n\n## Grafana\nGradana is a multi-platform open source analytics and interactive visualization web application. It provides charts, graphs, and alerts for the web when connected to supported data sources.\nGrafana supports querying Prometheus and makes it easy to create and edit dashboards, query data, create alerts and share dashboards with other users.\nIn dev environment, the management UI is available at http://localhost:3000/ with admin/admin credentials.\n\n\nPORTS:\n- 3000: Grafana UI => HTTP GET :3000\n\n\n## Deesup data\nDeesup Vendure service exposes a GraphQL API exportProducts that builds and uploads an xlsx export to Cloud Storage.\nai.deesup.com is able to retrieve the latest dataset from Cloud Storage and to load it.\n\n\nProducts dataframe structures:\n\n- id: number\n- name: string | null\n- slug: string | null\n- description: string | null\n- category.alpha: string | null\n- category.beta: string | null\n- category.gamma: string | null\n- category.delta: string | null\n- views.count: number | null\n- wishlist.count: number | null\n- timestamp.created: number | Date | null\n- price: number | null\n- price.original: number | null\n- 'price.starting': number | null\n- 'price.limit': number | null\n- 'sold.individually': Binary\n- 'items.per.stock'?: number | null\n- 'quantity': number | null\n- 'seller.type': 'private' | 'professional' | null\n- weight: number | null\n- height: number | null\n- width: number | null\n- depth: number | null\n- heighSeat: number | null\n- 'lamp.included': Binary\n- 'out.of.production': Binary\n- designer: string | null\n- material: string | null\n- brand: string | null\n- color: string | null\n- style: string | null\n- conditions: string | null\n\n## Flask\nFlask web interface is exposed on port 8000 and is the web entrypoint of the application.\nIt's possible to run Flask outside Docker using command:\n\n\n```\npython3 flask/app.py\n```","celery;docker;flower;machine-learning;python;scikit-learn","private","GitLab","2023-11-01T19:48:26.296Z",139,{"id":1777,"slug":1766,"createdAt":1779,"updatedAt":1779,"code":1780,"path":1781,"thumb":1782,"providerUrl":95,"provider":96,"nuxtPath":1781},"2025-02-11T11:23:33.448Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610897984797105100101101115117112991111094611910198112","/portfolio.rottigni.tech/seed/assets/repos/gitlab/aideesupcom.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/gitlab/aideesupcom.webp",{"id":1132,"uid":1784,"createdAt":1785,"updatedAt":1786,"enabled":9,"name":1787,"slug":1787,"category":103,"avatarUrl":77,"url":1788,"publicUrl":1789,"private":80,"description":1790,"language":520,"size":1791,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":1792,"visibility":86,"provider":87,"pushedAt":1793,"mediaId":77,"assetId":1794,"asset":1795},414958788,"2021-10-08T11:23:55.000Z","2022-11-21T14:34:38.000Z","js-biglietto-treno","https://api.github.com/repos/LorenzoRottigni/js-biglietto-treno","https://github.com/LorenzoRottigni/js-biglietto-treno","Boolean academy JS train ticket snippet",990,"boolean;css;html;javascript","2021-10-08T11:59:33.000Z",140,{"id":1794,"slug":1787,"createdAt":1796,"updatedAt":1796,"code":1797,"path":1798,"thumb":1799,"providerUrl":95,"provider":96,"nuxtPath":1798},"2025-02-11T11:23:37.356Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471061154598105103108105101116116111451161141011101114611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/js-biglietto-treno.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/js-biglietto-treno.webp",{"id":1150,"uid":1801,"createdAt":1802,"updatedAt":1803,"enabled":9,"name":1804,"slug":1804,"category":103,"avatarUrl":77,"url":1805,"publicUrl":1806,"private":80,"description":1807,"language":520,"size":1808,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":1809,"visibility":86,"provider":87,"pushedAt":1810,"mediaId":77,"assetId":1811,"asset":1812},419338063,"2021-10-20T13:18:29.000Z","2022-11-21T14:27:16.000Z","js-campominato-dom","https://api.github.com/repos/LorenzoRottigni/js-campominato-dom","https://github.com/LorenzoRottigni/js-campominato-dom","Boolean academy JS campominato webgame",2332,"boolean;css;html;javascript;webgame","2021-10-21T11:09:25.000Z",141,{"id":1811,"slug":1804,"createdAt":1813,"updatedAt":1813,"code":1814,"path":1815,"thumb":1816,"providerUrl":95,"provider":96,"nuxtPath":1815},"2025-02-11T11:23:41.230Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984710611545999710911211110910511097116111451001111094611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/js-campominato-dom.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/js-campominato-dom.webp",{"id":1167,"uid":1818,"createdAt":1819,"updatedAt":1820,"enabled":9,"name":1821,"slug":1821,"category":103,"avatarUrl":77,"url":1822,"publicUrl":1823,"private":80,"description":77,"language":520,"size":1752,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":1824,"visibility":86,"provider":87,"pushedAt":1825,"mediaId":77,"assetId":1826,"asset":1827},422595324,"2021-10-29T13:57:59.000Z","2022-11-21T14:11:10.000Z","vue-slider","https://api.github.com/repos/LorenzoRottigni/vue-slider","https://github.com/LorenzoRottigni/vue-slider","boolean;javascript;slider;vuejs","2021-10-31T15:11:05.000Z",142,{"id":1826,"slug":1821,"createdAt":1828,"updatedAt":1828,"code":1829,"path":1830,"thumb":1831,"providerUrl":95,"provider":96,"nuxtPath":1830},"2025-02-11T11:23:45.158Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847118117101451151081051001011144611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/vue-slider.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/vue-slider.webp",{"id":1185,"uid":1833,"createdAt":1834,"updatedAt":1835,"enabled":9,"name":1836,"slug":1836,"category":103,"avatarUrl":77,"url":1837,"publicUrl":1838,"private":80,"description":1839,"language":144,"size":38,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":1840,"visibility":86,"provider":87,"pushedAt":1841,"mediaId":77,"assetId":1842,"asset":1843},424031009,"2021-11-02T23:35:06.000Z","2022-11-21T14:09:49.000Z","vue-todolist","https://api.github.com/repos/LorenzoRottigni/vue-todolist","https://github.com/LorenzoRottigni/vue-todolist","Boolean academy project: TODO list with Vuejs CDN","boolean;cdn;todolist;vuejs","2021-11-03T10:42:52.000Z",143,{"id":1842,"slug":1836,"createdAt":1844,"updatedAt":1844,"code":1845,"path":1846,"thumb":1847,"providerUrl":95,"provider":96,"nuxtPath":1846},"2025-02-11T11:23:49.124Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847118117101451161111001111081051151164611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/vue-todolist.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/vue-todolist.webp",{"id":1202,"uid":1849,"createdAt":1850,"updatedAt":1851,"enabled":9,"name":1852,"slug":1853,"category":76,"avatarUrl":77,"url":1854,"publicUrl":1855,"private":80,"description":1856,"language":81,"size":230,"stargazersCount":83,"defaultBranch":84,"readmemd":1857,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":1858,"mediaId":77,"assetId":1508,"asset":1859},634528101,"2023-04-30T12:28:28.000Z","2023-04-30T12:43:35.000Z","WAN-scraper","wan-scraper","https://api.github.com/repos/LorenzoRottigni/WAN-scraper","https://github.com/LorenzoRottigni/WAN-scraper","Web scraper that works with DNS servers to collect random data around the world.","# WAN-scraper\n\n## Overview\nThis is a web scraping project using Python Scrapy to collect data from a list of random websites. The goal is to gather information on website structure, content, and other relevant data for analysis.\n\n## Requirements\n- Python 3.x\n- Scrapy\n\n## Installation & Usage\n1. Clone the repository: `git clone https://github.com/LorenzoRottigni/WAN-scraper.git`\n2. Create venv \"scraper\": `python3 -m venv scraper`\n3. Activate scraper venv: `source scraper/bin/activate`\n4. Install dependencies: `pip3 install -r requirements.txt`\n5. Run Scrapy spider: `scrapy crawl wan_scraper`\n6. The spider will visit the URLs in the `start_urls` list in `wan_scraper/spiders/wan_scraper.py`, collect data, and save it to a CSV file located in the project directory.\n\n## Additional Information\n- The spider is set to obey the `robots.txt` file on each website visited, but please use caution and follow ethical scraping practices.\n- Feel free to modify the spider's behavior to suit your needs by editing the code in `wan_scraper/spiders/wan_scraper.py`.\n- For more information on using Scrapy, please refer to the [official documentation](https://docs.scrapy.org/en/latest/index.html).\n","2023-04-30T14:30:33.000Z",{"id":1508,"slug":1853,"createdAt":1860,"updatedAt":1860,"code":1861,"path":1862,"thumb":1863,"providerUrl":95,"provider":96,"nuxtPath":1862},"2025-02-11T11:23:53.782Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847119971104511599114971121011144611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/wan-scraper.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/wan-scraper.webp",{"id":1219,"uid":1865,"createdAt":1866,"updatedAt":1867,"enabled":9,"name":1868,"slug":1868,"category":103,"avatarUrl":77,"url":1869,"publicUrl":1870,"private":80,"description":1871,"language":520,"size":137,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":1872,"visibility":86,"provider":87,"pushedAt":1873,"mediaId":77,"assetId":1874,"asset":1875},421830605,"2021-10-27T13:31:07.000Z","2022-11-21T14:14:44.000Z","js-simon","https://api.github.com/repos/LorenzoRottigni/js-simon","https://github.com/LorenzoRottigni/js-simon","Boolean academy Javascript snippet","boolean;css;html;javascript;slider","2021-10-27T21:26:28.000Z",145,{"id":1874,"slug":1868,"createdAt":1876,"updatedAt":1876,"code":1877,"path":1878,"thumb":1879,"providerUrl":95,"provider":96,"nuxtPath":1878},"2025-02-11T11:23:58.311Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847106115451151051091111104611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/js-simon.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/js-simon.webp",{"id":855,"uid":1881,"createdAt":1882,"updatedAt":1883,"enabled":9,"name":1884,"slug":1884,"category":103,"avatarUrl":77,"url":1885,"publicUrl":1886,"private":80,"description":1887,"language":520,"size":1888,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":1809,"visibility":86,"provider":87,"pushedAt":1889,"mediaId":77,"assetId":1890,"asset":1891},418978710,"2021-10-19T15:15:43.000Z","2022-11-21T14:28:17.000Z","js-campominato-grid","https://api.github.com/repos/LorenzoRottigni/js-campominato-grid","https://github.com/LorenzoRottigni/js-campominato-grid","Boolean academy project campominato grid system",2211,"2021-10-20T13:40:36.000Z",146,{"id":1890,"slug":1884,"createdAt":1892,"updatedAt":1892,"code":1893,"path":1894,"thumb":1895,"providerUrl":95,"provider":96,"nuxtPath":1894},"2025-02-11T11:24:05.124Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984710611545999710911211110910511097116111451031141051004611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/js-campominato-grid.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/js-campominato-grid.webp",{"id":1253,"uid":1897,"createdAt":1898,"updatedAt":1899,"enabled":9,"name":1900,"slug":1900,"category":103,"avatarUrl":77,"url":1901,"publicUrl":1902,"private":80,"description":1620,"language":520,"size":98,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":1903,"visibility":86,"provider":87,"pushedAt":1904,"mediaId":77,"assetId":573,"asset":1905},421035261,"2021-10-25T13:27:52.000Z","2022-11-21T14:20:17.000Z","js-snack-es6","https://api.github.com/repos/LorenzoRottigni/js-snack-es6","https://github.com/LorenzoRottigni/js-snack-es6","boolean;css;html;javascript;snippet","2021-10-25T19:43:38.000Z",{"id":573,"slug":1900,"createdAt":1906,"updatedAt":1906,"code":1907,"path":1908,"thumb":1909,"providerUrl":95,"provider":96,"nuxtPath":1908},"2025-02-11T11:24:09.021Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984710611545115110979910745101115544611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/js-snack-es6.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/js-snack-es6.webp",{"id":1270,"uid":1911,"createdAt":1912,"updatedAt":1913,"enabled":9,"name":1914,"slug":1914,"category":103,"avatarUrl":77,"url":1915,"publicUrl":1916,"private":80,"description":1917,"language":107,"size":1918,"stargazersCount":83,"defaultBranch":109,"readmemd":110,"topicRaw":1919,"visibility":86,"provider":87,"pushedAt":1920,"mediaId":77,"assetId":823,"asset":1921},447231795,"2022-01-12T13:37:50.000Z","2022-11-21T11:37:02.000Z","laravel-base-crud","https://api.github.com/repos/LorenzoRottigni/laravel-base-crud","https://github.com/LorenzoRottigni/laravel-base-crud","Boolean project to learn Laravel CRUD",556,"boolean;crud;laravel;mvc;vuejs","2022-01-14T13:32:51.000Z",{"id":823,"slug":1914,"createdAt":1922,"updatedAt":1922,"code":1923,"path":1924,"thumb":1925,"providerUrl":95,"provider":96,"nuxtPath":1924},"2025-02-11T11:24:13.509Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847108971149711810110845989711510145991141171004611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/laravel-base-crud.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/laravel-base-crud.webp",{"id":1288,"uid":1927,"createdAt":1928,"updatedAt":1929,"enabled":9,"name":1930,"slug":1930,"category":103,"avatarUrl":77,"url":1931,"publicUrl":1932,"private":80,"description":1933,"language":107,"size":1934,"stargazersCount":83,"defaultBranch":109,"readmemd":110,"topicRaw":1935,"visibility":86,"provider":87,"pushedAt":1936,"mediaId":77,"assetId":1937,"asset":1938},449056763,"2022-01-17T21:41:37.000Z","2022-11-21T11:32:29.000Z","laravel-boolpress","https://api.github.com/repos/LorenzoRottigni/laravel-boolpress","https://github.com/LorenzoRottigni/laravel-boolpress","Boolean academy project: wordpress copy to learning Laravel",1219,"blade;blade-template;boolean;laravel;mvc;php;vuejs;wordpress","2022-01-28T16:39:12.000Z",149,{"id":1937,"slug":1930,"createdAt":1939,"updatedAt":1939,"code":1940,"path":1941,"thumb":1942,"providerUrl":95,"provider":96,"nuxtPath":1941},"2025-02-11T11:24:17.633Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847108971149711810110845981111111081121141011151154611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/laravel-boolpress.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/laravel-boolpress.webp",{"id":1305,"uid":1944,"createdAt":1945,"updatedAt":1946,"enabled":9,"name":1947,"slug":1947,"category":103,"avatarUrl":77,"url":1948,"publicUrl":1949,"private":80,"description":1950,"language":107,"size":1951,"stargazersCount":83,"defaultBranch":109,"readmemd":110,"topicRaw":1952,"visibility":86,"provider":87,"pushedAt":1953,"mediaId":77,"assetId":1389,"asset":1954},440589022,"2021-12-21T16:53:14.000Z","2022-11-21T11:54:44.000Z","laravel-comics","https://api.github.com/repos/LorenzoRottigni/laravel-comics","https://github.com/LorenzoRottigni/laravel-comics","Boolean project: DC website using Laravel & VueJS",1034,"boolean;crud;laravel;mvc;vuejs2","2021-12-26T22:01:42.000Z",{"id":1389,"slug":1947,"createdAt":1955,"updatedAt":1955,"code":1956,"path":1957,"thumb":1958,"providerUrl":95,"provider":96,"nuxtPath":1957},"2025-02-11T11:24:21.827Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984710897114971181011084599111109105991154611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/laravel-comics.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/laravel-comics.webp",{"id":1322,"uid":1960,"createdAt":1961,"updatedAt":1962,"enabled":9,"name":1963,"slug":1963,"category":103,"avatarUrl":77,"url":1964,"publicUrl":1965,"private":80,"description":1966,"language":107,"size":558,"stargazersCount":83,"defaultBranch":109,"readmemd":110,"topicRaw":1967,"visibility":86,"provider":87,"pushedAt":1968,"mediaId":77,"assetId":1969,"asset":1970},446503121,"2022-01-10T16:40:32.000Z","2022-11-21T11:36:25.000Z","laravel-migration-seeder","https://api.github.com/repos/LorenzoRottigni/laravel-migration-seeder","https://github.com/LorenzoRottigni/laravel-migration-seeder","Boolean project to learn Laravel seeders","boolean;crud;laravel;mvc;mysql;php;seeder","2022-01-10T16:41:00.000Z",151,{"id":1969,"slug":1963,"createdAt":1971,"updatedAt":1971,"code":1972,"path":1973,"thumb":1974,"providerUrl":95,"provider":96,"nuxtPath":1973},"2025-02-11T11:24:26.208Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984710897114971181011084510910510311497116105111110451151011011001011144611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/laravel-migration-seeder.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/laravel-migration-seeder.webp",{"id":1340,"uid":1976,"createdAt":1977,"updatedAt":1978,"enabled":9,"name":1979,"slug":1979,"category":103,"avatarUrl":77,"url":1980,"publicUrl":1981,"private":80,"description":1982,"language":107,"size":524,"stargazersCount":83,"defaultBranch":109,"readmemd":110,"topicRaw":1983,"visibility":86,"provider":87,"pushedAt":1984,"mediaId":77,"assetId":1752,"asset":1985},446418903,"2022-01-10T12:41:51.000Z","2022-11-21T11:37:58.000Z","laravel-model-controller","https://api.github.com/repos/LorenzoRottigni/laravel-model-controller","https://github.com/LorenzoRottigni/laravel-model-controller","Boolean project to learn Laravel MVC pattern","blade;boolean;crud;laravel;mvc;php;vuejs2","2022-01-10T12:42:50.000Z",{"id":1752,"slug":1979,"createdAt":1986,"updatedAt":1986,"code":1987,"path":1988,"thumb":1989,"providerUrl":95,"provider":96,"nuxtPath":1988},"2025-02-11T11:24:30.528Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984710897114971181011084510911110010110845991111101161141111081081011144611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/laravel-model-controller.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/laravel-model-controller.webp",{"id":1358,"uid":1991,"createdAt":1992,"updatedAt":1993,"enabled":9,"name":1994,"slug":1994,"category":76,"avatarUrl":77,"url":1995,"publicUrl":1996,"private":80,"description":1997,"language":107,"size":1998,"stargazersCount":83,"defaultBranch":109,"readmemd":110,"topicRaw":1999,"visibility":86,"provider":87,"pushedAt":2000,"mediaId":77,"assetId":2001,"asset":2002},439377725,"2021-12-17T15:29:55.000Z","2022-11-21T11:56:02.000Z","laravel-primi-passi","https://api.github.com/repos/LorenzoRottigni/laravel-primi-passi","https://github.com/LorenzoRottigni/laravel-primi-passi","Boolean academy project: first laravel project",433,"crud;laravel;mvc;php","2021-12-17T15:30:38.000Z",153,{"id":2001,"slug":1994,"createdAt":2003,"updatedAt":2003,"code":2004,"path":2005,"thumb":2006,"providerUrl":95,"provider":96,"nuxtPath":2005},"2025-02-11T11:24:34.627Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984710897114971181011084511211410510910545112971151151054611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/laravel-primi-passi.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/laravel-primi-passi.webp",{"id":609,"uid":2008,"createdAt":2009,"updatedAt":2010,"enabled":9,"name":2011,"slug":2011,"category":76,"avatarUrl":77,"url":2012,"publicUrl":2013,"private":80,"description":2014,"language":128,"size":2015,"stargazersCount":83,"defaultBranch":84,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2016,"mediaId":77,"assetId":2017,"asset":2018},620925716,"2023-03-29T16:34:30.000Z","2023-03-30T07:48:38.000Z","lord-icon-thief","https://api.github.com/repos/LorenzoRottigni/lord-icon-thief","https://github.com/LorenzoRottigni/lord-icon-thief","Script to generate lottie json file on filesystem from a list of lord-icon urls",250,"2023-03-30T12:28:12.000Z",154,{"id":2017,"slug":2011,"createdAt":2019,"updatedAt":2019,"code":2020,"path":2021,"thumb":2022,"providerUrl":95,"provider":96,"nuxtPath":2021},"2025-02-11T11:24:39.524Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471081111141004510599111110451161041051011024611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/lord-icon-thief.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/lord-icon-thief.webp",{"id":447,"uid":2024,"createdAt":2025,"updatedAt":2026,"enabled":9,"name":2027,"slug":2027,"category":103,"avatarUrl":77,"url":2028,"publicUrl":2029,"private":80,"description":2030,"language":144,"size":171,"stargazersCount":83,"defaultBranch":109,"readmemd":2031,"topicRaw":1792,"visibility":86,"provider":87,"pushedAt":2032,"mediaId":77,"assetId":2033,"asset":2034},416752243,"2021-10-13T13:21:41.000Z","2022-11-21T14:31:18.000Z","js-mail-dadi","https://api.github.com/repos/LorenzoRottigni/js-mail-dadi","https://github.com/LorenzoRottigni/js-mail-dadi","Boolean academy JS dice snippet","# js-mail-dadi\nYou can reach \"mail-checker/mail-checker.html\" and \"dice-game/dice-game.html\" throught \"index.html\" menu\n","2021-10-14T08:30:55.000Z",155,{"id":2033,"slug":2027,"createdAt":2035,"updatedAt":2035,"code":2036,"path":2037,"thumb":2038,"providerUrl":95,"provider":96,"nuxtPath":2037},"2025-02-11T11:24:43.479Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847106115451099710510845100971001054611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/js-mail-dadi.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/js-mail-dadi.webp",{"id":1408,"uid":2040,"createdAt":2041,"updatedAt":2042,"enabled":9,"name":2043,"slug":2043,"category":103,"avatarUrl":77,"url":2044,"publicUrl":2045,"private":80,"description":1620,"language":144,"size":120,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":1792,"visibility":86,"provider":87,"pushedAt":2046,"mediaId":77,"assetId":2047,"asset":2048},416347758,"2021-10-12T13:25:48.000Z","2022-11-21T14:32:00.000Z","js-fizzbuzzdom","https://api.github.com/repos/LorenzoRottigni/js-fizzbuzzdom","https://github.com/LorenzoRottigni/js-fizzbuzzdom","2021-10-12T15:20:45.000Z",156,{"id":2047,"slug":2043,"createdAt":2049,"updatedAt":2049,"code":2050,"path":2051,"thumb":2052,"providerUrl":95,"provider":96,"nuxtPath":2051},"2025-02-11T11:24:47.385Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984710611545102105122122981171221221001111094611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/js-fizzbuzzdom.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/js-fizzbuzzdom.webp",{"id":1425,"uid":2054,"createdAt":2055,"updatedAt":2056,"enabled":9,"name":2057,"slug":2057,"category":103,"avatarUrl":77,"url":2058,"publicUrl":2059,"private":80,"description":2060,"language":144,"size":38,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":1792,"visibility":86,"provider":87,"pushedAt":2061,"mediaId":77,"assetId":2062,"asset":2063},415937132,"2021-10-11T13:24:33.000Z","2022-11-21T14:32:42.000Z","js-hamburger","https://api.github.com/repos/LorenzoRottigni/js-hamburger","https://github.com/LorenzoRottigni/js-hamburger","Boolean academy JS vanilla hamburger snippet","2021-10-11T13:38:13.000Z",157,{"id":2062,"slug":2057,"createdAt":2064,"updatedAt":2064,"code":2065,"path":2066,"thumb":2067,"providerUrl":95,"provider":96,"nuxtPath":2066},"2025-02-11T11:24:51.280Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471061154510497109981171141031011144611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/js-hamburger.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/js-hamburger.webp",{"id":981,"uid":2069,"createdAt":2070,"updatedAt":2071,"enabled":9,"name":2072,"slug":2072,"category":103,"avatarUrl":77,"url":2073,"publicUrl":2074,"private":80,"description":2075,"language":520,"size":38,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":2076,"visibility":86,"provider":87,"pushedAt":2077,"mediaId":77,"assetId":2078,"asset":2079},417506881,"2021-10-15T13:19:50.000Z","2022-11-21T14:29:34.000Z","js-jsnacks-blocco-2","https://api.github.com/repos/LorenzoRottigni/js-jsnacks-blocco-2","https://github.com/LorenzoRottigni/js-jsnacks-blocco-2","Boolean academy basic JS snippets","boolean;javascript","2021-10-15T15:03:33.000Z",158,{"id":2078,"slug":2072,"createdAt":2080,"updatedAt":2080,"code":2081,"path":2082,"thumb":2083,"providerUrl":95,"provider":96,"nuxtPath":2082},"2025-02-11T11:24:55.102Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471061154510611511097991071154598108111999911145504611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/js-jsnacks-blocco-2.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/js-jsnacks-blocco-2.webp",{"id":1458,"uid":2085,"createdAt":2086,"updatedAt":2087,"enabled":9,"name":2088,"slug":2088,"category":103,"avatarUrl":77,"url":2089,"publicUrl":2090,"private":80,"description":2075,"language":144,"size":137,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":2076,"visibility":86,"provider":87,"pushedAt":2091,"mediaId":77,"assetId":485,"asset":2092},418518945,"2021-10-18T13:41:36.000Z","2022-11-21T14:28:58.000Z","js-paliedispari","https://api.github.com/repos/LorenzoRottigni/js-paliedispari","https://github.com/LorenzoRottigni/js-paliedispari","2021-10-19T15:11:22.000Z",{"id":485,"slug":2088,"createdAt":2093,"updatedAt":2093,"code":2094,"path":2095,"thumb":2096,"providerUrl":95,"provider":96,"nuxtPath":2095},"2025-02-11T11:24:59.157Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471061154511297108105101100105115112971141054611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/js-paliedispari.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/js-paliedispari.webp",{"id":1476,"uid":2098,"createdAt":2099,"updatedAt":2100,"enabled":9,"name":2101,"slug":2101,"category":103,"avatarUrl":77,"url":2102,"publicUrl":2103,"private":80,"description":2104,"language":144,"size":2105,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":2106,"visibility":86,"provider":87,"pushedAt":2107,"mediaId":77,"assetId":2108,"asset":2109},419738243,"2021-10-21T13:38:46.000Z","2022-11-21T14:26:35.000Z","js-our-team","https://api.github.com/repos/LorenzoRottigni/js-our-team","https://github.com/LorenzoRottigni/js-our-team","Boolean academy HTML-JS project",1535,"boolean;css;csv;html;javascript","2021-10-21T15:33:24.000Z",160,{"id":2108,"slug":2101,"createdAt":2110,"updatedAt":2110,"code":2111,"path":2112,"thumb":2113,"providerUrl":95,"provider":96,"nuxtPath":2112},"2025-02-11T11:25:03.024Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471061154511111711445116101971094611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/js-our-team.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/js-our-team.webp",{"id":1494,"uid":2115,"createdAt":2116,"updatedAt":2117,"enabled":9,"name":2118,"slug":2118,"category":103,"avatarUrl":77,"url":2119,"publicUrl":2120,"private":80,"description":1620,"language":144,"size":83,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":1792,"visibility":86,"provider":87,"pushedAt":2121,"mediaId":77,"assetId":2122,"asset":2123},414574097,"2021-10-07T11:30:50.000Z","2022-11-21T14:35:18.000Z","js-pwdgen-wannabe","https://api.github.com/repos/LorenzoRottigni/js-pwdgen-wannabe","https://github.com/LorenzoRottigni/js-pwdgen-wannabe","2021-10-07T11:39:18.000Z",161,{"id":2122,"slug":2118,"createdAt":2124,"updatedAt":2124,"code":2125,"path":2126,"thumb":2127,"providerUrl":95,"provider":96,"nuxtPath":2126},"2025-02-11T11:25:06.980Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984710611545112119100103101110451199711011097981014611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/js-pwdgen-wannabe.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/js-pwdgen-wannabe.webp",{"id":1511,"uid":2129,"createdAt":2130,"updatedAt":2131,"enabled":9,"name":2132,"slug":2132,"category":103,"avatarUrl":77,"url":2133,"publicUrl":2134,"private":80,"description":1620,"language":520,"size":154,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":2135,"visibility":86,"provider":87,"pushedAt":2136,"mediaId":77,"assetId":2137,"asset":2138},421440860,"2021-10-26T13:41:08.000Z","2022-11-21T14:18:09.000Z","js-es6-icons","https://api.github.com/repos/LorenzoRottigni/js-es6-icons","https://github.com/LorenzoRottigni/js-es6-icons","boolean;css;html;icons;javascript","2021-10-26T20:41:27.000Z",162,{"id":2137,"slug":2132,"createdAt":2139,"updatedAt":2139,"code":2140,"path":2141,"thumb":2142,"providerUrl":95,"provider":96,"nuxtPath":2141},"2025-02-11T11:25:12.305Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847106115451011155445105991111101154611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/js-es6-icons.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/js-es6-icons.webp",{"id":2144,"uid":2145,"createdAt":2146,"updatedAt":2147,"enabled":9,"name":2148,"slug":2149,"category":1767,"avatarUrl":2150,"url":2151,"publicUrl":2152,"private":9,"description":2153,"language":2154,"size":77,"stargazersCount":83,"defaultBranch":84,"readmemd":2155,"topicRaw":2156,"visibility":1774,"provider":1775,"pushedAt":2147,"mediaId":77,"assetId":2157,"asset":2158},216,66871620,"2025-02-06T13:36:50.361Z","2025-02-11T13:30:25.220Z","s3.rottigni.tech","s3rottignitech","https://gitlab.com/uploads/-/system/project/avatar/66871620/s3-logo-min.png","https://gitlab.com/lr-labs/s3.rottigni.tech","https://gitlab.com/LorenzoRottigni/s3.rottigni.tech","S3 Storage Server powered by Minio and deployed on k8s","docker","# s3.rottigni.tech\n\n## Minio\n\n### Deployment\n\nCreate the Minio operator:\n```bash\nkubectl apply -f k8s/common/minio-operator.yaml\n# or\nkubectl apply -k \"github.com/minio/operator?ref=v7.0.0\"\n```\n\n### Localhost (Docker Desktop)\n\nCreate a persisted volume for the Minio tenant:\n```bash\nkubectl apply -f k8s/local/minio-tenant.yaml\n```\n\nCreate the Minio tenant:\n```bash\nkubectl apply -f k8s/local/minio-volume.yaml\n```\n\nExpose Minio console to the localhost:\n```bash\nkubectl port-forward -n minio-tenant service/myminio-console 9443:9443\n```\n\n\n### Production\n\nCreate a persisted volume for the Minio tenant:\n```bash\nkubectl apply -f k8s/prod/minio-tenant.yaml\n```\n\nCreate the Minio tenant:\n```bash\nkubectl apply -f k8s/prod/minio-volume.yaml\n```\n\nCreate TLS certificate:\n```bash\nkubectl apply -f k8s/prod/certificate.yaml\n```\n\nExpose Minio console via ingress:\n```bash\nkubectl apply -f k8s/prod/ingress.yaml\n```\n\n### Configuration\n\n#### CSI (Container Storage Interface)\n\nIt's necessary to manually create a persisted volume with one of the following storage classes:\n\n- hostpath: simpler CSI suitable for development or small application\n- directpv: CSI tailored for Minio capable to create distributed volumes across different nodes\n\nMinio tenant manifest configures its own persisted volume claim with a configurable size.\n\n#### Multiple Servers\n\nIt's generally recommended to run the s3 object storage across multiple servers.\n\n- servers: determine the number of minio servers available\n- volumesPerServer: determine the number of volumes for each server\n\nRunning more than 1 server requires the following stringData configuration:\n\n```bash\nexport MINIO_STORAGE_CLASS_STANDARD=\"EC:4\" \n```\n\n### Minio Client\n\nInstall the Minio client:\n\n```bash\nbrew install minio/stable/mc\nmc --help\n```\n\nConnect to an s3 server:\n\n```bash\nmc alias set s3-rottigni-tech https://s3.rottigni.tech ACCESS_KEY SECRET_KEY\n```\n\n### Reset\n\n#### Development\n```bash\nkubectl delete ns minio-tenant\nkubectl create ns minio-tenant\nkubectl apply -f k8s/local/minio-volume.yaml\nkubectl apply -f k8s/local/minio-tenant.yaml\nwatch kubectl events -n minio-tenant\nwatch kubectl get pods -n minio-tenant\n```\n\n#### Production\n```bash\nkubectl delete ns minio-tenant\nkubectl create ns minio-tenant\nkubectl apply -f k8s/s3.rottigni.tech/minio-volume.yaml\nkubectl apply -f k8s/s3.rottigni.tech/minio-tenant.yaml\nwatch kubectl events -n minio-tenant\nwatch kubectl get pods -n minio-tenant\n```\n\n\n\n","docker;kubernetes;minio;s3",299,{"id":2157,"slug":2149,"createdAt":2159,"updatedAt":2159,"code":2160,"path":2161,"thumb":2162,"providerUrl":95,"provider":96,"nuxtPath":2161},"2025-02-11T14:12:38.903Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610897984711551114111116116105103110105116101991044611910198112","/portfolio.rottigni.tech/seed/assets/repos/gitlab/s3rottignitech.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/gitlab/s3rottignitech.webp",{"id":2164,"uid":2165,"createdAt":2166,"updatedAt":2167,"enabled":9,"name":2168,"slug":2169,"category":1767,"avatarUrl":2170,"url":2171,"publicUrl":2172,"private":9,"description":2173,"language":2154,"size":77,"stargazersCount":83,"defaultBranch":84,"readmemd":2174,"topicRaw":2175,"visibility":1774,"provider":1775,"pushedAt":2167,"mediaId":77,"assetId":2176,"asset":2177},218,53844934,"2024-01-14T16:21:49.088Z","2024-04-11T09:40:44.499Z","omega.rottigni.tech","omegarottignitech","https://gitlab.com/uploads/-/system/project/avatar/53844934/avatar.png","https://gitlab.com/lr-labs/omega.rottigni.tech","https://gitlab.com/LorenzoRottigni/omega.rottigni.tech","This is the Nginx Ingress for omega.rottigni.tech, facilitating external access to services jupyterhub.rottigni.tech and sentry.rottigni.tech over the internet.","README.md omega.rottigni.tech\n","docker;nginx;reverse-proxy;vps",300,{"id":2176,"slug":2169,"createdAt":2178,"updatedAt":2178,"code":2179,"path":2180,"thumb":2181,"providerUrl":95,"provider":96,"nuxtPath":2180},"2025-02-11T14:12:42.402Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610897984711110910110397114111116116105103110105116101991044611910198112","/portfolio.rottigni.tech/seed/assets/repos/gitlab/omegarottignitech.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/gitlab/omegarottignitech.webp",{"id":2183,"uid":2184,"createdAt":2185,"updatedAt":2186,"enabled":9,"name":2187,"slug":2188,"category":1767,"avatarUrl":2189,"url":2190,"publicUrl":2191,"private":9,"description":2192,"language":2193,"size":77,"stargazersCount":83,"defaultBranch":84,"readmemd":2194,"topicRaw":2195,"visibility":1774,"provider":1775,"pushedAt":2186,"mediaId":77,"assetId":2196,"asset":2197},220,53770455,"2024-01-11T15:48:12.052Z","2024-01-15T16:20:50.654Z","runner.rottigni.tech","runnerrottignitech","https://gitlab.com/uploads/-/system/project/avatar/53770455/gitlab-runner.png","https://gitlab.com/lr-labs/runner.rottigni.tech","https://gitlab.com/LorenzoRottigni/runner.rottigni.tech","A Dockerized GitLab Runner instance, running three Docker-in-Docker (dind) runners, facilitates CI/CD pipelines across the LR Labs GitLab Group.","CI/CD","# Gitlab Runner\n\nRunning monorunner config for local development:\n\n```\ndocker-compose -f docker/docker-compose.local.yml up\n```\n\nRunning multirunner config for production:\n\n```\ndocker-compose -f docker/docker-compose.local.yml up\n```","CI/CD;dind;docker;gitlab;gitlab-runner",301,{"id":2196,"slug":2188,"createdAt":2198,"updatedAt":2198,"code":2199,"path":2200,"thumb":2201,"providerUrl":95,"provider":96,"nuxtPath":2200},"2025-02-11T14:12:45.904Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116108979847114117110110101114114111116116105103110105116101991044611910198112","/portfolio.rottigni.tech/seed/assets/repos/gitlab/runnerrottignitech.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/gitlab/runnerrottignitech.webp",{"id":2203,"uid":2204,"createdAt":2205,"updatedAt":2206,"enabled":9,"name":2207,"slug":2208,"category":1767,"avatarUrl":2209,"url":2210,"publicUrl":2211,"private":9,"description":2212,"language":2213,"size":77,"stargazersCount":83,"defaultBranch":84,"readmemd":2214,"topicRaw":2215,"visibility":1774,"provider":1775,"pushedAt":2206,"mediaId":77,"assetId":2216,"asset":2217},222,52324737,"2023-11-19T20:15:32.612Z","2025-09-30T09:05:37.679Z","k8s.rottigni.tech","k8srottignitech","https://gitlab.com/uploads/-/system/project/avatar/52324737/logo.png","https://gitlab.com/lr-labs/k8s.rottigni.tech","https://gitlab.com/LorenzoRottigni/k8s.rottigni.tech","LR Labs' Kubernetes cluster serves as the orchestrator for all services within the rottigni.tech ecosystem.","Containerd","# k8s.rottigni.tech\n\n## Minikube\n\n### Ports\n\n#### LoadBalancer port\n\n- run \"minikube tunnel\" to allow LoadBalancer to receive an external IP\n- run yaml fle containing LoadBalancer port specified\n\n#### NodePort\n\n- run yaml file containing NodePort\n- run yaml service \u003Cservice-name> (--url)\n \n#### ClusterIP\n\n- run yaml file contaning ClusterIP port\n\n### Ingress\n\n- run \"minikube tunnel\" to create a tunnel that binds the minikube VM to the localhost interface.\n- run yaml file containing Ingress configuration\n- edit /etc/hosts adding: 127.0.0.1 \u003Chost-from-ingress-config.info>\n- curl hello-world.info\n\n### Ingress + Registry\n\n```\nmkdir /opt/ecr\nmkdir /opt/ecr/auth\nmkdir /opt/ecr/data\n\nhtpasswd -Bbn lorenzo passwd > /opt/ecr/auth/htpasswd\n\nminikube tunnel\n\nkubectl apply -R -f k8s\n\nnano /etc/hosts -> 127.0.0.1 registry.rottigni.tech\n\ncurl registry.rottigni.tech:443\n```\n\n## Secrets & TLS Certs\n\n### localhost\n\n```\nopenssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout registry.rottigni.tech.key -out registry.rottigni.tech.crt -subj \"/CN=registry.rottigni.tech\" -addext \"subjectAltName=DNS:registry.rottigni.tech\"\n\ncp registry.rottigni.tech.key /opt/ssl/registry.rottigni.tech.key\ncp registry.rottigni.tech.crt /opt/ssl/registry.rottigni.tech.crt\n\nkubectl create secret tls registry-ssl --cert=/opt/ssl/registry.rottigni.tech.crt --key=/opt/ssl/registry.rottigni.tech.key -n lr-labs\n```\n\n```\nopenssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout portfolio.rottigni.tech.key -out portfolio.rottigni.tech.crt -subj \"/CN=portfolio.rottigni.tech\" -addext \"subjectAltName=DNS:portfolio.rottigni.tech\"\n\ncp portfolio.rottigni.tech.key /opt/ssl/portfolio.rottigni.tech.key\ncp portfolio.rottigni.tech.crt /opt/ssl/portfolio.rottigni.tech.crt\n\nkubectl create secret tls portfolio-ssl --cert=/opt/ssl/portfolio.rottigni.tech.crt --key=/opt/ssl/portfolio.rottigni.tech.key -n lr-labs\n```\n\n### Production\n\n```\nsudo certbot certonly --standalone -d registry.rottigni.tech\n\nkubectl create secret tls registry-ssl --cert=/etc/letsencrypt/live/registry.rottigni.tech/fullchain.pem --key=/etc/letsencrypt/live/registry.rottigni.tech/privkey.pem -n lr-labs\n```\n\n## Production K8s setup\n\n### Control Plane setup\n\n```\nsh sh/k8s-ubuntu.sh\nsh sh/k8s-control-plane.sh\n\n# labelling worker node\nkubectl label node zeta-rottigni-tech node-role.kubernetes.io/worker=true\n```\n\n### Worker Node setup\n\n```\nsh sh/k8s-ubuntu.sh\n\nkubeadm join \u003Ccontrol-plane-ip>:6443 --token \u003Ctoken> \\\n\t--discovery-token-ca-cert-hash \u003Csha256-token>\n\n\tkubeadm join 149.62.186.95:6443 --token l60hpw.155wv7bokkugntgf \\\n\t--discovery-token-ca-cert-hash sha256:bceeda74a963d2d9d2cef1e25c223111a4278304512e644e110de734e0f0df56\n```\n\n## Debugging\n\nUseful commands:\n\n```\n# get nginx logs\nkubectl logs -n ingress-nginx deploy/ingress-nginx-controller --follow --tail=200\n\n# restart nginx\nkubectl rollout restart -n=ingress-nginx deployment ingress-nginx-controller\n\n# get into nginx controller pod\nkubectl exec -it -n ingress-nginx deploy/ingress-nginx-controller -- /bin/sh\n\n\n# debug cert-manager\nkubectl get certificate wildcard-tls-secret -n lr-labs\nkubectl get certificate -n lr-labs\nkubectl get certificaterequest -n lr-labs\nkubectl describe certificate -n lr-labs wildcard-tls-secret\ndescribe certificaterequest -n lr-labs wildcard-tls-secret-cw88l\nkubectl logs -n cert-manager -l app=cert-manager\n\n# cleanup\nkubectl delete deployment,service,ingress,pods,endpoints --all -n lr-labs\nkubectl delete deployment,service,ingress,pods,endpoints --all -n cert-manager\nkubectl delete deployment,service,ingress,pods,endpoints --all -n ingress-nginx\n\nkubectl delete all --all -n lr-labs\nkubectl delete all --all -n cert-manager\nkubectl delete all --all -n ingress-nginx\nkubectl delete all --all -n default\n\nkubectl patch pvc -n=lr-labs registry-pvc -p '{\"metadata\":{\"finalizers\":null}}'\nkubectl patch pv portfolio-pv -p '{\"metadata\": {\"finalizers\": null}}'\n\nkubectl exec -it deploy/portfolio -n lr-labs -- /bin/bash\nkubectl exec -it pod/prisma-seeder-28415050-q4r87 -n lr-labs -- /bin/bash\n```\n\nDocs:\n\n- https://www.techrepublic.com/article/install-containerd-ubuntu/\n- https://kubernetes.io/docs/setup/production-environment/container-runtimes/\n- https://kubernetes.io/docs/reference/setup-tools/kubeadm/\n- https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/\n- https://medium.com/@olorunfemikawonise_56441/simplifying-kubernetes-installation-on-ubuntu-using-a-bash-shell-script-d75fed68a31\n- https://github.com/kubernetes/ingress-nginx/blob/main/docs/deploy/baremetal.md\n\n## Clean up the registry\n\n```\n# delete untagged images older then 14 days\nkubectl exec -n lr-labs -it deploy/registry -- sh -c 'find /var/lib/registry/docker/registry/v2/repositories/*/_manifests/tags/* -type d -mtime +14 -maxdepth 1 -exec rm -rf {} \\;'\n\n# delete unreferenced blob revisions\nkubectl exec -n lr-labs -it deploy/registry -- sh -c 'find /var/lib/registry/docker/registry/v2/repositories/*/_manifests/revisions/sha256/* -type d -mtime +14 -maxdepth 1 -exec rm -rf {} \\;'\n```","Containerd;MetalLB;bare-metal;ingress-nginx;kubeadm;kubernetes;minikube",302,{"id":2216,"slug":2208,"createdAt":2218,"updatedAt":2218,"code":2219,"path":2220,"thumb":2221,"providerUrl":95,"provider":96,"nuxtPath":2220},"2025-02-11T14:12:49.454Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610897984710756115114111116116105103110105116101991044611910198112","/portfolio.rottigni.tech/seed/assets/repos/gitlab/k8srottignitech.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/gitlab/k8srottignitech.webp",{"id":2223,"uid":2224,"createdAt":2225,"updatedAt":2226,"enabled":9,"name":2227,"slug":2228,"category":1767,"avatarUrl":2229,"url":2230,"publicUrl":2231,"private":9,"description":2232,"language":2154,"size":77,"stargazersCount":83,"defaultBranch":84,"readmemd":2233,"topicRaw":2234,"visibility":1774,"provider":1775,"pushedAt":2235,"mediaId":38,"assetId":189,"asset":2236},224,50248052,"2023-09-11T08:48:26.702Z","2025-10-09T00:16:19.125Z","sentry.rottigni.tech","sentryrottignitech","https://gitlab.com/uploads/-/system/project/avatar/50248052/grafana.png","https://gitlab.com/lr-labs/sentry.rottigni.tech","https://gitlab.com/LorenzoRottigni/sentry.rottigni.tech","This project is a monitoring solution designed to keep track of the status and performance of the rottigni.tech web environment.","# sentry.rottigni.tech\n\n## Project Overview\n\nThis project is a monitoring solution designed to keep track of the status and performance of the following projects:\n\n- [https://www.rottigni.tech](https://www.rottigni.tech)\n- [https://portfolio.rottigni.tech](https://portfolio.rottigni.tech)\n- [https://smtp.rottigni.tech](https://smtp.rottigni.tech)\n- [https://cv.rottigni.tech](https://cv.rottigni.tech)\n- [https://jupyterhub.rottigni.tech](https://jupyterhub.rottigni.tech)\n- [https://storage.rottigni.tech](https://storage.rottigni.tech)\n\n## Table of Contents\n\n- [sentry.rottigni.tech](#sentryrottignitech)\n - [Project Overview](#project-overview)\n - [Table of Contents](#table-of-contents)\n - [Getting Started](#getting-started)\n - [Prerequisites](#prerequisites)\n - [Installation](#installation)\n - [Usage](#usage)\n - [Docker Compose](#docker-compose)\n - [Grafana](#grafana)\n - [Prometheus](#prometheus)\n - [License](#license)\n\n## Getting Started\n\n### Prerequisites\n\nBefore running this project, you will need to have the following installed:\n\n- Docker\n- Docker Compose\n\n### Installation\n\n1. Clone this repository:\n\n```bash\ngit clone git@gitlab.com:LorenzoRottigni/sentry.rottigni.tech.git\n```\n\n2. Navigate to project directory:\n\n```bash\ncd sentry.rottigni.tech\n```\n\nBuild the Docker images:\n\n```bash\ndocker-compose build\n```\n\nStart the Docker containers:\n\n```bash\ndocker-compose up -d\n```\n\n## Usage\n\nOnce the Docker containers are running, you can access the monitoring dashboard at:\n\n- Grafana: [http://localhost:5000](http://localhost:5000)\n - Default Credentials: Username - admin, Password - admin\n- Prometheus: [http://localhost:9090](http://localhost:9090)\n\n## Docker Compose\n\nThe project uses Docker Compose to manage the containerized services. The `docker-compose.yml` file defines the services and their configurations.\n\n## Grafana\n\n[Grafana](https://grafana.com/) is an open-source analytics and monitoring platform. It provides a powerful and customizable dashboard for visualizing metrics and logs.\n\n## Prometheus\n\n[Prometheus](https://prometheus.io/) is an open-source monitoring and alerting toolkit. It collects and stores time-series data and can be used to query and alert on that data.\n\n## License\n\nThis project is licensed under the [MIT License](LICENSE).\n","docker;grafana;prometheus;sentry","2024-03-04T15:32:58.112Z",{"id":189,"slug":2228,"createdAt":2237,"updatedAt":2237,"code":2238,"path":2239,"thumb":2240,"providerUrl":95,"provider":96,"nuxtPath":2239},"2025-02-11T10:44:41.141Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547109101100105974711810510910111147115101110116114121114111116116105103110105116101991044611910198112","/portfolio.rottigni.tech/seed/assets/media/vimeo/sentryrottignitech.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/media/vimeo/sentryrottignitech.webp",{"id":2242,"uid":2243,"createdAt":2244,"updatedAt":2245,"enabled":9,"name":2246,"slug":2247,"category":1767,"avatarUrl":2248,"url":2249,"publicUrl":2250,"private":9,"description":2251,"language":2154,"size":77,"stargazersCount":83,"defaultBranch":84,"readmemd":2252,"topicRaw":2253,"visibility":1774,"provider":1775,"pushedAt":2245,"mediaId":77,"assetId":2254,"asset":2255},226,48741550,"2023-08-23T12:16:30.675Z","2025-02-11T09:49:41.737Z","smtp.rottigni.tech","smtprottignitech","https://gitlab.com/uploads/-/system/project/avatar/48741550/avatar.png","https://gitlab.com/lr-labs/smtp.rottigni.tech","https://gitlab.com/LorenzoRottigni/smtp.rottigni.tech","A straightforward SMTP server enabling LR Labs services to send emails globally.","README.md smtp.rottigni.tech","docker;fastify;smtp",304,{"id":2254,"slug":2247,"createdAt":2256,"updatedAt":2256,"code":2257,"path":2258,"thumb":2259,"providerUrl":95,"provider":96,"nuxtPath":2258},"2025-02-11T14:12:56.652Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116108979847115109116112114111116116105103110105116101991044611910198112","/portfolio.rottigni.tech/seed/assets/repos/gitlab/smtprottignitech.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/gitlab/smtprottignitech.webp",{"id":2261,"uid":2262,"createdAt":2263,"updatedAt":2264,"enabled":9,"name":2265,"slug":2266,"category":1767,"avatarUrl":2267,"url":2268,"publicUrl":2269,"private":9,"description":2270,"language":2154,"size":77,"stargazersCount":83,"defaultBranch":84,"readmemd":2271,"topicRaw":2175,"visibility":1774,"provider":1775,"pushedAt":2264,"mediaId":77,"assetId":2272,"asset":2273},228,48605573,"2023-08-18T13:25:00.237Z","2024-01-15T10:42:07.752Z","gamma.rottigni.tech","gammarottignitech","https://gitlab.com/uploads/-/system/project/avatar/48605573/nginxo.png","https://gitlab.com/lr-labs/gamma.rottigni.tech","https://gitlab.com/LorenzoRottigni/gamma.rottigni.tech","This is the deprecated Nginx Ingress for gamma.rottigni.tech, facilitating external access to services www.rottigni.tech, sentry.rottigni.tech, and smtp.rottigni.tech over the internet.","README.md gamma.rottigni.tech",305,{"id":2272,"slug":2266,"createdAt":2274,"updatedAt":2274,"code":2275,"path":2276,"thumb":2277,"providerUrl":95,"provider":96,"nuxtPath":2276},"2025-02-11T14:13:00.103Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161089798471039710910997114111116116105103110105116101991044611910198112","/portfolio.rottigni.tech/seed/assets/repos/gitlab/gammarottignitech.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/gitlab/gammarottignitech.webp",{"id":2279,"uid":2280,"createdAt":2281,"updatedAt":2282,"enabled":9,"name":1767,"slug":2283,"category":1767,"avatarUrl":2284,"url":2285,"publicUrl":2286,"private":9,"description":2287,"language":2154,"size":77,"stargazersCount":83,"defaultBranch":109,"readmemd":950,"topicRaw":2288,"visibility":1774,"provider":1775,"pushedAt":2282,"mediaId":77,"assetId":2289,"asset":2290},230,48412024,"2023-08-10T20:12:54.412Z","2025-02-17T11:13:52.087Z","rottignitech","https://gitlab.com/uploads/-/system/project/avatar/48412024/svelte.png","https://gitlab.com/lr-labs/rottigni.tech","https://gitlab.com/LorenzoRottigni/rottigni.tech","rottigni.tech Projects Hub: A landing page that serves as a central entry point for the various ecosystems within rottigni.tech.","docker;svelte;sveltekit",306,{"id":2289,"slug":2283,"createdAt":2291,"updatedAt":2291,"code":2292,"path":2293,"thumb":2294,"providerUrl":95,"provider":96,"nuxtPath":2293},"2025-02-11T14:13:03.639Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116108979847114111116116105103110105116101991044611910198112","/portfolio.rottigni.tech/seed/assets/repos/gitlab/rottignitech.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/gitlab/rottignitech.webp",{"id":2296,"uid":2297,"createdAt":2298,"updatedAt":2299,"enabled":9,"name":2300,"slug":2301,"category":1767,"avatarUrl":2302,"url":2303,"publicUrl":2304,"private":80,"description":2305,"language":2306,"size":77,"stargazersCount":83,"defaultBranch":84,"readmemd":2307,"topicRaw":2308,"visibility":86,"provider":1775,"pushedAt":2299,"mediaId":77,"assetId":2309,"asset":2310},232,48381787,"2023-08-09T19:10:03.154Z","2024-05-08T14:00:03.950Z","storage.jupyterhub.rottigni.tech","storagejupyterhubrottignitech","https://gitlab.com/uploads/-/system/project/avatar/48381787/jupytero.jpeg","https://gitlab.com/lr-labs/storage.jupyterhub.rottigni.tech","https://gitlab.com/LorenzoRottigni/storage.jupyterhub.rottigni.tech","Lorenzo Rottigni's Jupyter storage automatically synchronized with jupyterhub.rottigni.tech, ensuring versioned tracking of all changes.","jupyter","# storage.jupyterhub.rottigni.tech\n\n\nThis is a public repository contaning user-generated content of jupyterhub.rottigni.tech, it's automatically kept up-to-date by a cron job running on jupyterhub.rottigni.tech.","jupyter;jupyterhub",307,{"id":2309,"slug":2301,"createdAt":2311,"updatedAt":2311,"code":2312,"path":2313,"thumb":2314,"providerUrl":95,"provider":96,"nuxtPath":2313},"2025-02-11T14:13:07.639Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161089798471151161111149710310110611711212111610111410411798114111116116105103110105116101991044611910198112","/portfolio.rottigni.tech/seed/assets/repos/gitlab/storagejupyterhubrottignitech.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/gitlab/storagejupyterhubrottignitech.webp",{"id":2316,"uid":2317,"createdAt":2318,"updatedAt":2319,"enabled":9,"name":2320,"slug":2321,"category":1767,"avatarUrl":2322,"url":2323,"publicUrl":2324,"private":9,"description":2325,"language":2326,"size":77,"stargazersCount":83,"defaultBranch":84,"readmemd":2327,"topicRaw":2328,"visibility":1774,"provider":1775,"pushedAt":2319,"mediaId":77,"assetId":2329,"asset":2330},234,48225761,"2023-08-03T13:24:09.629Z","2024-04-19T08:22:37.738Z","jupyterhub.rottigni.tech","jupyterhubrottignitech","https://gitlab.com/uploads/-/system/project/avatar/48225761/logo.png","https://gitlab.com/lr-labs/jupyterhub.rottigni.tech","https://gitlab.com/LorenzoRottigni/jupyterhub.rottigni.tech","Lorenzo Rottigni's self-hosted Jupyterhub server.","bash","# jupyterhub.rottigni.tech\n\n\nWelcome to **jupyterhub.rottigni.tech**, Lorenzo Rottigni's personal JupyterHub service.\n\n\n## Getting Started\n\nTo initiate the JupyterHub service on the HTTPS port 443, execute the following command:\n\n```\ndocker-compose build\ndocker-compose up jupyterhub backup_runner --remove-orphans -d\n```\n\n\nPlease note that it's essential to build the \"jupyternb\" image before launching the hub; otherwise, it won't be discoverable in the local registry.\n\n## Authentication\n\nThis JupyterHub instance employs the `jupyterhub.auth.DummyAuthenticator`, allowing any user to authenticate using the same password (defined in `jupyterhub_config.py`).\n\n\nAs this serves as a personal notebook, the username for personal use should be set as \"lorenzo\": this allows the synchronization of user files within the repository.\n\n\nOnce authenticated, the JupyterHub container will generate a child container named `jupyter-\u003Cusername>`. It utilizes a custom image named \"jupyternb,\" constructed from the `Dockerfile.jupyternb` (configured via `c.DockerSpawner.image`).\n\n\nThis feature, referred to as \"user-specified subcontainers,\" offers benefits such as isolation, resource efficiency, scalability, and simplified cleanup.\n\n\nEach authenticated user will have their container, containing their personal documents stored as internal Docker volumes.\n\n\n## Backup\n\nThe jupyterhub.rottigni.tech service provides an exposed service known as `backup_runner,\" which serves the purpose of synchronizing data generated by the user \"lorenzo\" with a designated Git repository.\n\n\nEnclosed within an Alpine container, this service incorporates a cron job that runs every 30 minutes.\n\n\nIts function is to synchronize the Docker volume of the \"lorenzo\" user with the repository hosted at https://gitlab.com/LorenzoRottigni/jupyterhub-storage.\n","bash;docker;git;jupyter;jupyterhub",308,{"id":2329,"slug":2321,"createdAt":2331,"updatedAt":2331,"code":2332,"path":2333,"thumb":2334,"providerUrl":95,"provider":96,"nuxtPath":2333},"2025-02-11T14:13:11.162Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610897984710611711212111610111410411798114111116116105103110105116101991044611910198112","/portfolio.rottigni.tech/seed/assets/repos/gitlab/jupyterhubrottignitech.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/gitlab/jupyterhubrottignitech.webp",{"id":2336,"uid":2337,"createdAt":2338,"updatedAt":2339,"enabled":9,"name":2340,"slug":2341,"category":1767,"avatarUrl":2342,"url":2343,"publicUrl":2344,"private":9,"description":2345,"language":2154,"size":77,"stargazersCount":83,"defaultBranch":84,"readmemd":2346,"topicRaw":2175,"visibility":1774,"provider":1775,"pushedAt":2339,"mediaId":77,"assetId":2347,"asset":2348},236,43682929,"2023-02-20T14:08:05.624Z","2024-01-15T10:37:04.455Z","alpha.rottigni.tech","alpharottignitech","https://gitlab.com/uploads/-/system/project/avatar/43682929/nginx.png","https://gitlab.com/lr-labs/alpha.rottigni.tech","https://gitlab.com/LorenzoRottigni/alpha.rottigni.tech","This is the deprecated Nginx Ingress for alpha.rottigni.tech, facilitating external access to the service portfolio.rottigni.tech over the internet.","README.md alpha.rottigni.tech",309,{"id":2347,"slug":2341,"createdAt":2349,"updatedAt":2349,"code":2350,"path":2351,"thumb":2352,"providerUrl":95,"provider":96,"nuxtPath":2351},"2025-02-11T14:13:14.641Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161089798479710811210497114111116116105103110105116101991044611910198112","/portfolio.rottigni.tech/seed/assets/repos/gitlab/alpharottignitech.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/gitlab/alpharottignitech.webp",{"id":2354,"uid":2355,"createdAt":2356,"updatedAt":2357,"enabled":9,"name":2358,"slug":2359,"category":1767,"avatarUrl":2360,"url":2361,"publicUrl":2362,"private":9,"description":2363,"language":2154,"size":77,"stargazersCount":83,"defaultBranch":84,"readmemd":2364,"topicRaw":2175,"visibility":1774,"provider":1775,"pushedAt":2357,"mediaId":77,"assetId":2365,"asset":2366},238,43672539,"2023-02-20T08:32:15.140Z","2024-07-30T08:11:53.039Z","beta.rottigni.tech","betarottignitech","https://gitlab.com/uploads/-/system/project/avatar/43672539/nginx.png","https://gitlab.com/lr-labs/beta.rottigni.tech","https://gitlab.com/LorenzoRottigni/beta.rottigni.tech","This is the Nginx Ingress for beta.rottigni.tech, facilitating external access to the service storage.rottigni.tech over the internet.","README.md beta.rottigni.tech\n",310,{"id":2365,"slug":2359,"createdAt":2367,"updatedAt":2367,"code":2368,"path":2369,"thumb":2370,"providerUrl":95,"provider":96,"nuxtPath":2369},"2025-02-11T14:13:18.150Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161089798479810111697114111116116105103110105116101991044611910198112","/portfolio.rottigni.tech/seed/assets/repos/gitlab/betarottignitech.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/gitlab/betarottignitech.webp",{"id":2372,"uid":2373,"createdAt":2374,"updatedAt":2375,"enabled":9,"name":2376,"slug":2377,"category":1767,"avatarUrl":2378,"url":2379,"publicUrl":2380,"private":9,"description":2381,"language":2382,"size":77,"stargazersCount":83,"defaultBranch":84,"readmemd":2383,"topicRaw":2384,"visibility":1774,"provider":1775,"pushedAt":2375,"mediaId":77,"assetId":2385,"asset":2386},240,42862177,"2023-01-24T17:35:21.339Z","2025-08-03T20:15:11.863Z","cv.rottigni.tech","cvrottignitech","https://gitlab.com/uploads/-/system/project/avatar/42862177/android-chrome-512x512.png","https://gitlab.com/lr-labs/cv.rottigni.tech","https://gitlab.com/LorenzoRottigni/cv.rottigni.tech","Lorenzo Rottigni's web-based curriculum vitae, developed using ReactJS and featuring version control.","css","# Getting Started with Create React App\n\nThis project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).\n\n## Available Scripts\n\nIn the project directory, you can run:\n\n### `yarn start`\n\nRuns the app in the development mode.\\\nOpen [http://localhost:3000](http://localhost:3000) to view it in the browser.\n\nThe page will reload if you make edits.\\\nYou will also see any lint errors in the console.\n\n### `yarn test`\n\nLaunches the test runner in the interactive watch mode.\\\nSee the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.\n\n### `yarn build`\n\nBuilds the app for production to the `build` folder.\\\nIt correctly bundles React in production mode and optimizes the build for the best performance.\n\nThe build is minified and the filenames include the hashes.\\\nYour app is ready to be deployed!\n\nSee the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.\n\n### `yarn eject`\n\n**Note: this is a one-way operation. Once you `eject`, you can’t go back!**\n\nIf you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.\n\nInstead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.\n\nYou don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.\n\n## Learn More\n\nYou can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).\n\nTo learn React, check out the [React documentation](https://reactjs.org/).\n","css;cv;html;pug;sass",311,{"id":2385,"slug":2377,"createdAt":2387,"updatedAt":2387,"code":2388,"path":2389,"thumb":2390,"providerUrl":95,"provider":96,"nuxtPath":2389},"2025-02-11T14:13:21.732Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610897984799118114111116116105103110105116101991044611910198112","/portfolio.rottigni.tech/seed/assets/repos/gitlab/cvrottignitech.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/gitlab/cvrottignitech.webp",{"id":2392,"uid":2393,"createdAt":2394,"updatedAt":2395,"enabled":9,"name":2396,"slug":2397,"category":1767,"avatarUrl":2398,"url":2399,"publicUrl":2400,"private":9,"description":2401,"language":2402,"size":77,"stargazersCount":83,"defaultBranch":84,"readmemd":2403,"topicRaw":2404,"visibility":1774,"provider":1775,"pushedAt":2395,"mediaId":77,"assetId":108,"asset":2405},242,41187588,"2022-11-18T19:00:10.662Z","2025-01-25T12:57:18.602Z","storage.rottigni.tech","storagerottignitech","https://gitlab.com/uploads/-/system/project/avatar/41187588/android-chrome-512x512.png","https://gitlab.com/lr-labs/storage.rottigni.tech","https://gitlab.com/LorenzoRottigni/storage.rottigni.tech","A high-speed static content provider, implemented in Python Flask, to supply assets across the LR Labs ecosystem.","flask","# storage.rottigni.tech\n\n## Development server\n```\n- python3 -m venv venv\n- source venv/bin/activate\n- pip3 install -r requirements.txt\n- flask run\n```\n! make sure to have installed libmagic on OS\n! make sure that file /var/data/storage/storage_rottigni_tech/flaskr/http.log exists\n! make sure that directory /var/data/storage/ exists\n! make sure that file /tmp/storage/storage.rottigni.tech.db","flask;python;sqlalchemy;sqlite;storage",{"id":108,"slug":2397,"createdAt":2406,"updatedAt":2406,"code":2407,"path":2408,"thumb":2409,"providerUrl":95,"provider":96,"nuxtPath":2408},"2025-02-11T14:13:25.213Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610897984711511611111497103101114111116116105103110105116101991044611910198112","/portfolio.rottigni.tech/seed/assets/repos/gitlab/storagerottignitech.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/gitlab/storagerottignitech.webp",{"id":2411,"uid":2412,"createdAt":2413,"updatedAt":2414,"enabled":9,"name":2415,"slug":2416,"category":1767,"avatarUrl":2417,"url":2418,"publicUrl":2419,"private":9,"description":2420,"language":2421,"size":77,"stargazersCount":83,"defaultBranch":109,"readmemd":2422,"topicRaw":2423,"visibility":1774,"provider":1775,"pushedAt":2414,"mediaId":77,"assetId":2424,"asset":2425},245,41023518,"2022-11-13T20:59:27.783Z","2025-10-06T08:44:02.144Z","portfolio.rottigni.tech","portfoliorottignitech","https://gitlab.com/uploads/-/system/project/avatar/41023518/android-chrome-512x512.png","https://gitlab.com/lr-labs/portfolio.rottigni.tech","https://gitlab.com/LorenzoRottigni/portfolio.rottigni.tech","Lorenzo Rottigni's personal web portfolio.","Nitro","## README.md portfolio.rottigni.tech\n","Nitro;css;html;nuxtjs;prisma;sass;sqlite;typecript;vuejs",313,{"id":2424,"slug":2416,"createdAt":2426,"updatedAt":2426,"code":2427,"path":2428,"thumb":2429,"providerUrl":95,"provider":96,"nuxtPath":2428},"2025-02-11T14:13:28.842Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116108979847112111114116102111108105111114111116116105103110105116101991044611910198112","/portfolio.rottigni.tech/seed/assets/repos/gitlab/portfoliorottignitech.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/gitlab/portfoliorottignitech.webp",{"id":2431,"uid":2432,"createdAt":2433,"updatedAt":2434,"enabled":9,"name":2435,"slug":2436,"category":1767,"avatarUrl":2437,"url":2438,"publicUrl":2439,"private":9,"description":2440,"language":2441,"size":77,"stargazersCount":83,"defaultBranch":84,"readmemd":77,"topicRaw":2441,"visibility":1774,"provider":1775,"pushedAt":2434,"mediaId":77,"assetId":2442,"asset":2443},345,52174642,"2023-11-14T16:13:11.076Z","2025-02-11T14:04:20.455Z","network.rottigni.tech","networkrottignitech","https://gitlab.com/uploads/-/system/project/avatar/52174642/network.png","https://gitlab.com/lr-labs/network.rottigni.tech","https://gitlab.com/LorenzoRottigni/network.rottigni.tech","A versioned network schema of the LR Labs ecosystem created using Draw.io.","Drawio",465,{"id":2442,"slug":2436,"createdAt":2444,"updatedAt":2444,"code":2445,"path":2446,"thumb":2447,"providerUrl":95,"provider":96,"nuxtPath":2446},"2025-02-12T00:13:40.146Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116108979847110101116119111114107114111116116105103110105116101991044611910198112","/portfolio.rottigni.tech/seed/assets/repos/gitlab/networkrottignitech.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/gitlab/networkrottignitech.webp",{"id":2449,"uid":2450,"createdAt":2451,"updatedAt":2452,"enabled":9,"name":2453,"slug":2453,"category":76,"avatarUrl":77,"url":2454,"publicUrl":2455,"private":80,"description":77,"language":520,"size":583,"stargazersCount":83,"defaultBranch":84,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2456,"mediaId":77,"assetId":2457,"asset":2458},6511,956106172,"2025-03-27T17:53:18.000Z","2025-03-27T18:07:24.000Z","napi-rs-orm","https://api.github.com/repos/LorenzoRottigni/napi-rs-orm","https://github.com/LorenzoRottigni/napi-rs-orm","2025-03-27T18:07:21.000Z",3185,{"id":2457,"slug":2453,"createdAt":2459,"updatedAt":2459,"code":2460,"path":2461,"thumb":2462,"providerUrl":95,"provider":96,"nuxtPath":2461},"2025-04-29T00:19:17.905Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471109711210545114115451111141094611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/napi-rs-orm.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/napi-rs-orm.webp",{"id":2464,"uid":2465,"createdAt":2466,"updatedAt":2467,"enabled":9,"name":2468,"slug":2468,"category":76,"avatarUrl":77,"url":2469,"publicUrl":2470,"private":80,"description":2471,"language":1010,"size":154,"stargazersCount":83,"defaultBranch":84,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2472,"mediaId":77,"assetId":2473,"asset":2474},6516,940655747,"2025-02-28T15:02:33.000Z","2025-02-28T15:07:04.000Z","opencv-rust-c","https://api.github.com/repos/LorenzoRottigni/opencv-rust-c","https://github.com/LorenzoRottigni/opencv-rust-c","OpenCV camera using Rust and C++","2025-02-28T15:07:00.000Z",3186,{"id":2473,"slug":2468,"createdAt":2475,"updatedAt":2475,"code":2476,"path":2477,"thumb":2478,"providerUrl":95,"provider":96,"nuxtPath":2477},"2025-04-29T00:19:23.345Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847111112101110991184511411711511645994611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/opencv-rust-c.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/opencv-rust-c.webp",{"id":2480,"uid":2481,"createdAt":2482,"updatedAt":2483,"enabled":9,"name":2484,"slug":2484,"category":76,"avatarUrl":77,"url":2485,"publicUrl":2486,"private":80,"description":77,"language":520,"size":601,"stargazersCount":83,"defaultBranch":84,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2487,"mediaId":77,"assetId":2488,"asset":2489},6517,943409653,"2025-03-05T16:58:48.000Z","2025-03-06T09:16:33.000Z","rust-napi-rs","https://api.github.com/repos/LorenzoRottigni/rust-napi-rs","https://github.com/LorenzoRottigni/rust-napi-rs","2025-03-06T09:16:29.000Z",3187,{"id":2488,"slug":2484,"createdAt":2490,"updatedAt":2490,"code":2491,"path":2492,"thumb":2493,"providerUrl":95,"provider":96,"nuxtPath":2492},"2025-04-29T00:19:28.775Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471141171151164511097112105451141154611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/rust-napi-rs.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/rust-napi-rs.webp",{"id":2495,"uid":2496,"createdAt":2497,"updatedAt":2498,"enabled":9,"name":2499,"slug":2499,"category":76,"avatarUrl":77,"url":2500,"publicUrl":2501,"private":80,"description":77,"language":77,"size":83,"stargazersCount":83,"defaultBranch":84,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2498,"mediaId":77,"assetId":2502,"asset":2503},6519,944431164,"2025-03-07T10:33:07.000Z","2025-03-07T10:33:08.000Z","rust-neon","https://api.github.com/repos/LorenzoRottigni/rust-neon","https://github.com/LorenzoRottigni/rust-neon",3188,{"id":2502,"slug":2499,"createdAt":2504,"updatedAt":2504,"code":2505,"path":2506,"thumb":2507,"providerUrl":95,"provider":96,"nuxtPath":2506},"2025-04-29T00:19:32.397Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847114117115116451101011111104611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/rust-neon.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/rust-neon.webp",{"id":2509,"uid":2510,"createdAt":2511,"updatedAt":2512,"enabled":9,"name":2513,"slug":2513,"category":76,"avatarUrl":77,"url":2514,"publicUrl":2515,"private":80,"description":77,"language":1010,"size":120,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2516,"mediaId":77,"assetId":2517,"asset":2518},6521,946039578,"2025-03-10T14:13:31.000Z","2025-03-10T14:58:09.000Z","rust-neon-runtime-compilation","https://api.github.com/repos/LorenzoRottigni/rust-neon-runtime-compilation","https://github.com/LorenzoRottigni/rust-neon-runtime-compilation","2025-03-10T14:58:06.000Z",3189,{"id":2517,"slug":2513,"createdAt":2519,"updatedAt":2519,"code":2520,"path":2521,"thumb":2522,"providerUrl":95,"provider":96,"nuxtPath":2521},"2025-04-29T00:19:37.308Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984711411711511645110101111110451141171101161051091014599111109112105108971161051111104611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/rust-neon-runtime-compilation.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/rust-neon-runtime-compilation.webp",{"id":2524,"uid":2525,"createdAt":2526,"updatedAt":2527,"enabled":9,"name":2528,"slug":2528,"category":76,"avatarUrl":77,"url":2529,"publicUrl":2530,"private":80,"description":77,"language":1010,"size":98,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2531,"mediaId":77,"assetId":2532,"asset":2533},6523,944397837,"2025-03-07T09:25:17.000Z","2025-03-07T09:36:50.000Z","rust-node-serialization","https://api.github.com/repos/LorenzoRottigni/rust-node-serialization","https://github.com/LorenzoRottigni/rust-node-serialization","2025-03-07T09:36:46.000Z",3190,{"id":2532,"slug":2528,"createdAt":2534,"updatedAt":2534,"code":2535,"path":2536,"thumb":2537,"providerUrl":95,"provider":96,"nuxtPath":2536},"2025-04-29T00:19:42.296Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847114117115116451101111001014511510111410597108105122971161051111104611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/rust-node-serialization.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/rust-node-serialization.webp",{"id":2539,"uid":2540,"createdAt":2541,"updatedAt":2542,"enabled":9,"name":2543,"slug":2543,"category":76,"avatarUrl":77,"url":2544,"publicUrl":2545,"private":80,"description":77,"language":1010,"size":2546,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2547,"mediaId":77,"assetId":2548,"asset":2549},6525,943790701,"2025-03-06T09:16:55.000Z","2025-03-06T10:07:58.000Z","rust-runtime-codegen","https://api.github.com/repos/LorenzoRottigni/rust-runtime-codegen","https://github.com/LorenzoRottigni/rust-runtime-codegen",166,"2025-03-06T10:07:55.000Z",3191,{"id":2548,"slug":2543,"createdAt":2550,"updatedAt":2550,"code":2551,"path":2552,"thumb":2553,"providerUrl":95,"provider":96,"nuxtPath":2552},"2025-04-29T00:19:47.574Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471141171151164511411711011610510910145991111001011031011104611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/rust-runtime-codegen.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/rust-runtime-codegen.webp",{"id":2555,"uid":2556,"createdAt":2557,"updatedAt":2557,"enabled":9,"name":2558,"slug":2558,"category":76,"avatarUrl":77,"url":2559,"publicUrl":2560,"private":80,"description":77,"language":77,"size":83,"stargazersCount":83,"defaultBranch":84,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2557,"mediaId":77,"assetId":2561,"asset":2562},6527,944421312,"2025-03-07T10:12:27.000Z","rust-runtime-node-gen","https://api.github.com/repos/LorenzoRottigni/rust-runtime-node-gen","https://github.com/LorenzoRottigni/rust-runtime-node-gen",3192,{"id":2561,"slug":2558,"createdAt":2563,"updatedAt":2563,"code":2564,"path":2565,"thumb":2566,"providerUrl":95,"provider":96,"nuxtPath":2565},"2025-04-29T00:19:51.287Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471141171151164511411711011610510910145110111100101451031011104611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/rust-runtime-node-gen.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/rust-runtime-node-gen.webp",{"id":2568,"uid":2569,"createdAt":2570,"updatedAt":2571,"enabled":9,"name":2572,"slug":2572,"category":76,"avatarUrl":77,"url":2573,"publicUrl":2574,"private":80,"description":77,"language":1010,"size":98,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2575,"mediaId":77,"assetId":2576,"asset":2577},6529,944416460,"2025-03-07T10:02:26.000Z","2025-03-07T10:10:25.000Z","rust-runtime-wasm-gen","https://api.github.com/repos/LorenzoRottigni/rust-runtime-wasm-gen","https://github.com/LorenzoRottigni/rust-runtime-wasm-gen","2025-03-07T10:10:21.000Z",3193,{"id":2576,"slug":2572,"createdAt":2578,"updatedAt":2578,"code":2579,"path":2580,"thumb":2581,"providerUrl":95,"provider":96,"nuxtPath":2580},"2025-04-29T00:19:56.424Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847114117115116451141171101161051091014511997115109451031011104611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/rust-runtime-wasm-gen.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/rust-runtime-wasm-gen.webp",{"id":2583,"uid":2584,"createdAt":2585,"updatedAt":2586,"enabled":9,"name":2587,"slug":2587,"category":76,"avatarUrl":77,"url":2588,"publicUrl":2589,"private":80,"description":77,"language":1010,"size":137,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2590,"mediaId":77,"assetId":2591,"asset":2592},6531,958636447,"2025-04-01T14:15:45.000Z","2025-04-01T14:19:09.000Z","rust-sniffer","https://api.github.com/repos/LorenzoRottigni/rust-sniffer","https://github.com/LorenzoRottigni/rust-sniffer","2025-04-01T14:19:06.000Z",3194,{"id":2591,"slug":2587,"createdAt":2593,"updatedAt":2593,"code":2594,"path":2595,"thumb":2596,"providerUrl":95,"provider":96,"nuxtPath":2595},"2025-04-29T00:20:00.409Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847114117115116451151101051021021011144611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/rust-sniffer.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/rust-sniffer.webp",{"id":2598,"uid":2599,"createdAt":2600,"updatedAt":2600,"enabled":9,"name":2601,"slug":2601,"category":76,"avatarUrl":77,"url":2602,"publicUrl":2603,"private":80,"description":77,"language":77,"size":83,"stargazersCount":83,"defaultBranch":84,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2600,"mediaId":77,"assetId":2604,"asset":2605},6533,946030175,"2025-03-10T13:58:06.000Z","rust-ssr","https://api.github.com/repos/LorenzoRottigni/rust-ssr","https://github.com/LorenzoRottigni/rust-ssr",3195,{"id":2604,"slug":2601,"createdAt":2606,"updatedAt":2606,"code":2607,"path":2608,"thumb":2609,"providerUrl":95,"provider":96,"nuxtPath":2608},"2025-04-29T00:20:04.001Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847114117115116451151151144611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/rust-ssr.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/rust-ssr.webp",{"id":2611,"uid":2612,"createdAt":2613,"updatedAt":2614,"enabled":9,"name":2615,"slug":2615,"category":76,"avatarUrl":77,"url":2616,"publicUrl":2617,"private":80,"description":2618,"language":1010,"size":137,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2619,"mediaId":77,"assetId":2620,"asset":2621},6535,941017947,"2025-03-01T09:31:47.000Z","2025-03-01T09:49:38.000Z","rust-surveillance","https://api.github.com/repos/LorenzoRottigni/rust-surveillance","https://github.com/LorenzoRottigni/rust-surveillance","Rust surveillance platform based on open-cv deployed within a network of raspberry-pis","2025-03-01T09:49:35.000Z",3196,{"id":2620,"slug":2615,"createdAt":2622,"updatedAt":2622,"code":2623,"path":2624,"thumb":2625,"providerUrl":95,"provider":96,"nuxtPath":2624},"2025-04-29T00:20:07.992Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471141171151164511511711411810110510810897110991014611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/rust-surveillance.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/rust-surveillance.webp",{"id":2627,"uid":2628,"createdAt":2629,"updatedAt":2629,"enabled":9,"name":2630,"slug":2630,"category":76,"avatarUrl":77,"url":2631,"publicUrl":2632,"private":80,"description":77,"language":77,"size":83,"stargazersCount":83,"defaultBranch":84,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2629,"mediaId":77,"assetId":2633,"asset":2634},6548,958575917,"2025-04-01T12:26:08.000Z","rust","https://api.github.com/repos/LorenzoRottigni/rust","https://github.com/LorenzoRottigni/rust",3197,{"id":2633,"slug":2630,"createdAt":2635,"updatedAt":2635,"code":2636,"path":2637,"thumb":2638,"providerUrl":95,"provider":96,"nuxtPath":2637},"2025-04-29T00:20:19.495Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471141171151164611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/rust.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/rust.webp",{"id":2640,"uid":2641,"createdAt":2642,"updatedAt":2643,"enabled":9,"name":2644,"slug":2645,"category":76,"avatarUrl":77,"url":2646,"publicUrl":2647,"private":80,"description":2648,"language":520,"size":137,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2649,"mediaId":77,"assetId":2650,"asset":2651},8771,977929862,"2025-05-05T07:46:40.000Z","2025-05-05T07:57:33.000Z","node-wasm-DI","node-wasm-di","https://api.github.com/repos/LorenzoRottigni/node-wasm-DI","https://github.com/LorenzoRottigni/node-wasm-DI","Wasm dependency injection for nodejs, written in rust","2025-05-05T07:57:29.000Z",4353,{"id":2650,"slug":2645,"createdAt":2652,"updatedAt":2652,"code":2653,"path":2654,"thumb":2655,"providerUrl":95,"provider":96,"nuxtPath":2654},"2025-05-06T00:17:51.610Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471101111001014511997115109451001054611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/node-wasm-di.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/node-wasm-di.webp",{"id":2657,"uid":2658,"createdAt":2659,"updatedAt":2660,"enabled":9,"name":2661,"slug":2662,"category":76,"avatarUrl":77,"url":2663,"publicUrl":2664,"private":80,"description":77,"language":2665,"size":120,"stargazersCount":83,"defaultBranch":84,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2666,"mediaId":77,"assetId":2667,"asset":2668},10565,981156918,"2025-05-10T13:20:31.000Z","2025-05-10T13:21:20.000Z","C-playground","c-playground","https://api.github.com/repos/LorenzoRottigni/C-playground","https://github.com/LorenzoRottigni/C-playground","C++","2025-05-10T13:21:17.000Z",5516,{"id":2667,"slug":2662,"createdAt":2669,"updatedAt":2669,"code":2670,"path":2671,"thumb":2672,"providerUrl":95,"provider":96,"nuxtPath":2671},"2025-05-11T00:15:43.470Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798479945112108971211031141111171101004611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/c-playground.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/c-playground.webp",{"id":2674,"uid":2675,"createdAt":2676,"updatedAt":2677,"enabled":9,"name":2678,"slug":2678,"category":499,"avatarUrl":77,"url":2679,"publicUrl":2680,"private":80,"description":2681,"language":1010,"size":2682,"stargazersCount":38,"defaultBranch":109,"readmemd":2683,"topicRaw":2684,"visibility":86,"provider":87,"pushedAt":2685,"mediaId":77,"assetId":2686,"asset":2687},13201,986349118,"2025-05-19T13:28:29.000Z","2025-06-27T09:34:28.000Z","rpgx","https://api.github.com/repos/LorenzoRottigni/rpgx","https://github.com/LorenzoRottigni/rpgx","Rust-based RPG game engine",6097,"# RPGX\n\n\u003Cimg src=\"https://s3.rottigni.tech/rpgx/rpgx_logo_transparent.webp\" alt=\"RPGX Logo\" width=\"400\" />\n\nRPGX is a lightweight, modular, and extensible RPG game engine written in Rust, designed for flexibility and ease of use. It provides a rich grid-based architecture with layered maps, tile effects, pathfinding, and entity movement logic.\n\nBuilt with modern Rust paradigms, RPGX is distributed both as a native Rust crate and as a WebAssembly (WASM) module via `wasm-bindgen`, making it seamlessly integrable into Node.js environments and browser applications.\n\nRPGX is fully compatible with [Dioxus](https://dioxuslabs.com/), a powerful Rust-based UI framework, enabling smooth rendering and interactive frontend experiences for games built on top of the engine.\n\nThis combination of Rust’s performance, WASM’s portability, and Dioxus’s reactive UI system provides a robust foundation for developing cross-platform RPG games that can run natively, on the web, or in hybrid contexts.\n\n## 🚀 Getting Started\n\n---\n\n### 🦀 Rust (Native)\n\nInstall the core engine crate:\n\n```sh\ncargo add rpgx\n```\n\nOr add it manually in your Cargo.toml:\n\n```toml\n[dependencies]\nrpgx = { git = \"https://github.com/LorenzoRottigni/rpgx\", package = \"rpgx\" }\n```\n\nDocs: https://crates.io/crates/rpgx\n\n### 🌐 Node.js / WebAssembly\n\nInstall the WebAssembly driver for use in JS/TS:\n\n```sh\nnpm install @rpgx/js\n# or\nyarn add @rpgx/js\n# or\npnpm install @rpgx/js\n```\n\nDocs: https://www.npmjs.com/package/@rpgx/js\n\n### 🧱 C++ (WASM interop)\n\n🚧 Planned: A C++-friendly wrapper using wasm-bindgen-cxx or cxx, to allow integration with C++ game engines and UIs like Qt or Unreal.\n\n## Glossary\n\n### RPGX\n\n- [Effect](https://docs.rs/rpgx/0.1.3/rpgx/map/effect/enum.Effect.html)\n- [Mask](https://docs.rs/rpgx/0.1.3/rpgx/map/mask/struct.Mask.html)\n- [Layer](https://docs.rs/rpgx/0.1.3/rpgx/map/layer/struct.Layer.html)\n- [Map](https://docs.rs/rpgx/0.1.3/rpgx/map/struct.Map.html)\n- [Scene](https://docs.rs/rpgx/0.1.3/rpgx/engine/scene/struct.Scene.html)\n- [Engine](https://docs.rs/rpgx/0.1.3/rpgx/engine/struct.Engine.html)\n\n### Euclidean\n\n- [Rect](https://docs.rs/rpgx/0.1.3/rpgx/eucl/rect/struct.Rect.html)\n- [Coordinates](https://docs.rs/rpgx/0.1.3/rpgx/eucl/coordinates/struct.Coordinates.html)\n- [Delta](https://docs.rs/rpgx/0.1.3/rpgx/eucl/delta/struct.Delta.html)\n- [Direction](https://docs.rs/rpgx/0.1.3/rpgx/eucl/direction/enum.Direction.html)\n- [Shape](https://docs.rs/rpgx/0.1.3/rpgx/eucl/shape/struct.Shape.html)\n\n\n## Contributing\n\n### 🛠 Development Setup\n\nRequirements:\n\n- [Rust](https://rustup.rs) (with `wasm32-unknown-unknown` target)\n- [Node.js](https://nodejs.org)\n- [wasm-bindgen CLI](https://rustwasm.github.io/docs/wasm-bindgen/):\n\n ```sh\n cargo install wasm-bindgen-cli\n ```\n\n- [Dioxus CLI](https://dioxuslabs.com/):\n\n ```sh\n cargo install --locked dioxus-cli\n ```\n\nClone the repo and initialize your environment using the provided `Makefile`.\n\n---\n\n### 🚀 Common Development Workflows\n\n#### Run RPGX in Vue Playground\n\n```sh\nmake dev-vue\n```\n\n- Builds the `rpgx-wasm` driver bundle.\n- Generates JS bindings using `wasm-bindgen`.\n- Launches the Vue.js playground.\n\n#### Run RPGX in Node.js Playground\n\n```sh\nmake dev-node\n```\n\n- Builds and binds the WASM module.\n- Starts the Node.js script using TypeScript.\n\n#### Run RPGX in Dioxus (Web/Desktop)\n\n```sh\nmake dev-dioxus-web # For web browser rendering\nmake dev-dioxus-desktop # For native desktop app\n```\n\n---\n\n### 🧪 Testing\n\nRun all unit tests for the Rust core and WASM crates:\n\n```sh\nmake test-core # Tests for core engine (rpgx)\nmake test-wasm # Tests for WASM driver (rpgx-wasm)\n```\n\n---\n\n### 🧹 Clean Up Build Artifacts\n\n```sh\nmake clean\n```\n\nThis removes compiled files, WASM output, and `node_modules` from playgrounds.\n\n---\n\n### 📦 Production Builds\n\n#### Core Engine (Native)\n\n```sh\nmake build-core\n```\n\n#### WASM Package\n\n```sh\nmake build-wasm\n```\n\n#### Vue Production Build\n\n```sh\nmake build-vue\n```\n\n#### Dioxus Builds\n\n```sh\nmake build-dioxus-web\nmake build-dioxus-desktop\n```\n\n## License\n\nRPGX is licensed under the [MIT License](LICENSE). You are free to use, modify, and distribute it under the terms of this license.","game-engine-2d;rpg;rust;wasm","2025-06-27T09:34:25.000Z",7187,{"id":2686,"slug":2678,"createdAt":2688,"updatedAt":2688,"code":2689,"path":2690,"thumb":2691,"providerUrl":95,"provider":96,"nuxtPath":2690},"2025-05-20T04:02:43.254Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471141121031204611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/rpgx.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/rpgx.webp",{"id":2693,"uid":2694,"createdAt":2695,"updatedAt":2696,"enabled":9,"name":2697,"slug":2698,"category":76,"avatarUrl":77,"url":2699,"publicUrl":2700,"private":80,"description":77,"language":1010,"size":967,"stargazersCount":83,"defaultBranch":84,"readmemd":2701,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2702,"mediaId":77,"assetId":2703,"asset":2704},17948,993215655,"2025-05-30T12:11:49.000Z","2025-05-30T12:11:55.000Z","dioxus_kube_inspector","dioxus-kube-inspector","https://api.github.com/repos/LorenzoRottigni/dioxus_kube_inspector","https://github.com/LorenzoRottigni/dioxus_kube_inspector","# Development\n\nYour new bare-bones project includes minimal organization with a single `main.rs` file and a few assets.\n\n```\nproject/\n├─ assets/ # Any assets that are used by the app should be placed here\n├─ src/\n│ ├─ main.rs # main.rs is the entry point to your application and currently contains all components for the app\n├─ Cargo.toml # The Cargo.toml file defines the dependencies and feature flags for your project\n```\n\n\n\n### Serving Your App\n\nRun the following command in the root of your project to start developing with the default platform:\n\n```bash\ndx serve\n```\n\nTo run for a different platform, use the `--platform platform` flag. E.g.\n```bash\ndx serve --platform desktop\n```\n\n\n","2025-05-30T12:11:52.000Z",9388,{"id":2703,"slug":2698,"createdAt":2705,"updatedAt":2705,"code":2706,"path":2707,"thumb":2708,"providerUrl":95,"provider":96,"nuxtPath":2707},"2025-05-31T00:38:54.292Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847100105111120117115451071179810145105110115112101991161111144611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/dioxus-kube-inspector.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/dioxus-kube-inspector.webp",{"id":2710,"uid":2711,"createdAt":2712,"updatedAt":2713,"enabled":9,"name":2714,"slug":2714,"category":76,"avatarUrl":77,"url":2715,"publicUrl":2716,"private":80,"description":77,"language":1010,"size":2717,"stargazersCount":83,"defaultBranch":109,"readmemd":2701,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2718,"mediaId":77,"assetId":2719,"asset":2720},18083,993236001,"2025-05-30T12:53:23.000Z","2025-06-09T13:33:43.000Z","k8sville","https://api.github.com/repos/LorenzoRottigni/k8sville","https://github.com/LorenzoRottigni/k8sville",422,"2025-07-04T18:05:07.000Z",9389,{"id":2719,"slug":2714,"createdAt":2721,"updatedAt":2721,"code":2722,"path":2723,"thumb":2724,"providerUrl":95,"provider":96,"nuxtPath":2723},"2025-05-31T00:38:58.861Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847107561151181051081081014611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/k8sville.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/k8sville.webp",{"id":2726,"uid":2727,"createdAt":2728,"updatedAt":2729,"enabled":9,"name":2730,"slug":2730,"category":76,"avatarUrl":77,"url":2731,"publicUrl":2732,"private":80,"description":77,"language":1010,"size":279,"stargazersCount":83,"defaultBranch":109,"readmemd":2733,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2734,"mediaId":77,"assetId":2735,"asset":2736},18085,993144571,"2025-05-30T09:40:44.000Z","2025-05-30T09:42:10.000Z","kube-inspector","https://api.github.com/repos/LorenzoRottigni/kube-inspector","https://github.com/LorenzoRottigni/kube-inspector","cargo run -- /home/lorenzorottigni/Documents/gitlab_deesup/deesup-k8s/credentials/kubeconfig-test.yml\n","2025-05-30T09:42:06.000Z",9390,{"id":2735,"slug":2730,"createdAt":2737,"updatedAt":2737,"code":2738,"path":2739,"thumb":2740,"providerUrl":95,"provider":96,"nuxtPath":2739},"2025-05-31T00:39:03.568Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471071179810145105110115112101991161111144611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/kube-inspector.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/kube-inspector.webp",{"id":2742,"uid":2743,"createdAt":2744,"updatedAt":2745,"enabled":9,"name":2746,"slug":2746,"category":76,"avatarUrl":77,"url":2747,"publicUrl":2748,"private":80,"description":77,"language":1010,"size":38,"stargazersCount":83,"defaultBranch":109,"readmemd":77,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2749,"mediaId":77,"assetId":2750,"asset":2751},19859,995226912,"2025-06-03T06:51:22.000Z","2025-06-03T07:02:26.000Z","rust-internment","https://api.github.com/repos/LorenzoRottigni/rust-internment","https://github.com/LorenzoRottigni/rust-internment","2025-06-03T07:02:24.000Z",10417,{"id":2750,"slug":2746,"createdAt":2752,"updatedAt":2752,"code":2753,"path":2754,"thumb":2755,"providerUrl":95,"provider":96,"nuxtPath":2754},"2025-06-04T00:28:17.398Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847114117115116451051101161011141101091011101164611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/rust-internment.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/rust-internment.webp",{"id":2757,"uid":2758,"createdAt":2759,"updatedAt":2760,"enabled":9,"name":2761,"slug":2761,"category":76,"avatarUrl":77,"url":2762,"publicUrl":2763,"private":80,"description":2764,"language":2765,"size":1641,"stargazersCount":83,"defaultBranch":84,"readmemd":2766,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2767,"mediaId":77,"assetId":2768,"asset":2769},23717,1000072926,"2025-06-11T08:17:49.000Z","2025-08-19T09:47:14.000Z","k8s-cj-scheduler","https://api.github.com/repos/LorenzoRottigni/k8s-cj-scheduler","https://github.com/LorenzoRottigni/k8s-cj-scheduler","a plugin for Kubernetes written in Go that introduces a CRD (Custom Resource Definition), “cj-scheduler”, for managing and maintaining multiple cron jobs from a single manifest.","Go","# k8s-cj-scheduler\n\n\u003Cimg src=\"https://s3.rottigni.tech/public/github/k8s-cj-scheduler-logo.webp\" alt=\"RPGX Logo\" width=\"400\" />\n\n## Overview\n\nThe `k8s-cj-scheduler` project introduces a custom Kubernetes controller that simplifies the management of scheduled tasks within your cluster. Instead of directly interacting with Kubernetes `CronJob` resources, this operator allows you to define your schedules in a more declarative and streamlined way through a custom resource called `Scheduler`.\n\nIt's designed to abstract away the underlying `CronJob` complexities, enabling users to easily define multiple scheduled commands, specify container images, arguments, and even environment variables for each scheduled run, all within a single `Scheduler` object.\n\n---\n\n## Features\n\n* **Declarative Scheduling**: Define recurring tasks using a custom `Scheduler` resource, making your scheduled workloads a first-class citizen in Kubernetes.\n* **Multiple Schedules per Resource**: Consolidate multiple scheduled commands into a single `Scheduler` custom resource, simplifying management.\n* **Customizable Container Images**: Specify any container image to run your scheduled commands.\n* **Command-Line Arguments**: Pass custom arguments to your container commands via the `params` field.\n* **Environment Variables**: Inject necessary environment variables into your scheduled jobs using the `env` field, supporting both literal values and dynamic values from the Downward API.\n* **Automated CronJob Management**: The controller automatically creates, updates, and deletes Kubernetes `CronJob` resources based on your `Scheduler` definitions.\n* **Cleanup**: Automatically removes `CronJob`s that are no longer defined in your `Scheduler` resource.\n\n---\n\n## Getting Started\n\nTo deploy and use the `k8s-cj-scheduler` operator in your Kubernetes cluster, follow these steps.\n\n### Prerequisites\n\nBefore you begin, ensure you have the following installed:\n\n* **Go**: `v1.24.0+`\n* **Docker**: `v17.03+`\n* **kubectl**: `v1.11.3+` (compatible with your cluster)\n* **Kubernetes Cluster**: Access to a `v1.11.3+` Kubernetes cluster.\n\n### Standard Installation\n\nTo install the controller and its custom resources:\n\n```sh\nkubectl apply -f https://raw.githubusercontent.com/LorenzoRottigni/k8s-cj-scheduler/main/config/crd/bases/lr.labs_schedulers.yaml\nkubectl apply -k https://github.com/LorenzoRottigni/k8s-cj-scheduler/config/default\n```\n\n⚠️ Important: Ensure the controller image in the Kustomize setup points to a valid container registry (e.g., ghcr.io/lorenzorottigni/k8s-cj-scheduler:latest) that your cluster can pull from. If not, you must build and push your own image.\n\n### Helm Installation\n\nTo install the controller and its custom resources:\n\n```sh\nhelm repo add lr-labs https://lorenzorottigni.github.io/k8s-scheduler\nhelm repo update\nhelm install cj-scheduler lr-labs/k8s-cj-scheduler --namespace kube-system --create-namespace --skip-crds\n```\n\n### Deploying to the Cluster\n\n1. **Build and Push Your Operator Image**:\n First, build your controller image and push it to a container registry you have access to. Replace `\u003Cyour-registry>` with your registry's URL and `tag` with your preferred image tag (e.g., `v0.1.0`).\n\n ```sh\n make docker-build docker-push IMG=\u003Cyour-registry>/k8s-cj-scheduler:tag\n ```\n > **Note**: Ensure the image is published to a registry that your Kubernetes cluster can pull from. If you encounter permission issues, check your registry credentials.\n\n2. **Install the Custom Resource Definitions (CRDs)**:\n This step registers the `Scheduler` custom resource with your Kubernetes API server.\n\n ```sh\n make install\n ```\n\n3. **Deploy the Operator (Manager)**:\n Deploy the `k8s-cj-scheduler` controller to your cluster. This will create the necessary deployments, service accounts, and RBAC roles.\n\n ```sh\n make deploy IMG=\u003Cyour-registry>/k8s-cj-scheduler:tag\n ```\n > **Note**: If you face RBAC errors during deployment, you might need cluster-admin privileges or ensure your current `kubectl` context has sufficient permissions.\n\n### Creating Your Scheduled Tasks\n\nOnce the controller is running, you can create instances of your `Scheduler` custom resource to define your jobs.\n\nYou can apply the provided sample configuration:\n\n```sh\nkubectl apply -k config/samples/\n```\n\n**Example `Scheduler` Resource (`config/samples/v1_scheduler.yaml` or `test.yml`):**\n\n```yaml\napiVersion: lr.labs/v1 # Your API Group\nkind: Scheduler\nmetadata:\n name: my-first-scheduler\n namespace: default\nspec:\n schedules:\n - name: minutely-ping\n image: alpine/curl\n cronExpression: \"*/1 * * * *\" # Runs every minute\n params:\n - curl\n - \"[https://www.google.com](https://www.google.com)\"\n - name: env-variable-test\n image: busybox:latest\n cronExpression: \"*/2 * * * *\" # Runs every 2 minutes\n params:\n - sh\n - -c\n - \"echo 'Hello from ENVIRONMENT!'; echo 'MY_CUSTOM_VAR is: $MY_CUSTOM_VAR'; echo 'ANOTHER_SECRET_VAR is: $ANOTHER_SECRET_VAR'; sleep 5\"\n env:\n - name: MY_CUSTOM_VAR\n value: \"This is a custom value!\"\n - name: ANOTHER_SECRET_VAR\n value: \"Shhh, this is a secret!\"\n - name: POD_NAME\n valueFrom:\n fieldRef:\n fieldPath: metadata.name\n - name: NAMESPACE\n valueFrom:\n fieldRef:\n fieldPath: metadata.namespace\n```\n> **Note**: After applying, the `k8s-cj-scheduler` controller will create corresponding `CronJob` resources in the `default` namespace. You can verify them with `kubectl get cronjobs`.\n\n---\n\n## Usage Example\n\nLet's assume you've deployed the `k8s-cj-scheduler` operator to your cluster. Here's a quick example of how you can define and manage a scheduled task.\n\n1. **Define Your `Scheduler` Resource**:\n Create a file named `my-daily-report-scheduler.yaml` with the following content:\n\n ```yaml\n apiVersion: lr.labs/v1\n kind: Scheduler\n metadata:\n name: daily-report-generator\n namespace: default # Or your desired namespace\n spec:\n schedules:\n - name: generate-report\n image: myorg/report-generator:latest # Replace with your actual image\n cronExpression: \"0 0 * * *\" # Runs every day at midnight UTC\n params:\n - \"/app/generate-report.sh\"\n - \"--date=$(date +%Y-%m-%d)\"\n env:\n - name: REPORT_TYPE\n value: \"daily-summary\"\n - name: API_KEY_SECRET_NAME\n valueFrom:\n secretKeyRef:\n name: my-api-key-secret # Name of your secret\n key: api_key\n ```\n This `Scheduler` resource will create a `CronJob` that runs daily at midnight, executing a report generation script with specific parameters and environment variables (including one fetched from a Kubernetes Secret).\n\n2. **Apply the `Scheduler` Resource**:\n ```sh\n kubectl apply -f my-daily-report-scheduler.yaml\n ```\n\n3. **Verify the Created CronJob**:\n You can see the `CronJob` created by your operator:\n ```sh\n kubectl get cronjobs -n default\n # Expected output similar to:\n # NAME SCHEDULE SUSPEND FORBIDDEN AGE\n # daily-report-generator-generate-report 0 0 * * * False False 10s\n ```\n\n4. **Inspect Job Runs (Optional)**:\n As time passes, `CronJob`s will create `Job` resources. You can check them with:\n ```sh\n kubectl get jobs -n default -l scheduler=daily-report-generator\n ```\n And view logs of a specific job run:\n ```sh\n kubectl logs -f \u003Cjob-name-from-above-command> -n default\n ```\n\n---\n\n## Uninstallation\n\nTo remove the `k8s-cj-scheduler` and all its components from your cluster:\n\n1. **Delete Your `Scheduler` Instances**:\n This will trigger the controller to clean up all associated `CronJob`s.\n\n ```sh\n kubectl delete -f my-daily-report-scheduler.yaml # Delete your specific example\n kubectl delete -k config/samples/ # If you used the sample kustomize base\n ```\n\n2. **Delete the CRDs**:\n This removes the `Scheduler` API from your cluster.\n\n ```sh\n make uninstall\n ```\n\n3. **Undeploy the Controller Manager**:\n This removes the operator's deployment and related resources.\n\n ```sh\n make undeploy\n ```\n\n---\n\n## Project Distribution\n\nIf you wish to package and distribute your `k8s-cj-scheduler` solution to others:\n\n### 1. Providing a YAML Bundle\n\nYou can generate a single YAML file containing all necessary Kubernetes resources for installation:\n\n1. **Build the Installer Bundle**:\n\n ```sh\n make build-installer IMG=\u003Cyour-registry>/k8s-cj-scheduler:tag\n ```\n This command generates an `install.yaml` file in the `dist` directory. This file bundles all resources required to install the project.\n\n2. **Distribute and Use**:\n Users can then install the project by simply applying this bundle:\n\n ```sh\n kubectl apply -f [https://raw.githubusercontent.com/](https://raw.githubusercontent.com/)\u003Cyour-org>/k8s-cj-scheduler/\u003Ctag-or-branch>/dist/install.yaml\n ```\n (Replace `\u003Cyour-org>` and `\u003Ctag-or-branch>` with your actual GitHub organization and desired release tag/branch).\n\n### 2. Providing a Helm Chart\n\nYou can leverage the optional Helm plugin to generate a Helm Chart for easier deployment via Helm.\n\n1. **Generate/Update the Helm Chart**:\n ```sh\n kubebuilder edit --plugins=helm/v1-alpha\n ```\n This command generates (or updates) a Helm chart under `dist/chart`.\n\n2. **Distribute the Chart**:\n Users can obtain and install your solution using standard Helm commands.\n\n > **Note**: If you modify your project (e.g., add webhooks), you'll need to re-run the above `kubebuilder edit` command to sync changes to the Helm Chart. Use the `--force` flag if necessary, and manually re-apply any custom configurations in `dist/chart/values.yaml` or `dist/chart/manager/manager.yaml`.\n\n---\n\n## Contributing\n\n1. **Fork** the repository.\n2. **Clone** your forked repository: `git clone https://github.com/\u003Cyour-username>/k8s-cj-scheduler.git`\n3. Create a new **feature branch**: `git checkout -b feature/your-feature-name`\n4. Make your changes and **commit** them: `git commit -m \"feat: Add new feature\"`\n5. **Push** to your branch: `git push origin feature/your-feature-name`\n6. Open a **Pull Request** to the `main` branch of the upstream repository.\n\nPlease ensure your code adheres to the existing style and conventions. Run `make test` and `make fmt` before submitting.\n\n---\n\n**Additional Information**: Run `make help` for more information on all potential `make` targets.\n\nMore information can be found via the [Kubebuilder Documentation](https://book.kubebuilder.io/introduction.html).\n\n---\n\n## License\n\nCopyright 2025.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","2025-08-19T09:47:10.000Z",12310,{"id":2768,"slug":2761,"createdAt":2770,"updatedAt":2770,"code":2771,"path":2772,"thumb":2773,"providerUrl":95,"provider":96,"nuxtPath":2772},"2025-06-12T00:31:49.578Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984710756115459910645115991041011001171081011144611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/k8s-cj-scheduler.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/k8s-cj-scheduler.webp",{"id":2775,"uid":2776,"createdAt":2777,"updatedAt":2778,"enabled":9,"name":2779,"slug":2779,"category":76,"avatarUrl":77,"url":2780,"publicUrl":2781,"private":80,"description":2782,"language":128,"size":512,"stargazersCount":83,"defaultBranch":84,"readmemd":2783,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2784,"mediaId":77,"assetId":2785,"asset":2786},30256,1020637866,"2025-07-16T07:08:38.000Z","2025-07-16T07:20:46.000Z","apollo-cache-plugin","https://api.github.com/repos/LorenzoRottigni/apollo-cache-plugin","https://github.com/LorenzoRottigni/apollo-cache-plugin","Apollo GraphQL cache plugin compatible with Redis","# apollo-cache-plugin\n","2025-07-16T07:20:43.000Z",15079,{"id":2785,"slug":2779,"createdAt":2787,"updatedAt":2787,"code":2788,"path":2789,"thumb":2790,"providerUrl":95,"provider":96,"nuxtPath":2789},"2025-08-02T00:17:42.467Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798479711211110810811145999799104101451121081171031051104611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/apollo-cache-plugin.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/apollo-cache-plugin.webp",{"id":2792,"uid":2793,"createdAt":2794,"updatedAt":2795,"enabled":9,"name":2796,"slug":2796,"category":76,"avatarUrl":77,"url":2797,"publicUrl":2798,"private":80,"description":77,"language":520,"size":296,"stargazersCount":83,"defaultBranch":84,"readmemd":2799,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2800,"mediaId":77,"assetId":2801,"asset":2802},30750,1050407427,"2025-09-04T11:45:22.000Z","2025-09-04T11:53:57.000Z","demo-marco","https://api.github.com/repos/LorenzoRottigni/demo-marco","https://github.com/LorenzoRottigni/demo-marco","# Simple Token-Protected API\n\nA lightweight Express.js API with a fixed bearer token for authentication, designed to be deployed on [Render.com](https://render.com).\n\n## Endpoints\n\n| Method | Endpoint | Auth Required | Description |\n|--------|-------------|---------------|---------------------------------|\n| GET | /ping | ❌ | Health check |\n| GET | /carlist | ✅ | Returns a list of cars |\n| POST | /submit | ✅ | Accepts and returns JSON |\n| GET | /status | ❌ | Returns API status |\n| POST | /echo | ✅ | Echoes back posted JSON |\n\n## Authentication\n\nUse a fixed bearer token:\n\n\n","2025-09-04T11:53:53.000Z",15428,{"id":2801,"slug":2796,"createdAt":2803,"updatedAt":2803,"code":2804,"path":2805,"thumb":2806,"providerUrl":95,"provider":96,"nuxtPath":2805},"2025-10-01T00:27:03.105Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471001011091114510997114991114611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/demo-marco.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/demo-marco.webp",{"id":2808,"uid":2809,"createdAt":2810,"updatedAt":2811,"enabled":9,"name":2812,"slug":2812,"category":76,"avatarUrl":77,"url":2813,"publicUrl":2814,"private":80,"description":77,"language":128,"size":2815,"stargazersCount":83,"defaultBranch":84,"readmemd":2816,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2817,"mediaId":77,"assetId":2818,"asset":2819},30807,1051316047,"2025-09-05T19:27:36.000Z","2025-09-06T19:57:21.000Z","nuxt-tailwind-4","https://api.github.com/repos/LorenzoRottigni/nuxt-tailwind-4","https://github.com/LorenzoRottigni/nuxt-tailwind-4",261,"# Nuxt Minimal Starter\n\nLook at the [Nuxt documentation](https://nuxt.com/docs/getting-started/introduction) to learn more.\n\n## Setup\n\nMake sure to install dependencies:\n\n```bash\n# npm\nnpm install\n\n# pnpm\npnpm install\n\n# yarn\nyarn install\n\n# bun\nbun install\n```\n\n## Development Server\n\nStart the development server on `http://localhost:3000`:\n\n```bash\n# npm\nnpm run dev\n\n# pnpm\npnpm dev\n\n# yarn\nyarn dev\n\n# bun\nbun run dev\n```\n\n## Production\n\nBuild the application for production:\n\n```bash\n# npm\nnpm run build\n\n# pnpm\npnpm build\n\n# yarn\nyarn build\n\n# bun\nbun run build\n```\n\nLocally preview production build:\n\n```bash\n# npm\nnpm run preview\n\n# pnpm\npnpm preview\n\n# yarn\nyarn preview\n\n# bun\nbun run preview\n```\n\nCheck out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information.\n","2025-09-06T19:57:18.000Z",15429,{"id":2818,"slug":2812,"createdAt":2820,"updatedAt":2820,"code":2821,"path":2822,"thumb":2823,"providerUrl":95,"provider":96,"nuxtPath":2822},"2025-10-01T00:27:08.142Z","4711211111411610211110810511146114111116116105103110105461161019910447115101101100479711511510111611547114101112111115471031051161041179847110117120116451169710510811910511010045524611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/nuxt-tailwind-4.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/nuxt-tailwind-4.webp",{"id":2825,"uid":2826,"createdAt":2827,"updatedAt":2828,"enabled":9,"name":2829,"slug":2829,"category":76,"avatarUrl":77,"url":2830,"publicUrl":2831,"private":80,"description":77,"language":128,"size":983,"stargazersCount":83,"defaultBranch":109,"readmemd":2816,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2832,"mediaId":77,"assetId":2833,"asset":2834},30809,1051018787,"2025-09-05T10:08:24.000Z","2025-09-05T10:08:56.000Z","nuxt-tailwind-hmr-bug","https://api.github.com/repos/LorenzoRottigni/nuxt-tailwind-hmr-bug","https://github.com/LorenzoRottigni/nuxt-tailwind-hmr-bug","2025-09-05T10:08:53.000Z",15430,{"id":2833,"slug":2829,"createdAt":2835,"updatedAt":2835,"code":2836,"path":2837,"thumb":2838,"providerUrl":95,"provider":96,"nuxtPath":2837},"2025-10-01T00:27:13.249Z","471121111141161021111081051114611411111611610510311010546116101991044711510110110047971151151011161154711410111211111547103105116104117984711011712011645116971051081191051101004510410911445981171034611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/nuxt-tailwind-hmr-bug.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/nuxt-tailwind-hmr-bug.webp",{"id":2840,"uid":2841,"createdAt":2842,"updatedAt":2843,"enabled":9,"name":2844,"slug":2844,"category":76,"avatarUrl":77,"url":2845,"publicUrl":2846,"private":80,"description":77,"language":128,"size":997,"stargazersCount":83,"defaultBranch":84,"readmemd":2816,"topicRaw":85,"visibility":86,"provider":87,"pushedAt":2847,"mediaId":77,"assetId":2848,"asset":2849},30811,1051087164,"2025-09-05T12:25:05.000Z","2025-09-05T12:29:16.000Z","nuxt-tailwind-sass-bug","https://api.github.com/repos/LorenzoRottigni/nuxt-tailwind-sass-bug","https://github.com/LorenzoRottigni/nuxt-tailwind-sass-bug","2025-09-05T12:29:13.000Z",15431,{"id":2848,"slug":2844,"createdAt":2850,"updatedAt":2850,"code":2851,"path":2852,"thumb":2853,"providerUrl":95,"provider":96,"nuxtPath":2852},"2025-10-01T00:27:18.437Z","47112111114116102111108105111461141111161161051031101054611610199104471151011011004797115115101116115471141011121111154710310511610411798471101171201164511697105108119105110100451159711511545981171034611910198112","/portfolio.rottigni.tech/seed/assets/repos/github/nuxt-tailwind-sass-bug.webp","https://s3.rottigni.tech/portfolio.rottigni.tech/seed/assets/repos/github/nuxt-tailwind-sass-bug.webp"]