diff --git a/components/Figure/Figure.tsx b/components/Figure/Figure.tsx
index dd2df1bf..1c927ce0 100644
--- a/components/Figure/Figure.tsx
+++ b/components/Figure/Figure.tsx
@@ -1,8 +1,7 @@
-import Image from "../Image";
+import Image, { CustomImageProps } from "../Image";
import innerText from "react-innertext";
import { styled } from "../../lib/styles/stitches.config";
import type { PropsWithChildren } from "react";
-import type { ImageProps as NextImageProps } from "next/image";
const Wrapper = styled("figure", {
margin: "1em auto",
@@ -21,7 +20,7 @@ const Caption = styled("figcaption", {
},
});
-export type FigureProps = Omit &
+export type FigureProps = Omit &
PropsWithChildren<{
alt?: string; // becomes optional -- pulled from plaintext-ified caption if missing
}>;
diff --git a/components/Image/Image.tsx b/components/Image/Image.tsx
index b67d8628..1520a275 100644
--- a/components/Image/Image.tsx
+++ b/components/Image/Image.tsx
@@ -1,4 +1,5 @@
import NextImage from "next/image";
+import Link from "../Link";
import { styled } from "../../lib/styles/stitches.config";
import type { ComponentProps } from "react";
import type { ImageProps as NextImageProps, StaticImageData } from "next/image";
@@ -15,6 +16,11 @@ const RoundedImage = styled(NextImage, {
borderRadius: "$rounded",
});
+export type CustomImageProps = NextImageProps &
+ ComponentProps & {
+ href?: string; // optionally wrap image in a link
+ };
+
const CustomImage = ({
src,
width,
@@ -24,9 +30,10 @@ const CustomImage = ({
layout,
quality,
priority,
+ href,
className,
...rest
-}: NextImageProps & ComponentProps) => {
+}: CustomImageProps) => {
// passed directly into next/image: https://nextjs.org/docs/api-reference/next/image
const imageProps: Partial = {
width: typeof width === "string" ? Number.parseInt(width) : width,
@@ -50,10 +57,18 @@ const CustomImage = ({
imageProps.src = (src as string).replace(/^\/public/g, "");
}
+ // @ts-ignore
+ const img = ;
+
return (
- {/* @ts-ignore */}
-
+ {href ? (
+
+ {img}
+
+ ) : (
+ img
+ )}
);
};
diff --git a/notes/bernie-sanders-bern-app-data.mdx b/notes/bernie-sanders-bern-app-data.mdx
index 7386abc1..6524a1cd 100644
--- a/notes/bernie-sanders-bern-app-data.mdx
+++ b/notes/bernie-sanders-bern-app-data.mdx
@@ -82,14 +82,24 @@ Others have noted that web-based organizing tools like BERN have been used by ca
But the latter category of databases — like [NationBuilder](https://nationbuilder.com/) and, more notably, [NGP VAN's VoteBuilder](https://act.ngpvan.com/votebuilder) software based on the Obama campaign's inventions and now used by almost all Democratic campaigns across the United States — are secured and strictly guarded. Volunteer accounts need to be created and approved by paid campaign organizers and are locked down to provide the bare minimum amount of information necessary for one to canvass or phone bank a shortlist of voters. Every single click is also recorded in a [detailed log](sanders-campaign-audit.pdf) down to the millisecond. (This is how [Bernie's organizers got busted](https://time.com/4155185/bernie-sanders-hillary-clinton-data/) snooping around Hillary's VoteBuilder data last cycle, by the way.)
-
+
[NGP VAN's audit of the Sanders campaign's VoteBuilder
activity](/static/images/notes/bernie-sanders-bern-app-data/sanders-campaign-audit.pdf)
BERN is taking this to an unprecedented level. Allowing anybody on the internet to sign up and add others' personal information to the campaign's database without their knowledge is troubling, especially when you consider the gamified "points" system they've added as an incentive to report as much information on as many people as possible.
-
+
[BERN discussion on /r/SandersForPresident
thread](https://www.reddit.com/r/SandersForPresident/comments/bi15la/new_get_the_official_bernie_sanders_2020_app_bern/elxi85m/)
diff --git a/notes/coronavirus-open-source.mdx b/notes/coronavirus-open-source.mdx
index d9dc21a8..3fcbf51a 100644
--- a/notes/coronavirus-open-source.mdx
+++ b/notes/coronavirus-open-source.mdx
@@ -26,6 +26,7 @@ The maintainers are also [fully transparent](https://covidtracking.com/about-tra
width="680"
height="328"
alt="The COVID Tracking Project"
+ href="https://covidtracking.com/"
/>
## [#findthemasks](https://findthemasks.com/)
@@ -39,6 +40,7 @@ _Please_ look up your local hospitals on [#findthemasks](https://findthemasks.co
width="600"
height="295"
alt="#findthemasks"
+ href="https://findthemasks.com/"
/>
## [#StayTheFuckHome](https://staythefuckhome.com/)
@@ -52,6 +54,7 @@ The [GitHub community](https://github.com/flore2003/staythefuckhome/pulls?q=is%3
width="600"
height="215"
alt="#StayTheFuckHome"
+ href="https://staythefuckhome.com/"
/>
## [COVID-19 Dashboards](https://covid19dashboards.com/)
@@ -63,6 +66,7 @@ This collection of various visualizations is fascinating (and sobering) to look
width="580"
height="442"
alt="COVID-19 Dashboards"
+ href="https://covid19dashboards.com/"
/>
## [CoronaTracker](https://coronatracker.samabox.com/)
@@ -74,6 +78,7 @@ CoronaTracker is a _beautiful_ cross-platform app for iOS and macOS with intuiti
width="865"
height="417"
alt="CoronaTracker"
+ href="https://coronatracker.samabox.com/"
/>
## [Staying Home Club](https://stayinghome.club/)
@@ -85,6 +90,7 @@ A bit more family-friendly than [#StayTheFuckHome](https://staythefuckhome.com/)
width="600"
height="137"
alt="Staying Home Club"
+ href="https://stayinghome.club/"
/>
## [Nextstrain for nCoV](https://nextstrain.org/ncov)
@@ -96,6 +102,7 @@ This one is a bit over my head, but apparently [Nextstrain](https://nextstrain.o
width="865"
height="345"
alt="Nextstrain for nCOV"
+ href="https://nextstrain.org/ncov"
/>
## [Johns Hopkins 2019-nCoV Data](https://systems.jhu.edu/research/public-health/ncov/)
@@ -107,6 +114,7 @@ Johns Hopkins University's [visual COVID-19 global dashboard](https://www.arcgis
width="865"
height="426"
alt="Johns Hopkins 2019-nCoV Data"
+ href="https://systems.jhu.edu/research/public-health/ncov/"
/>
## [COVID-19 Scenarios](https://neherlab.org/covid19/)
@@ -120,6 +128,7 @@ The maintainers at the [Neher Lab in Basel, Switzerland](https://neherlab.org/)
width="740"
height="433"
alt="COVID-19 Scenarios"
+ href="https://neherlab.org/covid19/"
/>
## [Corona Data Scraper](https://coronadatascraper.com/#home)
@@ -131,6 +140,7 @@ Similar to the [COVID Tracking Project](https://covidtracking.com/) above, the [
width="750"
height="358"
alt="Corona Data Scraper"
+ href="https://coronadatascraper.com/#home"
/>
## [Folding@home](https://foldingathome.org/covid19/)
@@ -159,6 +169,7 @@ To wrap this list up, I thought I'd include [yet another API](https://github.com
width="712"
height="371"
alt="Coronavirus Tracker API"
+ href="https://coronavirus-tracker-api.herokuapp.com/v2/locations"
/>
### Stay safe (and [home](https://staythefuckhome.com/ "One last time...")), friends! ❤️
diff --git a/notes/finding-candidates-subdomain-takeovers.mdx b/notes/finding-candidates-subdomain-takeovers.mdx
index b91508d7..cdd82416 100644
--- a/notes/finding-candidates-subdomain-takeovers.mdx
+++ b/notes/finding-candidates-subdomain-takeovers.mdx
@@ -19,6 +19,7 @@ Not only are takeovers a fun way to dip your toes into [penetration testing](htt
src="/public/static/images/notes/finding-candidates-subdomain-takeovers/hackerone-2.png"
width="620"
height="347"
+ href="https://hackerone.com/hacktivity?querystring=subdomain%20takeover"
priority
>
[Huge rewards for subdomain takeovers on
diff --git a/notes/millenial-with-hillary-clinton.mdx b/notes/millenial-with-hillary-clinton.mdx
index fb1b5f59..26796901 100644
--- a/notes/millenial-with-hillary-clinton.mdx
+++ b/notes/millenial-with-hillary-clinton.mdx
@@ -15,6 +15,7 @@ noComments: true
src="/public/static/images/notes/millenial-with-hillary-clinton/24707394571_0818d4ab83_o-1-copy.jpg"
width="865"
height="411"
+ href="https://www.flickr.com/photos/hillaryclinton/24707394571/"
priority
>
[Hillary for New Hampshire](https://medium.com/@HillaryForNH) Winter Fellows with [Hillary
diff --git a/notes/my-first-code.mdx b/notes/my-first-code.mdx
index e743f2a5..838867b3 100644
--- a/notes/my-first-code.mdx
+++ b/notes/my-first-code.mdx
@@ -16,6 +16,7 @@ image: "/static/images/notes/my-first-code/jbb-screen1.png"
width="865"
height="155"
alt="Awesome First Code on GitHub"
+ href="https://github.com/jakejarvis/awesome-first-code"
priority
/>
@@ -34,7 +35,12 @@ Hopefully we can all look back at our first projects and be proud of how far we'
---
-
+
[Jake's Bulletin Board](https://github.com/jakejarvis/jbb)
diff --git a/notes/security-headers-cloudflare-workers.mdx b/notes/security-headers-cloudflare-workers.mdx
index f71df077..75c4991c 100644
--- a/notes/security-headers-cloudflare-workers.mdx
+++ b/notes/security-headers-cloudflare-workers.mdx
@@ -15,9 +15,10 @@ image: "/static/images/notes/security-headers-cloudflare-workers/security-header
src="/public/static/images/notes/security-headers-cloudflare-workers/security-headers.png"
width="700"
height="275"
+ href="https://securityheaders.com/?q=jarv.is&followRedirects=on"
priority
>
- An [A+ security grade](https://securityheaders.com/?q=jarv.is&followRedirects=on) for this website!
+ An [A+ security grade](https://securityheaders.com/?q=jarv.is&followRedirects=on) for this website!
In 2019, it's becoming more and more important to harden websites via HTTP response headers, which all modern browsers parse and enforce. Multiple standards have been introduced over the past few years to protect users from various attack vectors, including `Content-Security-Policy` for injection protection, `Strict-Transport-Security` for HTTPS enforcement, `X-XSS-Protection` for cross-site scripting prevention, `X-Content-Type-Options` to enforce correct MIME types, `Referrer-Policy` to limit information sent with external links, [and many, many more](https://www.netsparker.com/whitepaper-http-security-headers/).
diff --git a/notes/shodan-search-queries.mdx b/notes/shodan-search-queries.mdx
index fb64bf11..f51f0af1 100644
--- a/notes/shodan-search-queries.mdx
+++ b/notes/shodan-search-queries.mdx
@@ -13,7 +13,13 @@ image: "/static/images/notes/shodan-search-queries/shodan.png"
Over time, I've collected an assortment of interesting, funny, and depressing search queries to plug into [Shodan](https://www.shodan.io/), the ([literal](https://www.vice.com/en_uk/article/9bvxmd/shodan-exposes-the-dark-side-of-the-net)) internet search engine. Some return facepalm-inducing results, while others return serious and/or ancient vulnerabilities in the wild.
-
+
[**Most search filters require a Shodan account.**](https://account.shodan.io/register)
diff --git a/notes/y2k-sandbox.mdx b/notes/y2k-sandbox.mdx
index 18b389f0..ceb13b88 100644
--- a/notes/y2k-sandbox.mdx
+++ b/notes/y2k-sandbox.mdx
@@ -14,7 +14,7 @@ A few months ago, I stumbled upon [my first website ever](https://jakejarvis.git
Introducing the [**Y2K Sandbox**](/y2k/) — with fully-featured, fully-isolated, on-demand [**Windows Millennium Edition®**](https://www.youtube.com/watch?v=CaNDeyYP98A) virtual machines, simply to experience my first website in its natural Internet Explorer 5 habitat. And maybe play some [3D Pinball: Space Cadet](https://en.wikipedia.org/wiki/Full_Tilt!_Pinball#3D_Pinball_for_Windows_%E2%80%93_Space_Cadet). Oh, and [Microsoft Bob](https://en.wikipedia.org/wiki/Microsoft_Bob) is there too if you want to say hello and catch up. 🤓
-
+
[**Play in the Y2K Sandbox, at your own risk.**](/y2k/)
diff --git a/package.json b/package.json
index 81a236a0..6f5e55ae 100644
--- a/package.json
+++ b/package.json
@@ -27,8 +27,8 @@
"@octokit/graphql": "^4.8.0",
"@primer/octicons": "^17.0.0",
"@react-spring/web": "^9.4.4",
- "@sentry/node": "^6.19.0",
- "@sentry/tracing": "^6.19.0",
+ "@sentry/node": "^6.19.1",
+ "@sentry/tracing": "^6.19.1",
"@stitches/react": "^1.2.7",
"copy-to-clipboard": "^3.3.1",
"date-fns": "^2.28.0",
@@ -81,8 +81,8 @@
"@types/react-is": "^17.0.3",
"@types/remove-markdown": "^0.3.1",
"@types/sanitize-html": "^2.6.2",
- "@typescript-eslint/eslint-plugin": "^5.15.0",
- "@typescript-eslint/parser": "^5.15.0",
+ "@typescript-eslint/eslint-plugin": "^5.16.0",
+ "@typescript-eslint/parser": "^5.16.0",
"cross-env": "^7.0.3",
"eslint": "~8.11.0",
"eslint-config-next": "12.1.1-canary.15",
diff --git a/pages/cli.tsx b/pages/cli.tsx
index 80f86612..7424d3c3 100644
--- a/pages/cli.tsx
+++ b/pages/cli.tsx
@@ -30,9 +30,7 @@ const CLI = () => (