mirror of
https://github.com/lyx0/noury.li.git
synced 2024-11-13 19:49:54 +01:00
init commit
This commit is contained in:
commit
e463e9675f
31 changed files with 18412 additions and 0 deletions
74
CODE_OF_CONDUCT.md
Normal file
74
CODE_OF_CONDUCT.md
Normal 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
25
LICENSE
Normal 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
40
README.md
Normal 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
6
cdk/.npmignore
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
*.ts
|
||||||
|
!*.d.ts
|
||||||
|
|
||||||
|
# CDK asset staging directory
|
||||||
|
.cdk.staging
|
||||||
|
cdk.out
|
14
cdk/README.md
Normal file
14
cdk/README.md
Normal 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
36
cdk/bin/cdk.ts
Normal 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
32
cdk/cdk.json
Normal 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
8
cdk/jest.config.js
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
module.exports = {
|
||||||
|
testEnvironment: 'node',
|
||||||
|
roots: ['<rootDir>/test'],
|
||||||
|
testMatch: ['**/*.test.ts'],
|
||||||
|
transform: {
|
||||||
|
'^.+\\.tsx?$': 'ts-jest'
|
||||||
|
}
|
||||||
|
};
|
33
cdk/lib/certificate-stack.ts
Normal file
33
cdk/lib/certificate-stack.ts
Normal 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
85
cdk/lib/cloudfront.ts
Normal 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
111
cdk/lib/pipeline-stack.ts
Normal 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
3
cdk/lib/variables.ts
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
export const hostedZoneId = "Z02664723UDHCHU1STAVT";
|
||||||
|
|
||||||
|
export const website_domain = "minwiz.com";
|
4882
cdk/package-lock.json
generated
Normal file
4882
cdk/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
30
cdk/package.json
Normal file
30
cdk/package.json
Normal 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
17
cdk/test/cdk.test.ts
Normal 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
30
cdk/tsconfig.json
Normal 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
BIN
design/icon.pxd
Normal file
Binary file not shown.
0
dist/.gitkeep
vendored
Normal file
0
dist/.gitkeep
vendored
Normal file
47
gulpfile.js
Normal file
47
gulpfile.js
Normal 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
12490
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
33
package.json
Normal file
33
package.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/android-chrome-192x192.png
Normal file
BIN
public/android-chrome-192x192.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
BIN
public/android-chrome-512x512.png
Normal file
BIN
public/android-chrome-512x512.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 138 KiB |
BIN
public/apple-touch-icon.png
Normal file
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
BIN
public/favicon-16x16.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 768 B |
BIN
public/favicon-32x32.png
Normal file
BIN
public/favicon-32x32.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
BIN
public/favicon.ico
Normal file
BIN
public/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
2
public/robots.txt
Normal file
2
public/robots.txt
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
User-agent: *
|
||||||
|
Disallow: /*
|
1
public/site.webmanifest
Normal file
1
public/site.webmanifest
Normal 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
328
src/index.html
Normal 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
85
src/styles/stylesheet.css
Normal 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;
|
||||||
|
}
|
Loading…
Reference in a new issue