@networkpro/web 1.5.6 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +3 -0
- package/README.md +72 -16
- package/cspell.json +10 -1
- package/jsconfig.json +2 -1
- package/netlify-functions/cspReport.js +68 -0
- package/netlify.toml +17 -8
- package/package.json +10 -7
- package/playwright.config.js +20 -19
- package/scripts/checkNode.js +7 -1
- package/src/app.d.ts +7 -4
- package/src/app.html +6 -49
- package/src/hooks.client.ts +15 -7
- package/src/hooks.server.js +91 -0
- package/src/lib/components/foss/FossFeatures.svelte +57 -4
- package/src/lib/components/foss/FossItemContent.svelte +1 -1
- package/src/lib/components/layout/Footer.svelte +1 -1
- package/src/lib/components/layout/HeaderDefault.svelte +1 -1
- package/src/lib/components/layout/HeaderHome.svelte +1 -1
- package/src/lib/data/fossData.js +271 -68
- package/src/lib/images.js +6 -0
- package/src/lib/img/posts/eauth.png +0 -0
- package/src/lib/img/posts/eauth.webp +0 -0
- package/src/lib/meta.js +0 -1
- package/src/lib/pages/FossContent.svelte +1 -1
- package/src/lib/registerServiceWorker.js +32 -31
- package/src/routes/+layout.js +6 -1
- package/src/routes/+layout.svelte +7 -6
- package/src/routes/api/mock-csp/+server.js +22 -0
- package/src/service-worker.js +55 -28
- package/static/disableSw.js +12 -0
- package/stylelint.config.js +2 -6
- package/tests/e2e/app.spec.js +58 -21
- package/tests/e2e/mobile.spec.js +49 -29
- package/tests/unit/cspReport.test.js +81 -0
- package/_headers +0 -9
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
src/hooks.server.js
|
|
3
|
+
|
|
4
|
+
Copyright © 2025 Network Pro Strategies (Network Pro™)
|
|
5
|
+
SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
|
|
6
|
+
This file is part of Network Pro.
|
|
7
|
+
========================================================================== */
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* SvelteKit server hook to set Content Security Policy (CSP) header.
|
|
11
|
+
* @type {import('@sveltejs/kit').Handle}
|
|
12
|
+
*/
|
|
13
|
+
export async function handle({ event, resolve }) {
|
|
14
|
+
// Create the response
|
|
15
|
+
const response = await resolve(event);
|
|
16
|
+
|
|
17
|
+
// Check if the environment is for testing
|
|
18
|
+
const isTestEnvironment =
|
|
19
|
+
process.env.NODE_ENV === "test" || process.env.ENV_MODE === "ci";
|
|
20
|
+
|
|
21
|
+
// Set the Content Security Policy header
|
|
22
|
+
if (isTestEnvironment) {
|
|
23
|
+
// Relaxed CSP for testing: Allow inline scripts and eval
|
|
24
|
+
response.headers.set(
|
|
25
|
+
"Content-Security-Policy",
|
|
26
|
+
[
|
|
27
|
+
"default-src 'self';",
|
|
28
|
+
"script-src 'self' 'unsafe-inline' 'unsafe-eval' ws://localhost:*;", // Allow inline and eval scripts, and websockets for local testing
|
|
29
|
+
"style-src 'self' 'unsafe-inline';", // Allow inline styles
|
|
30
|
+
"img-src 'self' data:;", // Allow images from same origin and data URIs
|
|
31
|
+
"connect-src 'self';", // Allow connections only to same origin
|
|
32
|
+
"font-src 'self' data:;", // Allow fonts from same origin and data URIs
|
|
33
|
+
"form-action 'self';", // Allow forms to post to same origin
|
|
34
|
+
"base-uri 'self';", // Restrict base URIs to same origin
|
|
35
|
+
"object-src 'none';", // Block all object sources
|
|
36
|
+
"frame-ancestors 'none';", // Prevent framing of the site
|
|
37
|
+
"upgrade-insecure-requests;", // Automatically upgrade HTTP to HTTPS
|
|
38
|
+
"report-uri /api/mock-csp;", // Mock CSP reports for testing
|
|
39
|
+
].join(" "),
|
|
40
|
+
);
|
|
41
|
+
} else {
|
|
42
|
+
// Production or development environment: use a more restrictive CSP
|
|
43
|
+
response.headers.set(
|
|
44
|
+
"Content-Security-Policy",
|
|
45
|
+
[
|
|
46
|
+
"default-src 'self';", // Allow resources from same origin
|
|
47
|
+
"script-src 'self' 'unsafe-inline';", // Allow inline scripts
|
|
48
|
+
"style-src 'self' 'unsafe-inline';", // Allow inline styles
|
|
49
|
+
"img-src 'self' data:;", // Allow images from same origin and data URIs
|
|
50
|
+
"connect-src 'self';", // Allow connections only to same origin
|
|
51
|
+
"font-src 'self' data:;", // Allow fonts from same origin and data URIs
|
|
52
|
+
"form-action 'self';", // Allow forms to post to same origin
|
|
53
|
+
"base-uri 'self';", // Restrict base URIs to same origin
|
|
54
|
+
"object-src 'none';", // Block all object sources
|
|
55
|
+
"frame-ancestors 'none';", // Prevent framing of the site
|
|
56
|
+
"upgrade-insecure-requests;", // Automatically upgrade HTTP to HTTPS
|
|
57
|
+
`report-uri ${process.env.ENV_MODE === "prod" ? "/.netlify/functions/cspReport" : "/api/mock-csp"};`, // Add CSP report URI for violations
|
|
58
|
+
].join(" "),
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Set other security headers
|
|
63
|
+
response.headers.set(
|
|
64
|
+
"Permissions-Policy",
|
|
65
|
+
[
|
|
66
|
+
"fullscreen=(self)",
|
|
67
|
+
"sync-xhr=()",
|
|
68
|
+
"camera=()",
|
|
69
|
+
"microphone=()",
|
|
70
|
+
"geolocation=()",
|
|
71
|
+
"clipboard-read=()",
|
|
72
|
+
"clipboard-write=()",
|
|
73
|
+
"payment=()",
|
|
74
|
+
"usb=()",
|
|
75
|
+
"hid=()",
|
|
76
|
+
"gamepad=()",
|
|
77
|
+
"serial=()",
|
|
78
|
+
"publickey-credentials-get=()",
|
|
79
|
+
"interest-cohort=()",
|
|
80
|
+
"topics=()",
|
|
81
|
+
].join(", "),
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
response.headers.set("X-Content-Type-Options", "nosniff");
|
|
85
|
+
response.headers.set("Referrer-Policy", "strict-origin-when-cross-origin");
|
|
86
|
+
response.headers.set("X-Frame-Options", "DENY");
|
|
87
|
+
|
|
88
|
+
return response;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// cspell:ignore licdn
|
|
@@ -8,8 +8,8 @@ This file is part of Network Pro.
|
|
|
8
8
|
|
|
9
9
|
<script>
|
|
10
10
|
/**
|
|
11
|
-
* Array of feature
|
|
12
|
-
* @type {string
|
|
11
|
+
* Array of feature objects that describe the FOSS item
|
|
12
|
+
* @type {Array<{ emoji: string, label: string, description: string }>}
|
|
13
13
|
*/
|
|
14
14
|
export let features = [];
|
|
15
15
|
</script>
|
|
@@ -17,9 +17,62 @@ This file is part of Network Pro.
|
|
|
17
17
|
<!-- BEGIN FOSS FEATURES -->
|
|
18
18
|
{#if features && features.length > 0}
|
|
19
19
|
<ul>
|
|
20
|
-
{#each features as feature}
|
|
21
|
-
<li>
|
|
20
|
+
{#each features as feature, index}
|
|
21
|
+
<li class="emoji">
|
|
22
|
+
{#if index === 0}
|
|
23
|
+
<span class="headline">
|
|
24
|
+
{feature.emoji}
|
|
25
|
+
<span class="label">{feature.label}</span>
|
|
26
|
+
{#if feature.description && feature.description.trim()}
|
|
27
|
+
<span class="description">— {feature.description}</span>
|
|
28
|
+
{/if}
|
|
29
|
+
</span>
|
|
30
|
+
{:else}
|
|
31
|
+
{feature.emoji}
|
|
32
|
+
<span class="label">{feature.label}</span>
|
|
33
|
+
{#if feature.description && feature.description.trim()}
|
|
34
|
+
<span class="description">— {feature.description}</span>
|
|
35
|
+
{/if}
|
|
36
|
+
{/if}
|
|
37
|
+
</li>
|
|
22
38
|
{/each}
|
|
23
39
|
</ul>
|
|
24
40
|
{/if}
|
|
41
|
+
|
|
25
42
|
<!-- END FOSS FEATURES -->
|
|
43
|
+
|
|
44
|
+
<style>
|
|
45
|
+
ul {
|
|
46
|
+
margin: 0;
|
|
47
|
+
list-style-type: none;
|
|
48
|
+
padding-left: 0;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
ul li {
|
|
52
|
+
font-weight: 600;
|
|
53
|
+
margin-bottom: 0.5em;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.emoji {
|
|
57
|
+
margin-right: 8px;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.headline {
|
|
61
|
+
display: block; /* Ensure it is on its own line */
|
|
62
|
+
font-weight: bold; /* Keep the first item bold */
|
|
63
|
+
font-style: italic; /* Only make the first item italic */
|
|
64
|
+
margin-bottom: 4px; /* Add space between headline and the rest */
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.label {
|
|
68
|
+
font-weight: bold; /* Keep the label bold */
|
|
69
|
+
font-family: inherit; /* Ensure it uses the same font-family as normal text */
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.description {
|
|
73
|
+
display: inline; /* Keep description inline */
|
|
74
|
+
font-weight: normal; /* Ensure the description is normal (not bold) */
|
|
75
|
+
font-family: inherit; /* Ensure it uses the same font-family as normal text */
|
|
76
|
+
font-style: normal; /* Remove italic for the description */
|
|
77
|
+
}
|
|
78
|
+
</style>
|
|
@@ -14,7 +14,7 @@ This file is part of Network Pro.
|
|
|
14
14
|
import { bySvg, ccSvg } from "$lib";
|
|
15
15
|
|
|
16
16
|
// Log the base path to verify its value
|
|
17
|
-
|
|
17
|
+
console.log("Base path:", base);
|
|
18
18
|
|
|
19
19
|
// Dynamic links for licensing and trademark
|
|
20
20
|
const ccbyLink = `${base}/license#cc-by`;
|
|
@@ -10,7 +10,7 @@ This file is part of Network Pro.
|
|
|
10
10
|
import { base } from "$app/paths";
|
|
11
11
|
|
|
12
12
|
// Log the base path to verify its value
|
|
13
|
-
|
|
13
|
+
console.log("Base path:", base);
|
|
14
14
|
|
|
15
15
|
const homeLink = base || "/";
|
|
16
16
|
const aboutLink = `${base}/about`;
|
|
@@ -10,7 +10,7 @@ This file is part of Network Pro.
|
|
|
10
10
|
import { base } from "$app/paths";
|
|
11
11
|
|
|
12
12
|
// Log the base path to verify its value
|
|
13
|
-
|
|
13
|
+
console.log("Base path:", base);
|
|
14
14
|
|
|
15
15
|
const aboutLink = `${base}/about`;
|
|
16
16
|
const fossLink = `${base}/foss-spotlight`;
|
package/src/lib/data/fossData.js
CHANGED
|
@@ -1,14 +1,99 @@
|
|
|
1
1
|
/* ==========================================================================
|
|
2
2
|
src/lib/data/fossData.js
|
|
3
3
|
|
|
4
|
+
Copyright © 2025 Network Pro Strategies (Network Pro™)
|
|
4
5
|
SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
|
|
5
6
|
This file is part of Network Pro.
|
|
6
7
|
========================================================================== */
|
|
7
8
|
|
|
9
|
+
// cspell:ignore lsheet eauth bolditalic tosdr
|
|
10
|
+
|
|
8
11
|
// Import FOSS images
|
|
9
|
-
import { acodePng, acodeWbp, lsheetPng, lsheetWbp, pmxPng, pmxWbp, tosPng, tosWbp, urlPng, urlWbp } from "$lib";
|
|
12
|
+
import { acodePng, acodeWbp, eauthPng, eauthWbp, lsheetPng, lsheetWbp, pmxPng, pmxWbp, tosPng, tosWbp, urlPng, urlWbp } from "$lib";
|
|
10
13
|
|
|
11
14
|
export const fossData = [
|
|
15
|
+
{
|
|
16
|
+
id: "eauth",
|
|
17
|
+
images: {
|
|
18
|
+
webp: eauthWbp,
|
|
19
|
+
png: eauthPng,
|
|
20
|
+
},
|
|
21
|
+
imgAlt: "Ente Auth",
|
|
22
|
+
title: "Ente Auth",
|
|
23
|
+
headline: "🔐 Elevate Your 2FA Game with Ente Auth — The Cross-Platform Open-Source Powerhouse!",
|
|
24
|
+
headlineDescription: `
|
|
25
|
+
<p>
|
|
26
|
+
This week's <strong>FOSS Spotlight</strong> is on <strong>Ente Auth</strong> — the sleek, open-source 2FA authenticator that's putting privacy and usability front and center.
|
|
27
|
+
</p>
|
|
28
|
+
<p>
|
|
29
|
+
Whether you're a dev, a cybersecurity enthusiast, or simply serious about protecting your accounts, <strong>Ente Auth</strong> offers a next-level authentication experience — <strong>backed by encryption, not ads.</strong>
|
|
30
|
+
</p>
|
|
31
|
+
`,
|
|
32
|
+
features: [
|
|
33
|
+
{
|
|
34
|
+
emoji: "✨",
|
|
35
|
+
label: "Why Make the Switch to Ente Auth?",
|
|
36
|
+
isIntro: true
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
emoji: "✔️",
|
|
40
|
+
label: "End-to-End Encrypted Backups",
|
|
41
|
+
description: "Never lose access to your 2FA codes again."
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
emoji: "✔️",
|
|
45
|
+
label: "Cross-Platform Sync",
|
|
46
|
+
description: "Android, iOS, Windows, macOS, Linux, Web — all covered."
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
emoji: "✔️",
|
|
50
|
+
label: "Offline Functionality",
|
|
51
|
+
description: "No account or connection? No problem."
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
emoji: "✔️",
|
|
55
|
+
label: "Intuitive UX",
|
|
56
|
+
description: "Easily search, preview the next code, and share tokens securely."
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
emoji: "✔️",
|
|
60
|
+
label: "Audited Open Source",
|
|
61
|
+
description: "Reviewed by top-tier security firms."
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
emoji: "✔️",
|
|
65
|
+
label: "Free Forever",
|
|
66
|
+
description: "No ads. No tracking. Just transparent, user-first security."
|
|
67
|
+
}
|
|
68
|
+
],
|
|
69
|
+
detailsDescription: `
|
|
70
|
+
<p>
|
|
71
|
+
We've long backed <strong>Aegis</strong> — and still do. But <strong>Aegis lacks true cross-platform support</strong>. That's where <strong>Ente Auth</strong> shines.
|
|
72
|
+
</p>
|
|
73
|
+
<p>
|
|
74
|
+
Take control of your authentication experience. <strong>Embrace the freedom of private, seamless, and secure 2FA.</strong>
|
|
75
|
+
</p>
|
|
76
|
+
`,
|
|
77
|
+
links: [
|
|
78
|
+
{
|
|
79
|
+
label: "GitHub",
|
|
80
|
+
href: "https://github.com/ente-io/ente/",
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
label: "F-Droid",
|
|
84
|
+
href: "https://f-droid.org/packages/io.ente.auth/",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
label: "Website",
|
|
88
|
+
href: "https://ente.io/auth/",
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
label: "Play Store",
|
|
92
|
+
href: "https://play.google.com/store/apps/details?id=io.ente.auth",
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
notes: [],
|
|
96
|
+
},
|
|
12
97
|
{
|
|
13
98
|
id: "pmx",
|
|
14
99
|
images: {
|
|
@@ -19,28 +104,56 @@ export const fossData = [
|
|
|
19
104
|
title: "Permission Manager X",
|
|
20
105
|
headline: "Take Control of App Permissions Like a Pro with PMX!",
|
|
21
106
|
headlineDescription: `
|
|
22
|
-
<p>
|
|
23
|
-
|
|
107
|
+
<p>
|
|
108
|
+
Introducing Permission Manager X (PMX), the open-source, lightweight Android tool that provides you with full control over your app's permissions without the need for root access.
|
|
109
|
+
</p>
|
|
110
|
+
<p>
|
|
111
|
+
PMX was designed with user autonomy and simplicity in mind, enabling users to fully manage app permissions (both manifest permissions and AppOps) on Android devices.
|
|
112
|
+
</p>
|
|
24
113
|
`,
|
|
25
114
|
features: [
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
115
|
+
{
|
|
116
|
+
emoji: "⚡",
|
|
117
|
+
label: "Why Choose PMX?",
|
|
118
|
+
isIntro: true
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
emoji: "✔️",
|
|
122
|
+
label: "Granular, On-Demand Permission Control",
|
|
123
|
+
description: "Instantly block or allow app permissions with real-time control."
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
emoji: "✔️",
|
|
127
|
+
label: "Sensitive Data Access Monitoring",
|
|
128
|
+
description: "See which apps access your camera, mic, location, and more."
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
emoji: "✔️",
|
|
132
|
+
label: "Autostart Abuse Prevention",
|
|
133
|
+
description: "Halt apps that auto-launch and exploit background permissions."
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
emoji: "✔️",
|
|
137
|
+
label: "Clean, Ad-Free Interface",
|
|
138
|
+
description: "Lightweight UI with zero ads, trackers, or unnecessary bloat."
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
emoji: "✔️",
|
|
142
|
+
label: "Wireless ADB Support (No Root)",
|
|
143
|
+
description: "Advanced controls via ADB—wireless if supported—no root needed."
|
|
144
|
+
}
|
|
31
145
|
],
|
|
32
146
|
detailsDescription: `
|
|
33
|
-
<p>
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
<p>Try it now and liberate your Android from bloatware permission abuse!</p>
|
|
147
|
+
<p>
|
|
148
|
+
PMX offers a wealth of features for anyone evaluating mobile security tools, be they an IT professional, developer, or privacy-conscious user.
|
|
149
|
+
</p>
|
|
150
|
+
<p>
|
|
151
|
+
No ads. No tracking. Just privacy made easy.<br />
|
|
152
|
+
This isn't just another utility — it's a <em>must-have</em> for anyone serious about mobile privacy and transparency.
|
|
153
|
+
</p>
|
|
154
|
+
<p>
|
|
155
|
+
Try it now and liberate your Android from bloatware permission abuse!
|
|
156
|
+
</p>
|
|
44
157
|
`,
|
|
45
158
|
links: [
|
|
46
159
|
{
|
|
@@ -76,26 +189,55 @@ export const fossData = [
|
|
|
76
189
|
headline:
|
|
77
190
|
"Discover ToS;DR - The Open-Source Project That Translates Legal Jargon into Clarity",
|
|
78
191
|
headlineDescription: `
|
|
79
|
-
<p>
|
|
80
|
-
|
|
192
|
+
<p>
|
|
193
|
+
We've all been there—scrolling past walls of legal text and clicking “I agree” just to get on with it. But what exactly are we agreeing to?
|
|
194
|
+
</p>
|
|
195
|
+
<p>
|
|
196
|
+
<strong>ToS;DR (Terms of Service; Didn't Read)</strong> is the open-source project that helps you find out—without needing a law degree.
|
|
197
|
+
</p>
|
|
81
198
|
`,
|
|
82
199
|
features: [
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
200
|
+
{
|
|
201
|
+
emoji: "✨",
|
|
202
|
+
label: "Why ToS;DR?",
|
|
203
|
+
isIntro: true
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
emoji: "✔️",
|
|
207
|
+
label: "Community-driven ratings",
|
|
208
|
+
description: "from A (best) to E (worst)."
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
emoji: "✔️",
|
|
212
|
+
label: "Clear summaries of complex terms and privacy policies",
|
|
213
|
+
description: ""
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
emoji: "✔️",
|
|
217
|
+
label: "Highlights of key clauses",
|
|
218
|
+
description: "both good and bad."
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
emoji: "✔️",
|
|
222
|
+
label: "No account needed, completely free to use",
|
|
223
|
+
description: ""
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
emoji: "✔️",
|
|
227
|
+
label: "Transparent, open-source code and contribution process",
|
|
228
|
+
description: ""
|
|
229
|
+
}
|
|
88
230
|
],
|
|
89
231
|
detailsDescription: `
|
|
90
|
-
<p
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
<p>
|
|
97
|
-
|
|
98
|
-
|
|
232
|
+
<p>
|
|
233
|
+
Whether you're a privacy advocate, a curious user, or someone tired of blindly agreeing to questionable terms, ToS;DR helps you make informed decisions about the services you use every day.
|
|
234
|
+
</p>
|
|
235
|
+
<p>
|
|
236
|
+
💡 From browser extensions to a dedicated <strong>Android app on F-Droid</strong>, ToS;DR is privacy-conscious, ad-free, and built to empower.
|
|
237
|
+
</p>
|
|
238
|
+
<p>
|
|
239
|
+
Stay informed, protect your rights, and take back control of your digital life—one ToS at a time.
|
|
240
|
+
</p>
|
|
99
241
|
`,
|
|
100
242
|
links: [
|
|
101
243
|
{
|
|
@@ -103,13 +245,13 @@ export const fossData = [
|
|
|
103
245
|
href: "https://f-droid.org/en/packages/xyz.ptgms.tosdr/",
|
|
104
246
|
},
|
|
105
247
|
{
|
|
106
|
-
label: "GitHub (works with
|
|
248
|
+
label: "GitHub (works with Obtainium)",
|
|
107
249
|
href: "https://github.com/tosdr/tosdr-android",
|
|
108
250
|
},
|
|
109
251
|
{ label: "Website", href: "https://tosdr.org/" },
|
|
110
252
|
],
|
|
111
253
|
notes: [
|
|
112
|
-
`While the latest <a rel="noopener noreferrer" href="https://reports.exodus-privacy.eu.org/en/reports/592855/">Exodus</a> privacy audit shows the <a rel="noopener noreferrer" href="https://play.google.com/store/apps/details?id=xyz.ptgms.tosdr">Play Store</a> version is free of trackers, we'd still recommend opting for the F-Droid version or installing via <a rel="noopener noreferrer" href="https://github.com/ImranR98/Obtainium">
|
|
254
|
+
`While the latest <a rel="noopener noreferrer" href="https://reports.exodus-privacy.eu.org/en/reports/592855/">Exodus</a> privacy audit shows the <a rel="noopener noreferrer" href="https://play.google.com/store/apps/details?id=xyz.ptgms.tosdr">Play Store</a> version is free of trackers, we'd still recommend opting for the F-Droid version or installing via <a rel="noopener noreferrer" href="https://github.com/ImranR98/Obtainium">Obtainium</a>.`,
|
|
113
255
|
],
|
|
114
256
|
},
|
|
115
257
|
{
|
|
@@ -123,23 +265,46 @@ export const fossData = [
|
|
|
123
265
|
headline:
|
|
124
266
|
"Bring the power of a full-fledged IDE to your Android device with Acode!",
|
|
125
267
|
headlineDescription: `
|
|
126
|
-
<p>
|
|
268
|
+
<p>
|
|
269
|
+
Discover Acode, the open-source code editor that brings the power of a full-fledged IDE to your Android device. Whether you're tweaking HTML, crafting CSS, or debugging JavaScript, Acode has you covered.
|
|
270
|
+
</p>
|
|
127
271
|
`,
|
|
128
272
|
features: [
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
273
|
+
{
|
|
274
|
+
emoji: "✨",
|
|
275
|
+
label: "Why Acode?",
|
|
276
|
+
isIntro: true
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
emoji: "✔️",
|
|
280
|
+
label: "Lightweight & fast",
|
|
281
|
+
description: ""
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
emoji: "✔️",
|
|
285
|
+
label: "Supports over 100 programming languages",
|
|
286
|
+
description: ""
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
emoji: "✔️",
|
|
290
|
+
label: "Offline functionality",
|
|
291
|
+
description: "no internet needed."
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
emoji: "✔️",
|
|
295
|
+
label: "Integrated Git support",
|
|
296
|
+
description: ""
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
emoji: "✔️",
|
|
300
|
+
label: "Customizable themes & syntax highlighting",
|
|
301
|
+
description: ""
|
|
302
|
+
}
|
|
134
303
|
],
|
|
135
304
|
detailsDescription: `
|
|
136
|
-
<p
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
✔️ Offline functionality—no internet needed<br />
|
|
140
|
-
✔️ Integrated Git support<br />
|
|
141
|
-
✔️ Customizable themes & syntax highlighting</p>
|
|
142
|
-
<p>Perfect for developers on the go, students, or anyone passionate about coding and open-source software.</p>
|
|
305
|
+
<p>
|
|
306
|
+
Perfect for developers on the go, students, or anyone passionate about coding and open-source software.
|
|
307
|
+
</p>
|
|
143
308
|
`,
|
|
144
309
|
links: [
|
|
145
310
|
{ label: "GitHub", href: "https://github.com/Acode-Foundation/Acode" },
|
|
@@ -164,20 +329,43 @@ export const fossData = [
|
|
|
164
329
|
headline:
|
|
165
330
|
"Restore link control on Android 12 and later with LinkSheet Nightly.",
|
|
166
331
|
headlineDescription: `
|
|
167
|
-
<p>
|
|
332
|
+
<p>
|
|
333
|
+
LinkSheet is a powerful tool that restores the ability to choose which app opens your links on Android 12 and later. With its Material Design interface, LinkSheet allows you to set custom preferences for specific hosts, enhancing your privacy and control.
|
|
334
|
+
</p>
|
|
168
335
|
`,
|
|
169
336
|
features: [
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
337
|
+
{
|
|
338
|
+
emoji: "✨",
|
|
339
|
+
label: "Why LinkSheet?",
|
|
340
|
+
isIntro: true
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
emoji: "✔️",
|
|
344
|
+
label: "Regain Choice",
|
|
345
|
+
description: "Decide which app opens your links, bypassing Android's default restrictions."
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
emoji: "✔️",
|
|
349
|
+
label: "Custom Preferences",
|
|
350
|
+
description: "Set your preferred browser or app for specific hosts."
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
emoji: "✔️",
|
|
354
|
+
label: "Enhanced Privacy",
|
|
355
|
+
description: "Prevent unwanted app launches and ensure links open where you intend."
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
emoji: "✔️",
|
|
359
|
+
label: "User-Friendly Interface",
|
|
360
|
+
description: "Enjoy a sleek, Material Design that integrates seamlessly with your device."
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
emoji: "✔️",
|
|
364
|
+
label: "Customizable themes & syntax highlighting",
|
|
365
|
+
description: ""
|
|
366
|
+
}
|
|
174
367
|
],
|
|
175
368
|
detailsDescription: `
|
|
176
|
-
<p>✨ <span class="bolditalic">Why LinkSheet?</span><br />
|
|
177
|
-
✔️ <strong>Regain Choice:</strong> Decide which app opens your links, bypassing Android's default restrictions.<br />
|
|
178
|
-
✔️ <strong>Custom Preferences:</strong> Set your preferred browser or app for specific hosts.<br />
|
|
179
|
-
✔️ <strong>Enhanced Privacy:</strong> Prevent unwanted app launches and ensure links open where you intend.<br />
|
|
180
|
-
✔️ <strong>User-Friendly Interface:</strong> Enjoy a sleek, Material Design that integrates seamlessly with your device.</p>
|
|
181
369
|
`,
|
|
182
370
|
links: [
|
|
183
371
|
{
|
|
@@ -208,18 +396,33 @@ export const fossData = [
|
|
|
208
396
|
title: "URLCheck",
|
|
209
397
|
headline: "Analyze and inspect links before opening them with URLCheck.",
|
|
210
398
|
headlineDescription: `
|
|
211
|
-
<p>
|
|
399
|
+
<p>
|
|
400
|
+
URLCheck is a must-have for privacy-conscious users! This app helps you analyze and inspect links before opening them, protecting you from trackers, malicious sites, and other online threats.
|
|
401
|
+
</p>
|
|
212
402
|
`,
|
|
213
403
|
features: [
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
404
|
+
{
|
|
405
|
+
emoji: "🔍",
|
|
406
|
+
label: "Why you need it:",
|
|
407
|
+
isIntro: true
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
emoji: "✔️",
|
|
411
|
+
label: "Automatic URL Screening",
|
|
412
|
+
description: "Set it as your default browser for real-time link analysis."
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
emoji: "✔️",
|
|
416
|
+
label: "Full Transparency",
|
|
417
|
+
description: "Know what's behind a link before you click."
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
emoji: "✔️",
|
|
421
|
+
label: "Stronger Privacy & Security",
|
|
422
|
+
description: "Stay safe online with minimal effort!"
|
|
423
|
+
}
|
|
217
424
|
],
|
|
218
425
|
detailsDescription: `
|
|
219
|
-
<p>🔍 <span class="bolditalic">Why you need it:</span><br />
|
|
220
|
-
✔️ <b>Automatic URL screening:</b> Set it as your default browser for real-time link analysis.<br />
|
|
221
|
-
✔️ <b>Full transparency:</b> Know what's behind a link before you click.<br />
|
|
222
|
-
✔️ <b>Stronger privacy & security:</b> Stay safe online with minimal effort!</p>
|
|
223
426
|
`,
|
|
224
427
|
links: [
|
|
225
428
|
{ label: "GitHub", href: "https://github.com/TrianguloY/URLCheck" },
|
package/src/lib/images.js
CHANGED
|
@@ -38,6 +38,8 @@ import obtainiumWbp from "$lib/img/obtainium.webp";
|
|
|
38
38
|
// Import images for posts
|
|
39
39
|
import acodePng from "$lib/img/posts/acode.png";
|
|
40
40
|
import acodeWbp from "$lib/img/posts/acode.webp";
|
|
41
|
+
import eauthPng from "$lib/img/posts/eauth.png";
|
|
42
|
+
import eauthWbp from "$lib/img/posts/eauth.webp";
|
|
41
43
|
import lsheetPng from "$lib/img/posts/linksheet.png";
|
|
42
44
|
import lsheetWbp from "$lib/img/posts/linksheet.webp";
|
|
43
45
|
import pmxPng from "$lib/img/posts/pmx.png";
|
|
@@ -60,6 +62,8 @@ export {
|
|
|
60
62
|
bySvg,
|
|
61
63
|
ccBadge,
|
|
62
64
|
ccSvg,
|
|
65
|
+
eauthPng,
|
|
66
|
+
eauthWbp,
|
|
63
67
|
faviconSvg,
|
|
64
68
|
gplBadge,
|
|
65
69
|
logoPng,
|
|
@@ -78,3 +82,5 @@ export {
|
|
|
78
82
|
urlWbp,
|
|
79
83
|
vcfSrc
|
|
80
84
|
};
|
|
85
|
+
|
|
86
|
+
// cspell:ignore eauth
|
|
Binary file
|
|
Binary file
|
package/src/lib/meta.js
CHANGED