<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Elia Contini - Blog]]></title><description><![CDATA[Articles about web development with JavaScript, TypeScript and Python.]]></description><link>https://elia.contini.page</link><generator>GatsbyJS</generator><lastBuildDate>Sun, 16 Nov 2025 08:31:21 GMT</lastBuildDate><item><title><![CDATA[Build a static blog with Next.js 14: add the sitemap]]></title><description><![CDATA[Add sitemap.xml to a static blog built with Next.js 14]]></description><link>https://elia.contini.page/blog/static-blog-nextjs-14-sitemap/</link><guid isPermaLink="false">https://elia.contini.page/blog/static-blog-nextjs-14-sitemap/</guid><pubDate>Sun, 01 Sep 2024 08:00:00 GMT</pubDate></item><item><title><![CDATA[Build a static blog with Next.js 14: add social cards and robots.txt]]></title><description><![CDATA[Add SEO metadata to a static blog built with Next.js 14]]></description><link>https://elia.contini.page/blog/static-blog-nextjs-14-social-cards-robots/</link><guid isPermaLink="false">https://elia.contini.page/blog/static-blog-nextjs-14-social-cards-robots/</guid><pubDate>Thu, 01 Aug 2024 08:00:00 GMT</pubDate></item><item><title><![CDATA[Build a static blog with Next.js 14, App Router, and MDX]]></title><description><![CDATA[A basic static blog leveraging the Next.js 14 features]]></description><link>https://elia.contini.page/blog/static-blog-nextjs-14-app-router-mdx/</link><guid isPermaLink="false">https://elia.contini.page/blog/static-blog-nextjs-14-app-router-mdx/</guid><pubDate>Thu, 11 Jul 2024 08:00:00 GMT</pubDate></item><item><title><![CDATA[Node.js: promisify API]]></title><description><![CDATA[How to replace the common and old error-first callback style with promises]]></description><link>https://elia.contini.page/blog/nodejs-promisify-api/</link><guid isPermaLink="false">https://elia.contini.page/blog/nodejs-promisify-api/</guid><pubDate>Sun, 18 Jul 2021 08:00:00 GMT</pubDate></item><item><title><![CDATA[How to configure Nginx logs to improve GoAccess precision]]></title><description><![CDATA[Fine tuning Nginx logs to have precise analytics about a Gatsby generated website using GoAccess]]></description><link>https://elia.contini.page/blog/goaccess-nginx-gatsby-fine-tuning/</link><guid isPermaLink="false">https://elia.contini.page/blog/goaccess-nginx-gatsby-fine-tuning/</guid><pubDate>Sun, 13 Jun 2021 08:00:00 GMT</pubDate></item><item><title><![CDATA[Node.js and MongoDB on AWS Lambda using Serverless Framework]]></title><description><![CDATA[How to create a simple REST API to manage todos and deploy it on AWS Lambda]]></description><link>https://elia.contini.page/blog/nodejs-mongodb-serverless-aws-lambda-rest-api/</link><guid isPermaLink="false">https://elia.contini.page/blog/nodejs-mongodb-serverless-aws-lambda-rest-api/</guid><pubDate>Tue, 18 May 2021 08:00:00 GMT</pubDate></item><item><title><![CDATA[Fastify and MongoDB on Heroku]]></title><description><![CDATA[How to create a simple REST API to manage todos and deploy it on Heroku]]></description><link>https://elia.contini.page/blog/fastify-mongodb-heroku-rest-api/</link><guid isPermaLink="false">https://elia.contini.page/blog/fastify-mongodb-heroku-rest-api/</guid><pubDate>Sun, 18 Apr 2021 14:00:00 GMT</pubDate></item><item><title><![CDATA[CSS: aspect-ratio, clamp() and :focus-within]]></title><description><![CDATA[Some new interesting properties that make life easier]]></description><link>https://elia.contini.page/blog/css-aspect-ratio-clamp-focus-within/</link><guid isPermaLink="false">https://elia.contini.page/blog/css-aspect-ratio-clamp-focus-within/</guid><pubDate>Sat, 20 Feb 2021 09:00:00 GMT</pubDate></item><item><title><![CDATA[How to create a Node.js interactive Command Line Interface (CLI)]]></title><description><![CDATA[A pure Node.js interactive CLI without dependencies]]></description><link>https://elia.contini.page/blog/create-node-js-interactive-cli/</link><guid isPermaLink="false">https://elia.contini.page/blog/create-node-js-interactive-cli/</guid><pubDate>Sun, 31 Jan 2021 09:00:00 GMT</pubDate></item><item><title><![CDATA[Modern JavaScript: variable declaration]]></title><description><![CDATA[And details to keep in mind to avoid headaches]]></description><link>https://elia.contini.page/blog/modern-javascript-variable-declaration/</link><guid isPermaLink="false">https://elia.contini.page/blog/modern-javascript-variable-declaration/</guid><pubDate>Sun, 28 Jun 2020 08:00:00 GMT</pubDate></item><item><title><![CDATA[Install GoAccess Web log analyzer on Ubuntu Server 20.04 LTS]]></title><description><![CDATA[And use it in a DigitalOcean droplet]]></description><link>https://elia.contini.page/blog/install-goaccess-web-log-analyzer-on-ubuntu/</link><guid isPermaLink="false">https://elia.contini.page/blog/install-goaccess-web-log-analyzer-on-ubuntu/</guid><pubDate>Thu, 21 May 2020 08:00:00 GMT</pubDate></item><item><title><![CDATA[Ubuntu Server 20.04 LTS and Certbot]]></title><description><![CDATA[How to solve module ‘acme.challenges’ has no attribute ‘TLSSNI01’]]></description><link>https://elia.contini.page/blog/ubuntu-20-04-and-certbot/</link><guid isPermaLink="false">https://elia.contini.page/blog/ubuntu-20-04-and-certbot/</guid><pubDate>Sun, 26 Apr 2020 08:00:00 GMT</pubDate></item><item><title><![CDATA[Install Gatsby on Ubuntu]]></title><description><![CDATA[Set up your Ubuntu workstation to begin to develop with Gatsby]]></description><link>https://elia.contini.page/blog/install-gatsby-on-ubuntu/</link><guid isPermaLink="false">https://elia.contini.page/blog/install-gatsby-on-ubuntu/</guid><pubDate>Sun, 22 Mar 2020 09:00:00 GMT</pubDate></item><item><title><![CDATA[Django: get client IP from behind Amazon Elastic Load Balancer]]></title><description><![CDATA[Few lines of code to get the correct IP]]></description><link>https://elia.contini.page/blog/django-get-client-ip-behind-amazon-elastic-load-balancing/</link><guid isPermaLink="false">https://elia.contini.page/blog/django-get-client-ip-behind-amazon-elastic-load-balancing/</guid><pubDate>Wed, 13 Jul 2016 08:00:00 GMT</pubDate></item><item><title><![CDATA[TypeScript: first contact]]></title><description><![CDATA[Slides and code samples of my talk at FrontEnders Ticino meetup]]></description><link>https://elia.contini.page/blog/typescript-first-contact/</link><guid isPermaLink="false">https://elia.contini.page/blog/typescript-first-contact/</guid><pubDate>Sun, 20 Dec 2015 09:00:00 GMT</pubDate></item><item><title><![CDATA[dstore: how to create an observable data store]]></title><description><![CDATA[How to use dstore to manage your application data]]></description><link>https://elia.contini.page/blog/dstore-how-to-create-an-observable-data-store/</link><guid isPermaLink="false">https://elia.contini.page/blog/dstore-how-to-create-an-observable-data-store/</guid><pubDate>Thu, 15 Oct 2015 08:00:00 GMT</pubDate></item><item><title><![CDATA[Django: custom error pages]]></title><description><![CDATA[How to customize error pages in our Django project]]></description><link>https://elia.contini.page/blog/django-custom-error-pages/</link><guid isPermaLink="false">https://elia.contini.page/blog/django-custom-error-pages/</guid><pubDate>Sun, 10 May 2015 08:00:00 GMT</pubDate></item><item><title><![CDATA[Performance: how to eliminate render-blocking CSS]]></title><description><![CDATA[A solution to eliminate render-blocking CSS in above-the-fold content]]></description><link>https://elia.contini.page/blog/performance-how-to-eliminate-render-blocking-css/</link><guid isPermaLink="false">https://elia.contini.page/blog/performance-how-to-eliminate-render-blocking-css/</guid><pubDate>Sun, 14 Dec 2014 09:00:00 GMT</pubDate></item><item><title><![CDATA[JavaScript: export to CSV using the download attribute]]></title><description><![CDATA[Export data in CSV format using JavaScript and the download attribute]]></description><link>https://elia.contini.page/blog/javascript-export-to-csv-using-the-download-attribute/</link><guid isPermaLink="false">https://elia.contini.page/blog/javascript-export-to-csv-using-the-download-attribute/</guid><pubDate>Mon, 17 Mar 2014 09:00:00 GMT</pubDate></item><item><title><![CDATA[Django: enable gzip compression in views]]></title><description><![CDATA[How to serve pages quickly enabling compression]]></description><link>https://elia.contini.page/blog/django-enable-gzip-compression-in-views/</link><guid isPermaLink="false">https://elia.contini.page/blog/django-enable-gzip-compression-in-views/</guid><pubDate>Tue, 21 Jan 2014 09:00:00 GMT</pubDate></item><item><title><![CDATA[CSS: long string management (ellipsis)]]></title><description><![CDATA[How to manage long strings with CSS]]></description><link>https://elia.contini.page/blog/css-long-string-management-ellipsis/</link><guid isPermaLink="false">https://elia.contini.page/blog/css-long-string-management-ellipsis/</guid><pubDate>Sun, 20 Oct 2013 08:00:00 GMT</pubDate></item><item><title><![CDATA[CSS: box with zig-zag border]]></title><description><![CDATA[Creating zig-zagged borders with a touch of CSS]]></description><link>https://elia.contini.page/blog/css-box-with-zig-zag-border/</link><guid isPermaLink="false">https://elia.contini.page/blog/css-box-with-zig-zag-border/</guid><pubDate>Sun, 10 Feb 2013 09:00:00 GMT</pubDate></item><item><title><![CDATA[Django: set select choices dynamically in Forms]]></title><description><![CDATA[Making user choices dynamic]]></description><link>https://elia.contini.page/blog/django-set-select-choices-dynamically-in-forms/</link><guid isPermaLink="false">https://elia.contini.page/blog/django-set-select-choices-dynamically-in-forms/</guid><pubDate>Sun, 27 Jan 2013 09:00:00 GMT</pubDate></item><item><title><![CDATA[The Unofficial Dojo Toolkit 1.8 Quick Start Guide]]></title><description><![CDATA[Differences from the old versions and how to migrate]]></description><link>https://elia.contini.page/blog/the-unofficial-dojo-toolkit-1-8-quick-start-guide/</link><guid isPermaLink="false">https://elia.contini.page/blog/the-unofficial-dojo-toolkit-1-8-quick-start-guide/</guid><pubDate>Mon, 27 Aug 2012 08:00:00 GMT</pubDate></item><item><title><![CDATA[Dojo: mobile navigation how to]]></title><description><![CDATA[Creating a responsive navigation menu with dojo]]></description><link>https://elia.contini.page/blog/dojo-mobile-navigation-how-to/</link><guid isPermaLink="false">https://elia.contini.page/blog/dojo-mobile-navigation-how-to/</guid><pubDate>Mon, 25 Jun 2012 08:00:00 GMT</pubDate></item><item><title><![CDATA[DjangoDay 2012, Brescia: slides]]></title><description><![CDATA[The slides of my talk]]></description><link>https://elia.contini.page/blog/django-day-2012-brescia/</link><guid isPermaLink="false">https://elia.contini.page/blog/django-day-2012-brescia/</guid><pubDate>Sun, 22 Apr 2012 08:00:00 GMT</pubDate></item><item><title><![CDATA[MethodCamp 2012, Lugano: slides]]></title><description><![CDATA[The slides of my talk]]></description><link>https://elia.contini.page/blog/method-camp-2012/</link><guid isPermaLink="false">https://elia.contini.page/blog/method-camp-2012/</guid><pubDate>Sun, 18 Mar 2012 09:00:00 GMT</pubDate></item><item><title><![CDATA[Progressive Enhancement and Responsive Web Design]]></title><description><![CDATA[A list of some interesting Web resources and books]]></description><link>https://elia.contini.page/blog/progressive-enhancement-and-responsive-web-design/</link><guid isPermaLink="false">https://elia.contini.page/blog/progressive-enhancement-and-responsive-web-design/</guid><pubDate>Thu, 02 Feb 2012 09:00:00 GMT</pubDate></item><item><title><![CDATA[Dojo: Asynchronous Module Definition (AMD)]]></title><description><![CDATA[How to migrate old code to the new style exploiting AMD module format]]></description><link>https://elia.contini.page/blog/dojo-asynchronous-module-definition-amd/</link><guid isPermaLink="false">https://elia.contini.page/blog/dojo-asynchronous-module-definition-amd/</guid><pubDate>Mon, 23 Jan 2012 09:00:00 GMT</pubDate></item><item><title><![CDATA[Dojo: declarative widgets and XHTML validation]]></title><description><![CDATA[Write valid XHTML while using declarative widgets]]></description><link>https://elia.contini.page/blog/dojo-declarative-widgets-and-xhtml-validation/</link><guid isPermaLink="false">https://elia.contini.page/blog/dojo-declarative-widgets-and-xhtml-validation/</guid><pubDate>Mon, 02 Jan 2012 09:00:00 GMT</pubDate></item><item><title><![CDATA[Optimizing HTML, CSS and JavaScript]]></title><description><![CDATA[Resources to optimize your Web projects]]></description><link>https://elia.contini.page/blog/optimizing-html-css-javascript/</link><guid isPermaLink="false">https://elia.contini.page/blog/optimizing-html-css-javascript/</guid><pubDate>Mon, 24 Oct 2011 08:00:00 GMT</pubDate></item><item><title><![CDATA[8 Smartphone Application Builders]]></title><description><![CDATA[Mobile application develoment made easy]]></description><link>https://elia.contini.page/blog/smartphone-application-builders/</link><guid isPermaLink="false">https://elia.contini.page/blog/smartphone-application-builders/</guid><pubDate>Tue, 14 Jun 2011 08:00:00 GMT</pubDate></item><item><title><![CDATA[Fighting against the new Internet Explorer 6]]></title><description><![CDATA[I wish to introduce Google Chrome Frame]]></description><link>https://elia.contini.page/blog/fighting-against-the-new-internet-explorer-6/</link><guid isPermaLink="false">https://elia.contini.page/blog/fighting-against-the-new-internet-explorer-6/</guid><pubDate>Wed, 11 May 2011 08:00:00 GMT</pubDate></item><item><title><![CDATA[Sketches, wireframes and mockups]]></title><description><![CDATA[Are they different or are the same thing?]]></description><link>https://elia.contini.page/blog/sketches-wireframes-and-mockups/</link><guid isPermaLink="false">https://elia.contini.page/blog/sketches-wireframes-and-mockups/</guid><pubDate>Sun, 03 Apr 2011 08:00:00 GMT</pubDate></item><item><title><![CDATA[Cross-platform mobile frameworks]]></title><description><![CDATA[A list of mobile frameworks to develop cross-platform applications]]></description><link>https://elia.contini.page/blog/cross-platform-mobile-frameworks/</link><guid isPermaLink="false">https://elia.contini.page/blog/cross-platform-mobile-frameworks/</guid><pubDate>Thu, 10 Mar 2011 09:00:00 GMT</pubDate></item><item><title><![CDATA[MethodCamp 2011, Lugano: slides]]></title><description><![CDATA[The slides of my talk]]></description><link>https://elia.contini.page/blog/method-camp-2011/</link><guid isPermaLink="false">https://elia.contini.page/blog/method-camp-2011/</guid><pubDate>Sun, 27 Feb 2011 09:00:00 GMT</pubDate></item><item><title><![CDATA[Understanding HTML5 Validation]]></title><description><![CDATA[The differences between XHTML and HTML5 validation]]></description><link>https://elia.contini.page/blog/understanding-html5-validation/</link><guid isPermaLink="false">https://elia.contini.page/blog/understanding-html5-validation/</guid><pubDate>Sun, 02 Jan 2011 09:00:00 GMT</pubDate></item><item><title><![CDATA[A Guide to the Open Internet]]></title><description><![CDATA[Read and get the word out!]]></description><link>https://elia.contini.page/blog/a-guide-to-the-open-internet/</link><guid isPermaLink="false">https://elia.contini.page/blog/a-guide-to-the-open-internet/</guid><pubDate>Mon, 27 Dec 2010 09:00:00 GMT</pubDate></item><item><title><![CDATA[It's not "rooting", it's openness]]></title><description><![CDATA[Nexus S allows enthusiasts to install custom operating systems]]></description><link>https://elia.contini.page/blog/it-is-not-rooting-it-is-openness/</link><guid isPermaLink="false">https://elia.contini.page/blog/it-is-not-rooting-it-is-openness/</guid><pubDate>Tue, 21 Dec 2010 09:00:00 GMT</pubDate></item><item><title><![CDATA[An Introduction to Color Theory for Web Designers]]></title><description><![CDATA[What you need to know about colors]]></description><link>https://elia.contini.page/blog/an-introduction-to-color-theory-for-web-designers/</link><guid isPermaLink="false">https://elia.contini.page/blog/an-introduction-to-color-theory-for-web-designers/</guid><pubDate>Thu, 16 Dec 2010 09:00:00 GMT</pubDate></item><item><title><![CDATA[Developing mobile applications using PhoneGap and jQuery Mobile]]></title><description><![CDATA[Using Web technologies to develop cross platform mobile app]]></description><link>https://elia.contini.page/blog/developing-mobile-applications-using-phonegap-and-jquery-mobile/</link><guid isPermaLink="false">https://elia.contini.page/blog/developing-mobile-applications-using-phonegap-and-jquery-mobile/</guid><pubDate>Tue, 16 Nov 2010 09:00:00 GMT</pubDate></item></channel></rss>