CINXE.COM
It's FOSS
<!DOCTYPE html> <html lang="en" data-color-scheme="system"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>It's FOSS</title> <meta name="HandheldFriendly" content="True"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="theme-color" content="#007b80"> <link rel="preload" href="/assets/dist/app.min.js?v=dc47750738" as="script"> <link rel="preload" href="/assets/dist/app.min.css?v=dc47750738" as="style"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <style> body { --font-headings: var(--gh-font-heading, var(--font-system)); --font-body: var(--gh-font-heading, var(--font-system)); } </style> <link rel="preload stylesheet" href="https://fonts.googleapis.com/css2?family=Figtree:wght@400;500;600;700&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'" crossorigin> <style>body { --font-body: var(--gh-font-body, 'Figtree'), sans-serif; --font-headings: var(--gh-font-heading, 'Figtree'), sans-serif; }</style> <script async defer src="/assets/dist/app.min.js?v=dc47750738"></script> <link rel="stylesheet" type="text/css" href="/assets/dist/app.min.css?v=dc47750738"> <link rel="preconnect" href="https://a.pub.network/" crossorigin /> <link rel="preconnect" href="https://b.pub.network/" crossorigin /> <link rel="preconnect" href="https://c.pub.network/" crossorigin /> <link rel="preconnect" href="https://d.pub.network/" crossorigin /> <link rel="preconnect" href="https://c.amazon-adsystem.com" crossorigin /> <link rel="preconnect" href="https://s.amazon-adsystem.com" crossorigin /> <link rel="preconnect" href="https://btloader.com/" crossorigin /> <link rel="preconnect" href="https://api.btloader.com/" crossorigin /> <link rel="preconnect" href="https://confiant-integrations.global.ssl.fastly.net" crossorigin /> <link rel="stylesheet" href="https://a.pub.network/core/pubfig/cls.css"> <script data-cfasync="false" type="text/javascript"> var freestar = freestar || {}; freestar.queue = freestar.queue || []; freestar.config = freestar.config || {}; freestar.config.enabled_slots = []; freestar.initCallback = function () { (freestar.config.enabled_slots.length === 0) ? freestar.initCallbackCalled = false : freestar.newAdSlots(freestar.config.enabled_slots) } </script> <script src="https://a.pub.network/itsfoss/pubfig.min.js" data-cfasync="false" async></script> <style> :root { --global-max-width: 1320px; /* site max width */ --global-content-width: 680px; /* post-content-width */ --global-wide-width: 960px; /* site max width */ --global-post-hero-content-max-width: 768px; --global-radius: 5px; /* default radius */ --global-gallery-gap: 1em; /* Image gallery distance between images */ --global-hyphens: none; /* none/auto */ --global-header-height: 72px; --global-theme-notifications: visible; /* visible/hidden */ --global-progress-bar: visible; /* visible/hidden */ --global-content-preview-fading: 0%; /* 50%-100% for fading effect */ --global-hero-img-filter: ; --global-scroll-behavior: auto; } </style> <script> let preferredTheme = localStorage.getItem('PREFERRED_COLOR_SCHEME') || `system`; document.documentElement.setAttribute('data-color-scheme', preferredTheme); // Global values needed const themeGlobal = { currentPage: parseInt(''), nextPage: parseInt(''), nextPageLink: '', maxPages: parseInt(''), lastPage: `` === `` ? true : false, postsPerPage: parseInt('24'), totalPosts: parseInt(''), scrollPos: 0, imageLightbox: `true` === `true` ? true : false, autoloadResources: false, filterScrollBehavior: 'smooth' } // Calculate contrast & HSL value; function getBrandColorInfo(hexcolor) { // get contrast if (hexcolor.slice(0, 1) === '#') { hexcolor = hexcolor.slice(1); } if (hexcolor.length === 3) { hexcolor = hexcolor.split('').map(function (hex) { return hex + hex;}).join(''); } let r = parseInt(hexcolor.substr(0,2),16), g = parseInt(hexcolor.substr(2,2),16), b = parseInt(hexcolor.substr(4,2),16); let yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000; const colorContrast = (yiq >= 128) ? '#000' : '#fff'; //get HSL r /= 255, g /= 255, b /= 255; const max = Math.max(r, g, b), min = Math.min(r, g, b); let h, s, l = (max + min) / 2; if ( max == min ) { h = s = 0; } else { let d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); switch(max){ case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; } h /= 6; } const colorHSL = [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100)]; // return return { colorContrast, colorHSL } }; const brandColor = getBrandColorInfo("#007b80"); let style = document.createElement('style'); style.innerHTML = `:root { --color-brand-contrast: ${brandColor.colorContrast}; --color-brand-h: ${brandColor.colorHSL[0]}; --color-brand-s: ${brandColor.colorHSL[1]}%; --color-brand-l: ${brandColor.colorHSL[2]}%; --color-brand-hsl: ${brandColor.colorHSL[0]} ${brandColor.colorHSL[1]}% ${brandColor.colorHSL[2]}%; }` document.getElementsByTagName('head')[0].appendChild(style); </script> <link rel="icon" href="https://itsfoss.com/content/images/size/w256h256/2022/12/android-chrome-192x192.png" type="image/png"> <link rel="canonical" href="https://itsfoss.com/signin/"> <meta name="referrer" content="no-referrer-when-downgrade"> <meta property="og:site_name" content="It's FOSS"> <meta property="og:type" content="website"> <meta property="og:title" content="It's FOSS"> <meta property="og:url" content="https://itsfoss.com/signin/"> <meta property="article:publisher" content="https://www.facebook.com/itsfoss"> <meta name="twitter:card" content="summary"> <meta name="twitter:title" content="It's FOSS"> <meta name="twitter:url" content="https://itsfoss.com/signin/"> <meta name="twitter:site" content="@itsfoss2"> <meta name="generator" content="Ghost 5.116"> <link rel="alternate" type="application/rss+xml" title="It's FOSS" href="https://itsfoss.com/rss/"> <script defer src="https://cdn.jsdelivr.net/ghost/portal@~2.50/umd/portal.min.js" data-i18n="true" data-ghost="https://itsfoss.com/" data-key="121ee4fb8f9bf181b8f07c52f6" data-api="https://itsfoss.com/ghost/api/content/" data-locale="en" crossorigin="anonymous"></script><style id="gh-members-styles">.gh-post-upgrade-cta-content, .gh-post-upgrade-cta { display: flex; flex-direction: column; align-items: center; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; text-align: center; width: 100%; color: #ffffff; font-size: 16px; } .gh-post-upgrade-cta-content { border-radius: 8px; padding: 40px 4vw; } .gh-post-upgrade-cta h2 { color: #ffffff; font-size: 28px; letter-spacing: -0.2px; margin: 0; padding: 0; } .gh-post-upgrade-cta p { margin: 20px 0 0; padding: 0; } .gh-post-upgrade-cta small { font-size: 16px; letter-spacing: -0.2px; } .gh-post-upgrade-cta a { color: #ffffff; cursor: pointer; font-weight: 500; box-shadow: none; text-decoration: underline; } .gh-post-upgrade-cta a:hover { color: #ffffff; opacity: 0.8; box-shadow: none; text-decoration: underline; } .gh-post-upgrade-cta a.gh-btn { display: block; background: #ffffff; text-decoration: none; margin: 28px 0 0; padding: 8px 18px; border-radius: 4px; font-size: 16px; font-weight: 600; } .gh-post-upgrade-cta a.gh-btn:hover { opacity: 0.92; }</style><script async src="https://js.stripe.com/v3/"></script> <script defer src="https://cdn.jsdelivr.net/ghost/sodo-search@~1.5/umd/sodo-search.min.js" data-key="121ee4fb8f9bf181b8f07c52f6" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.5/umd/main.css" data-sodo-search="https://itsfoss.com/" data-locale="en" crossorigin="anonymous"></script> <link href="https://itsfoss.com/webmentions/receive/" rel="webmention"> <script defer src="/public/cards.min.js?v=dc47750738"></script> <link rel="stylesheet" type="text/css" href="/public/cards.min.css?v=dc47750738"> <script defer src="/public/member-attribution.min.js?v=dc47750738"></script><style>:root {--ghost-accent-color: #007b80;}</style> <style> body { --global-max-width: 1400px; --global-content-width: 70rem; } </style> <style> @media only screen and (max-width: 600px) { .hide-mobile {display:none;} } </style> <!-- CSS for bullet point rendering issue on course pages --> <style> .content ul li { list-style: inside; margin-bottom: 2rem; } </style> <!-- Vimeo embed fix for custom docs pages --> <style> .js-reframe { padding-top: 0px !important; } </style> <!-- Sourcepoint CMP CSS for geo depending button --> <style> #pmLink { visibility: hidden; text-decoration: none; cursor: pointer; background: transparent; border: none; } #pmLink:hover { visibility: visible; color: grey; } </style> <!-- Google tag (gtag.js) --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-24863836-4"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-24863836-4'); </script> <!-- Umami analytics --> <script async src="https://groovy-manul.pikapod.net/script.js" data-website-id="9f9bd940-0b37-4748-8257-9814959d3526"></script> <!-- Contextly Related Posts --> <script> !function(w,d,id,ns,s){var c=w[ns]=w[ns]||{};if(c.ready||(c.q=[],c.ready=function(){c.q.push(arguments)}),!d.getElementById(id)){var e=d.createElement(s);e.id=id,e.src="https://assets.context.ly/kit/6.latest/loader.js";var h=d.getElementsByTagName(s)[0];h.parentNode.insertBefore(e,h)}}(window,document,"ctx-loader","Contextly","script"); </script> <!-- Open Links in New Tab --> <script> document.addEventListener('DOMContentLoaded', function() { var links = document.querySelectorAll('a'); links.forEach(function(link) { if (link.hostname != window.location.hostname) { link.target = '_blank'; } }); }); </script> </head> <body class=" " data-hero-image=""> <main class="main flex"> <div class="signin-page flex flex-cc" data-image-style="right"> <div class="signin-page__content"> <a href="https://itsfoss.com" class="signin-page__brand"> <picture class=""> <source data-srcset="/content/images/size/w300/format/webp/2023/01/itsfoss-logo.png 300w," data-sizes="auto" type="image/webp" > <img class="lazyload" data-srcset="/content/images/size/w300/2023/01/itsfoss-logo.png 300w," srcset="/content/images/size/w30/2023/01/itsfoss-logo.png" data-sizes="auto" data-src="/content/images/size/w100/2023/01/itsfoss-logo.png" src="/content/images/size/w30/2023/01/itsfoss-logo.png" alt="It's FOSS" > </picture> </a> <div class="signin-page__box"> <h1 class="signin-page__title">Sign in</h1> <p id="form-input-label" class="opacity-080">Sign into your account again.</p> <form class="subscribe-form" data-members-form="signin" data-style=""> <input data-members-email class="" type="email" autocomplete="email" placeholder="Your email address" aria-labelledby="form-input-label" required> <button class="btn uppercase btn--brand" type="submit"> <span>Send login link</span> </button> <div class="msg-success">Great! Check your inbox and click the link.</div> <div class="msg-error">Sorry, something went wrong. Please try again.</div> </form> <p class="m-0 m-t text-center"> <small>Don't have an account yet? <a href="/signup/">Sign up</a> </small> </p> </div> </div> </div> </main> <dialog class="notification"> <i class="icon icon-success notification-icon"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-circle-check" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <circle cx="12" cy="12" r="9" /> <path d="M9 12l2 2l4 -4" /> </svg> </i> <i class="icon icon-error notification-icon"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-octagon" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M8.7 3h6.6c.3 0 .5 .1 .7 .3l4.7 4.7c.2 .2 .3 .4 .3 .7v6.6c0 .3 -.1 .5 -.3 .7l-4.7 4.7c-.2 .2 -.4 .3 -.7 .3h-6.6c-.3 0 -.5 -.1 -.7 -.3l-4.7 -4.7c-.2 -.2 -.3 -.4 -.3 -.7v-6.6c0 -.3 .1 -.5 .3 -.7l4.7 -4.7c.2 -.2 .4 -.3 .7 -.3z" /> <line x1="12" y1="8" x2="12" y2="12" /> <line x1="12" y1="16" x2="12.01" y2="16" /> </svg> </i> <i class="icon icon-warning notification-icon"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M12 9v2m0 4v.01" /> <path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /> </svg> </i> <p class="notification-msg signup-success">Great! You鈥檝e successfully signed up.</p> <p class="notification-msg signin-success">Welcome back! You've successfully signed in.</p> <p class="notification-msg subscribe-success">You've successfully subscribed to It's FOSS.</p> <p class="notification-msg link-expired">Your link has expired.</p> <p class="notification-msg checkout-success">Success! Check your email for magic link to sign-in.</p> <p class="notification-msg billing-success">Success! Your billing info has been updated.</p> <p class="notification-msg billing-cancel">Your billing was not updated.</p> <button class="notification-close js-notification-close" aria-label="Close" onclick="closeNotification(event.currentTarget.parentNode);"> <i class="icon icon-x"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-x" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <line x1="18" y1="6" x2="6" y2="18" /> <line x1="6" y1="6" x2="18" y2="18" /> </svg> </i> </button> </dialog> <script> // Give the parameter a variable name const qsParams = new URLSearchParams(window.location.search); const isAction = qsParams.has('action'); const isStripe = qsParams.has('stripe'); const success = qsParams.get('success'); const action = qsParams.get('action'); const stripe = qsParams.get('stripe'); if (qsParams && isAction) { if (success === "true") { switch (action) { case 'subscribe': openNotification('subscribe-success'); break; case 'signup': openNotification('signup-success'); break; case 'signin': openNotification('signin-success'); break; default: break; } } else { openNotification('link-expired'); } } if (qsParams && isStripe) { switch (stripe) { case 'success': openNotification('checkout-success'); break; case 'billing-update-success': openNotification('billing-success'); break; case 'billing-update-cancel': openNotification('billing-cancel'); break; default: break; } } /** * Handle Notifications */ function openNotification(type) { const notification = document.querySelector('dialog.notification'); if (notification) { notification.setAttribute('data-msg-type', type); notification.show(); setTimeout(function(){ closeNotification(notification); }, 3000); } } /** * Clean URI */ function clearURI() { window.history.replaceState({}, '', `${window.location.pathname}`); } function closeNotification(notification) { notification.close(); clearURI(); setTimeout(function(){ notification.removeAttribute('data-msg-type') }, 500); } </script> <script src="https://talk.hyvor.com/embed/comment-counts.js"></script> <script> hyvorTalkCommentCounts.load({ "website-id": 8243 }) </script> <script> Contextly.ready('widgets'); </script> <!-- HTML for geo depending button --> <button id="pmLink">Privacy Manager</button> <!-- Blockthrough script --> <script type="text/javascript" async src="https://btloader.com/tag?o=5714937848528896&upapi=true"></script> <!-- This site is converting visitors into subscribers and customers with OptinMonster - https://optinmonster.com --> <script>(function(d,u,ac){var s=d.createElement('script');s.type='text/javascript';s.src='https://a.omappapi.com/app/js/api.min.js';s.async=true;s.dataset.user=u;s.dataset.account=ac;d.getElementsByTagName('head')[0].appendChild(s);})(document,333364,352958);</script> <!-- / https://optinmonster.com --> </body> </html>