- {props.sections.map((section: Section) => (
+ {props.sections.map((section: Section, index: number) => (
-
0/{section.checklist.length} Done
+ {(done.value && done.value[index]) ? (
+
+ {done.value[index]}/{section.checklist.length} Done
+
+ ) : (
+
+ {section.checklist.length} Items
+
+ )}
-
{section.title}
+
+ {section.title}
+
{section.description}
-
- {/*
-
-
*/}
+ {(completions.value && completions.value[index]) ? (
+
+ {completions.value[index]}%
+
+ ) : (
+
+ Not yet started
+
+ )}
))}
diff --git a/web/src/data/articles.ts b/web/src/data/articles.ts
new file mode 100644
index 0000000..d16c865
--- /dev/null
+++ b/web/src/data/articles.ts
@@ -0,0 +1,47 @@
+
+interface Article {
+ title: string;
+ description: string;
+ slug: string;
+ markdown: string;
+ warningMessage?: string;
+}
+
+const articles: Article[] = [
+ {
+ title: 'Why security matters?',
+ description: 'Why your personal digital security and privacy needs to be taken seriously.',
+ slug: 'importance-of-digital-security',
+ markdown: 'https://raw.githubusercontent.com/Lissy93/personal-security-checklist/old-version/0_Why_It_Matters.md',
+ },
+ {
+ title: 'Security List: Short Version',
+ description: 'Main lists too long? Here\'s the TL;DR',
+ slug: 'short-list',
+ markdown: 'https://raw.githubusercontent.com/Lissy93/personal-security-checklist/old-version/2_TLDR_Short_List.md',
+ },
+ {
+ title: 'Helpful Links',
+ description: 'Directory of links to additional tools, resources and information.',
+ slug: 'helpful-links',
+ markdown: 'https://raw.githubusercontent.com/Lissy93/personal-security-checklist/old-version/4_Privacy_And_Security_Links.md',
+ warningMessage: 'This article was written in 2020, and needs updating.',
+ },
+ {
+ title: 'Security Gadgets',
+ description: 'Handy hardware devices that can help protect your privacy and security.',
+ slug: 'privacy-gadgets',
+ markdown: 'https://raw.githubusercontent.com/Lissy93/personal-security-checklist/old-version/6_Privacy_and-Security_Gadgets.md',
+ warningMessage: 'This article is outdated and may contain incorrect information. '
+ +'It is recommended to verify the information before using any of the products listed.',
+ },
+ {
+ title: 'Privacy-Respecting Software',
+ description: 'The ultimate list of privacy-respecting software alternatives to popular apps and services.',
+ slug: 'awesome-privacy',
+ markdown: 'https://raw.githubusercontent.com/Lissy93/awesome-privacy/main/README.md',
+ warningMessage: 'This resource has moved! You can now access it at github.com/Lissy93/awesome-privacy',
+ },
+];
+
+export default articles;
diff --git a/web/src/root.tsx b/web/src/root.tsx
index 1164247..50fef2b 100644
--- a/web/src/root.tsx
+++ b/web/src/root.tsx
@@ -28,7 +28,7 @@ export default component$(() => {
-
+
diff --git a/web/src/routes/about/about-content.ts b/web/src/routes/about/about-content.ts
new file mode 100644
index 0000000..c25ccf4
--- /dev/null
+++ b/web/src/routes/about/about-content.ts
@@ -0,0 +1,109 @@
+export const intro = [
+ `The objective of this project is to give you practical guidance on how to improve your digital security, and protect your privacy online.`,
+ `
+ The checklist is a living document, and will be updated regularly to reflect the latest threats and best practices.
+ This is made possible by open sourcing the content, and making it a community maintained resource,
+ meaning that anyone can suggest changes, make additions or update the guidance.
+ All edits are then reviewed by maintainers before being merged and going live.
+ `];
+
+export const projects = [
+ {
+ title: 'Web-Check',
+ description: 'OSINT tool for analysing any website',
+ icon: 'https://icon.horse/icon/web-check.xyz',
+ link: 'https://github.com/lissy93/web-check',
+ },
+ {
+ title: 'Dashy',
+ description: 'Dashboard app, for organising your self-hosted services',
+ icon: 'https://dashy.to/img/dashy.png',
+ link: 'https://github.com/lissy93/dashy',
+ },
+ {
+ title: 'Email Comparison',
+ description: 'Objective comparison of private/secure mail providers',
+ icon: 'https://email-comparison.as93.net/favicon.png',
+ link: 'https://github.com/lissy93/email-comparison',
+ },
+ {
+ title: 'Awesome Privacy',
+ description: 'A list of privacy-respscting software and services',
+ icon: 'https://awesome-privacy.xyz/awesome-privacy.png',
+ link: 'https://github.com/lissy93/awesome-privacy',
+ },
+ {
+ title: 'Portainer-Templates',
+ description: 'Compiled repository of 1-click Docker apps for self-hosting',
+ icon: 'https://portainer-templates.as93.net/favicon.png',
+ link: 'https://github.com/lissy93/portainer-templates',
+ },
+ {
+ title: 'AdGuardian',
+ description: 'CLI tool for monitoring your networks traffic and AdGuard DNS stats',
+ icon: 'https://adguardian.as93.net/favicon.png',
+ link: 'https://github.com/lissy93/adguardian-term',
+ },
+ {
+ title: 'Bug-Bounties',
+ description: 'Database of websites which accept responsible vulnerability discolsure',
+ icon: 'https://bug-bounties.as93.net/favicon.png',
+ link: 'https://github.com/lissy93/bug-bounties',
+ },
+ {
+ title: 'Git-In',
+ description: 'Tools and resources to help beginners get into open source',
+ icon: 'https://www.git-in.to/favicon.png',
+ link: 'https://github.com/lissy93/git-in',
+ },
+];
+
+export const socials = [
+ {
+ title: 'GitHub',
+ icon: 'hub',
+ link: 'https://github.com/lissy93',
+ },
+ {
+ title: 'Twitter',
+ icon: 'twitter',
+ link: 'https://x.com/lissy_sykes',
+ },
+ {
+ title: 'Mastodon',
+ icon: 'mastodon',
+ link: 'https://mastodon.social/@lissy93',
+ },
+ {
+ title: 'Dev',
+ icon: 'dev',
+ link: 'https://dev.to/lissy93',
+ },
+ {
+ title: 'LinkedIn',
+ icon: 'linkedin',
+ link: 'https://linkedin.com/in/aliciasykes',
+ },
+];
+
+export const license = `
+The MIT License (MIT)
+Copyright (c) Alicia Sykes
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sub-license, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included install
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANT ABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+`;
diff --git a/web/src/routes/about/index.tsx b/web/src/routes/about/index.tsx
index 2449266..1c98238 100644
--- a/web/src/routes/about/index.tsx
+++ b/web/src/routes/about/index.tsx
@@ -1,45 +1,212 @@
-import { component$ } from "@builder.io/qwik";
+import { component$, useResource$, Resource } from "@builder.io/qwik";
import type { DocumentHead } from "@builder.io/qwik-city";
+import Icon from "~/components/core/icon";
+import { projects, socials, intro, license } from './about-content';
export default component$(() => {
+
+ interface Contributor {
+ login: string;
+ avatar_url: string;
+ avatarUrl: string;
+ html_url: string;
+ contributions: number;
+ name: string;
+ }
+
+
+ const contributorsResource = useResource$(async () => {
+ const url = 'https://api.github.com/repos/lissy93/personal-security-checklist/contributors?per_page=100';
+ const response = await fetch(url);
+ if (!response.ok) {
+ throw new Error('Failed to fetch contributors');
+ }
+ return await response.json();
+ });
+
+ const sponsorsResource = useResource$(async () => {
+ const url = 'https://github-sponsors.as93.workers.dev/lissy93';
+ const response = await fetch(url);
+ if (!response.ok) {
+ throw new Error('Failed to fetch sponsors');
+ }
+ return await response.json();
+ });
+
+
return (
- About the Security Checklist
+ About the Security Checklist
+ {intro.map((paragraph, index) => (
+ {paragraph}
+ ))}
+
- About the Author
-
- This project was originally started by me, Alicia Sykes- with a lot of help from the community.
-
-
-
-
- I write apps which aim to help people escape big tech, secure their data,
- and protect their privacy.
-
-
-
- I have a particular interest in self-hosting, Linux and OSINT.
- So if this type of stuff interests you, check out these other projects that I maintain:
-
-
-
- - Web-Check - OSINT tool for analysing any website
- - Dashy - Dashboard app, for organising your self-hosted services
- - Portainer-Templates - Compiled repository of 1-click Docker apps for self-hosting
- - AdGuardian - CLI tool for monitoring your networks traffic and AdGuard DNS stats
- - Bug-Bounties - Database of websites which accept responsible vulnerability discolsure
- - Awesome Privacy - A list of privacy-respscting software and services
- - Email Comparison - Objective comparison of private/secure mail providers
- - Git-In - Tools and resources to help beginners get into open source
-
-
- For a full list of projects I've published, see apps.aliciasykes.com, or follow me on GitHub (I'm Lissy93).
+ Credits
+
+
+ Sponsors
+
+
+ Huge thanks to the following sponsors, for their ongoing support 💖
+
+
+
+
+
+
+ Contributors
+
+ This project exists thanks to all the people who've helped build and maintain it.
+ Special thanks to the below, top-100 contributors 🌟
+
+
+
Loading...
}
+ onResolved={(contributors: Contributor[]) => (
+ contributors.map((contributor: Contributor) => (
+
+
+ {contributor.login}
+
+ ))
+ )}
+ />
+
+
+
+
+ About the Author
+
+ This project was originally started by
+ me, Alicia Sykes
+ - with a lot of help from the community.
+
+
+
+
+
+ {
+ socials.map((social, index) => (
+
+
+
+ ))
+ }
+
+
+
+ I write apps which aim to help people escape big tech, secure their data, and protect their privacy.
+
+
+
+ I have a particular interest in self-hosting, Linux, security and OSINT.
+ So if this type of stuff interests you, check out these other projects:
+
+
+ {
+ projects.map((project, index) => (
+ -
+
+
+ {project.title}
+ - {project.description}
+
+ ))
+ }
+
+
+
+ For a more open source apps I've published,
+ see apps.aliciasykes.com,
+ or follow me on GitHub
+
+
+
+
+
+
+
+ License
+
+ This project is split-licensed, with the checklist content (located
+ in
+ personal-security-checklist.yml
+ ) being licensed
+ under CC BY-NC-SA 4.0.
+ And everything else (including all the code), licensed
+ under MIT.
+
+
+ {license}
+
+
+
+ What does this means for you?
+
+
+
+ This means that for everything (except the checklist YAML file), you have almost unlimited freedom to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of this software.
+ All that we ask is that you include the original copyright notice and permission notice in any copies of the software
+
+
+ And for the security-list content you can share and adapt this content as long as you give appropriate credit,
+ don't use it for commercial purposes, and distribute your contributions under the same license.
+
+
+
+
+
+
);
});
diff --git a/web/src/routes/article/[slug]/article.module.css b/web/src/routes/article/[slug]/article.module.css
new file mode 100644
index 0000000..959bd52
--- /dev/null
+++ b/web/src/routes/article/[slug]/article.module.css
@@ -0,0 +1,7 @@
+.psc_article {
+ img {
+ display: inline;
+ margin: 0 auto;
+ border-radius: 4px;
+ }
+}
diff --git a/web/src/routes/article/[slug]/index.tsx b/web/src/routes/article/[slug]/index.tsx
new file mode 100644
index 0000000..def0808
--- /dev/null
+++ b/web/src/routes/article/[slug]/index.tsx
@@ -0,0 +1,100 @@
+// src/routes/articles/[slug].tsx
+import { component$, Resource, useResource$, useStore } from '@builder.io/qwik';
+import { useLocation } from '@builder.io/qwik-city';
+import { marked } from "marked";
+
+import articles from '~/data/articles';
+
+import styles from './article.module.css';
+
+export default component$(() => {
+ const location = useLocation();
+ const store = useStore({ article: null, notFound: false });
+
+ const slug = location.params.slug;
+ const article = articles.find(a => a.slug === slug);
+
+ const parseMarkdown = (text: string | undefined): string => {
+ if (!text) return '';
+
+ // Custom renderer
+ const renderer = new marked.Renderer();
+
+ // Override function to handle headings
+ renderer.heading = (text, level) => {
+ const escapedText = text.toLowerCase().replace(/[^\w]+/g, '-');
+ return `${text}`;
+ };
+
+ // Override function to handle links
+ renderer.link = (href, title, text) => {
+ if (href.startsWith('/')) {
+ href = `https://github.com/Lissy93/personal-security-checklist/blob/old-version/${href}`;
+ }
+ title = title ? `title="${title}"` : '';
+ return `${text}`;
+ };
+
+ // Sanitize the input to remove