Split the html into templates and partials
This commit is contained in:
151
package-lock.json
generated
151
package-lock.json
generated
@@ -737,14 +737,6 @@
|
||||
"requires": {
|
||||
"core-js": "^2.6.5",
|
||||
"regenerator-runtime": "^0.13.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"regenerator-runtime": {
|
||||
"version": "0.13.3",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
|
||||
"integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"@babel/preset-env": {
|
||||
@@ -812,14 +804,6 @@
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"regenerator-runtime": "^0.13.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"regenerator-runtime": {
|
||||
"version": "0.13.3",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
|
||||
"integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"@babel/template": {
|
||||
@@ -1407,6 +1391,12 @@
|
||||
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
|
||||
"dev": true
|
||||
},
|
||||
"abbrev": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
|
||||
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
|
||||
"dev": true
|
||||
},
|
||||
"accepts": {
|
||||
"version": "1.3.7",
|
||||
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
|
||||
@@ -1744,6 +1734,14 @@
|
||||
"babel-runtime": "^6.26.0",
|
||||
"core-js": "^2.5.0",
|
||||
"regenerator-runtime": "^0.10.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"regenerator-runtime": {
|
||||
"version": "0.10.5",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
|
||||
"integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"babel-runtime": {
|
||||
@@ -2590,6 +2588,16 @@
|
||||
"typedarray": "^0.0.6"
|
||||
}
|
||||
},
|
||||
"config-chain": {
|
||||
"version": "1.1.12",
|
||||
"resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz",
|
||||
"integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ini": "^1.3.4",
|
||||
"proto-list": "~1.2.1"
|
||||
}
|
||||
},
|
||||
"connect-history-api-fallback": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
|
||||
@@ -3314,6 +3322,36 @@
|
||||
"safer-buffer": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"editorconfig": {
|
||||
"version": "0.15.3",
|
||||
"resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz",
|
||||
"integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"commander": "^2.19.0",
|
||||
"lru-cache": "^4.1.5",
|
||||
"semver": "^5.6.0",
|
||||
"sigmund": "^1.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"lru-cache": {
|
||||
"version": "4.1.5",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
|
||||
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"pseudomap": "^1.0.2",
|
||||
"yallist": "^2.1.2"
|
||||
}
|
||||
},
|
||||
"yallist": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
|
||||
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"ee-first": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||
@@ -4977,6 +5015,18 @@
|
||||
"integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
|
||||
"dev": true
|
||||
},
|
||||
"html-beautify-webpack-plugin": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/html-beautify-webpack-plugin/-/html-beautify-webpack-plugin-1.0.5.tgz",
|
||||
"integrity": "sha512-5mt+1QVY861mWQfodXMw1vaP6kKJ55EXCe7sshCoykpnhXiZ/OerxvR64WDO9xi15j6o9o6kor4pYAjzIGLEVQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"assert": "^1.4.1",
|
||||
"chalk": "^2.3.0",
|
||||
"js-beautify": "^1.7.5",
|
||||
"lodash": "^4.17.4"
|
||||
}
|
||||
},
|
||||
"html-comment-regex": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
|
||||
@@ -5666,6 +5716,19 @@
|
||||
"integrity": "sha512-MUj2XlMB8kpe+8DJUGH/3UJm4XpI8XEgZQ+CiHDeyrGoKPdW/8FJv6ku+3UiYm5Fz3CWaL+iXmD8Q4Ap6aC1Jw==",
|
||||
"dev": true
|
||||
},
|
||||
"js-beautify": {
|
||||
"version": "1.10.2",
|
||||
"resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.2.tgz",
|
||||
"integrity": "sha512-ZtBYyNUYJIsBWERnQP0rPN9KjkrDfJcMjuVGcvXOUJrD1zmOGwhRwQ4msG+HJ+Ni/FA7+sRQEMYVzdTQDvnzvQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"config-chain": "^1.1.12",
|
||||
"editorconfig": "^0.15.3",
|
||||
"glob": "^7.1.3",
|
||||
"mkdirp": "~0.5.1",
|
||||
"nopt": "~4.0.1"
|
||||
}
|
||||
},
|
||||
"js-levenshtein": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
|
||||
@@ -6409,6 +6472,16 @@
|
||||
"integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=",
|
||||
"dev": true
|
||||
},
|
||||
"nopt": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
|
||||
"integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"abbrev": "1",
|
||||
"osenv": "^0.1.4"
|
||||
}
|
||||
},
|
||||
"normalize-path": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
|
||||
@@ -6682,6 +6755,12 @@
|
||||
"integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
|
||||
"dev": true
|
||||
},
|
||||
"os-homedir": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
|
||||
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
|
||||
"dev": true
|
||||
},
|
||||
"os-locale": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
|
||||
@@ -6693,6 +6772,22 @@
|
||||
"mem": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"os-tmpdir": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
|
||||
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
|
||||
"dev": true
|
||||
},
|
||||
"osenv": {
|
||||
"version": "0.1.5",
|
||||
"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
|
||||
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"os-homedir": "^1.0.0",
|
||||
"os-tmpdir": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"output-file-sync": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-2.0.1.tgz",
|
||||
@@ -7785,6 +7880,12 @@
|
||||
"integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
|
||||
"dev": true
|
||||
},
|
||||
"proto-list": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
|
||||
"integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
|
||||
"dev": true
|
||||
},
|
||||
"proxy-addr": {
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
|
||||
@@ -7801,6 +7902,12 @@
|
||||
"integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
|
||||
"dev": true
|
||||
},
|
||||
"pseudomap": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
|
||||
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
|
||||
"dev": true
|
||||
},
|
||||
"psl": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz",
|
||||
@@ -8057,9 +8164,9 @@
|
||||
}
|
||||
},
|
||||
"regenerator-runtime": {
|
||||
"version": "0.10.5",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
|
||||
"integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
|
||||
"version": "0.13.3",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
|
||||
"integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
|
||||
"dev": true
|
||||
},
|
||||
"regenerator-transform": {
|
||||
@@ -8632,6 +8739,12 @@
|
||||
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
|
||||
"dev": true
|
||||
},
|
||||
"sigmund": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
|
||||
"integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
|
||||
"dev": true
|
||||
},
|
||||
"signal-exit": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
|
||||
|
||||
@@ -11,17 +11,18 @@
|
||||
"author": "Daniel Vassallo",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@babel/runtime": "^7.4.5",
|
||||
"@babel/cli": "^7.4.4",
|
||||
"@babel/core": "^7.4.5",
|
||||
"@babel/plugin-transform-runtime": "^7.4.4",
|
||||
"@babel/preset-env": "^7.4.5",
|
||||
"@babel/runtime": "^7.4.5",
|
||||
"autoprefixer": "^9.6.0",
|
||||
"babel-loader": "^8.0.6",
|
||||
"babel-polyfill": "^6.26.0",
|
||||
"css-loader": "^2.1.1",
|
||||
"favicons-webpack-plugin": "^1.0.2",
|
||||
"file-loader": "^3.0.1",
|
||||
"html-beautify-webpack-plugin": "^1.0.5",
|
||||
"html-loader": "^0.5.5",
|
||||
"html-webpack-plugin": "^3.2.0",
|
||||
"lodash": ">=4.17.13",
|
||||
|
||||
133
src/index.html
133
src/index.html
@@ -1,133 +0,0 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<title>Userbase</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="container mx-auto max-w-2xl px-4 text-blackish" style="font-size: 16px">
|
||||
<div class="section">
|
||||
<div class="flex justify-center">
|
||||
<img class="w-32 h-32" src="./img/icon.png">
|
||||
</div>
|
||||
<h1 class="font-logo">Userbase</h1>
|
||||
<h2>You won't believe it's not a database!</h2>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="section">
|
||||
<h3 id="what-is-userbase">What is Userbase?</h3>
|
||||
|
||||
<p>Userbase is like a database, but purpose-built for web app user data. It's accessible directly
|
||||
from the browser through a very simple JavaScript SDK.</p>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="section">
|
||||
<h3 id="why-not-a-database">Why isn't it a database?</h3>
|
||||
|
||||
<p>With Userbase you can durably store, update, delete, and query user data. But that's where the
|
||||
similarities with traditional databases end.</p>
|
||||
<h4 id="zero-management">Zero management</h4>
|
||||
<p>Unlike a real database, all Userbase queries run in the browser, with the server-side acting as
|
||||
a dumb data store. There's no database to manage and worry about.
|
||||
</p>
|
||||
<h4 id="user-management">Built-in user management</h4>
|
||||
<p>Unlike a real database, Userbase takes care of your user accounts. It comes with built-in APIs for user
|
||||
signups, logins, and access control.</p>
|
||||
<h4 id="e2ee">End-to-end encrypted</h4>
|
||||
<p>Unlike a real database, Userbase won't show you what your users store in your web app.</p>
|
||||
<p>Wait, what!? — Yes, that's a feature — maybe the most important feature. Userbase spares you from the liability
|
||||
of handling user data by encrypting everything in the browser, using keys that always stay with the user.</p>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="section">
|
||||
<h3 id="what-would-i-use-it">When would I use it?</h3>
|
||||
|
||||
<p>If you're building a web app, you will likely need a database. Userbase can substitute your
|
||||
database... </p>
|
||||
<ul>
|
||||
<li>If you want to build a web app without writing any backend code.</li>
|
||||
<li>If you never want to see your users' data.</li>
|
||||
<li>If you're tired of dealing with databases.</li>
|
||||
<li>If you want to radically simplify your GDPR compliance.</li>
|
||||
<li>And if you want to keep things really simple.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="section">
|
||||
<h3 id="how-do-i-start">How do I start?</h3>
|
||||
|
||||
<p>Userbase will be available around mid-December 2019.</p>
|
||||
|
||||
<h4 id="oss">Open source</h4>
|
||||
<p>Userbase is being developed in the open, and is <a href="https://github.com/encrypted-dev/userbase"
|
||||
target="_blank" rel="noopener noreferrer">100% open-source</a>, MIT licensed. You can modify and extend the
|
||||
backend to your liking, and run it yourself in your AWS account, always under your control.</p>
|
||||
|
||||
<h4 id="saas">As a service</h4>
|
||||
<p>Or for just $39/month you can go fully serverless, backendless, databaseless, and AWSless!</p>
|
||||
<ul>
|
||||
<li>Unlimited web apps.</li>
|
||||
<li>Unlimited users.</li>
|
||||
<li>1 GB storage included.</li>
|
||||
<li>Unlimited extra storage at $1/month per GB.</li>
|
||||
<li>All features included.</li>
|
||||
</ul>
|
||||
|
||||
<h4 id="mailing-list">Join the waiting list</h4>
|
||||
<p>Enter your email to receive occasional updates about Userbase. No spam ever.</p>
|
||||
|
||||
<form method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" target="_blank"
|
||||
class="validate text-center"
|
||||
action="https://danielvassallo.us20.list-manage.com/subscribe/post?u=e3b0fd293a0e6d7ea0080fafe&id=d0aae9dd3e">
|
||||
|
||||
<input type="email" value="" name="EMAIL" id="mce-EMAIL" required autocorrect="off" spellcheck="false"
|
||||
placeholder="Email address"
|
||||
class="font-light text-sm h-10 p-2 border border-gray-500 outline-none w-64 rounded my-4 inline-block">
|
||||
|
||||
<input type="submit" value="Subscribe" name="subscribe" id="mc-embedded-subscribe"
|
||||
class="rounded-lg w-40 h-10 bg-yellowish font-bold cursor-pointer text-gray-900 inline-block relative"
|
||||
style="top: 1px;">
|
||||
|
||||
<div class="mc-status" class="hidden"></div>
|
||||
<div style="position: absolute; left: -5000px;" aria-hidden="true">
|
||||
<input type="text" name="b_e3b0fd293a0e6d7ea0080fafe_d0aae9dd3e" tabindex="-1" value=""></div>
|
||||
<div class="clear"></div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="section">
|
||||
<h3 id="about">Who's behind this?</h3>
|
||||
|
||||
<p>This product is the work of <a href="https://twitter.com/dvassallo" target="_blank"
|
||||
rel="noopener noreferrer">Daniel Vassallo</a> and <a href="https://twitter.com/justinberman95" target="_blank"
|
||||
rel="noopener noreferrer">Justin Berman</a>. We're a small independent business, structured
|
||||
to be lean, profitable, and sustainable. We're here for the long haul.
|
||||
</p>
|
||||
|
||||
<p>If you have any questions, or there's anything we can do to help you with your web app, please <a
|
||||
href="mailto:daniel@encrypted.dev">get in touch</a>. Thank you!</p>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
${require('./footer.html')}
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
104
src/pages/index.html
Normal file
104
src/pages/index.html
Normal file
@@ -0,0 +1,104 @@
|
||||
<div class="section">
|
||||
<h3 id="what-is-userbase">What is Userbase?</h3>
|
||||
|
||||
<p>Userbase is like a database, but purpose-built for web app user data. It's accessible directly
|
||||
from the browser through a very simple JavaScript SDK.</p>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="section">
|
||||
<h3 id="why-not-a-database">Why isn't it a database?</h3>
|
||||
|
||||
<p>With Userbase you can durably store, update, delete, and query user data. But that's where the
|
||||
similarities with traditional databases end.</p>
|
||||
<h4 id="zero-management">Zero management</h4>
|
||||
<p>Unlike a real database, all Userbase queries run in the browser, with the server-side acting as
|
||||
a dumb data store. There's no database to manage and worry about.
|
||||
</p>
|
||||
<h4 id="user-management">Built-in user management</h4>
|
||||
<p>Unlike a real database, Userbase takes care of your user accounts. It comes with built-in APIs for user
|
||||
signups, logins, and access control.</p>
|
||||
<h4 id="e2ee">End-to-end encrypted</h4>
|
||||
<p>Unlike a real database, Userbase won't show you what your users store in your web app.</p>
|
||||
<p>Wait, what!? — Yes, that's a feature — maybe the most important feature. Userbase spares you from the liability
|
||||
of handling user data by encrypting everything in the browser, using keys that always stay with the user.</p>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="section">
|
||||
<h3 id="what-would-i-use-it">When would I use it?</h3>
|
||||
|
||||
<p>If you're building a web app, you will likely need a database. Userbase can substitute your
|
||||
database... </p>
|
||||
<ul>
|
||||
<li>If you want to build a web app without writing any backend code.</li>
|
||||
<li>If you never want to see your users' data.</li>
|
||||
<li>If you're tired of dealing with databases.</li>
|
||||
<li>If you want to radically simplify your GDPR compliance.</li>
|
||||
<li>And if you want to keep things really simple.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="section">
|
||||
<h3 id="how-do-i-start">How do I start?</h3>
|
||||
|
||||
<p>Userbase will be available around mid-December 2019.</p>
|
||||
|
||||
<h4 id="oss">Open source</h4>
|
||||
<p>Userbase is being developed in the open, and is <a href="https://github.com/encrypted-dev/userbase" target="_blank"
|
||||
rel="noopener noreferrer">100% open-source</a>, MIT licensed. You can modify and extend the
|
||||
backend to your liking, and run it yourself in your AWS account, always under your control.</p>
|
||||
|
||||
<h4 id="saas">As a service</h4>
|
||||
<p>Or for just $39/month you can go fully serverless, backendless, databaseless, and AWSless!</p>
|
||||
<ul>
|
||||
<li>Unlimited web apps.</li>
|
||||
<li>Unlimited users.</li>
|
||||
<li>1 GB storage included.</li>
|
||||
<li>Unlimited extra storage at $1/month per GB.</li>
|
||||
<li>All features included.</li>
|
||||
</ul>
|
||||
|
||||
<h4 id="mailing-list">Join the waiting list</h4>
|
||||
<p>Enter your email to receive occasional updates about Userbase. No spam ever.</p>
|
||||
|
||||
<form method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" target="_blank"
|
||||
class="validate text-center"
|
||||
action="https://danielvassallo.us20.list-manage.com/subscribe/post?u=e3b0fd293a0e6d7ea0080fafe&id=d0aae9dd3e">
|
||||
|
||||
<input type="email" value="" name="EMAIL" id="mce-EMAIL" required autocorrect="off" spellcheck="false"
|
||||
placeholder="Email address"
|
||||
class="font-light text-sm h-10 p-2 border border-gray-500 outline-none w-64 rounded my-4 inline-block">
|
||||
|
||||
<input type="submit" value="Subscribe" name="subscribe" id="mc-embedded-subscribe"
|
||||
class="rounded-lg w-40 h-10 bg-yellowish font-bold cursor-pointer text-gray-900 inline-block relative"
|
||||
style="top: 1px;">
|
||||
|
||||
<div class="mc-status" class="hidden"></div>
|
||||
<div style="position: absolute; left: -5000px;" aria-hidden="true">
|
||||
<input type="text" name="b_e3b0fd293a0e6d7ea0080fafe_d0aae9dd3e" tabindex="-1" value=""></div>
|
||||
<div class="clear"></div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="section">
|
||||
<h3 id="about">Who's behind this?</h3>
|
||||
|
||||
<p>This product is the work of <a href="https://twitter.com/dvassallo" target="_blank"
|
||||
rel="noopener noreferrer">Daniel Vassallo</a> and <a href="https://twitter.com/justinberman95" target="_blank"
|
||||
rel="noopener noreferrer">Justin Berman</a>. We're a small independent business, structured to be lean,
|
||||
profitable, and sustainable. We're here for the long haul.
|
||||
</p>
|
||||
|
||||
<p>If you have any questions, or there's anything we can do to help you with your web app, please <a
|
||||
href="mailto:daniel@encrypted.dev">get in touch</a>. Thank you!</p>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
9
src/partials/header.html
Normal file
9
src/partials/header.html
Normal file
@@ -0,0 +1,9 @@
|
||||
<div class="section">
|
||||
<div class="flex justify-center">
|
||||
<img class="w-32 h-32" src="../img/icon.png">
|
||||
</div>
|
||||
<h1 class="font-logo">Userbase</h1>
|
||||
<h2>You won't believe it's not a database!</h2>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
@@ -3,7 +3,7 @@
|
||||
@tailwind components;
|
||||
|
||||
body {
|
||||
@apply pb-10;
|
||||
@apply pb-10 text-center;
|
||||
}
|
||||
|
||||
a {
|
||||
|
||||
18
src/template.html
Normal file
18
src/template.html
Normal file
@@ -0,0 +1,18 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<title>Userbase</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="container mx-auto max-w-2xl px-4 text-blackish" style="font-size: 16px">
|
||||
<%= require('html-loader!./partials/' + header + '.html') %>
|
||||
<%= require('html-loader!./pages/' + page + '.html') %>
|
||||
<%= require('html-loader!./partials/' + footer + '.html') %>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,3 +1,4 @@
|
||||
const fs = require('fs')
|
||||
const path = require('path')
|
||||
const glob = require('glob')
|
||||
const webpack = require('webpack')
|
||||
@@ -6,12 +7,23 @@ const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
|
||||
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
|
||||
const PurgecssPlugin = require('purgecss-webpack-plugin')
|
||||
const HtmlWebPackPlugin = require('html-webpack-plugin')
|
||||
const HtmlBeautifyPlugin = require('html-beautify-webpack-plugin')
|
||||
const FaviconsWebpackPlugin = require('favicons-webpack-plugin')
|
||||
const OpenBrowserPlugin = require('opn-browser-webpack-plugin')
|
||||
|
||||
module.exports = (env, argv) => {
|
||||
|
||||
const PATHS = {
|
||||
const pages = []
|
||||
|
||||
fs.readdirSync('./src/pages/').forEach(file => {
|
||||
pages.push(new HtmlWebPackPlugin({
|
||||
template: './src/template.html',
|
||||
filename: './' + file,
|
||||
templateParameters() { return { header: 'header', footer: 'footer', page: file.split('.')[0] } }
|
||||
}))
|
||||
})
|
||||
|
||||
const paths = {
|
||||
src: path.join(__dirname, 'src')
|
||||
}
|
||||
|
||||
@@ -51,18 +63,6 @@ module.exports = (env, argv) => {
|
||||
exclude: /node_modules/,
|
||||
loader: 'babel-loader'
|
||||
},
|
||||
{
|
||||
test: /\.html$/,
|
||||
use: [
|
||||
{
|
||||
loader: 'html-loader',
|
||||
options: {
|
||||
interpolate: true,
|
||||
minimize: false
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
test: /\.(woff|woff2|eot|ttf|otf|png|svg|jpg|gif)$/,
|
||||
use: ['file-loader']
|
||||
@@ -76,13 +76,21 @@ module.exports = (env, argv) => {
|
||||
ignoreOrder: false
|
||||
}),
|
||||
new PurgecssPlugin({
|
||||
paths: glob.sync(`${PATHS.src}/**/*`, { nodir: true }),
|
||||
}),
|
||||
new HtmlWebPackPlugin({
|
||||
template: './src/index.html',
|
||||
filename: './index.html'
|
||||
paths: glob.sync(`${paths.src}/**/*`, { nodir: true }),
|
||||
}),
|
||||
...pages,
|
||||
new FaviconsWebpackPlugin('./src/img/icon.png'),
|
||||
new HtmlBeautifyPlugin({
|
||||
config: {
|
||||
html: {
|
||||
end_with_newline: true,
|
||||
indent_size: 2,
|
||||
indent_with_tabs: false,
|
||||
indent_inner_html: false,
|
||||
preserve_newlines: true
|
||||
}
|
||||
}
|
||||
}),
|
||||
new webpack.NoEmitOnErrorsPlugin(),
|
||||
new webpack.WatchIgnorePlugin(['./dist'])
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user