├── js ├── main.ts ├── index.ts ├── cookies.ts ├── normalizeText.ts ├── urls.ts └── notifications.ts ├── .gitignore ├── scss ├── _images.scss ├── _animations.scss ├── _colors.scss ├── _layout.scss ├── _fonts.scss ├── style.scss └── index.scss ├── img ├── share.jpg ├── favicon.ico ├── background.webp ├── screenshot.png ├── favicon-16x16.png ├── favicon-32x32.png ├── maskable_icon.png ├── mstile-70x70.png ├── apple-touch-icon.png ├── monochrome_icon.png ├── mstile-144x144.png ├── mstile-150x150.png ├── mstile-310x150.png ├── mstile-310x310.png ├── android-chrome-36x36.png ├── android-chrome-48x48.png ├── android-chrome-72x72.png ├── android-chrome-96x96.png ├── android-chrome-144x144.png ├── android-chrome-192x192.png ├── android-chrome-256x256.png ├── android-chrome-384x384.png ├── android-chrome-512x512.png ├── apple-touch-icon-57x57.png ├── apple-touch-icon-60x60.png ├── apple-touch-icon-72x72.png ├── apple-touch-icon-76x76.png ├── apple-touch-icon-114x114.png ├── apple-touch-icon-120x120.png ├── apple-touch-icon-144x144.png ├── apple-touch-icon-152x152.png ├── apple-touch-icon-180x180.png ├── psychopaths-are-ruining-everything.jpg ├── united-states-hurdle-to-universal-basic-income.jpg ├── browserconfig.xml ├── safari-pinned-tab.svg └── favicon.svg ├── fonts ├── raleway │ ├── raleway-700.eot │ ├── raleway-700.ttf │ ├── raleway-700.woff │ ├── raleway-700.woff2 │ ├── raleway-regular.eot │ ├── raleway-regular.ttf │ ├── raleway-regular.woff │ └── raleway-regular.woff2 ├── fontawesome │ ├── webfonts │ │ ├── fa-brands-400.eot │ │ ├── fa-brands-400.ttf │ │ ├── fa-solid-900.eot │ │ ├── fa-solid-900.ttf │ │ ├── fa-solid-900.woff │ │ ├── fa-brands-400.woff │ │ ├── fa-brands-400.woff2 │ │ └── fa-solid-900.woff2 │ └── css │ │ ├── solid.min.css │ │ └── brands.min.css └── playfair-display │ ├── playfair-display-700.eot │ ├── playfair-display-700.ttf │ ├── playfair-display-700.woff │ ├── playfair-display-700.woff2 │ ├── playfair-display-regular.eot │ ├── playfair-display-regular.ttf │ ├── playfair-display-regular.woff │ └── playfair-display-regular.woff2 ├── robots.txt ├── tsconfig.json ├── .github └── FUNDING.yml ├── _redirects ├── package.json ├── webpack.config.js ├── sitemap.xml ├── manifest.json ├── posts.json ├── sw.js ├── psychopaths-are-ruining-everything.html ├── united-states-hurdle-to-universal-basic-income.html ├── disclaimer.html ├── index.php ├── terms-and-conditions.html ├── index.html └── privacy-policy.html /js/main.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.code-workspace 2 | node_modules 3 | .DS_Store -------------------------------------------------------------------------------- /scss/_images.scss: -------------------------------------------------------------------------------- 1 | /* 2 | ** Images 3 | */ 4 | :root { 5 | --header-image: 'none'; 6 | } -------------------------------------------------------------------------------- /img/share.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/share.jpg -------------------------------------------------------------------------------- /img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/favicon.ico -------------------------------------------------------------------------------- /img/background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/background.webp -------------------------------------------------------------------------------- /img/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/screenshot.png -------------------------------------------------------------------------------- /img/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/favicon-16x16.png -------------------------------------------------------------------------------- /img/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/favicon-32x32.png -------------------------------------------------------------------------------- /img/maskable_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/maskable_icon.png -------------------------------------------------------------------------------- /img/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/mstile-70x70.png -------------------------------------------------------------------------------- /img/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/apple-touch-icon.png -------------------------------------------------------------------------------- /img/monochrome_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/monochrome_icon.png -------------------------------------------------------------------------------- /img/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/mstile-144x144.png -------------------------------------------------------------------------------- /img/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/mstile-150x150.png -------------------------------------------------------------------------------- /img/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/mstile-310x150.png -------------------------------------------------------------------------------- /img/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/mstile-310x310.png -------------------------------------------------------------------------------- /fonts/raleway/raleway-700.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/raleway/raleway-700.eot -------------------------------------------------------------------------------- /fonts/raleway/raleway-700.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/raleway/raleway-700.ttf -------------------------------------------------------------------------------- /img/android-chrome-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/android-chrome-36x36.png -------------------------------------------------------------------------------- /img/android-chrome-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/android-chrome-48x48.png -------------------------------------------------------------------------------- /img/android-chrome-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/android-chrome-72x72.png -------------------------------------------------------------------------------- /img/android-chrome-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/android-chrome-96x96.png -------------------------------------------------------------------------------- /fonts/raleway/raleway-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/raleway/raleway-700.woff -------------------------------------------------------------------------------- /fonts/raleway/raleway-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/raleway/raleway-700.woff2 -------------------------------------------------------------------------------- /img/android-chrome-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/android-chrome-144x144.png -------------------------------------------------------------------------------- /img/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/android-chrome-192x192.png -------------------------------------------------------------------------------- /img/android-chrome-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/android-chrome-256x256.png -------------------------------------------------------------------------------- /img/android-chrome-384x384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/android-chrome-384x384.png -------------------------------------------------------------------------------- /img/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/android-chrome-512x512.png -------------------------------------------------------------------------------- /img/apple-touch-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/apple-touch-icon-57x57.png -------------------------------------------------------------------------------- /img/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /img/apple-touch-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/apple-touch-icon-72x72.png -------------------------------------------------------------------------------- /img/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /fonts/raleway/raleway-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/raleway/raleway-regular.eot -------------------------------------------------------------------------------- /fonts/raleway/raleway-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/raleway/raleway-regular.ttf -------------------------------------------------------------------------------- /fonts/raleway/raleway-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/raleway/raleway-regular.woff -------------------------------------------------------------------------------- /img/apple-touch-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/apple-touch-icon-114x114.png -------------------------------------------------------------------------------- /img/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /img/apple-touch-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/apple-touch-icon-144x144.png -------------------------------------------------------------------------------- /img/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /img/apple-touch-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/apple-touch-icon-180x180.png -------------------------------------------------------------------------------- /fonts/raleway/raleway-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/raleway/raleway-regular.woff2 -------------------------------------------------------------------------------- /robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: /.git 3 | Disallow: /.gitignore 4 | Allow: / 5 | 6 | Sitemap: https://nicolefurlan.com/sitemap.xml -------------------------------------------------------------------------------- /fonts/fontawesome/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/fontawesome/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /fonts/fontawesome/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/fontawesome/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /fonts/fontawesome/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/fontawesome/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /fonts/fontawesome/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/fontawesome/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /fonts/fontawesome/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/fontawesome/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /img/psychopaths-are-ruining-everything.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/psychopaths-are-ruining-everything.jpg -------------------------------------------------------------------------------- /fonts/fontawesome/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/fontawesome/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /fonts/fontawesome/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/fontawesome/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /fonts/fontawesome/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/fontawesome/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /fonts/playfair-display/playfair-display-700.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/playfair-display/playfair-display-700.eot -------------------------------------------------------------------------------- /fonts/playfair-display/playfair-display-700.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/playfair-display/playfair-display-700.ttf -------------------------------------------------------------------------------- /fonts/playfair-display/playfair-display-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/playfair-display/playfair-display-700.woff -------------------------------------------------------------------------------- /fonts/playfair-display/playfair-display-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/playfair-display/playfair-display-700.woff2 -------------------------------------------------------------------------------- /fonts/playfair-display/playfair-display-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/playfair-display/playfair-display-regular.eot -------------------------------------------------------------------------------- /fonts/playfair-display/playfair-display-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/playfair-display/playfair-display-regular.ttf -------------------------------------------------------------------------------- /fonts/playfair-display/playfair-display-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/playfair-display/playfair-display-regular.woff -------------------------------------------------------------------------------- /fonts/playfair-display/playfair-display-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/fonts/playfair-display/playfair-display-regular.woff2 -------------------------------------------------------------------------------- /img/united-states-hurdle-to-universal-basic-income.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikkifurls/nicolefurlan.com/master/img/united-states-hurdle-to-universal-basic-income.jpg -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "sourceMap": true, 4 | "noImplicitAny": true, 5 | "module": "esnext", 6 | "target": "es6", 7 | "allowJs": true, 8 | "moduleResolution": "node", 9 | } 10 | } -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [nikkifurls] 4 | patreon: nicolefurlan 5 | custom: ["https://nicolefurlan.com", "https://www.paypal.com/donate?hosted_button_id=M7MMF3EWQTLKG"] 6 | -------------------------------------------------------------------------------- /_redirects: -------------------------------------------------------------------------------- 1 | /disclaimer/* /disclaimer.html 200 2 | /privacy-policy/* /privacy-policy.html 200 3 | /terms-and-conditions/* /terms-and-conditions.html 200 4 | /psychopaths-are-ruining-everything/* /psychopaths-are-ruining-everything.html 200 5 | /united-states-hurdle-to-universal-basic-income/* /united-states-hurdle-to-universal-basic-income.html 200 6 | /donate https://www.paypal.com/donate?hosted_button_id=M7MMF3EWQTLKG 7 | /* /index.html 200 -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nicolefurlan.com", 3 | "version": "143", 4 | "description": "Software engineer on a pursuit of equality, compassion, and justice for all.", 5 | "scripts": { 6 | "build": "webpack --mode production" 7 | }, 8 | "dependencies": { 9 | "css-loader": "^6.8.1", 10 | "sass": "^1.65.1", 11 | "sass-loader": "^13.3.2", 12 | "style-loader": "^3.3.3", 13 | "ts-loader": "^9.4.4", 14 | "webpack-cli": "^5.1.4" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /scss/_animations.scss: -------------------------------------------------------------------------------- 1 | @use 'colors'; 2 | 3 | /* 4 | ** Animations 5 | */ 6 | @keyframes pulse { 7 | 0% { 8 | color: var(--color-gray-med); 9 | } 10 | 11 | 17% { 12 | color: var(--color-main); 13 | } 14 | 15 | 35% { 16 | color: var(--color-main-dark); 17 | } 18 | 19 | 52% { 20 | color: var(--color-accent-dark); 21 | } 22 | 23 | 68% { 24 | color: var(--color-accent); 25 | } 26 | 27 | 86% { 28 | color: var(--color-gray-med); 29 | } 30 | } -------------------------------------------------------------------------------- /img/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | #000000 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /scss/_colors.scss: -------------------------------------------------------------------------------- 1 | /* 2 | ** Colors 3 | */ 4 | :root { 5 | --color-main: #0FF; /* cyan */ 6 | --color-main-dark: #008B8B; /* darkcyan */ 7 | --color-accent: #FFA07A; /* lightsalmon */ 8 | --color-accent-dark: #FF6347; /* tomato */ 9 | --color-black: #000; 10 | --color-gray-light: #A0A0A0; 11 | --color-gray-med: #464646; 12 | --color-gray-dark: #151515; 13 | --color-white: #FFF; 14 | --color-facebook: #3B5998; 15 | --color-twitter: #1DA1F2; 16 | --color-patreon: #F96854; 17 | --color-paypal: #0E55AA; 18 | --color-android: #839E2E; 19 | --color-apple: #8A98A0; 20 | } -------------------------------------------------------------------------------- /fonts/fontawesome/css/solid.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900} -------------------------------------------------------------------------------- /fonts/fontawesome/css/brands.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands";font-weight:400} -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | module.exports = { 4 | entry: [ './js/index.ts', './js/main.ts' ], 5 | devtool: 'inline-source-map', 6 | module: { 7 | rules: [ 8 | { 9 | test: /\.tsx?$/, 10 | use: 'ts-loader', 11 | exclude: /node_modules/, 12 | }, 13 | { 14 | test: /\.s[ac]ss$/i, 15 | use: [ 16 | // Creates `style` nodes from JS strings 17 | "style-loader", 18 | // Translates CSS into CommonJS 19 | "css-loader", 20 | // Compiles Sass to CSS 21 | "sass-loader", 22 | ], 23 | }, 24 | ], 25 | }, 26 | resolve: { 27 | extensions: ['.ts', '.js'], 28 | }, 29 | output: { 30 | filename: 'bundle.[contenthash].js', 31 | path: path.resolve(__dirname, 'js'), 32 | }, 33 | }; -------------------------------------------------------------------------------- /js/index.ts: -------------------------------------------------------------------------------- 1 | import { showNotification } from "./notifications"; 2 | import { setLinkEventListeners } from "./urls"; 3 | 4 | import '../scss/index.scss'; 5 | import '../scss/style.scss'; 6 | 7 | window.addEventListener('load', () => { 8 | 9 | // Display cookie notification. 10 | showNotification({ text: 'cookie', className: 'notification-cookie' }); 11 | 12 | // If URL parameters are passed in, check for notification. 13 | if (window.location.search) { 14 | const query = window.location.search.replace('?', '').split('='); 15 | if (query.length > 1) { 16 | const [ param, value ] = query; 17 | 18 | if ('notification' === param && value) { 19 | showNotification({ text: value }); 20 | } 21 | } 22 | } 23 | 24 | // Set event listeners for all event links. 25 | setLinkEventListeners(); 26 | }); 27 | -------------------------------------------------------------------------------- /scss/_layout.scss: -------------------------------------------------------------------------------- 1 | @use 'colors'; 2 | 3 | /* 4 | ** Layout 5 | */ 6 | 7 | $media-tablet: 30em; 8 | $media-desktop: 48em; 9 | $media-desktop-large: 75em; 10 | 11 | :root { 12 | --space-xxsmall: .1em; 13 | --space-xsmall: .25em; 14 | --space-small: .5em; 15 | --space-medium: .75em; 16 | --space-large: 1em; 17 | --space-xlarge: 1.25em; 18 | --space-xxlarge: 1.5em; 19 | --space-super: 2em; 20 | --space-xsuper: 3em; 21 | --space-xxsuper: 4em; 22 | --space-border: 4px; 23 | } 24 | 25 | @mixin padding-default($padding-top-bottom: 0) { 26 | padding: $padding-top-bottom var(--space-large); 27 | 28 | @media (min-width: $media-desktop) { 29 | padding: $padding-top-bottom var(--space-xlarge); 30 | } 31 | 32 | @media (min-width: $media-desktop-large) { 33 | padding: $padding-top-bottom var(--space-xxlarge); 34 | } 35 | } -------------------------------------------------------------------------------- /scss/_fonts.scss: -------------------------------------------------------------------------------- 1 | @use 'layout'; 2 | 3 | /* 4 | ** Fonts 5 | */ 6 | :root { 7 | --font-heading: "Roboto Slab"; 8 | --font-heading-stack: var(--font-heading), Georgia, serif; 9 | --font-body: "Roboto"; 10 | --font-body-stack: var(--font-body), helvetica, arial, sans-serif; 11 | --font-small: .8rem; 12 | --font-medium: 1rem; 13 | --font-large: 1.25rem; 14 | --font-xlarge: 1.5rem; 15 | --font-xxlarge: 2rem; 16 | --font-super: 2.5rem; 17 | --font-xsuper: 3rem; 18 | --font-xxsuper: 3.5rem; 19 | --font-normal: 400; 20 | --font-bold: 700; 21 | }; 22 | 23 | @mixin font-size($font-size: 1em) { 24 | font-size: $font-size; 25 | 26 | @media (min-width: layout.$media-desktop) { 27 | font-size: calc(#{$font-size} * 1.25); 28 | } 29 | 30 | @media (min-width: layout.$media-desktop-large) { 31 | font-size: calc(#{$font-size} * 1.5); 32 | } 33 | } -------------------------------------------------------------------------------- /sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | https://nicolefurlan.com/ 7 | 2024-01-01 8 | 9 | 10 | https://nicolefurlan.com/disclaimer 11 | 2024-01-01 12 | 13 | 14 | https://nicolefurlan.com/privacy-policy 15 | 2024-01-01 16 | 17 | 18 | https://nicolefurlan.com/terms-and-conditions 19 | 2024-01-01 20 | 21 | 22 | https://nicolefurlan.com/psychopaths-are-ruining-everything 23 | 2024-01-01 24 | 25 | 26 | https://nicolefurlan.com/united-states-hurdle-to-universal-basic-income 27 | 2024-01-01 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /js/cookies.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Set cookie. 3 | * @param {Object} cookie setCookie function requires an object with the following properties: 4 | * @param {string} cookie.name Cookie name. 5 | * @param {string|boolean=} cookie.value Cookie value. Defaults to boolean true. 6 | */ 7 | export const setCookie = ({ name, value = true } : { name: string, value?: string|boolean }): void => { 8 | const date = new Date(); 9 | date.setTime(date.getTime() + (365 * 24 * 60 * 60 * 1000)); 10 | document.cookie = name + '=' + value + '; expires=' + date.toUTCString() + '; path=/'; 11 | } 12 | 13 | /** 14 | * Get cookie by name. 15 | * @param {Object} cookie getCookie function requires an object with the following properties: 16 | * @param {string} cookie.name Cookie name. 17 | * @returns {string} Cookie value. 18 | */ 19 | export const getCookie = ({ name }: { name: string }): string => { 20 | const cookieValue = document.cookie.split('; ') 21 | .map(cookie => { 22 | // Extract the cookie name and value from the cookie string. 23 | const [ cookieName, cookieValue ] = cookie.split('='); 24 | 25 | // If the cookie name matches the name provided, return the cookie. 26 | return cookieName === name ? cookieValue : null; 27 | }) 28 | .filter(cookie => cookie); // Remove null values. 29 | 30 | return cookieValue[0] ?? ''; 31 | } 32 | -------------------------------------------------------------------------------- /img/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /js/normalizeText.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Normalize a text string. 3 | * 4 | * @param {Object} textString The `normalizeText` function takes an object as its parameter with the following properties: 5 | * @param {string} textString.text Text string to normalize. 6 | * @param {string=} textString.type Type of normalization to perform. Defaults to 'text'. Other possible value is 'url'. 7 | * @returns {string} Normalized text string. 8 | */ 9 | const normalizeText = ({ text, type = 'text' } : { text: string, type?: string }): string => { 10 | 11 | // Remove leading and trailing slashes. 12 | let decodedText = text.replace(/^\/|\/$/g, ''); 13 | 14 | // Transform accented characters to their non-accented version. 15 | decodedText = decodedText.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); 16 | 17 | // Remove .html extension. 18 | decodedText = decodedText.replace(/.html/g, ' '); 19 | 20 | // Remove +. 21 | decodedText = decodedText.replace(/\+/g, ' '); 22 | 23 | // Remove %20. 24 | decodedText = decodedText.replace(/%20/g, ' '); 25 | 26 | // Change dashes to spaces, unless type=url. 27 | if (type === 'url') { 28 | decodedText = decodedText.replace(/ /g, '-'); 29 | } else { 30 | decodedText = decodedText.replace(/-/g, ' '); 31 | } 32 | 33 | // Transform to lowercase. 34 | decodedText = decodedText.toLowerCase(); 35 | 36 | // Trim whitespace. 37 | decodedText = decodedText.trim(); 38 | 39 | return decodedText; 40 | } 41 | 42 | export default normalizeText; 43 | -------------------------------------------------------------------------------- /scss/style.scss: -------------------------------------------------------------------------------- 1 | @use 'layout'; 2 | 3 | :root { 4 | --font-heading: "Playfair Display"; 5 | --font-body: "Raleway"; 6 | --color-main: #92D7DA; 7 | --color-main-dark: #489094; 8 | --color-accent: #FA96C0; 9 | --color-accent-dark: #B34F78; 10 | } 11 | 12 | .projects { 13 | &__list-item-icon { 14 | i { 15 | font-size: initial; 16 | } 17 | } 18 | } 19 | 20 | .skills, 21 | .experience { 22 | &__list-item { 23 | margin: 0; 24 | text-align: left; 25 | } 26 | } 27 | 28 | .skills { 29 | &__list { 30 | font-weight: var(--font-bold); 31 | text-align: left; 32 | 33 | @media (min-width: layout.$media-tablet) { 34 | display: grid; 35 | gap: 0 var(--space-xsuper); 36 | grid-auto-flow: column; 37 | grid-template-rows: repeat(12, 1fr); 38 | } 39 | 40 | @media (min-width: layout.$media-desktop-large) { 41 | grid-template-rows: repeat(8, 1fr); 42 | } 43 | } 44 | } 45 | 46 | .education, 47 | .experience { 48 | &__item { 49 | margin: var(--space-medium) auto; 50 | 51 | &:not(:last-of-type) { 52 | padding-bottom: var(--space-small); 53 | border-bottom: 1px solid var(--color-accent-dark); 54 | } 55 | 56 | &-title { 57 | color: inherit; 58 | font-family: var(--font-body); 59 | } 60 | } 61 | } 62 | 63 | .experience { 64 | &__item { 65 | &-link { 66 | display: inline-block; 67 | } 68 | 69 | &-title { 70 | margin: 0; 71 | } 72 | 73 | &-details &-details-summary { 74 | color: var(--color-main); 75 | } 76 | } 77 | } -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Nicole Furlan", 3 | "short_name": "Nicole Furlan", 4 | "description": "Software engineer on a pursuit of equality, compassion, and justice for all.", 5 | "display": "standalone", 6 | "start_url": "./", 7 | "scope": ".", 8 | "theme_color": "#000", 9 | "background_color": "#000", 10 | "orientation": "portrait-primary", 11 | "icons": [ 12 | { 13 | "src": "img/android-chrome-36x36.png", 14 | "sizes": "36x36", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "img/android-chrome-48x48.png", 19 | "sizes": "48x48", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "img/android-chrome-72x72.png", 24 | "sizes": "72x72", 25 | "type": "image/png" 26 | }, 27 | { 28 | "src": "img/android-chrome-96x96.png", 29 | "sizes": "96x96", 30 | "type": "image/png" 31 | }, 32 | { 33 | "src": "img/android-chrome-144x144.png", 34 | "sizes": "144x144", 35 | "type": "image/png" 36 | }, 37 | { 38 | "src": "img/android-chrome-192x192.png", 39 | "sizes": "192x192", 40 | "type": "image/png" 41 | }, 42 | { 43 | "src": "img/android-chrome-256x256.png", 44 | "sizes": "256x256", 45 | "type": "image/png" 46 | }, 47 | { 48 | "src": "img/android-chrome-384x384.png", 49 | "sizes": "384x384", 50 | "type": "image/png" 51 | }, 52 | { 53 | "src": "img/android-chrome-512x512.png", 54 | "sizes": "512x512", 55 | "type": "image/png" 56 | }, 57 | { 58 | "src": "img/maskable_icon.png", 59 | "sizes": "650x650", 60 | "type": "image/png", 61 | "purpose": "maskable" 62 | }, 63 | { 64 | "src": "img/monochrome_icon.png", 65 | "sizes": "512x512", 66 | "type": "image/png", 67 | "purpose": "monochrome" 68 | } 69 | ], 70 | "screenshots": [ 71 | { 72 | "src": "img/screenshot.png", 73 | "sizes": "1500x800", 74 | "type": "image/png" 75 | } 76 | ], 77 | "related_applications": [ 78 | { 79 | "platform": "webapp", 80 | "url": "https://nicolefurlan.com/manifest.json" 81 | } 82 | ] 83 | } -------------------------------------------------------------------------------- /js/urls.ts: -------------------------------------------------------------------------------- 1 | import { showNotification } from "./notifications"; 2 | 3 | declare global { 4 | interface Window { 5 | baseUrl: string; 6 | baseTitle: string; 7 | baseDescription: string; 8 | gtag: any; 9 | } 10 | } 11 | 12 | /** 13 | * Copies provided URL to clipboard if navigator.clipboard is available, otherwise displays a notification with the URL. 14 | * @param {Object} url The `copyUrl` function requires an object with the following properties: 15 | * @param {string=} url.url Url to copy. 16 | */ 17 | export const copyUrl = ({ url = window.location.href } : { url?: string }): void => { 18 | if (!url) { 19 | return; 20 | } 21 | 22 | if (navigator.clipboard) { 23 | navigator.clipboard.writeText(url) 24 | .then(() => { 25 | showNotification({ text: `Success! 🥳 URL copied to clipboard: ${url}` }); 26 | }) 27 | .catch(() => { 28 | showNotification({ text: `Copy URL: ${url}` }); 29 | }); 30 | 31 | } else { 32 | showNotification({ text: `Copy URL: ${url}` }); 33 | } 34 | 35 | // Send copy event to GA. 36 | window.gtag('event', 'select_content', { 37 | item_id: url, 38 | }); 39 | } 40 | 41 | /** 42 | * Displays the native sharing mechanism for the device if navigator.share is available, otherwise displays a notification with the share data. 43 | * @param {Object} url The `shareUrl` function requires an object with the following properties: 44 | * @param {string=} url.url URL to share. Defaults to window.location.href. 45 | * @param {string=} url.title Title of website. Defaults to window.baseTitle. 46 | * @param {string=} url.text Text to share. Defaults to window.baseDescription. 47 | */ 48 | export const shareUrl = ({ url = window.location.href, title = window.baseTitle, text = window.baseDescription } : { url?: string, title?: string, text?: string }): void => { 49 | if (navigator.share) { 50 | navigator.share({ title, url }).catch(error => console.warn(error)); 51 | } else { 52 | const textEncoded = encodeURIComponent(text + ' ' + url); 53 | showNotification({ 54 | text: `  Facebook` + 55 | `  Twitter` + 56 | `  Email` + 57 | `  Copy`, 58 | cookieName: '', 59 | className: 'notification-share' 60 | }); 61 | } 62 | 63 | // Send share event to GA. 64 | window.gtag('event', 'share', { 65 | content_id: url, 66 | }); 67 | } 68 | 69 | /** 70 | * Adds event listeners to share and copy links. 71 | */ 72 | export const setLinkEventListeners = (): void => { 73 | 74 | const shareLinks = document.querySelectorAll('.share'); 75 | 76 | if (shareLinks) { 77 | shareLinks.forEach(link => { 78 | link.addEventListener('click', event => { 79 | event.preventDefault(); 80 | 81 | const targetElement = event.target; 82 | 83 | if (!targetElement) { 84 | return; 85 | } 86 | 87 | let element = targetElement.closest('.share'); 88 | 89 | if (!element) { 90 | return; 91 | } 92 | 93 | shareUrl({ 94 | url: element.dataset.url ?? window.baseUrl, 95 | title: element.dataset.title ?? window.baseTitle, 96 | text: element.dataset.text ?? window.baseDescription 97 | }); 98 | }); 99 | }); 100 | } 101 | 102 | const copyLinks = document.querySelectorAll('.copy'); 103 | 104 | if (copyLinks) { 105 | copyLinks.forEach(link => { 106 | link.addEventListener('click', event => { 107 | event.preventDefault(); 108 | 109 | const targetElement = event.target; 110 | 111 | if (!targetElement) { 112 | return; 113 | } 114 | 115 | let element = targetElement.closest('.copy'); 116 | 117 | if (!element) { 118 | return; 119 | } 120 | 121 | copyUrl({ url: element.dataset.url ?? window.baseUrl }); 122 | }); 123 | }); 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /js/notifications.ts: -------------------------------------------------------------------------------- 1 | import { setCookie, getCookie } from "./cookies"; 2 | import { setLinkEventListeners } from "./urls"; 3 | 4 | /** 5 | * Show notification. 6 | * 7 | * @param {Object} notification The `showNotification` function requires an object with the following properties: 8 | * @param {string} notification.text Text to display in notification. Also accepts 'paypal-confirmation' to display PayPal confirmation text, or 'cookie' to display cookie consent text. 9 | * @param {string=} notification.cookieName Cookie name to set once notification is closed so that the notification does not display again for the user. Defaults to ''. 10 | * @param {string=} notification.className Class name to apply to notification element. Defaults to ''. 11 | */ 12 | export const showNotification = ({ text, cookieName = '', className = '' } : { text: string, cookieName?: string, className?: string }): void => { 13 | 14 | // Don't display notification if cookie is set. 15 | if (cookieName && getCookie({name: cookieName})) { 16 | return; 17 | } 18 | 19 | new Promise((resolve, reject) => { 20 | 21 | const notificationContainer = document.querySelector('.notification'); 22 | const notificationTextContainer = document.querySelector('.notification p'); 23 | const notificationCloseContainer = document.querySelector('.notification .close'); 24 | 25 | if (!notificationContainer) { 26 | reject('.notification element not found'); 27 | } 28 | 29 | // Close any open notifications. 30 | closeNotification(); 31 | 32 | // Set notification text. 33 | if (notificationTextContainer) { 34 | if (text === 'paypal-confirmation') { 35 | notificationTextContainer.innerHTML = `Transaction approved! Thank you so much! `; 36 | } else if (text === 'cookie') { 37 | notificationTextContainer.innerHTML = `Cookies and other tracking technologies are used on this website to improve your browsing experience, analyze website traffic, and show personalized content and targeted ads. By browsing this website, you consent to the use of cookies and other tracking technologies.`; 38 | } else { 39 | notificationTextContainer.innerHTML = text; 40 | } 41 | } 42 | 43 | // Set notification class. 44 | if (className) { 45 | notificationContainer.setAttribute('data-class', className); 46 | notificationContainer.classList.add(className); 47 | } 48 | 49 | // Set cookie data attribute, which will cause the cookie to get set when the notification is closed, so that it doesn't display again for the user. 50 | if (cookieName) { 51 | notificationContainer.setAttribute('data-cookie', cookieName); 52 | } 53 | 54 | // Set close functionality. 55 | if (notificationCloseContainer) { 56 | notificationCloseContainer.addEventListener('click', () => { 57 | closeNotification(); 58 | }); 59 | } 60 | 61 | // Display notification. 62 | notificationContainer.show(); 63 | notificationContainer.setAttribute('aria-hidden', 'false'); 64 | 65 | // Resolve promise. 66 | resolve(true); 67 | }) 68 | .then((result) => { 69 | if (result) { 70 | // Set event listeners for any event links in notification. 71 | setLinkEventListeners(); 72 | } 73 | }) 74 | .catch((error) => { 75 | console.error(error); 76 | }); 77 | } 78 | 79 | /** 80 | * Close notification. 81 | */ 82 | export const closeNotification = (): void => { 83 | 84 | const notificationContainer = document.querySelector('.notification'); 85 | 86 | if (!notificationContainer) { 87 | return; 88 | } 89 | 90 | notificationContainer.close(); 91 | notificationContainer.setAttribute('aria-hidden', 'true'); 92 | 93 | // If notification has class data attribute set, remove class after closing. 94 | if (notificationContainer.dataset.class) { 95 | notificationContainer.classList.remove(notificationContainer.dataset.class); 96 | notificationContainer.removeAttribute('data-class'); 97 | } 98 | 99 | // If notification has cookie data attribute set, set cookie after closing. 100 | if (notificationContainer.dataset.cookie) { 101 | setCookie({ name: notificationContainer.dataset.cookie, value: true }); 102 | notificationContainer.removeAttribute('data-cookie'); 103 | } 104 | } 105 | 106 | /** 107 | * Show promo notification. 108 | * @param {Object} notification The `showPromo` function requires an object with the following properties: 109 | * @param {string} notification.text Text to display in notification. 110 | * @param {string=} notification.cookieName Cookie name to provide to showNotification(), so that the promo does not display again for the user. Defaults to the website URL with '-promo' appended. 111 | * @param {string=} notification.customIconSelector Selector for the promo icon, if one exists. If provided, the icon will be animated and a cookie will be set on click so that it only animates once. 112 | */ 113 | export const showPromo = ({ text, cookieName = `${window.baseUrl}-promo`, customIconSelector = 'nav .custom' }: { text: string, cookieName?: string, customIconSelector?: string }): void => { 114 | 115 | if (!text) { 116 | return; 117 | } 118 | 119 | // Animate custom icon and set click event listener so that it only animates once. 120 | if (customIconSelector) { 121 | setTimeout(() => { 122 | const element = document.querySelector(customIconSelector); 123 | 124 | if (!element) { 125 | return; 126 | } 127 | 128 | element.classList.add('animate'); 129 | element.addEventListener('click', () => { 130 | setCookie({ name: `${cookieName}-icon`, value: true }); 131 | }); 132 | }, 20000); 133 | } 134 | 135 | // Show the notification for the promo. 136 | setTimeout(() => { 137 | showNotification({ text, cookieName }); 138 | }, 60000); 139 | } 140 | -------------------------------------------------------------------------------- /posts.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "url": "psychopaths-are-ruining-everything", 4 | "title": "Psychopaths Are Ruining Everything", 5 | "description": "And We’re Not Doing Anything About It", 6 | "image": "psychopaths-are-ruining-everything.jpg", 7 | "image_credit": "Photo by Morgan Housel on Unsplash", 8 | "date": "2020-08-17", 9 | "content": 10 | "

I remember learning about psychopaths and sociopaths in abnormal psychology in college, and immediately thinking, wow, no wonder why the world is so messed up.

I also remember being very unsurprised in 2016 when I read the study that found that 21% of corporate executives are psychopathic. For comparison, that’s the same percentage for prison inmates. Roughly 1% of the general population exhibits psychopathic behavior.

Psychopaths lack the ability to experience feelings of remorse, guilt, or empathy for others. They have excessively high self-approval and a nearly complete inability to form genuine emotional attachments to others. They manipulate the artificial relationships they do form to exploit others for their benefit. They’re superficially charming and generally appear normal to others, particularly due to their ability to maintain the appearance of a normal work and family life.

If you’re part of the working class, I’m sure you understand how these characteristics would make someone incredibly effective at climbing the corporate ladder. But if that person ends up in a position of immense power—in the government, for example—the decisions they make on a daily basis are incredibly high impact. Someone who also lacks empathy for others is more likely to value personal gain above all when making decisions, and if those decisions are made without considering their impacts from an ethical perspective, large numbers of people can experience immense suffering.

In the United States, the pandemic has accelerated the evolution of our system into late-stage capitalism. The ruling elite—made up of corporate executives, some who even made their way into our government—have fully manipulated the situation for their benefit, bailing themselves out (again) while having no empathy for the working class, ignoring their desperate cries for financial stability. Now, large numbers of people are experiencing unprecedented suffering.

It is time for the working class to realize our power and leverage, particularly at this moment in time. Our lives literally depend on it.

", 11 | "links": [ 12 | { 13 | "url": "http://www.telegraph.co.uk/news/2016/09/13/1-in-5-ceos-are-psychopaths-australian-study-finds", 14 | "title": "The Telegraph: 1 in 5 CEOs are psychopaths, study finds" 15 | }, 16 | { 17 | "url": "https://www.telegraph.co.uk/news/newstopics/howaboutthat/9828914/Why-your-boss-could-easily-be-a-psychopath.html", 18 | "title": "The Telegraph: Why your boss could easily be a psychopath" 19 | }, 20 | { 21 | "url": "https://amzn.to/2Wi0k15 ", 22 | "title": "Snakes in Suits: When Psychopaths Go to Work by Paul Babiak" 23 | } 24 | ] 25 | }, 26 | { 27 | "url": "united-states-hurdle-to-universal-basic-income", 28 | "title": "The Elite Hurdle to Universal Basic Income in the United States", 29 | "description": "The ruling elites' oppression of the United States working class is both the biggest reason for and the biggest barrier to Universal Basic Income", 30 | "image": "united-states-hurdle-to-universal-basic-income.jpg", 31 | "image_credit": "Photo by Sharon McCutcheon on Unsplash", 32 | "date": "2020-07-13", 33 | "content": 34 | "

Since Andrew Yang brought the idea of Universal Basic Income (UBI) into mainstream conversation during the Democratic primary election of 2020, the policy position has gained lots of attention. Many view it as an opportunity to decrease poverty and homelessness, support entrepreneurs and socially beneficial members of society, provide an off-ramp from bull-shit jobs, and mitigate the effects of economic stressors like technological automation and crises like the coronavirus pandemic. Many view it as an enormous, unrealistic cost and worry that it disincentivizes people to work.

The problem I often see ignored, even by many on the Left, is that for the ruling elite class, UBI is a threat to their control over the working class, whose oppression makes their lifestyles possible. If the working class stays hungry, quite literally, we’ll never rise up. I don’t know about you, but I would be protesting in the street every day if I could financially afford to. The list of reasons to protest is certainly long enough.

The coronavirus pandemic, and the high likelihood that pandemics will continue happening, has created a strong case for UBI all on its own. Other countries have implemented UBI and have avoided the economic devastation we’re currently experiencing. However, the United States government and ruling elites, two groups which overlap greatly, have mostly ignored cries from the working class for financial reassurance. The U.S. government even actively worked against the working class citizens, who they swore to represent, to direct financial relief in the form of taxpayer dollars directly into the pockets of the ruling elites.

For the U.S. working class, our systemic corruption and oppression by the ruling elites creates what I think is the strongest case for UBI. It’s the best shot we have at avoiding being pulverized by our capitalist system, which the pandemic has accelerated into late-stage capitalism. But it is that very corruption and oppression that has created a country where UBI has absolutely no chance of being enacted.

Though the Overton window on UBI may have shifted, only major systemic change would allow the actual policies to be put into place to enable UBI for U.S. citizens. It is time for the working class to realize our power and leverage, particularly at this moment in time. Our lives literally depend on it.

", 35 | "links": [ 36 | { 37 | "url": "https://amzn.to/2OixR70 ", 38 | "title": "The War on Normal People by Andrew Yang" 39 | }, 40 | { 41 | "url": "https://amzn.to/2Wi5IkJ ", 42 | "title": "Utopia for Realists by Rutger Bregman" 43 | } 44 | ] 45 | } 46 | ] -------------------------------------------------------------------------------- /sw.js: -------------------------------------------------------------------------------- 1 | const cacheName = "cache143"; 2 | const cacheFiles = [ 3 | "/", 4 | "manifest.json", 5 | "posts.json", 6 | "img/background.webp", 7 | "img/logo_nav.svg", 8 | "index.html", 9 | "disclaimer.html", 10 | "privacy-policy.html", 11 | "terms-and-conditions.html", 12 | "psychopaths-are-ruining-everything.html", 13 | "img/psychopaths-are-ruining-everything.jpg", 14 | "united-states-hurdle-to-universal-basic-income.html", 15 | "img/united-states-hurdle-to-universal-basic-income.jpg", 16 | "fonts/playfair-display/playfair-display-700.eot", 17 | "fonts/playfair-display/playfair-display-700.svg", 18 | "fonts/playfair-display/playfair-display-700.ttf", 19 | "fonts/playfair-display/playfair-display-700.woff", 20 | "fonts/playfair-display/playfair-display-700.woff2", 21 | "fonts/playfair-display/playfair-display-regular.eot", 22 | "fonts/playfair-display/playfair-display-regular.svg", 23 | "fonts/playfair-display/playfair-display-regular.ttf", 24 | "fonts/playfair-display/playfair-display-regular.woff", 25 | "fonts/playfair-display/playfair-display-regular.woff2", 26 | "fonts/raleway/raleway-700.eot", 27 | "fonts/raleway/raleway-700.svg", 28 | "fonts/raleway/raleway-700.ttf", 29 | "fonts/raleway/raleway-700.woff", 30 | "fonts/raleway/raleway-700.woff2", 31 | "fonts/raleway/raleway-regular.eot", 32 | "fonts/raleway/raleway-regular.svg", 33 | "fonts/raleway/raleway-regular.ttf", 34 | "fonts/raleway/raleway-regular.woff", 35 | "fonts/raleway/raleway-regular.woff2", 36 | "fonts/fontawesome/css/brands.min.css", 37 | "fonts/fontawesome/css/fontawesome.min.css", 38 | "fonts/fontawesome/css/solid.min.css", 39 | "fonts/fontawesome/webfonts/fa-brands-400.eot", 40 | "fonts/fontawesome/webfonts/fa-brands-400.svg", 41 | "fonts/fontawesome/webfonts/fa-brands-400.ttf", 42 | "fonts/fontawesome/webfonts/fa-brands-400.woff", 43 | "fonts/fontawesome/webfonts/fa-brands-400.woff2", 44 | "fonts/fontawesome/webfonts/fa-solid-900.eot", 45 | "fonts/fontawesome/webfonts/fa-solid-900.svg", 46 | "fonts/fontawesome/webfonts/fa-solid-900.ttf", 47 | "fonts/fontawesome/webfonts/fa-solid-900.woff", 48 | "fonts/fontawesome/webfonts/fa-solid-900.woff2", 49 | "js/bundle.d5c5844848e3d2f8ffc5.js", 50 | "img/android-chrome-36x36.png", // Favicon, Android Chrome M39+ with 0.75 screen density 51 | "img/android-chrome-48x48.png", // Favicon, Android Chrome M39+ with 1.0 screen density 52 | "img/android-chrome-72x72.png", // Favicon, Android Chrome M39+ with 1.5 screen density 53 | "img/android-chrome-96x96.png", // Favicon, Android Chrome M39+ with 2.0 screen density 54 | "img/android-chrome-144x144.png", // Favicon, Android Chrome M39+ with 3.0 screen density 55 | "img/android-chrome-192x192.png", // Favicon, Android Chrome M39+ with 4.0 screen density 56 | "img/android-chrome-256x256.png", // Favicon, Android Chrome M47+ Splash screen with 1.5 screen density 57 | "img/android-chrome-384x384.png", // Favicon, Android Chrome M47+ Splash screen with 3.0 screen density 58 | "img/android-chrome-512x512.png", // Favicon, Android Chrome M47+ Splash screen with 4.0 screen density 59 | "img/apple-touch-icon.png", // Favicon, Apple default 60 | "img/apple-touch-icon-57x57.png", // Apple iPhone, Non-retina with iOS6 or prior 61 | "img/apple-touch-icon-60x60.png", // Apple iPhone, Non-retina with iOS7 62 | "img/apple-touch-icon-72x72.png", // Apple iPad, Non-retina with iOS6 or prior 63 | "img/apple-touch-icon-76x76.png", // Apple iPad, Non-retina with iOS7 64 | "img/apple-touch-icon-114x114.png", // Apple iPhone, Retina with iOS6 or prior 65 | "img/apple-touch-icon-120x120.png", // Apple iPhone, Retina with iOS7 66 | "img/apple-touch-icon-144x144.png", // Apple iPad, Retina with iOS6 or prior 67 | "img/apple-touch-icon-152x152.png", // Apple iPad, Retina with iOS7 68 | "img/apple-touch-icon-180x180.png", // Apple iPhone 6 Plus with iOS8 69 | "img/browserconfig.xml", // IE11 icon configuration file 70 | "img/favicon.ico", // Favicon, IE and fallback for other browsers 71 | "img/favicon-16x16.png", // Favicon, default 72 | "img/favicon-32x32.png", // Favicon, Safari on Mac OS 73 | "img/maskable_icon.png", // Favicon, maskable https://web.dev/maskable-icon 74 | "img/monochrome_icon.png", // Favicon, monochrome https://web.dev/monochrome-icon 75 | "img/mstile-70x70.png", // Favicon, Windows 8 / IE11 76 | "img/mstile-144x144.png", // Favicon, Windows 8 / IE10 77 | "img/mstile-150x150.png", // Favicon, Windows 8 / IE11 78 | "img/mstile-310x150.png", // Favicon, Windows 8 / IE11 79 | "img/mstile-310x310.png", // Favicon, Windows 8 / IE11 80 | "img/safari-pinned-tab.svg", // Favicon, Safari pinned tab 81 | "img/share.jpg" // Social media sharing 82 | ]; 83 | 84 | // 1) INSTALL - triggers when service worker-controlled pages are accessed subsequently 85 | // Add all cacheFiles to cache 86 | // If any file fails to be fetched 87 | // cache.addAll rejects 88 | // install fails 89 | // the service worker will be abandoned (if an older version is running, it'll be left intact) 90 | self.addEventListener("install", event => { 91 | 92 | // Kick out the old service worker 93 | self.skipWaiting(); 94 | 95 | event.waitUntil( 96 | caches.open(cacheName).then(cache => { 97 | return cache.addAll(cacheFiles); 98 | }) 99 | ); 100 | }); 101 | 102 | // 2) ACTIVATE - triggers when service worker is installed successfully 103 | // Delete non-current caches used in previous versions 104 | // (Can block page loads, only use for things you couldn't do while previous version was active) 105 | self.addEventListener("activate", event => { 106 | event.waitUntil( 107 | caches.keys().then(cacheObjects => { 108 | return Promise.all( 109 | cacheObjects.map(cacheObjectName => { 110 | if (cacheObjectName != cacheName) { 111 | return caches.delete(cacheObjectName); 112 | } 113 | }) 114 | ) 115 | }) 116 | ); 117 | }); 118 | 119 | // 3) FETCH - triggers when any resource controlled by a service worker is fetched 120 | // Offline-first - cache falling back to network strategy 121 | self.addEventListener("fetch", event => { 122 | const cacheBlacklist = [ 123 | "adservice", 124 | "amazon-adsystem", 125 | "amazon.com", 126 | "doubleclick", 127 | "facebook", 128 | "google-analytics", 129 | "google.com", 130 | "googleads", 131 | "googlesyndication", 132 | "googletagmanager", 133 | "googletagservices", 134 | "pagead", 135 | "repixel" 136 | ]; 137 | 138 | const url = new URL(event.request.url); 139 | const online = navigator.onLine ? true : false; 140 | const blacklisted = [url.hostname].filter(hostname => cacheBlacklist.some(item => hostname.includes(item))).length ? true : false; 141 | const cacheMatch = cacheFiles.find(cacheFile => cacheFile.includes(url.pathname.replace("/", ""))); 142 | const cacheResponse = (online && (event.request.method === "GET") && !blacklisted) ? true : false; 143 | 144 | if (!online) { 145 | if (cacheMatch) { 146 | event.respondWith(fetchCacheResponse(cacheMatch)); 147 | } else { 148 | if (blacklisted) { 149 | console.warn(`Ignoring offline blacklisted request: ${event.request.url}`); 150 | } else { 151 | event.respondWith(fetchCacheResponse("index.html")); 152 | } 153 | } 154 | } else { 155 | if (cacheMatch) { 156 | event.respondWith(fetchCacheResponse(cacheMatch) || fetchNetworkResponse(event.request, cacheResponse)); 157 | } else { 158 | event.respondWith(fetchNetworkResponse(event.request, cacheResponse)); 159 | } 160 | } 161 | }); 162 | 163 | const fetchCacheResponse = eventRequest => { 164 | return caches.match(eventRequest) 165 | .then(responseCache => { 166 | if (responseCache) { 167 | return responseCache; 168 | } else { 169 | return fetchCacheResponse("index.html"); 170 | } 171 | }) 172 | .catch(error => { 173 | return fetchCacheResponse("index.html"); 174 | }); 175 | } 176 | 177 | const fetchNetworkResponse = (eventRequest, updateCache = false) => { 178 | return fetch(eventRequest) 179 | .then(responseNetwork => { 180 | if (updateCache) { 181 | const responseNetworkCache = responseNetwork.clone(); 182 | const responseNetworkReturn = responseNetwork.clone(); 183 | caches.open(cacheName) 184 | .then(cache => cache.put(eventRequest, responseNetworkCache)) 185 | .catch(error => console.warn(error)); 186 | return responseNetworkReturn; 187 | } else { 188 | return responseNetwork; 189 | } 190 | }) 191 | .catch(error => console.warn(error)); 192 | } -------------------------------------------------------------------------------- /psychopaths-are-ruining-everything.html: -------------------------------------------------------------------------------- 1 | Nicole Furlan - Psychopaths Are Ruining Everything

Psychopaths Are Ruining Everything

And We’re Not Doing Anything About It

Nicole Furlan

I remember learning about psychopaths and sociopaths in abnormal psychology in college, and immediately thinking, wow, no wonder why the world is so messed up.

I also remember being very unsurprised in 2016 when I read the study that found that 21% of corporate executives are psychopathic. For comparison, that’s the same percentage for prison inmates. Roughly 1% of the general population exhibits psychopathic behavior.

Psychopaths lack the ability to experience feelings of remorse, guilt, or empathy for others. They have excessively high self-approval and a nearly complete inability to form genuine emotional attachments to others. They manipulate the artificial relationships they do form to exploit others for their benefit. They’re superficially charming and generally appear normal to others, particularly due to their ability to maintain the appearance of a normal work and family life.

If you’re part of the working class, I’m sure you understand how these characteristics would make someone incredibly effective at climbing the corporate ladder. But if that person ends up in a position of immense power—in the government, for example—the decisions they make on a daily basis are incredibly high impact. Someone who also lacks empathy for others is more likely to value personal gain above all when making decisions, and if those decisions are made without considering their impacts from an ethical perspective, large numbers of people can experience immense suffering.

In the United States, the pandemic has accelerated the evolution of our system into late-stage capitalism. The ruling elite—made up of corporate executives, some who even made their way into our government—have fully manipulated the situation for their benefit, bailing themselves out (again) while having no empathy for the working class, ignoring their desperate cries for financial stability. Now, large numbers of people are experiencing unprecedented suffering.

It is time for the working class to realize our power and leverage, particularly at this moment in time. Our lives literally depend on it.

-------------------------------------------------------------------------------- /united-states-hurdle-to-universal-basic-income.html: -------------------------------------------------------------------------------- 1 | Nicole Furlan - The Elite Hurdle to Universal Basic Income in the United States

The Elite Hurdle to Universal Basic Income in the United States

The ruling elites' oppression of the United States working class is both the biggest reason for and the biggest barrier to Universal Basic Income

Nicole Furlan

Since Andrew Yang brought the idea of Universal Basic Income (UBI) into mainstream conversation during the Democratic primary election of 2020, the policy position has gained lots of attention. Many view it as an opportunity to decrease poverty and homelessness, support entrepreneurs and socially beneficial members of society, provide an off-ramp from bull-shit jobs, and mitigate the effects of economic stressors like technological automation and crises like the coronavirus pandemic. Many view it as an enormous, unrealistic cost and worry that it disincentivizes people to work.

The problem I often see ignored, even by many on the Left, is that for the ruling elite class, UBI is a threat to their control over the working class, whose oppression makes their lifestyles possible. If the working class stays hungry, quite literally, we’ll never rise up. I don’t know about you, but I would be protesting in the street every day if I could financially afford to. The list of reasons to protest is certainly long enough.

The coronavirus pandemic, and the high likelihood that pandemics will continue happening, has created a strong case for UBI all on its own. Other countries have implemented UBI and have avoided the economic devastation we’re currently experiencing. However, the United States government and ruling elites, two groups which overlap greatly, have mostly ignored cries from the working class for financial reassurance. The U.S. government even actively worked against the working class citizens, who they swore to represent, to direct financial relief in the form of taxpayer dollars directly into the pockets of the ruling elites.

For the U.S. working class, our systemic corruption and oppression by the ruling elites creates what I think is the strongest case for UBI. It’s the best shot we have at avoiding being pulverized by our capitalist system, which the pandemic has accelerated into late-stage capitalism. But it is that very corruption and oppression that has created a country where UBI has absolutely no chance of being enacted.

Though the Overton window on UBI may have shifted, only major systemic change would allow the actual policies to be put into place to enable UBI for U.S. citizens. It is time for the working class to realize our power and leverage, particularly at this moment in time. Our lives literally depend on it.

-------------------------------------------------------------------------------- /disclaimer.html: -------------------------------------------------------------------------------- 1 | Nicole Furlan - Disclaimer

Disclaimer

Nicole Furlan disclaimer

The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.

For the purposes of this Disclaimer:

  • Website refers to nicolefurlan.com.
  • Service refers to the Website.
  • Company (referred to as either "the Company", "We", "Us" or "Our" in this policy) refers to Nicole Furlan.
  • You refers to the individual accessing the Website, Service, Company, or other legal entity.
Disclaimer

The information contained on the Service is for general information purposes only.

The Company assumes no responsibility for errors or omissions in the contents of the Service.

In no event shall the Company be liable for any special, direct, indirect, consequential, or incidental damages or any damages whatsoever, whether in an action of contract, negligence or other tort, arising out of or in connection with the use of the Service or the contents of the Service. The Company reserves the right to make additions, deletions, or modifications to the contents on the Service at any time without prior notice.

External Links Disclaimer

The Service may contain links to external websites that are not provided or maintained by or in any way affiliated with the Company.

Please note that the Company does not guarantee the accuracy, relevance, timeliness, or completeness of any information on these external websites.

Errors and Omissions Disclaimer

The information given by the Service is for general guidance on matters of interest only. Even if the Company takes every precaution to insure that the content of the Service is both current and accurate, errors can occur. Plus, given the changing nature of laws, rules and regulations, there may be delays, omissions or inaccuracies in the information contained on the Service.

The Company is not responsible for any errors or omissions, or for the results obtained from the use of this information.

Fair Use Disclaimer

The Company may use copyrighted material which has not always been specifically authorized by the copyright owner. The Company is making such material available for criticism, comment, news reporting, teaching, scholarship, or research.

The Company believes this constitutes a "fair use" of any such copyrighted material as provided for in section 107 of the United States Copyright law.

If You wish to use copyrighted material from the Service for your own purposes that go beyond fair use, You must obtain permission from the copyright owner.

Views Expressed Disclaimer

The Service may contain views and opinions which are those of the authors and do not necessarily reflect the official policy or position of any other author, agency, organization, employer or company, including the Company.

Comments published by users are their sole responsibility and the users will take full responsibility, liability and blame for any libel or litigation that results from something written in or as a direct result of something written in a comment. The Company is not liable for any comment published by users and reserve the right to delete any comment for any reason whatsoever.

No Responsibility Disclaimer

The information on the Service is provided with the understanding that the Company is not herein engaged in rendering legal, accounting, tax, or other professional advice and services. As such, it should not be used as a substitute for consultation with professional accounting, tax, legal or other competent advisers.

In no event shall the Company or its suppliers be liable for any special, incidental, indirect, or consequential damages whatsoever arising out of or in connection with your access or use or inability to access or use the Service.

"Use at Your Own Risk" Disclaimer

All information in the Service is provided "as is", with no guarantee of completeness, accuracy, timeliness or of the results obtained from the use of this information, and without warranty of any kind, express or implied, including, but not limited to warranties of performance, merchantability and fitness for a particular purpose.

The Company will not be liable to You or anyone else for any decision made or action taken in reliance on the information given by the Service or for any consequential, special or similar damages, even if advised of the possibility of such damages.

Contact Us

If you have any questions about this Disclaimer, contact us by email at info@nicolefurlan.com

Last updated: June 22, 2020

-------------------------------------------------------------------------------- /scss/index.scss: -------------------------------------------------------------------------------- 1 | @use 'animations'; 2 | @use 'colors'; 3 | @use 'fonts'; 4 | @use 'images'; 5 | @use 'layout'; 6 | 7 | $media-tablet: 30em; 8 | $media-desktop: 48em; 9 | $media-desktop-large: 75em; 10 | 11 | /* 12 | ** Typography 13 | */ 14 | html, 15 | *, 16 | *::before, 17 | *::after { 18 | box-sizing: border-box; 19 | } 20 | 21 | html { 22 | font-size: 100%; 23 | } 24 | 25 | html, 26 | body { 27 | margin: 0; 28 | padding: 0; 29 | } 30 | 31 | body, 32 | .description { 33 | font-family: var(--font-body-stack); 34 | } 35 | 36 | body { 37 | @include fonts.font-size(var(--font-medium)); 38 | background-color: var(--color-gray-dark); 39 | color: var(--color-white); 40 | font-weight: var(--font-normal); 41 | line-height: 1.4; 42 | } 43 | 44 | header, 45 | h1, 46 | h2, 47 | h3, 48 | h4, 49 | .title { 50 | font-family: var(--font-heading-stack); 51 | 52 | } 53 | 54 | h1, 55 | h2, 56 | .title { 57 | line-height: 1.1; 58 | } 59 | 60 | h3, 61 | h4, 62 | .description { 63 | line-height: 1.2; 64 | } 65 | 66 | h1, 67 | h2, 68 | h3, 69 | h4, 70 | .title { 71 | color: var(--color-accent); 72 | } 73 | 74 | header, 75 | h1, 76 | h2, 77 | h3, 78 | h4, 79 | .title, 80 | .description, 81 | a, 82 | button, 83 | .button, 84 | input[type="button"], 85 | input[type="submit"], 86 | summary, 87 | dt { 88 | font-weight: var(--font-bold); 89 | } 90 | 91 | blockquote, 92 | body, 93 | dd, 94 | dl, 95 | figure, 96 | h1, 97 | h2, 98 | h3, 99 | h4, 100 | p { 101 | margin: 0; 102 | } 103 | 104 | h1, 105 | h2, 106 | h3, 107 | h4, 108 | p, 109 | dd { 110 | margin: var(--space-small) auto; 111 | } 112 | 113 | dl, 114 | ol, 115 | ul { 116 | dt, 117 | dd, 118 | li { 119 | margin: var(--space-small) auto; 120 | } 121 | } 122 | 123 | h1, 124 | .title { 125 | @include fonts.font-size(var(--font-xsuper)); 126 | } 127 | 128 | h2 { 129 | @include fonts.font-size(var(--font-super)); 130 | } 131 | 132 | h3, 133 | .description { 134 | @include fonts.font-size(var(--font-xlarge)); 135 | } 136 | 137 | h4 { 138 | @include fonts.font-size(var(--font-large)); 139 | } 140 | 141 | .social, 142 | button, 143 | .button, 144 | input[type="button"], 145 | input[type="submit"], 146 | textarea, 147 | select { 148 | font-size: var(--font-large); 149 | } 150 | 151 | code, 152 | kbd, 153 | samp, 154 | pre, 155 | .code { 156 | font-family: monospace, monospace; 157 | } 158 | 159 | .bold { 160 | font-weight: var(--font-bold); 161 | } 162 | 163 | .italic { 164 | font-style: italic; 165 | } 166 | 167 | .underline { 168 | text-decoration: underline; 169 | } 170 | 171 | mark::before, 172 | mark::after { 173 | clip-path: inset(100%); 174 | clip: rect(1px, 1px, 1px, 1px); 175 | height: 1px; 176 | overflow: hidden; 177 | position: absolute; 178 | white-space: nowrap; 179 | width: 1px; 180 | } 181 | 182 | mark::before { 183 | content: " [highlight start] "; 184 | } 185 | 186 | mark::after { 187 | content: " [highlight end] "; 188 | } 189 | 190 | .icon, 191 | span[class*="icon"] { 192 | vertical-align: bottom; 193 | } 194 | 195 | .icon-heart { 196 | color: var(--color-accent); 197 | } 198 | 199 | /* 200 | ** Layout 201 | */ 202 | article, 203 | aside, 204 | footer, 205 | header, 206 | nav, 207 | section { 208 | display: block; 209 | } 210 | 211 | .container-scrollable { 212 | align-self: normal; 213 | display: flex; 214 | flex-wrap: nowrap; 215 | gap: 0 var(--space-xsmall); 216 | justify-content: space-between; 217 | list-style: none; 218 | overflow-x: auto; 219 | padding: inherit; 220 | padding-bottom: 0; 221 | 222 | @media (min-width: layout.$media-desktop) { 223 | padding: 0; 224 | } 225 | 226 | a { 227 | margin: 0 var(--space-xsmall); 228 | 229 | &:first-of-type { 230 | margin-left: 0; 231 | } 232 | 233 | &:last-of-type { 234 | margin-right: 0; 235 | } 236 | } 237 | 238 | &::-webkit-scrollbar { 239 | height: 1rem; 240 | } 241 | 242 | &::-webkit-scrollbar-thumb { 243 | background: var(--color-accent-dark); 244 | } 245 | 246 | &::-webkit-scrollbar-track { 247 | background: var(--color-accent); 248 | } 249 | } 250 | 251 | .container { 252 | margin: 0 auto; 253 | width: min(700px, 100%); 254 | 255 | @media (min-width: layout.$media-desktop-large) { 256 | width: min(1000px, 100%); 257 | } 258 | } 259 | 260 | .container-text { 261 | margin: 0 auto; 262 | padding: var(--space-super); 263 | width: min(55ch, 100%); 264 | } 265 | 266 | .container-nav { 267 | background-color: rgba(0, 0, 0, .85); 268 | @include layout.padding-default(0); 269 | 270 | &:first-of-type { 271 | top: 0; 272 | position: sticky; 273 | z-index: 999; 274 | } 275 | 276 | &:last-of-type { 277 | .nav { 278 | @media (max-width: layout.$media-tablet) { 279 | display: none; 280 | } 281 | } 282 | } 283 | 284 | nav { 285 | display: flex; 286 | flex-direction: column; 287 | justify-content: center; 288 | align-items: center; 289 | 290 | @media (min-width: layout.$media-desktop) { 291 | display: grid; 292 | grid-template-columns: minmax(250px, 25%) 1fr; 293 | align-items: center; 294 | } 295 | 296 | &:has(.nav) { 297 | grid-template-columns: minmax(250px, 25%) 1fr 1fr; 298 | } 299 | 300 | a { 301 | padding: var(--space-xsmall); 302 | } 303 | 304 | .logo { 305 | margin: var(--space-xsmall) auto; 306 | padding: var(--space-small) var(--space-xsmall) 0; 307 | 308 | img { 309 | width: 250px; 310 | } 311 | 312 | @media (min-width: layout.$media-desktop) { 313 | margin: 0 auto; 314 | padding: 0; 315 | 316 | img { 317 | width: 100%; 318 | } 319 | } 320 | } 321 | 322 | .nav { 323 | align-items: center; 324 | display: flex; 325 | gap: 10px; 326 | list-style: none; 327 | margin: 0; 328 | padding: 0; 329 | 330 | li { 331 | margin: 0; 332 | } 333 | } 334 | 335 | .social { 336 | @extend .container-scrollable; 337 | justify-content: center; 338 | 339 | @media (min-width: layout.$media-desktop) { 340 | align-items: center; 341 | justify-content: flex-end; 342 | margin: 0; 343 | } 344 | 345 | a { 346 | &:first-of-type { 347 | @media (max-width: layout.$media-desktop) { 348 | margin-left: 0; 349 | } 350 | } 351 | 352 | &.custom.animate { 353 | animation: pulse 1s 0s forwards 3; 354 | } 355 | } 356 | } 357 | } 358 | } 359 | 360 | header { 361 | background: var(--color-black) no-repeat center/cover; 362 | display: flex; 363 | flex-direction: column; 364 | min-height: 25vh; 365 | place-content: center; 366 | 367 | .description { 368 | margin: 0 auto; 369 | } 370 | 371 | &.image-logo { 372 | align-items: center; 373 | justify-content: flex-end; 374 | @include layout.padding-default(var(--space-large)); 375 | 376 | .logo + .text { 377 | margin-top: var(--space-large); 378 | } 379 | 380 | .logo { 381 | img { 382 | max-height: 32vh; 383 | width: 100%; 384 | 385 | @media (min-width: layout.$media-desktop-large) { 386 | max-height: 30vh; 387 | } 388 | } 389 | } 390 | 391 | .text { 392 | text-align: center; 393 | 394 | address, 395 | time { 396 | display: none; 397 | } 398 | } 399 | } 400 | 401 | &.image-background { 402 | align-items: flex-start; 403 | justify-content: center; 404 | @include layout.padding-default(var(--space-xxsuper)); 405 | 406 | .text { 407 | @media (min-width: layout.$media-tablet) { 408 | max-width: 65%; 409 | } 410 | 411 | @media (min-width: layout.$media-desktop) { 412 | max-width: 52.5%; 413 | } 414 | 415 | hgroup { 416 | h1 { 417 | margin: 0 auto var(--space-small); 418 | } 419 | 420 | .description { 421 | color: var(--color-white); 422 | } 423 | } 424 | 425 | address { 426 | margin-top: var(--space-super); 427 | } 428 | } 429 | } 430 | } 431 | 432 | .template { 433 | header { 434 | .description { 435 | display: none; 436 | } 437 | } 438 | } 439 | 440 | main { 441 | margin: var(--space-large) auto; 442 | @include layout.padding-default(var(--space-super)); 443 | 444 | section { 445 | padding-bottom: var(--space-super); 446 | 447 | &:last-of-type { 448 | padding-bottom: 0; 449 | } 450 | 451 | &:only-of-type { 452 | padding-bottom: var(--space-super); 453 | } 454 | } 455 | } 456 | 457 | .template, 458 | .post { 459 | main { 460 | .container { 461 | background-color: var(--color-black); 462 | color: var(--color-white); 463 | } 464 | } 465 | } 466 | 467 | footer { 468 | @include layout.padding-default(var(--space-small)); 469 | 470 | .container-text, 471 | .ad-disclaimer, 472 | .image-credit, 473 | .tech-credit, 474 | .links:not(.list) { 475 | font-size: var(--font-small); 476 | text-align: center; 477 | } 478 | 479 | .image-credit, 480 | .tech-credit { 481 | margin: var(--space-large) auto; 482 | } 483 | 484 | .container-text { 485 | padding: var(--space-large); 486 | 487 | @media (min-width: layout.$media-desktop) { 488 | background-color: var(--color-gray-dark); 489 | border: var(--space-border) solid var(--color-black); 490 | border-radius: var(--space-border); 491 | padding: var(--space-super); 492 | } 493 | } 494 | 495 | .links:not(.list) { 496 | a { 497 | display: block; 498 | margin: 0 auto; 499 | padding: var(--space-medium) 0; 500 | 501 | @media (min-width: layout.$media-tablet) { 502 | display: inline-block; 503 | margin: var(--space-xsmall); 504 | padding: var(--space-large); 505 | 506 | &:first-of-type { 507 | margin-left: 0; 508 | padding-left: 0; 509 | } 510 | 511 | &:last-of-type { 512 | margin-right: 0; 513 | padding-right: 0; 514 | } 515 | } 516 | } 517 | } 518 | } 519 | 520 | details { 521 | display: block; 522 | 523 | summary { 524 | margin: var(--space-small) auto; 525 | } 526 | } 527 | 528 | /* 529 | ** Links / Buttons / Forms 530 | */ 531 | .buttons, 532 | label { 533 | margin: var(--space-small) auto; 534 | } 535 | 536 | a { 537 | color: var(--color-main); 538 | position: relative; 539 | text-decoration: none; 540 | 541 | &:hover, 542 | &:active, 543 | &:focus { 544 | color: var(--color-accent); 545 | } 546 | } 547 | 548 | button, 549 | .button, 550 | input, 551 | select, 552 | textarea { 553 | border: none; 554 | border-radius: var(--space-border); 555 | vertical-align: middle; 556 | } 557 | 558 | .facebook, 559 | .button.facebook, 560 | button.facebook { 561 | background-color: var(--color-facebook); 562 | } 563 | 564 | .twitter, 565 | .button.twitter, 566 | button.twitter { 567 | background-color: var(--color-twitter); 568 | } 569 | 570 | .patreon, 571 | .button.patreon, 572 | button.patreon { 573 | background-color: var(--color-patreon); 574 | } 575 | 576 | .paypal, 577 | .button.paypal 578 | button.paypal { 579 | background-color: var(--color-paypal); 580 | } 581 | 582 | .android:not(.install), 583 | .button.android 584 | button.android { 585 | background-color: var(--color-android); 586 | } 587 | 588 | .apple:not(.install), 589 | .button.apple 590 | button.apple { 591 | background-color: var(--color-apple); 592 | } 593 | 594 | button, 595 | .button, 596 | input[type="button"], 597 | input[type="submit"] { 598 | background-color: var(--color-main-dark); 599 | color: var(--color-white); 600 | line-height: 1; 601 | padding: var(--space-small) var(--space-large); 602 | 603 | &[type=color] { 604 | padding: 0; 605 | } 606 | 607 | &::-webkit-search-cancel-button { 608 | cursor: pointer; 609 | } 610 | 611 | &:hover, 612 | &:active, 613 | &:focus { 614 | background-color: var(--color-accent-dark); 615 | color: var(--color-white); 616 | } 617 | 618 | &.disabled { 619 | &, 620 | &:active, 621 | &:hover, 622 | &:focus { 623 | background-color: var(--color-gray-dark); 624 | color: var(--color-white); 625 | cursor: not-allowed; 626 | pointer-events: none; 627 | } 628 | } 629 | } 630 | 631 | button, 632 | .button, 633 | details summary, 634 | .close, 635 | .copy, 636 | .install, 637 | .share { 638 | cursor: pointer; 639 | } 640 | 641 | input, 642 | textarea, 643 | select { 644 | background-color: var(--color-white); 645 | color: var(--color-gray-dark); 646 | font-size: inherit; 647 | padding: var(--space-small); 648 | } 649 | 650 | label { 651 | display: grid; 652 | align-content: center; 653 | align-items: center; 654 | justify-content: space-between; 655 | grid-template-columns: minmax(10em, 25%) 1fr; 656 | } 657 | 658 | /* 659 | ** Media 660 | */ 661 | img { 662 | background: transparent; 663 | border-style: none; 664 | height: auto; 665 | max-width: 100%; 666 | } 667 | 668 | /* 669 | ** Notifications 670 | */ 671 | .notification { 672 | background-color: var(--color-gray-med); 673 | bottom: 0; 674 | color: var(--color-white); 675 | display: none; 676 | left: 0; 677 | @include layout.padding-default(var(--space-small)); 678 | position: fixed; 679 | right: 0; 680 | width: 100%; 681 | z-index: 999; 682 | 683 | &[open] { 684 | display: block; 685 | } 686 | 687 | &.notification-share { 688 | p { 689 | @extend .container-scrollable; 690 | justify-content: normal; 691 | padding-bottom: var(--space-xsmall); 692 | 693 | a { 694 | display: flex; 695 | align-items: center; 696 | } 697 | } 698 | } 699 | 700 | p { 701 | margin: 0; 702 | margin-right: var(--space-large); 703 | } 704 | 705 | .container { 706 | display: grid; 707 | grid-template-columns: 1fr minmax(10px, 5%); 708 | } 709 | 710 | .url { 711 | user-select: all; 712 | } 713 | } 714 | 715 | /* 716 | ** Misc 717 | */ 718 | @keyframes pulse { 719 | 0% { 720 | color: var(--color-gray-med); 721 | } 722 | 723 | 17% { 724 | color: var(--color-main); 725 | } 726 | 727 | 35% { 728 | color: var(--color-main-dark); 729 | } 730 | 731 | 52% { 732 | color: var(--color-accent-dark); 733 | } 734 | 735 | 68% { 736 | color: var(--color-accent); 737 | } 738 | 739 | 86% { 740 | color: var(--color-gray-med); 741 | } 742 | } -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 |
2 |

Projects

3 | 20 |
21 |
22 |

Skills

23 | 49 |
50 |
51 |

Education

52 |
53 |

Master of Software Engineering

54 |

Penn State University (remote, 2011-2012)

55 |

Coursework focused heavily on each phase of the software development life cycle

56 |
57 |
58 |

Bachelor of Science, Computer Science

59 |

University of Massachusetts (Dartmouth MA, 2007-2010)

60 |

Coursework built a strong foundation of computer science with programming in C and Java

61 |
62 |
63 |
64 |

Experience

65 |
66 |

Alley

(remote, 2021-current) 67 |
    68 |
  • Built, maintained, and fixed issues with enterprise-level websites built with WordPress
  • 69 |
  • Built, maintained, and fixed issues with features built with PHP, JavaScript, and React - including the WordPress Gutenberg editor
  • 70 |
  • Worked on agile teams using the Scrum development methodology
  • 71 |
72 |
73 | Senior Software Engineer 74 |
    75 |
  • Built features and fixed issues with enterprise-level WordPress websites The New York Post, National Review, and Bassmaster using PHP, JavaScript, TypeScript, and React
  • 76 |
  • Migrated Communications of the ACM to a redesigned WordPress theme with various new features built using PHP and JavaScript (not yet launched)
  • 77 |
  • Built a Laravel-based application that tracks the Google Lighthouse metrics for internal and client websites
  • 78 |
  • Used Git for code version control
  • 79 |
  • Conducted code reviews to ensure functionality and quality
  • 80 |
  • Wrote technical documentation for other staff members
  • 81 |
  • Kept on top of new trends for websites and web applications
  • 82 |
83 |
84 |
85 |
86 |

Mercy for Animals

(remote, 2015-2019) 87 |
    88 |
  • Built, maintained, and fixed issues with websites and web applications, including a large existing codebase with minimal documentation
  • 89 |
  • Hired and managed a team of three web developers
  • 90 |
  • Wrote and reviewed a large amount of technical and non-technical documentation
  • 91 |
92 |
93 | Associate Director of Web Development (2018-2019), Full Stack Web Developer (2016-2018) 94 |
    95 |
  • Communicated with other departments and developed software solutions to address their technical needs
  • 96 |
  • Advised and guided the organization on higher-level technical functionality and planning
  • 97 |
  • Assisted with creating, updating, and fixing issues with websites and web applications written in HTML, CSS, JavaScript, PHP, and MySQL including a large existing codebase with minimal documentation
  • 98 |
  • Assisted in creating and maintaining a large library of technical documentation for both technical and non-technical staff members
  • 99 |
  • Used Git for code version control and managed large code base with multiple users
  • 100 |
  • Built team of three developers, including analyzing team needs, creating job postings, interviewing candidates, and selecting new hires
  • 101 |
  • Managed and mentored team members
  • 102 |
  • Managed projects, eliminated roadblocks, delegated tasks according to team member suitability and workload
  • 103 |
  • Conducted code reviews to ensure functionality and quality
  • 104 |
  • Kept on top of new trends for websites and web applications
  • 105 |
106 |
107 |
108 | Web Developer (2015-2016) 109 |
    110 |
  • Built, updated, and fixed issues with websites and applications written in HTML, CSS, JavaScript, PHP, and MySQL
  • 111 |
  • Used Git for code version control
  • 112 |
  • Wrote technical documentation for both technical and non-technical staff members
  • 113 |
  • Kept on top of new trends for websites and web applications
  • 114 |
115 |
116 |
117 |
118 |

Animal Outlook

 (remote, 2013-2015) 119 |
    120 |
  • Built, maintained, and fixed issues with websites and web applications
  • 121 |
  • Built and maintained a LAMP server
  • 122 |
  • Wrote a large amount of technical and non-technical documentation
  • 123 |
124 |
125 | Director of Technology (2013-2015), Web Developer (2013) 126 |
    127 |
  • Developed and maintained WordPress themes, plugins, and 3rd party integrations in HTML, CSS, JavaScript, PHP, and MySQL
  • 128 |
  • Migrated several websites to WordPress with the goal of non-technical staff maintainability
  • 129 |
  • Built and maintained a secure and reliable Linux server with Apache, MySQL, and PHP (LAMP), which hosted a large number of websites
  • 130 |
  • Set up and used Git for code version control
  • 131 |
  • Developed graphics using Adobe Photoshop upon request
  • 132 |
  • Reviewed and edited web content and layout
  • 133 |
  • Developed and maintained documentation with the level of user technical expertise in mind
  • 134 |
  • Coordinated and/or assisted with other projects as determined
  • 135 |
  • Designed and sent out newsletters using Mailchimp
  • 136 |
  • Set up tracking on websites including Google Search Console, Google Analytics, and Google Adwords
  • 137 |
  • Contributed to strategies for driving traffic to websites, including writing blog articles as time allowed
  • 138 |
  • Continuously searched for ways to improve websites
  • 139 |
140 |
141 |
142 |
143 |

General Dynamics

 (Taunton MA, 2008-2013) 144 |
    145 |
  • Wrote, tested, and fixed embedded software
  • 146 |
  • Managed the software release process for our engineering team
  • 147 |
  • Wrote and reviewed technical documentation
  • 148 |
149 |
150 | Software Engineer (2010-2013), Software Engineering Intern (2008-2010) 151 |
    152 |
  • Wrote software for embedded systems in C and Java
  • 153 |
  • Tested software and fixed bugs in C and Java
  • 154 |
  • Worked in collaboration with other teams and departments in a large organization
  • 155 |
  • Managed the entire software release process for a large team of engineers
  • 156 |
  • Wrote and reviewed documentation for other technical users
  • 157 |
158 |
159 |
160 |
-------------------------------------------------------------------------------- /img/favicon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /terms-and-conditions.html: -------------------------------------------------------------------------------- 1 | Nicole Furlan - Terms and Conditions

Terms and Conditions

Nicole Furlan terms and conditions

The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.

For the purposes of these Terms and Conditions:

  • Affiliate means an entity that controls, is controlled by or is under common control with a party, where "control" means ownership of 50% or more of the shares, equity interest or other securities entitled to vote for election of directors or other managing authority.
  • Company (referred to as either "the Company", "We", "Us" or "Our" in this Agreement) refers to Nicole Furlan.
  • Country refers to the United States
  • Device means any device that can access the Service such as a computer, a cellphone or a digital tablet.
  • Service refers to the Website.
  • Terms and Conditions (also referred as "Terms") mean these Terms and Conditions that form the entire agreement between You and the Company regarding the use of the Service.
  • Third-party Social Media Service means any services or content (including data, information, products or services) provided by a third-party that may be displayed, included or made available by the Service.
  • Website refers to Nicole Furlan, accessible from nicolefurlan.com.
  • You means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.
Acknowledgement

These are the Terms and Conditions governing the use of this Service and the agreement that operates between You and the Company. These Terms and Conditions set out the rights and obligations of all users regarding the use of the Service.

Your access to and use of the Service is conditioned on Your acceptance of and compliance with these Terms and Conditions. These Terms and Conditions apply to all visitors, users and others who access or use the Service.

By accessing or using the Service You agree to be bound by these Terms and Conditions. If You disagree with any part of these Terms and Conditions then You may not access the Service.

You represent that you are over the age of 18. The Company does not permit those under 18 to use the Service.

Your access to and use of the Service is also conditioned on Your acceptance of and compliance with the Privacy Policy of the Company. Our Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your personal information when You use the Application or the Website and tells You about Your privacy rights and how the law protects You. Please read Our Privacy Policy carefully before using Our Service.

Links to Other Websites

Our Service may contain links to third-party web sites or services that are not owned or controlled by the Company.

The Company has no control over, and assumes no responsibility for, the content, privacy policies, or practices of any third party web sites or services. You further acknowledge and agree that the Company shall not be responsible or liable, directly or indirectly, for any damage or loss caused or alleged to be caused by or in connection with the use of or reliance on any such content, goods or services available on or through any such web sites or services.

We strongly advise You to read the terms and conditions and privacy policies of any third-party web sites or services that You visit.

Termination

We may terminate or suspend Your access immediately, without prior notice or liability, for any reason whatsoever, including without limitation if You breach these Terms and Conditions.

Upon termination, Your right to use the Service will cease immediately.

Limitation of Liability

Notwithstanding any damages that You might incur, the entire liability of the Company and any of its suppliers under any provision of this Terms and Your exclusive remedy for all of the foregoing shall be limited to the amount actually paid by You through the Service or 100 USD if You haven't purchased anything through the Service.

To the maximum extent permitted by applicable law, in no event shall the Company or its suppliers be liable for any special, incidental, indirect, or consequential damages whatsoever (including, but not limited to, damages for loss of profits, loss of data or other information, for business interruption, for personal injury, loss of privacy arising out of or in any way related to the use of or inability to use the Service, third-party software and/or third-party hardware used with the Service, or otherwise in connection with any provision of this Terms), even if the Company or any supplier has been advised of the possibility of such damages and even if the remedy fails of its essential purpose.

Some states do not allow the exclusion of implied warranties or limitation of liability for incidental or consequential damages, which means that some of the above limitations may not apply. In these states, each party's liability will be limited to the greatest extent permitted by law.

"AS IS" and "AS AVAILABLE" Disclaimer

The Service is provided to You "AS IS" and "AS AVAILABLE" and with all faults and defects without warranty of any kind. To the maximum extent permitted under applicable law, the Company, on its own behalf and on behalf of its Affiliates and its and their respective licensors and service providers, expressly disclaims all warranties, whether express, implied, statutory or otherwise, with respect to the Service, including all implied warranties of merchantability, fitness for a particular purpose, title and non-infringement, and warranties that may arise out of course of dealing, course of performance, usage or trade practice. Without limitation to the foregoing, the Company provides no warranty or undertaking, and makes no representation of any kind that the Service will meet Your requirements, achieve any intended results, be compatible or work with any other software, applications, systems or services, operate without interruption, meet any performance or reliability standards or be error free or that any errors or defects can or will be corrected.

Without limiting the foregoing, neither the Company nor any of the company's provider makes any representation or warranty of any kind, express or implied: (i) as to the operation or availability of the Service, or the information, content, and materials or products included thereon; (ii) that the Service will be uninterrupted or error-free; (iii) as to the accuracy, reliability, or currency of any information or content provided through the Service; or (iv) that the Service, its servers, the content, or e-mails sent from or on behalf of the Company are free of viruses, scripts, trojan horses, worms, malware, timebombs or other harmful components.

Some jurisdictions do not allow the exclusion of certain types of warranties or limitations on applicable statutory rights of a consumer, so some or all of the above exclusions and limitations may not apply to You. But in such a case the exclusions and limitations set forth in this section shall be applied to the greatest extent enforceable under applicable law.

Governing Law

The laws of the Country, excluding its conflicts of law rules, shall govern this Terms and Your use of the Service. Your use of the Application may also be subject to other local, state, national, or international laws.

Disputes Resolution

If You have any concern or dispute about the Service, You agree to first try to resolve the dispute informally by contacting the Company.

For European Union (EU) Users

If You are a European Union consumer, you will benefit from any mandatory provisions of the law of the country in which you are resident in.

United States Legal Compliance

You represent and warrant that (i) You are not located in a country that is subject to the United States government embargo, or that has been designated by the United States government as a "terrorist supporting" country, and (ii) You are not listed on any United States government list of prohibited or restricted parties.

Severability and Waiver

If any provision of these Terms is held to be unenforceable or invalid, such provision will be changed and interpreted to accomplish the objectives of such provision to the greatest extent possible under applicable law and the remaining provisions will continue in full force and effect.

Except as provided herein, the failure to exercise a right or to require performance of an obligation under this Terms shall not effect a party's ability to exercise such right or require such performance at any time thereafter nor shall be the waiver of a breach constitute a waiver of any subsequent breach.

Translation Interpretation

These Terms and Conditions may have been translated if We have made them available to You on our Service.

You agree that the original English text shall prevail in the case of a dispute.

Changes to These Terms and Conditions

We reserve the right, at Our sole discretion, to modify or replace these Terms at any time. If a revision is material We will make reasonable efforts to provide at least 30 days' notice prior to any new terms taking effect. What constitutes a material change will be determined at Our sole discretion.

By continuing to access or use Our Service after those revisions become effective, You agree to be bound by the revised terms. If You do not agree to the new terms, in whole or in part, please stop using the website and the Service.

Contact Us

If you have any questions about these Terms and Conditions, contact us by email at info@nicolefurlan.com

Last updated: June 22, 2020

-------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | Nicole Furlan

Hi! I'm Nicole

I'm a Software Engineer working on building a better world for us all

Projects

  • PWA Generator: a static site generator that builds and deploys Progressive Web Apps to Netlify (in progress)  
  • Dog Safe Foods: a Progressive Web App that allows you to instantly determine whether a certain food is safe for dogs to consume  
  • Cat Safe Foods: a Progressive Web App that allows you to instantly determine whether a certain food is safe for cats to consume  
  • Simple PWA: a Progressive Web App template that provides the minimum file structure needed to create a PWA  
  • Gmail Analyzed: a Progressive Web App that analyzes your inbox and provides a list of the email senders that are clogging it up (in progress)  

Skills

  • Apache
  • Composer
  • CSS/Sass
  • Elasticsearch
  • Git
  • Google Analytics
  • Google Search Console
  • Google Tag Manager
  • Gutenberg
  • HTML
  • JavaScript
  • Laravel
  • MySQL
  • Node
  • NPM
  • PHP
  • PHPUnit
  • Progressive web apps
  • React
  • Shell scripting
  • TypeScript
  • Unix command line
  • Webpack
  • WordPress

Education

Master of Software Engineering

Penn State University (remote, 2011-2012)

Coursework focused heavily on each phase of the software development life cycle

Bachelor of Science, Computer Science

University of Massachusetts (Dartmouth MA, 2007-2010)

Coursework built a strong foundation of computer science with programming in C and Java

Experience

Alley

(remote, 2021-current)
  • Built, maintained, and fixed issues with enterprise-level websites built with WordPress
  • Built, maintained, and fixed issues with features built with PHP, JavaScript, and React - including the WordPress Gutenberg editor
  • Worked on agile teams using the Scrum development methodology
Senior Software Engineer
  • Built features and fixed issues with enterprise-level WordPress websites The New York Post, National Review, and Bassmaster using PHP, JavaScript, TypeScript, and React
  • Migrated Communications of the ACM to a redesigned WordPress theme with various new features built using PHP and JavaScript (not yet launched)
  • Built a Laravel-based application that tracks the Google Lighthouse metrics for internal and client websites
  • Used Git for code version control
  • Conducted code reviews to ensure functionality and quality
  • Wrote technical documentation for other staff members
  • Kept on top of new trends for websites and web applications

Mercy for Animals

(remote, 2015-2019)
  • Built, maintained, and fixed issues with websites and web applications, including a large existing codebase with minimal documentation
  • Hired and managed a team of three web developers
  • Wrote and reviewed a large amount of technical and non-technical documentation
Associate Director of Web Development (2018-2019), Full Stack Web Developer (2016-2018)
  • Communicated with other departments and developed software solutions to address their technical needs
  • Advised and guided the organization on higher-level technical functionality and planning
  • Assisted with creating, updating, and fixing issues with websites and web applications written in HTML, CSS, JavaScript, PHP, and MySQL including a large existing codebase with minimal documentation
  • Assisted in creating and maintaining a large library of technical documentation for both technical and non-technical staff members
  • Used Git for code version control and managed large code base with multiple users
  • Built team of three developers, including analyzing team needs, creating job postings, interviewing candidates, and selecting new hires
  • Managed and mentored team members
  • Managed projects, eliminated roadblocks, delegated tasks according to team member suitability and workload
  • Conducted code reviews to ensure functionality and quality
  • Kept on top of new trends for websites and web applications
Web Developer (2015-2016)
  • Built, updated, and fixed issues with websites and applications written in HTML, CSS, JavaScript, PHP, and MySQL
  • Used Git for code version control
  • Wrote technical documentation for both technical and non-technical staff members
  • Kept on top of new trends for websites and web applications

Animal Outlook

 (remote, 2013-2015)
  • Built, maintained, and fixed issues with websites and web applications
  • Built and maintained a LAMP server
  • Wrote a large amount of technical and non-technical documentation
Director of Technology (2013-2015), Web Developer (2013)
  • Developed and maintained WordPress themes, plugins, and 3rd party integrations in HTML, CSS, JavaScript, PHP, and MySQL
  • Migrated several websites to WordPress with the goal of non-technical staff maintainability
  • Built and maintained a secure and reliable Linux server with Apache, MySQL, and PHP (LAMP), which hosted a large number of websites
  • Set up and used Git for code version control
  • Developed graphics using Adobe Photoshop upon request
  • Reviewed and edited web content and layout
  • Developed and maintained documentation with the level of user technical expertise in mind
  • Coordinated and/or assisted with other projects as determined
  • Designed and sent out newsletters using Mailchimp
  • Set up tracking on websites including Google Search Console, Google Analytics, and Google Adwords
  • Contributed to strategies for driving traffic to websites, including writing blog articles as time allowed
  • Continuously searched for ways to improve websites

General Dynamics

 (Taunton MA, 2008-2013)
  • Wrote, tested, and fixed embedded software
  • Managed the software release process for our engineering team
  • Wrote and reviewed technical documentation
Software Engineer (2010-2013), Software Engineering Intern (2008-2010)
  • Wrote software for embedded systems in C and Java
  • Tested software and fixed bugs in C and Java
  • Worked in collaboration with other teams and departments in a large organization
  • Managed the entire software release process for a large team of engineers
  • Wrote and reviewed documentation for other technical users

-------------------------------------------------------------------------------- /privacy-policy.html: -------------------------------------------------------------------------------- 1 | Nicole Furlan - Privacy Policy

Privacy Policy

Nicole Furlan privacy policy

This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your information when You use the Service and tells You about Your privacy rights and how the law protects You. We use Your Personal data to provide and improve the Service. By using the Service, You agree to the collection and use of information in accordance with this Privacy Policy.

The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.

For the purposes of this Privacy Policy:

  • You means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.
  • Company (referred to as either "the Company", "We", "Us" or "Our" in this Agreement) refers to Nicole Furlan.
  • Affiliate means an entity that controls, is controlled by or is under common control with a party, where "control" means ownership of 50% or more of the shares, equity interest or other securities entitled to vote for election of directors or other managing authority.
  • Account means a unique account created for You to access our Service or parts of our Service.
  • Website refers to Nicole Furlan, accessible from nicolefurlan.com.
  • Service refers to the Website.
  • Country refers to the United States
  • Service Provider means any natural or legal person who processes the data on behalf of the Company. It refers to third-party companies or individuals employed by the Company to facilitate the Service, to provide the Service on behalf of the Company, to perform services related to the Service or to assist the Company in analyzing how the Service is used.
  • Third-party Social Media Service refers to any website or any social network website through which a User can log in or create an account to use the Service.
  • Personal Data is any information that relates to an identified or identifiable individual.
  • Cookies are small files that are placed on Your computer, mobile device or any other device by a website, containing the details of Your browsing history on that website among its many uses.
  • Device means any device that can access the Service such as a computer, a cellphone or a digital tablet.
  • Usage Data refers to data collected automatically, either generated by the use of the Service or from the Service infrastructure itself (for example, the duration of a page visit).
Collecting and Using Your Personal Data

Types of Data Collected

Personal Data

While using Our Service, We may ask You to provide Us with certain personally identifiable information that can be used to contact or identify You. Personally identifiable information may include, but is not limited to Usage Data.

Usage Data is collected automatically when using the Service. Usage Data may include information such as Your Device's Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that You visit, the time and date of Your visit, the time spent on those pages, unique device identifiers and other diagnostic data.

When You access the Service by or through a mobile device, We may collect certain information automatically, including, but not limited to, the type of mobile device You use, Your mobile device unique ID, the IP address of Your mobile device, Your mobile operating system, the type of mobile Internet browser You use, unique device identifiers and other diagnostic data.

We may also collect information that Your browser sends whenever You visit our Service or when You access the Service by or through a mobile device.

Tracking Technologies and Cookies

We use Cookies and similar tracking technologies to track the activity on Our Service and store certain information. Tracking technologies used are beacons, tags, and scripts to collect and track information and to improve and analyze Our Service.

You can instruct Your browser to refuse all Cookies or to indicate when a Cookie is being sent. However, if You do not accept Cookies, You may not be able to use some parts of our Service.

Cookies can be "Persistent" or "Session" Cookies. Persistent Cookies remain on your personal computer or mobile device when You go offline, while Session Cookies are deleted as soon as You close your web browser.

We use both session and persistent Cookies for the purposes set out below:

  • Necessary / Essential Cookies

    Type: Session Cookies

    Administered by: Us

    Purpose: These Cookies are essential to provide You with services available through the Website and to enable You to use some of its features. They help to authenticate users and prevent fraudulent use of user accounts. Without these Cookies, the services that You have asked for cannot be provided, and We only use these Cookies to provide You with those services.

  • Cookies Policy / Notice Acceptance Cookies

    Type: Persistent Cookies

    Administered by: Us

    Purpose: These Cookies identify if users have accepted the use of cookies on the Website.

  • Functionality Cookies

    Type: Persistent Cookies

    Administered by: Us

    Purpose: These Cookies allow us to remember choices You make when You use the Website, such as remembering your login details or language preference. The purpose of these Cookies is to provide You with a more personal experience and to avoid You having to re-enter your preferences every time You use the Website.

  • Tracking and Performance Cookies

    Type: Persistent Cookies

    Administered by: Third-Parties

    Purpose: These Cookies are used to track information about traffic to the Website and how users use the Website. The information gathered via these Cookies may directly or indirectly identify you as an individual visitor. This is because the information collected is typically linked to a pseudonymous identifier associated with the device you use to access the Website. We may also use these Cookies to test new advertisements, pages, features or new functionality of the Website to see how our users react to them.

  • Targeting and Advertising Cookies

    Type: Persistent Cookies

    Administered by: Third-Parties

    Purpose: These Cookies track your browsing habits to enable Us to show advertising which is more likely to be of interest to You. These Cookies use information about your browsing history to group You with other users who have similar interests. Based on that information, and with Our permission, third party advertisers can place Cookies to enable them to show adverts which We think will be relevant to your interests while You are on third party websites.

For more information about the cookies we use and your choices regarding cookies, please visit our Cookies Policy.

Use of Your Personal Data

The Company may use Personal Data for the following purposes:

  • To provide and maintain our Service  including to monitor the usage of our Service.
  • To manage Your Account: to manage Your registration as a user of the Service. The Personal Data You provide can give You access to different functionalities of the Service that are available to You as a registered user.
  • For the performance of a contract: the development, compliance and undertaking of the purchase contract for the products, items or services You have purchased or of any other contract with Us through the Service.
  • To contact You: To contact You by email, telephone calls, SMS, or other equivalent forms of electronic communication, such as a mobile application's push notifications regarding updates or informative communications related to the functionalities, products or contracted services, including the security updates, when necessary or reasonable for their implementation.
  • To provide You with news, special offers and general information about other goods, services and events which we offer that are similar to those that you have already purchased or enquired about unless You have opted not to receive such information.
  • To manage Your requests: To attend and manage Your requests to Us.

We may share your personal information in the following situations:

  • With Service Providers: We may share Your personal information with Service Providers to monitor and analyze the use of our Service, to show advertisements to You to help support and maintain Our Service, to contact You.
  • For Business transfers: We may share or transfer Your personal information in connection with, or during negotiations of, any merger, sale of Company assets, financing, or acquisition of all or a portion of our business to another company.
  • With Affiliates: We may share Your information with Our affiliates, in which case we will require those affiliates to honor this Privacy Policy. Affiliates include Our parent company and any other subsidiaries, joint venture partners or other companies that We control or that are under common control with Us.
  • With Business partners: We may share Your information with Our business partners to offer You certain products, services or promotions.
  • With other users: when You share personal information or otherwise interact in the public areas with other users, such information may be viewed by all users and may be publicly distributed outside. If You interact with other users or register through a Third-Party Social Media Service, Your contacts on the Third-Party Social Media Service may see You name, profile, pictures and description of Your activity. Similarly, other users will be able to view descriptions of Your activity, communicate with You and view Your profile.

Retention of Your Personal Data

The Company will retain Your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use Your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies.

The Company will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of Our Service, or We are legally obligated to retain this data for longer time periods.

Transfer of Your Personal Data

Your information, including Personal Data, is processed at the Company's operating offices and in any other places where the parties involved in the processing are located. It means that this information may be transferred to—and maintained on—computers located outside of Your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from Your jurisdiction.

Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer.

The Company will take all steps reasonably necessary to ensure that Your data is treated securely and in accordance with this Privacy Policy and no transfer of Your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of Your data and other personal information.

Disclosure of Your Personal Data

Business Transactions

If the Company is involved in a merger, acquisition or asset sale, Your Personal Data may be transferred. We will provide notice before Your Personal Data is transferred and becomes subject to a different Privacy Policy.

Law enforcement

Under certain circumstances, the Company may be required to disclose Your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency).

Other legal requirements

The Company may disclose Your Personal Data in the good faith belief that such action is necessary to:

  • Comply with a legal obligation
  • Protect and defend the rights or property of the Company
  • Prevent or investigate possible wrongdoing in connection with the Service
  • Protect the personal safety of Users of the Service or the public
  • Protect against legal liability

Security of Your Personal Data

The security of Your Personal Data is important to Us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While We strive to use commercially acceptable means to protect Your Personal Data, We cannot guarantee its absolute security.

Detailed Information on the Processing of Your Personal Data

Service Providers have access to Your Personal Data only to perform their tasks on Our behalf and are obligated not to disclose or use it for any other purpose.

  • Google Analytics: We may use third-party Service providers to monitor and analyze the use of our Service. For more information on what type of information Google Analytics collects, please visit Google's Privacy Policy page: policies.google.com/privacy
  • Google Ads (AdSense): We may use Service providers to show advertisements to You to help support and maintain Our Service. You can opt-out from Google Adsense service by following the instructions as described on Google's Privacy Policy page: policies.google.com/privacy.
Children's Privacy

Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from anyone under the age of 13. If You are a parent or guardian and You are aware that Your child has provided Us with Personal Data, please contact Us. If We become aware that We have collected Personal Data from anyone under the age of 13 without verification of parental consent, We take steps to remove that information from Our servers.

If We need to rely on consent as a legal basis for processing Your information and Your country requires consent from a parent, We may require Your parent's consent before We collect and use that information.

Links to Other Websites

Our Service may contain links to other websites that are not operated by Us. If You click on a third party link, You will be directed to that third party's site. We strongly advise You to review the Privacy Policy of every site You visit.

We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.

Changes to this Privacy Policy

We may update our Privacy Policy from time to time. We will notify You of any changes by posting the new Privacy Policy on this page.

We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the "Last updated" date at the top of this Privacy Policy.

You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.

Contact Us

If you have any questions about this Privacy Policy, contact us by email at info@nicolefurlan.com

Last updated: June 22, 2020

--------------------------------------------------------------------------------