init commit

This commit is contained in:
lyx0 2023-10-29 01:45:03 +02:00
commit e463e9675f
31 changed files with 18412 additions and 0 deletions

74
CODE_OF_CONDUCT.md Normal file
View file

@ -0,0 +1,74 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
- The use of sexualized language or imagery and unwelcome sexual attention or
advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic
address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at office[AT]zeplia[DOT]com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

25
LICENSE Normal file
View file

@ -0,0 +1,25 @@
BSD 2-Clause License
Copyright (c) 2020, Zeplia
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

40
README.md Normal file
View file

@ -0,0 +1,40 @@
# MinWiz - Minimal starter kit for under 2 KB sites
Use this starter kit to create a **viable, good looking, production-ready website** whose entire size does not exceed 2 KB compressed when opened in a browser. Ideally, the total size of all assets (HTML, CSS, favicon, etc.) downloaded by the browser when opening the page will be under 2 KB. You can see a live version at [MinWiz.com](https://minwiz.com).
## Getting started
Make sure you have Node and npm installed. Any version will do.
If you're doing web development you probably already have gulp-cli globally installed (you can test with `gulp -v`). If you don't have it, run `npm install --global gulp-cli`
- clone the repo
- install the dependencies with `npm install`
- build the site (in the _dist_ folder) with `npm run build`
- at this point, the _dist_ folder contains all assets in a minified form, ready to be copied/deployed to your web hosting service
If you want to live edit the site, there is a handy-dandy `gulp dev` command and the Live Server extension for VS Code is configured to open the site from _dist_ folder. Run the command, click _Go Live_ in the status panel of VS Code and you're good to go.
## Contributing
If you have a creative idea for decreasing the size of the website **feel free to submit a PR!** You can learn how from this [Step-by-step guide to contributing on GitHub](https://www.dataschool.io/how-to-contribute-on-github/).
If it's not obvious how your PR will help, please conceptually explain it. Ex:
> As the stylesheet.css already includes the text "section {", rearranging the order in "section, p, h1," to "p, h1, section {" will pick-up more text during gzipping.
Please note that I'm using package-lock with lockfileVersion 2. If you submit a PR and you're using lockfileVersion 1, make sure not to include the _package-lock.json_ file.
## Thank you
- Color scheme inspired from [john-doe.neocities.org](https://john-doe.neocities.org/).
- <del>Navigation inspired from [Functional CSS Tabs Revisited](https://css-tricks.com/functional-css-tabs-revisited/).</dev>
- Navigation suggested by /u/trust_me_im_a_turtle on Reddit. Demo [here](https://codesandbox.io/s/hash-navigation-919fp?file=/index.html:226-397).
## CDK deployment notes
For `cdk deploy` to work we need to have a Github personal access token in the GITHUB_TOKEN variable:
```
echo export GITHUB_TOKEN=REPLACE_ME_WITH_THE_REAL_GITHUB_TOKEN >> ~/.bashrc
```

6
cdk/.npmignore Normal file
View file

@ -0,0 +1,6 @@
*.ts
!*.d.ts
# CDK asset staging directory
.cdk.staging
cdk.out

14
cdk/README.md Normal file
View file

@ -0,0 +1,14 @@
# Welcome to your CDK TypeScript project
This is a blank project for TypeScript development with CDK.
The `cdk.json` file tells the CDK Toolkit how to execute your app.
## Useful commands
* `npm run build` compile typescript to js
* `npm run watch` watch for changes and compile
* `npm run test` perform the jest unit tests
* `cdk deploy` deploy this stack to your default AWS account/region
* `cdk diff` compare deployed stack with current state
* `cdk synth` emits the synthesized CloudFormation template

36
cdk/bin/cdk.ts Normal file
View file

@ -0,0 +1,36 @@
#!/usr/bin/env node
import * as cdk from "aws-cdk-lib";
import "source-map-support/register";
import { CertificateStack } from "../lib/certificate-stack";
import { CloudfrontStack } from "../lib/cloudfront";
import { PipelineStack } from "../lib/pipeline-stack";
if (!process.env.GITHUB_TOKEN) {
console.log("No Github Token present");
}
const app = new cdk.App();
const certStack = new CertificateStack(app, "CertificateStack", {
env: {
region: "us-east-1",
},
});
const cloudfrontStack = new CloudfrontStack(app, "CloudfrontStack", {
websiteCert: certStack.websiteCert,
hostedZone: certStack.hostedZone,
env: {
region: "us-east-1",
},
});
new PipelineStack(app, "PipelineStack", {
githubToken: process.env.GITHUB_TOKEN || "",
websiteBucket: cloudfrontStack.websiteBucket,
env: {
region: "us-east-1",
},
});
app.synth();

32
cdk/cdk.json Normal file
View file

@ -0,0 +1,32 @@
{
"app": "npx ts-node --prefer-ts-exts bin/cdk.ts",
"watch": {
"include": [
"**"
],
"exclude": [
"README.md",
"cdk*.json",
"**/*.d.ts",
"**/*.js",
"tsconfig.json",
"package*.json",
"yarn.lock",
"node_modules",
"test"
]
},
"context": {
"@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true,
"@aws-cdk/core:stackRelativeExports": true,
"@aws-cdk/aws-rds:lowercaseDbIdentifier": true,
"@aws-cdk/aws-lambda:recognizeVersionProps": true,
"@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true,
"@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true,
"@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true,
"@aws-cdk/core:target-partitions": [
"aws",
"aws-cn"
]
}
}

8
cdk/jest.config.js Normal file
View file

@ -0,0 +1,8 @@
module.exports = {
testEnvironment: 'node',
roots: ['<rootDir>/test'],
testMatch: ['**/*.test.ts'],
transform: {
'^.+\\.tsx?$': 'ts-jest'
}
};

View file

@ -0,0 +1,33 @@
import { CfnOutput, Stack, StackProps } from "aws-cdk-lib";
import { DnsValidatedCertificate } from "aws-cdk-lib/aws-certificatemanager";
import { HostedZone, IHostedZone } from "aws-cdk-lib/aws-route53";
import { Construct } from "constructs";
import { hostedZoneId, website_domain } from "./variables";
export class CertificateStack extends Stack {
public readonly websiteCert: DnsValidatedCertificate;
public readonly hostedZone: IHostedZone;
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
this.hostedZone = HostedZone.fromHostedZoneAttributes(
this,
"HostedZoneWithAttrs",
{
hostedZoneId,
zoneName: website_domain,
}
);
this.websiteCert = new DnsValidatedCertificate(this, "MinWizSSL", {
domainName: website_domain,
subjectAlternativeNames: [`www.${website_domain}`],
hostedZone: this.hostedZone,
});
new CfnOutput(this, "WebsiteCertArn", {
value: this.websiteCert.certificateArn,
});
}
}

85
cdk/lib/cloudfront.ts Normal file
View file

@ -0,0 +1,85 @@
import {
CfnOutput,
Duration,
RemovalPolicy,
Stack,
StackProps,
} from "aws-cdk-lib";
import { DnsValidatedCertificate } from "aws-cdk-lib/aws-certificatemanager";
import {
AllowedMethods,
CachePolicy,
Distribution,
HttpVersion,
PriceClass,
SecurityPolicyProtocol,
ViewerProtocolPolicy,
} from "aws-cdk-lib/aws-cloudfront";
import { S3Origin } from "aws-cdk-lib/aws-cloudfront-origins";
import { ARecord, IHostedZone, RecordTarget } from "aws-cdk-lib/aws-route53";
import { HttpsRedirect } from "aws-cdk-lib/aws-route53-patterns";
import { CloudFrontTarget } from "aws-cdk-lib/aws-route53-targets";
import { Bucket } from "aws-cdk-lib/aws-s3";
import { Construct } from "constructs";
import { website_domain } from "./variables";
export interface CloudfrontStackProps extends StackProps {
readonly websiteCert: DnsValidatedCertificate;
readonly hostedZone: IHostedZone;
}
export class CloudfrontStack extends Stack {
public readonly websiteBucket: Bucket;
constructor(scope: Construct, id: string, props: CloudfrontStackProps) {
super(scope, id, props);
this.websiteBucket = new Bucket(this, "websiteBucket", {
removalPolicy: RemovalPolicy.DESTROY,
bucketName: website_domain,
autoDeleteObjects: true,
});
new CfnOutput(this, "websiteBucketArn", {
value: this.websiteBucket.bucketArn,
});
const cachePolicy = new CachePolicy(this, "MinWizPolicy", {
defaultTtl: Duration.hours(24),
minTtl: Duration.hours(24),
maxTtl: Duration.hours(24),
enableAcceptEncodingGzip: true,
enableAcceptEncodingBrotli: true,
});
const distribution = new Distribution(this, "MinWizDistribution", {
defaultBehavior: {
origin: new S3Origin(this.websiteBucket),
allowedMethods: AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
cachePolicy,
compress: true,
viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
},
domainNames: [website_domain /*, `www.${website_domain}`*/],
certificate: props.websiteCert,
minimumProtocolVersion: SecurityPolicyProtocol.TLS_V1_2_2019,
defaultRootObject: "index.html",
enableIpv6: true,
enabled: true,
httpVersion: HttpVersion.HTTP2,
priceClass: PriceClass.PRICE_CLASS_ALL,
});
new ARecord(this, "aliasForCloudfront", {
target: RecordTarget.fromAlias(new CloudFrontTarget(distribution)),
zone: props.hostedZone,
recordName: website_domain,
});
new HttpsRedirect(this, "wwwToNonWww", {
recordNames: [`www.${website_domain}`],
targetDomain: website_domain,
zone: props.hostedZone,
});
}
}

111
cdk/lib/pipeline-stack.ts Normal file
View file

@ -0,0 +1,111 @@
import {
App,
RemovalPolicy,
SecretValue,
Stack,
StackProps,
} from "aws-cdk-lib";
import {
BuildSpec,
ComputeType,
LinuxBuildImage,
PipelineProject,
} from "aws-cdk-lib/aws-codebuild";
import { Artifact, Pipeline } from "aws-cdk-lib/aws-codepipeline";
import {
CodeBuildAction,
GitHubSourceAction,
GitHubTrigger,
S3DeployAction,
} from "aws-cdk-lib/aws-codepipeline-actions";
import {
BlockPublicAccess,
Bucket,
BucketEncryption,
} from "aws-cdk-lib/aws-s3";
export interface PipelineStackProps extends StackProps {
readonly githubToken: string;
readonly websiteBucket: Bucket;
}
export class PipelineStack extends Stack {
constructor(app: App, id: string, props: PipelineStackProps) {
super(app, id, props);
const siteBuild = new PipelineProject(this, "MinWizBuild", {
description: "minwiz.com site build",
buildSpec: BuildSpec.fromObject({
version: "0.2",
phases: {
install: {
commands: ["npm ci"],
},
build: {
commands: "npm run build",
},
},
artifacts: {
"base-directory": "dist",
files: ["**/*"],
},
}),
environment: {
buildImage: LinuxBuildImage.STANDARD_5_0,
computeType: ComputeType.SMALL,
},
});
const siteBuildOutput = new Artifact("SiteBuildOutput");
const sourceOutput = new Artifact("SrcOutput");
const artifactBucket = new Bucket(this, "MinWizPipelineArtifacts", {
removalPolicy: RemovalPolicy.DESTROY,
encryption: BucketEncryption.S3_MANAGED,
blockPublicAccess: BlockPublicAccess.BLOCK_ALL,
autoDeleteObjects: true,
});
new Pipeline(this, "MinWiz", {
restartExecutionOnUpdate: true,
artifactBucket,
stages: [
{
stageName: "Source",
actions: [
new GitHubSourceAction({
actionName: "Checkout",
output: sourceOutput,
owner: "zeplia",
repo: "minwiz",
oauthToken: SecretValue.plainText(props.githubToken),
trigger: GitHubTrigger.WEBHOOK,
}),
],
},
{
stageName: "Build",
actions: [
new CodeBuildAction({
actionName: "Site_Build",
project: siteBuild,
input: sourceOutput,
outputs: [siteBuildOutput],
}),
],
},
{
stageName: "Deploy",
actions: [
new S3DeployAction({
actionName: "DeployStaticSite",
input: siteBuildOutput,
bucket: props.websiteBucket,
}),
],
},
],
});
}
}

3
cdk/lib/variables.ts Normal file
View file

@ -0,0 +1,3 @@
export const hostedZoneId = "Z02664723UDHCHU1STAVT";
export const website_domain = "minwiz.com";

4882
cdk/package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

30
cdk/package.json Normal file
View file

@ -0,0 +1,30 @@
{
"name": "cdk",
"version": "0.1.0",
"bin": {
"cdk": "bin/cdk.js"https://github.com/noury-ee/noury.ee/pulls?q=is%3Apr+is%3Aopen+sort%3Aupdated-desc
},
"scripts": {
"build": "tsc",
"watch": "tsc -w",
"test": "jest",
"cdk": "cdk",
"diff": "cdk diff CertificateStack CloudfrontStack PipelineStack --profile iamadmin-general",
"deploy": "cdk deploy CertificateStack CloudfrontStack PipelineStack --profile iamadmin-general",
"destroy": "cdk destroy PipelineStack --profile iamadmin-general"
},
"devDependencies": {
"@types/jest": "^27.4.1",
"@types/node": "^18.8.5",
"jest": "^26.4.2",
"ts-jest": "^26.2.0",
"aws-cdk": "^2.46.0",
"ts-node": "^10.9.1",
"typescript": "^4.8.4"
},
"dependencies": {
"aws-cdk-lib": "^2.46.0",
"constructs": "^10.1.131",
"source-map-support": "^0.5.16"
}
}

17
cdk/test/cdk.test.ts Normal file
View file

@ -0,0 +1,17 @@
// import * as cdk from 'aws-cdk-lib';
// import { Template } from 'aws-cdk-lib/assertions';
// import * as Cdk from '../lib/cdk-stack';
// example test. To run these tests, uncomment this file along with the
// example resource in lib/cdk-stack.ts
test('SQS Queue Created', () => {
// const app = new cdk.App();
// // WHEN
// const stack = new Cdk.CdkStack(app, 'MyTestStack');
// // THEN
// const template = Template.fromStack(stack);
// template.hasResourceProperties('AWS::SQS::Queue', {
// VisibilityTimeout: 300
// });
});

30
cdk/tsconfig.json Normal file
View file

@ -0,0 +1,30 @@
{
"compilerOptions": {
"target": "ES2018",
"module": "commonjs",
"lib": [
"es2018"
],
"declaration": true,
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"noImplicitThis": true,
"alwaysStrict": true,
"noUnusedLocals": false,
"noUnusedParameters": false,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": false,
"inlineSourceMap": true,
"inlineSources": true,
"experimentalDecorators": true,
"strictPropertyInitialization": false,
"typeRoots": [
"./node_modules/@types"
]
},
"exclude": [
"node_modules",
"cdk.out"
]
}

BIN
design/icon.pxd Normal file

Binary file not shown.

0
dist/.gitkeep vendored Normal file
View file

47
gulpfile.js Normal file
View file

@ -0,0 +1,47 @@
/* eslint-disable no-console */
const gulp = require("gulp");
const htmlmin = require("gulp-htmlmin");
const cleanCSS = require("gulp-clean-css");
const inlinesource = require("gulp-inline-source");
const path = require("path");
const del = require("del");
const html = () =>
gulp
.src("src/*.html")
.pipe(inlinesource({ rootpath: path.resolve("dist") }))
.pipe(
htmlmin({
collapseWhitespace: true,
// removeOptionalTags: true,
collapseBooleanAttributes: true,
})
)
.pipe(gulp.dest("dist"));
const css = () =>
gulp
.src("src/styles/*.css")
.pipe(
cleanCSS({ debug: true, level: 2 }, (details) => {
console.log(`${details.name}: ${details.stats.originalSize}`);
console.log(`${details.name}: ${details.stats.minifiedSize}`);
})
)
.pipe(gulp.dest("dist/styles"));
const purge = () => del(["dist/styles"]);
const assets = () => gulp.src("public/*").pipe(gulp.dest("dist"));
const dev = () =>
gulp.watch(
["src/**/*"],
{ ignoreInitial: false },
gulp.series(css, html, purge, assets)
);
exports.html = html;
exports.css = css;
exports.dev = dev;
exports.default = gulp.series(css, html, purge, assets);

12490
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

33
package.json Normal file
View file

@ -0,0 +1,33 @@
{
"name": "minwiz",
"version": "1.0.0",
"description": "MinWiz - Minimal starter kit for under 2 KB sites",
"scripts": {
"lint": "eslint . --ignore-path ./.gitignore",
"build": "gulp",
"deploy": "cd cdk && npm run deploy && cd .."
},
"repository": {
"type": "git",
"url": "git+https://github.com/zeplia/minwiz.git"
},
"author": "Zeplia",
"license": "BSD-2-Clause",
"bugs": {
"url": "https://github.com/zeplia/minwiz/issues"
},
"homepage": "https://github.com/zeplia/minwiz#readme",
"devDependencies": {
"del": "^6.1.1",
"eslint": "^8.25.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-config-standard": "^17.0.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^6.1.0",
"gulp": "^4.0.2",
"gulp-clean-css": "^4.3.0",
"gulp-htmlmin": "^5.0.1",
"gulp-inline-source": "^4.0.0"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

BIN
public/apple-touch-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
public/favicon-16x16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 768 B

BIN
public/favicon-32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

2
public/robots.txt Normal file
View file

@ -0,0 +1,2 @@
User-agent: *
Disallow: /*

1
public/site.webmanifest Normal file
View file

@ -0,0 +1 @@
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}

328
src/index.html Normal file
View file

@ -0,0 +1,328 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta content="width=device-width,initial-scale=1" name="viewport" />
<title>dank.pw - home</title>
<meta property="og:title" content="dank.pw" />
<meta property="og:description" content="Dank Privacy" />
<meta property="og:image" content="https://dank.pw/og.png" />
<link inline rel="stylesheet" href="styles/stylesheet.css" />
<link rel="canonical" href="https://minwiz.com/" />
</head>
<body>
<header>
<a href="#h">dank.pw</a></h1>
<nav>
<a href="#s">Site Template Used</a>
<a href="#c">Contact</a>
</nav>
</header>
<main>
<section id="s">
<h1>Minwiz - Starter kit for lightweight sites</h1>
Starter kit for good looking, viable, lightweight (under 2 KB
compressed), production-ready sites with all the bells and whistles of
modern web included. Ideally, the total size of all assets (HTML, CSS,
favicon, etc.) downloaded by the browser when opening the page is under
2 KB.
<br />
This is an open source project hosted on
<a
target="_blank"
rel="noopener"
href="https://github.com/zeplia/minwiz"
>GitHub</a
>
with a very permissive license. Feel free to fork and use as you see fit
(PRs are welcome). It features:
<br />
<ul>
<li>
💯 score on Lighthouse and
<a
target="_blank"
rel="noopener"
href="https://developers.google.com/speed/pagespeed/insights/?url=https%3A%2F%2Fminwiz.com%2F"
>PageSpeed Insights</a
>
</li>
<li>
<a
target="_blank"
rel="noopener"
href="https://validator.w3.org/nu/?doc=https%3A%2F%2Fminwiz.com%2F"
>HTML5 & CSS3 valid</a
>
</li>
<li>favicon</li>
<li>robots.txt and sitemap</li>
<li>responsive design</li>
<li>
light/dark scheme depending on user's operating system current theme
preference
</li>
</ul>
<h3>How lightweight is it?</h3>
To check the site size on Firefox or Chrome, open a new
private/incognito window, right click on the blank page, select
<i>Inspect</i>, go to the <i>Network</i> tab, enter the URL in the
address bar and press <i>Enter</i>. The transferred size appears in the status
bar at the bottom of the <i>Network</i> tab.
<br />
<a
target="_blank"
rel="noopener"
href="https://gtmetrix.com/reports/minwiz.com/xzAvYUKq/#waterfall"
>GTmetrix</a
>
site size: 1.7 KB, 4.1 KB uncompressed
</section>
<section id="c">
<h3>Contact info</h3>
<br />
Email: noury[AT]dank[DOT]pw
<br />
</section>
<section id="h">
<h1>Dank Privacy:</h1>
<h3>> AnonymousOverflow</h3>
<p>
View StackOverflow in privacy and without the clutter.
</p>
<p>
Source: <a href="https://github.com/httpjamesm/AnonymousOverflow">https://github.com/httpjamesm/AnonymousOverflow</a>
</p>
<p>
Instance: <a href="https://stackoverflow.dank.pw">https://stackoverflow.dank.pw</a>
</p>
<br>
<h3>> BiblioReads</h3>
<p>
An Alternative Private Goodreads Front-End.
</p>
<p>
Source: <a href="https://github.com/nesaku/BiblioReads">https://github.com/nesaku/BiblioReads</a>
</p>
<p>
Instance: <a href="https://biblioreads.dank.pw">https://biblioreads.dank.pw</a>
</p>
<br>
<h3>> BreezeWiki</h3>
<p>
An alternative frontend for Fandom.
</p>
<p>
Source: <a href="https://gitdab.com/cadence/breezewiki">https://gitdab.com/cadence/breezewiki</a>
</p>
<p>
Instance: <a href="https://breezewiki.dank.pw">https://breezewiki.dank.pw</a>
</p>
<br>
<h3>> CyberChef</h3>
<p>
The Cyber Swiss Army Knife - a web app for encryption, encoding, compression and data analysis.
</p>
<p>
Source: <a href="https://github.com/gchq/CyberChef">https://github.com/gchq/CyberChef</a>
</p>
<p>
Instance: <a href="https://cyberchef.dank.pw">https://cyberchef.dank.pw</a>
</p>
<br>
<h3>> Gothub</h3>
<p>
Alternative front-end for GitHub written with Go.
</p>
<p>
Source: <a href="https://codeberg.org/gothub/gothub">https://codeberg.org/gothub/gothub</a>
</p>
<p>
Instance: <a href="https://gothub.dank.pw">https://gothub.dank.pw</a>
</p>
<br>
<h3>> Libreddit</h3>
<p>
Private front-end for Reddit
</p>
<p>
Source: <a href="https://github.com/spikecodes/libreddit">https://github.com/spikecodes/libreddit</a>
</p>
<p>
Instance: <a href="https://reddit.dank.pw">https://reddit.dank.pw</a>
</p>
<br>
<h3>> Libremdb</h3>
<p>
A free & open source IMDb front-end.
</p>
<p>
Source: <a href="https://github.com/zyachel/libremdb">https://github.com/zyachel/libremdb</a>
</p>
<p>
Instance: <a href="https://imdb.dank.pw">https://imdb.dank.pw</a>
</p>
<br>
<h3>> Lingva</h3>
<p>
Alternative front-end for Google Translate
</p>
<p>
Source: <a href="https://github.com/thedaviddelta/lingva-translate">https://github.com/thedaviddelta/lingva-translate</a>
</p>
<p>
Instance: <a href="https://lingva.dank.pw">https://lingva.dank.pw</a>
</p>
<br>
<h3>> Piped</h3>
<p>
An open-source alternative frontend for YouTube which is efficient by design.
</p>
<p>
Source: <a href="https://github.com/TeamPiped/Piped">https://github.com/TeamPiped/Piped</a>
</p>
<p>
Instance: <a href="https://piped.dank.pw">https://piped.dank.pw</a> (Note: Signups currently disabled)
</p>
<br>
<h3>> PrivateBin</h3>
<p>
A minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES.
</p>
<p>
Source: <a href="https://github.com/PrivateBin/PrivateBin">https://github.com/PrivateBin/PrivateBin</a>
</p>
<p>
Instance: <a href="https://bin.dank.pw">https://bin.dank.pw</a>
</p>
<br>
<h3>> Quetre</h3>
<p>
A libre front-end for Quora
</p>
<p>
Source: <a href="https://github.com/zyachel/quetre">https://github.com/zyachel/quetre</a>
</p>
<p>
Instance: <a href="https://quora.dank.pw">https://quora.dank.pw</a>
</p>
<br>
<h3>> Rimgo</h3>
<p>
Rimgo is an alternative frontend for Imgur.
</p>
<p>
Source: <a href="https://codeberg.org/video-prize-ranch/rimgo">https://codeberg.org/video-prize-ranch/rimgo</a>
</p>
<p>
Instance: <a href="https://imgur.dank.pw">https://imgur.dank.pw</a>
</p>
<br>
<h3>> SearXNG</h3>
<p>
SearXNG is a free internet metasearch engine which aggregates results from various search services and databases.
</p>
<p>
Source: <a href="https://github.com/searxng/searxng">https://github.com/searxng/searxng</a>
</p>
<p>
Instance: <a href="https://searx.dank.pw">https://searx.dank.pw</a>
</p>
<br>
<h3>> Send</h3>
<p>
Easily and securely share files from the command line. A fully featured Firefox Send client.
</p>
<p>
Source: <a href="https://github.com/timvisee/ffsend">https://github.com/timvisee/ffsend</a>
</p>
<p>
Instance: <a href="https://send.dank.pw">https://send.dank.pw</a>
</p>
<br>
<h3>> Teddit</h3>
<p>
Teddit is a free and open source alternative Reddit front-end focused on privacy.
</p>
<p>
Source: <a href="https://codeberg.org/teddit/teddit">https://codeberg.org/teddit/teddit</a>
</p>
<p>
Instance: <a href="https://teddit.dank.pw">https://teddit.dank.pw</a>
</p>
<br>
<h3>> IT-Tools</h3>
<p>
Collection of handy online tools for developers, with great UX.
</p>
<p>
Source: <a href="https://github.com/CorentinTh/it-tools">https://github.com/CorentinTh/it-tools</a>
</p>
<p>
Instance: <a href="https://tools.dank.pw">https://tools.dank.pw</a>
</p>
<br>
<h3>> Wikiless</h3>
<p>
A free open source alternative Wikipedia front-end focused on privacy.
</p>
<p>
Source: <a href="https://github.com/Metastem/wikiless">https://github.com/Metastem/wikiless</a>
</p>
<p>
Instance: <a href="https://wikipedia.dank.pw">https://wikipedia.dank.pw</a>
</p>
<br>
<h4>> Disclaimer </h4>
<p>
I try my best to keep this service up to date and running but there is absolutely no guarantee or warranty for anything.
</p>
</section>
</main>
<footer>
Site source: <a target="_blank" rel="noopener" href="https://github.com/lyx0/dank.pw/">Github</a> | Status: <a target="_blank" rel="noopener" href="https://status.dank.pw">Uptime</a>
</footer>
</body>
</html>

85
src/styles/stylesheet.css Normal file
View file

@ -0,0 +1,85 @@
* {
margin: 0;
--tc: #fff;
--bc: #111;
--hc: #fb0;
}
body {
font: 18px -apple-system, BlinkMacSystemFont, sans-serif;
line-height: 1.4;
color: var(--tc);
background: var(--bc);
max-width: 36em;
margin: 0 auto;
padding: 0 0.7em;
text-align: justify;
}
main {
margin-bottom: 3em;
}
a {
text-decoration: none;
color: var(--hc);
}
a:hover {
text-decoration: underline;
}
h1,
br,
header,
ul {
margin-bottom: 1em;
}
h2 {
margin-bottom: 0.3em;
}
ul {
padding-left: 1em;
}
br {
content: " ";
display: block;
}
/* navigation */
section,
section:target ~ section:last-of-type {
display: none;
}
section:target,
section:last-of-type {
display: inherit;
}
/* end navigation */
header {
display: flex;
justify-content: space-between;
align-items: center;
}
header > a {
font-size: 1.7em;
font-weight: 700;
}
nav a {
margin-left: 0.75em;
}
footer {
max-width: 36em;
margin: 0 auto;
padding: 0 0.7em;
text-align: center;
}