<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="vendor/material-design-lite/material.min.css"> <link rel="stylesheet" href="css/main.css"> <meta name="theme-color" content="#180f24"> <title>Nicolas PENNEC - Tech Lead / Senior Fullstack Web Developer - Rennes, France</title> <meta content="Hi! I'm Nicolas Pennec, a Teach Lead and Web Engineer based in Rennes, France" name="description"> <meta property="og:title" content="Nicolas PENNEC - Tech Lead Web Engineer - Rennes, France"> <meta property="og:description" content="Hi! I'm Nicolas Pennec, a Teach Lead and Web Engineer based in Rennes, France"> <meta property="og:type" content="website"> <meta property="og:url" content="https://pennec.io/"> <meta property="og:image" content="https://pennec.io/img/avatar-nicolas-pennec.jpg"> <meta name="twitter:card" content="summary"> <meta name="twitter:site" content="@NicoPennec"> <script type="application/ld+json"> { "@context": "http://schema.org", "@type": "Person", "name": "Nicolas Pennec", "additionalName": "NicoPennec", "jobTitle": "Tech Lead Web Engineer", "url": "https://pennec.io", "image": "https://pennec.io/img/avatar-nicolas-pennec.jpg", "sameAs": [ "https://twitter.com/nicopennec", "https://www.linkedin.com/in/nicopennec", "https://github.com/nicopennec", "https://medium.com/@NicoPennec" ] } </script> <link rel="preconnect" href="https://fonts.googleapis.com" crossorigin> <link rel="preconnect" href="https://www.google-analytics.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin> <link rel="dns-prefetch" href="https://fonts.googleapis.com"> <link rel="dns-prefetch" href="https://www.google-analytics.com"> <link rel="dns-prefetch" href="https://fonts.gstatic.com/"> </head> <body class="mdl-color--grey-100 mdl-color-text--grey-800 mdl-base fonts--loading"> <div class="mdl-layout mdl-js-layout mdl-layout--fixed-header"> <header class="header mdl-layout__header mdl-layout__header--waterfall"> <div class="mdl-layout__header-row"> <span class="mdl-layout-title">Nicolas PENNEC</span> <div class="mdl-layout-spacer"></div> <nav class="mdl-navigation mdl-layout--large-screen-only"> <a class="mdl-navigation__link" href="#about">About</a> <a class="mdl-navigation__link" href="#skills">Skills</a> <a class="mdl-navigation__link" href="#open-source">Open Source</a> <a class="mdl-navigation__link" href="#talks">Talks</a> <a class="mdl-navigation__link" href="#follow-me">Follow Me</a> </nav> </div> </header> <div class="mdl-layout__drawer"> <span class="mdl-layout-title">Nicolas PENNEC</span> <nav class="mdl-navigation"> <a class="mdl-navigation__link" href="#about">About</a> <a class="mdl-navigation__link" href="#skills">Skills</a> <a class="mdl-navigation__link" href="#open-source">Open Source</a> <a class="mdl-navigation__link" href="#talks">Talks</a> <a class="mdl-navigation__link" href="#follow-me">Follow Me</a> </nav> </div> <main class="mdl-layout__content"> <div class="page-content"> <section class="about section--center mdl-grid mdl-grid--no-spacing mdl-shadow--2dp"> <div class="mdl-card mdl-cell mdl-cell--12-col"> <h1>Nicolas PENNEC</h1> <h2>Tech Lead / Senior Fullstack Web Developer</h2> <h2>Co-Founder of <a href="https://rennesjs.org" title="Rennes JavaScript User Group">RennesJS</a></h2> <h2>Member of <a href="https://github.com/nuxt-community">Nuxt Community</a></h2> <div class="resume"> <p>Hi! I'm Nicolas Pennec, a Teach Lead and Web Engineer based in Rennes, France.</p> <p>I'm working as Senior Front-End Engineer for <a rel="nofollow noopener" href="https://www.cg-wire.com/">CGWire</a>, which develops the open-source software <a rel="nofollow noopener" href="https://github.com/cgwire/kitsu">Kitsu</a>.</p> <p> With over 15 years of experience in IT, I am passionate about web development. <br> For me, programming feels more like a kind of puzzle! A funny game ツ </p> </div> <!-- <div> <a href="cv/french/cv-nicolas-pennec-2016.pdf" class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--colored" title="Download my Curriculum Vitae"> Download my CV <i class="mdl-color-text--white material-icons mdi-picture-as-pdf" aria-hidden="true"></i> </a> </div> --> </div> <img id="about" class="avatar mdl-shadow--2dp" src="img/avatar-nicolas-pennec.jpg" alt="Nicolas PENNEC" width="128" height="128"> </section> <section id="skills" class="section--center mdl-grid mdl-grid--no-spacing mdl-shadow--2dp"> <div class="mdl-card mdl-cell mdl-cell--12-col"> <div class="mdl-card__supporting-text"> <h4> <i class="mdl-color-text--blue-grey-400 material-icons mdi-thumb-up" aria-hidden="true"><!--thumb_up--></i> My Skills </h4> <ul> <li>JavaScript <ul> <li>Front-End: Vue & Nuxt / Reat & Next</li> <li>Back-End: Node.js / Express / Electron</li> </ul> </li> <li>HTML 5</li> <li>CSS / SASS / LESS</li> <li>Java / JEE</li> <li>PHP / Symfony</li> <li>MySQL / PostgreSQL / MongoDB</li> <li><abbr title="Search Engine Optimization">SEO</abbr></li> <li><abbr title="Geographic Information System">GIS</abbr></li> <li>CI/CD (GitLab CI, GitHub Actions, CircleCI, ...)</li> </ul> </div> </div> </section> <section id="open-source" class="section--center mdl-grid mdl-grid--no-spacing mdl-shadow--2dp"> <div class="mdl-card mdl-cell mdl-cell--12-col"> <div class="mdl-card__supporting-text"> <h4> <i class="mdl-color-text--blue-grey-400 material-icons mdi-extension" aria-hidden="true"><!--extension--></i> Open Source Projects </h4> <ul class="open-source-projects"> <li> <b>Sitemap Module for Nuxt.js 🤖</b> <p><a href="https://github.com/nuxt-community/sitemap-module">nuxt-community/sitemap-module</a></p> <p><a class="github-button" href="https://github.com/nuxt-community/sitemap-module" data-size="large" data-show-count="true" aria-label="Star nuxt-community/sitemap-module on GitHub">Star</a></p> </li> <li> <b>A Weather app build with Nuxt.js 🌤️</b> <p><a href="https://github.com/nicopennec/nuxt-weather">nicopennec/nuxt-weather</a></p> <p><a class="github-button" href="https://github.com/nicopennec/nuxt-weather" data-size="large" data-show-count="true" aria-label="Star nicopennec/nuxt-weather on GitHub">Star</a></p> </li> <li> <b>Easily create your WebPageTest instance with Vagrant ⚡️</b> <p><a href="https://github.com/nicopennec/vagrant-webpagetest">nicopennec/vagrant-webpagetest</a></p> <p><a class="github-button" href="https://github.com/nicopennec/vagrant-webpagetest" data-size="large" data-show-count="true" aria-label="Star nicopennec/vagrant-webpagetest on GitHub">Star</a></p> </li> </ul> </div> </div> </section> <section id="talks" class="section--center mdl-grid mdl-grid--no-spacing mdl-shadow--2dp"> <div class="mdl-card mdl-cell mdl-cell--12-col"> <div class="mdl-card__supporting-text"> <h4> <i class="mdl-color-text--blue-grey-400 material-icons mdi-forum" aria-hidden="true"><!--forum--></i> My Talks </h4> <p>I have spoken at several meetups and conferences:</p> <ul class="talks__list"> <li> <a href="https://www.breizhcamp.org/">BreizhCamp Conference</a> 2025, Rennes, France <ul> <li> <a href="https://www.youtube.com/watch?v=yzKMbVFcukU" title="show the video"><span lang="fr">Montres Cardio-GPS : Mythes, Réalités et Technologies Décryptées</span></a> [<abbr title="french">fr</abbr>] (<a href="https://docs.google.com/presentation/d/e/2PACX-1vSsL60RQ6reJmljR5-nmmB6P0uUNkVlkZS-s27LMtGaU1Nr6LSo6-bBC2b4r5wZPmMTc6T5lGx6r48E/pub" title="show the slides">Slides</a>) </li> </ul> </li> <li> <a href="https://www.meetup.com/fr-FR/paris-typescript/">Paris TypeScript Meetup</a> 2020, Paris, France (online) <ul> <li> <a href="https://www.youtube.com/live/SfvFu7cyNZk?si=NxZA7PkMYF88EDT-&t=420" title="show the video">Serverless made easy for web developers, with WarpJS</a> [<abbr title="english">en</abbr>] </li> </ul> </li> <li> <a href="https://www.meetup.com/fr-FR/BrestJS/">BrestJS Meetup</a> 2018, Brest, France <ul> <li> <a href="https://docs.google.com/presentation/d/e/2PACX-1vRPXeMkc3JfpzBVMbISZXeshGNiprFDfPxvJ6wChOW3qnjehoaD9wGS15m_YGaihV3Gni4Z3oWqOH4b/pub" title="show the slides">"Nuxt 2.0 - Universal Vue.js Applications"</a> </li> </ul> </li> <li> <a href="https://www.meetup.com/fr-FR/Vuejs-Nantes/">Vue.js Nantes Meetup</a> 2018, Nantes, France <ul> <li> <a href="https://docs.google.com/presentation/d/e/2PACX-1vSDcRTuy85VFClUmdH7Ryw9nZnuu8EtZZrmwpZBpwiKKN4fPhnrrO0-7PR9ok5aIGJ_Kqt0TcCJqVmT/pub" title="show the slides">"Nuxt.js - Universal Vue.js Applications"</a> </li> </ul> </li> <li> <a href="https://www.breizhcamp.org">BreizhCamp Conference</a> 2018, Rennes, France <ul> <li> <a href="https://docs.google.com/presentation/d/e/2PACX-1vR_cnC9AoX-hrGS9jyCHAmn4W8Cds2iL7NUGq7y2fTAuWQS4CiNsV9GYH7S1EsezkniSxcKF_9uZeQF/pub" title="show the slides"><span lang="fr">"Nom de Zeus, j'ai typé mon Vanilla JS !"</span></a> (<a href="https://github.com/NicoPennec/tscheck-demo" title="view source code">source code on GitHub</a>) </li> <li> <a href="https://www.youtube.com/watch?v=_7-uB04niws&list=PLzZ0f2KT2ZROn2h2DKpm531Vqip82U9eT" title="show the video"><span lang="fr">Node.js et les 3 coquillages</span></a> [<abbr title="french">fr</abbr>] (<a href="https://docs.google.com/presentation/d/e/2PACX-1vSrym1ZiZdTpEPI_XEpdWHMYlD-uJAzo61qZ7o1zYb5suWfeSQzR8DGWNTD7wpDFS3IqxWCCfKLZTOr/pub">slides</a>) </li> </ul> </li> <li> <a href="https://chtijs.francejs.org/">Chti.js Meetup</a> 2017, Lille, France <ul> <li> <a href="https://docs.google.com/presentation/d/1lUjjTBYEY8TaeWlpvMel6H33rb7d_gixsHpl8nhd2aw/pub" title="show the slides">"Nuxt.js - Universal Vue.js Applications"</a> [<abbr title="english">en</abbr>] </li> </ul> </li> <li> <a href="https://www.ovh.com/fr/blog/sentry-ouvrez-chasse-aux-bugs/">OVH Meetup</a> 2017, Lille, France <ul> <li> <a href="https://www.youtube.com/watch?v=5kPWr1IYVhg&t=0s&list=PLzZ0f2KT2ZROn2h2DKpm531Vqip82U9eT" title="show the video"><span lang="fr">"Sentry, La chasse aux bugs est ouverte !"</span></a> [<abbr title="french">fr</abbr>] (<a href="https://docs.google.com/presentation/d/1GnNcwWokpuGDzF07qFXJibOpzIbEX6X6IQR04oLuIFE/pub">slides</a>) </li> </ul> </li> <li> <a href="https://www.breizhcamp.org">BreizhCamp Conference</a> 2017, Rennes, France <ul> <li> <a href="https://docs.google.com/presentation/d/1KBcAav2BhM9DQY5NMq0AOpvgNh9KutKSezmHUT02qK8/pub" title="show the slides"><span lang="fr">"Sentry, La chasse aux bugs est ouverte !"</span></a> [<abbr title="french">fr</abbr>] </li> </ul> </li> <li> <a href="https://www.breizhcamp.org">BreizhCamp Conference</a> 2015, Rennes, France <ul> <li> <!--<span>"Angular 2, The Force Awakens"</span> / --> <a href="https://www.youtube.com/watch?v=IWJqj9y5tO4&list=PLzZ0f2KT2ZROn2h2DKpm531Vqip82U9eT" title="show the video"><span lang="fr">"Angular 2, Le Réveil de la Force"</span></a> [<abbr title="french">fr</abbr>] (<a href="https://www.slideshare.net/NicoPennec/angular-2-le-reveil-de-la-force">slides</a>) </li> <li> <!--<span>"45 Tools to Boost Your Front-End"</span> / --> <a href="https://www.youtube.com/watch?v=D67WubvgGWM&list=PLzZ0f2KT2ZROn2h2DKpm531Vqip82U9eT" title="show the video"><span lang="fr">"45 outils pour doper votre front-end"</span></a> [<abbr title="french">fr</abbr>] (<a href="https://www.slideshare.net/NicoPennec/45-toolstoboostyourfrontend" title="show the slides">slides</a>) </li> </ul> </li> <li> <a href="https://rennesjs.org" title="Rennes JavaScript User Group">RennesJS Meetup</a>, Rennes, France <ul> <li> <a href="https://www.slideshare.net/NicoPennec/ng-conf-2015" title="show the slides">"Ng-Conf 2015 Report : AngularJS 1 & 2"</a> [<abbr title="english">en</abbr>] </li> <li> <a href="https://www.slideshare.net/NicoPennec/introduction-angularjs" title="show the slides">"Introduction à AngularJS"</a> [<abbr title="french">fr</abbr>] </li> </ul> </li> <li> <u>Flex User Group</u>, Rennes, France <ul> <li> <a href="https://fr.slideshare.net/NicoPennec/flex-46-et-flash-builder-46" title="show the slides">"Flex 4.6 & Flash Builder 4.6"</a> [<abbr title="french">fr</abbr>] </li> <li> <a href="https://fr.slideshare.net/NicoPennec/prsentation-de-robotlegs" title="show the slides">"Présentation de Robotlegs"</a> [<abbr title="french">fr</abbr>] </li> </ul> </li> </ul> </div> </div> </section> <section id="follow-me" class="section--center mdl-grid mdl-grid--no-spacing mdl-shadow--2dp"> <div class="mdl-card mdl-cell mdl-cell--12-col"> <div class="mdl-card__supporting-text"> <h4> <i class="mdl-color-text--blue-grey-400 material-icons mdi-people" aria-hidden="true"><!--people--></i> Follow Me </h4> <ul class="social"> <li><a href="https://www.linkedin.com/in/nicopennec">LinkedIn</a></li> <li><a href="https://github.com/NicoPennec">GitHub</a></li> <li><a href="https://stackoverflow.com/users/4328275/nicopennec">StackOverflow</a></li> <li><a href="https://www.slideshare.net/NicoPennec">SlideShare</a></li> <li><a href="https://www.instagram.com/nicopennec/">Instagram</a></li> <li><a href="https://www.facebook.com/nicolas.pennec">Facebook</a></li> <li><a href="https://x.com/NicoPennec">X (Twitter)</a></li> <li><a href="https://medium.com/@NicoPennec">Medium</a></li> </ul> </div> </div> </section> </div> </main> </div> <script src="vendor/raven/3.27.0/raven.min.js"></script> <script src="vendor/material-design-lite/material.min.js"></script> <script src="vendor/loadcss/0.1.7/loadCSS.min.js"></script> <script> Raven.config('https://cdf67a30b325483893c7d843765a6cf2@sentry.io/158789').install(); var ss=loadCSS('https://fonts.googleapis.com/icon?family=Material+Icons'); onloadCSS(ss,function(){document.body.classList.add('mdi--loaded');}); </script> <noscript><link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"></noscript> <script> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-63811497-1', 'auto'); ga('send', 'pageview'); </script> <script async defer src="https://buttons.github.io/buttons.js"></script> </body> </html>