diff --git a/.cspell/custom-dictionary-workspace.txt b/.cspell/custom-dictionary-workspace.txt
index 1216d573..35bc3f7e 100644
--- a/.cspell/custom-dictionary-workspace.txt
+++ b/.cspell/custom-dictionary-workspace.txt
@@ -1,10 +1,27 @@
# Custom Dictionary Words
+Bluesky
cdaps
+chromeos
+cloudflareinsights
CTAP
+Descope
+errorf
geolocation
+gethinode
+getstarted
+Hanko
+hinode
+isset
Keychain
lastmod
+nosniff
+opengraph
+reauth
Reauthentication
+SAMEORIGIN
+unshallow
upsell
UVRA
webauthn
+webshare
+Yubico
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index e258d0c9..00000000
--- a/.eslintignore
+++ /dev/null
@@ -1,2 +0,0 @@
-assets/js/vendor
-node_modules
\ No newline at end of file
diff --git a/.eslintrc.json b/.eslintrc.json
deleted file mode 100644
index c926994d..00000000
--- a/.eslintrc.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "env": {
- "browser": true,
- "commonjs": true,
- "es6": true,
- "node": true
- },
- "extends": "eslint:recommended",
- "globals": {
- "Atomics": "readonly",
- "SharedArrayBuffer": "readonly"
- },
- "parserOptions": {
- "ecmaVersion": 2018,
- "sourceType": "module"
- },
- "rules": {
- "no-console": 0,
- "quotes": ["error", "single"],
- "comma-dangle": [
- "error",
- {
- "arrays": "always-multiline",
- "objects": "always-multiline",
- "imports": "always-multiline",
- "exports": "always-multiline",
- "functions": "ignore"
- }
- ]
- }
-}
\ No newline at end of file
diff --git a/.git-hooks/pre-commit b/.git-hooks/pre-commit
new file mode 100755
index 00000000..47fc3292
--- /dev/null
+++ b/.git-hooks/pre-commit
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+echo "Running pre-commit checks..."
+markdownlint-cli2 "*.md" "content/**/*.md"
\ No newline at end of file
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 00000000..8779e876
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,41 @@
+
+
+## What type of PR is this? (check all applicable)
+
+- [ ] Minor content update (spelling, grammar)
+- [ ] Substantive content update (changes meaning)
+- [ ] Net new content
+- [ ] Reference content update (platforms, device support, etc)
+- [ ] Core platform updates (Hugo / Hinode / Cloudflare)
+- [ ] Administrivia / chores
+
+## Description, Motivation, and Context
+
+
+
+## Related Issues
+
+
+
+- Related Issue #
+- Closes #
diff --git a/.gitignore b/.gitignore
index 85ea9156..e794cd03 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,11 @@
-node_modules
-public
-resources
+/_vendor
+/prebuild
+/public
+resources/
+node_modules/
+
+.DS_store
+.hugo_build.lock
.netlify
-.hugo_build.lock
\ No newline at end of file
+
+hugo
diff --git a/.gitpod.yml b/.gitpod.yml
deleted file mode 100644
index ff805199..00000000
--- a/.gitpod.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-# Source:
-# - https://github.com/gitpod-io/template-hugo
-# - https://www.gitpod.io/docs/configure/workspaces/tasks#one-line-tasks
-
-tasks:
- - name: Run development server
- init: pnpm install
- command: pnpm dev
-
-ports:
- - port: 1313
- onOpen: open-preview
diff --git a/.husky/pre-commit b/.husky/pre-commit
deleted file mode 100755
index 75fac8e1..00000000
--- a/.husky/pre-commit
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/usr/bin/env sh
-. "$(dirname -- "$0")/_/husky.sh"
-
-npm run lint
diff --git a/.markdownlint-cli2.jsonc b/.markdownlint-cli2.jsonc
index f3d4ce10..1fb54d7e 100644
--- a/.markdownlint-cli2.jsonc
+++ b/.markdownlint-cli2.jsonc
@@ -2,13 +2,13 @@
"config": {
"default": true,
"MD013": false,
- "MD022": false,
"MD024": false,
- "MD025": false,
"MD026": false,
- "MD033": false,
"MD034": false,
- "MD036": false
+ "MD051": false,
+ "MD053": false,
+ "MD055": false,
+ "MD056": false
},
- "ignores": ["node_modules", "CHANGELOG.md", "README.md"]
+ "ignores": ["node_modules", "CHANGELOG.md"]
}
\ No newline at end of file
diff --git a/.npmignore b/.npmignore
deleted file mode 100644
index 81e0bb4a..00000000
--- a/.npmignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.eslintcache
-.stylelintcache
-.netlify
-.hugo_build.lock
-yarn-error.log
-node_modules
-public
-resources
diff --git a/.npmrc b/.npmrc
deleted file mode 100644
index 2f4f5b80..00000000
--- a/.npmrc
+++ /dev/null
@@ -1,4 +0,0 @@
-enable-pre-post-scripts = true
-auto-install-peers = true
-node-linker = hoisted
-prefer-symlinked-executables = false
\ No newline at end of file
diff --git a/.stylelintignore b/.stylelintignore
deleted file mode 100644
index 9d9a3cec..00000000
--- a/.stylelintignore
+++ /dev/null
@@ -1,2 +0,0 @@
-assets/scss/vendor
-node_modules
\ No newline at end of file
diff --git a/.stylelintrc.json b/.stylelintrc.json
deleted file mode 100644
index 3315ca04..00000000
--- a/.stylelintrc.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "extends": "stylelint-config-standard-scss",
- "rules": {
- "no-empty-source": null,
- "string-quotes": "double",
- "scss/comment-no-empty": null,
- "max-line-length": null,
- "scss/at-extend-no-missing-placeholder": null,
- "font-family-no-missing-generic-family-keyword": [
- true,
- {
- "ignoreFontFamilies": [
- "bootstrap-icons"
- ]
- }
- ],
- "function-name-case": [
- "lower",
- {
- "ignoreFunctions": [
- "RGB"
- ]
- }
- ],
- "at-rule-no-unknown": [
- true,
- {
- "ignoreAtRules": [
- "extend",
- "at-root",
- "debug",
- "warn",
- "error",
- "if",
- "else",
- "for",
- "each",
- "while",
- "mixin",
- "include",
- "content",
- "return",
- "function",
- "tailwind",
- "apply",
- "responsive",
- "variants",
- "screen"
- ]
- }
- ]
- }
-}
\ No newline at end of file
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
deleted file mode 100644
index 77366b2e..00000000
--- a/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# 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, sex characteristics, gender identity and expression,
-level of experience, education, socio-economic status, 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 hello@getdoks.org. 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 https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
-
-[homepage]: https://www.contributor-covenant.org
-
-For answers to common questions about this code of conduct, see
-https://www.contributor-covenant.org/faq
diff --git a/LICENSE b/LICENSE
index aac8ecf9..43ef51e1 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,67 +1,10 @@
## License for passkeys.dev content
-All content, unless otherwise indicated, is available under
-([CC-BY-SA 2.5](https://creativecommons.org/licenses/by-sa/2.5/)).
+All content, unless otherwise indicated, is licensed under a [Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License](https://creativecommons.org/licenses/by-nc-nd/4.0/).
-### Text of CC-BY-SA-2.5 license
+__Additional Terms: You may only link to this content. Copying, distributing, or modifying the content is not permitted.__
-```
-Creative Commons Attribution-ShareAlike 2.5
-
-CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE.
-
-License
-
-THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-
-BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
-
- 1. Definitions
- a. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License.
- b. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License.
- c. "Licensor" means the individual or entity that offers the Work under the terms of this License.
- d. "Original Author" means the individual or entity who created the Work.
- e. "Work" means the copyrightable work of authorship offered under the terms of this License.
- f. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
- g. "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, ShareAlike.
- 2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws.
- 3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:
- a. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works;
- b. to create and reproduce Derivative Works;
- c. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works;
- d. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works.
- e. For the avoidance of doubt, where the work is a musical composition:
- i. Performance Royalties Under Blanket Licenses. Licensor waives the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work.
- ii. Mechanical Rights and Statutory Royalties. Licensor waives the exclusive right to collect, whether individually or via a music rights society or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions).
- f. Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor waives the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions).
-
- The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved.
- 4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
- a. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any credit as required by clause 4(c), as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any credit as required by clause 4(c), as requested.
- b. You may distribute, publicly display, publicly perform, or publicly digitally perform a Derivative Work only under the terms of this License, a later version of this License with the same License Elements as this License, or a Creative Commons iCommons license that contains the same License Elements as this License (e.g. Attribution-ShareAlike 2.5 Japan). You must include a copy of, or the Uniform Resource Identifier for, this License or other license specified in the previous sentence with every copy or phonorecord of each Derivative Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Derivative Works that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder, and You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Derivative Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Derivative Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Derivative Work itself to be made subject to the terms of this License.
- c. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or (ii) if the Original Author and/or Licensor designate another party or parties (e.g. a sponsor institute, publishing entity, journal) for attribution in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit.
- 5. Representations, Warranties and Disclaimer
-
- UNLESS OTHERWISE AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE MATERIALS, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
- 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- 7. Termination
- a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
- b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.
- 8. Miscellaneous
- a. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
- b. Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
- c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
- d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
- e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
-
-Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor.
-
-Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time.
-
-Creative Commons may be contacted at http://creativecommons.org/.
-```
-
-## Licenses for code examples and snippets
+### Code examples and snippets
Code examples and snippets are in the public domain
([CC0](https://creativecommons.org/publicdomain/zero/1.0/legalcode)). No licensing notice
@@ -197,7 +140,7 @@ express Statement of Purpose.
this CC0 or use of the Work.
```
-#### Doks engine
+#### Doks
MIT License
diff --git a/README.md b/README.md
index d3240fc2..f3f252d5 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,18 @@
-## passkeys.dev
+# passkeys.dev
-docs coming soon
\ No newline at end of file
+## Development
+
+The following dependencies are required to work on passkeys.dev locally:
+
+- [Golang 1.23.x](https://go.dev/dl/)
+- [Hugo v0.140.x](https://gohugo.io/installation/)
+- [markdownlint-cli2](https://github.com/DavidAnson/markdownlint-cli2#install) (installed globally)
+
+Once these are installed, enable pre-commit linting:
+
+1. In the project folder, run `git config core.hooksPath .git-hooks`
+2. Make the hook executable: `chmod a+x .git-hooks/pre-commit`
+
+Then run `hugo server` to start the dev server!
+
+The site will be available locally at http://localhost:1313.
diff --git a/archetypes/default.md b/archetypes/default.md
new file mode 100644
index 00000000..25b67521
--- /dev/null
+++ b/archetypes/default.md
@@ -0,0 +1,5 @@
++++
+date = '{{ .Date }}'
+draft = true
+title = '{{ replace .File.ContentBaseName "-" " " | title }}'
++++
diff --git a/assets/favicon.ico b/assets/favicon.ico
deleted file mode 100644
index 93a383fc..00000000
Binary files a/assets/favicon.ico and /dev/null differ
diff --git a/assets/favicon.png b/assets/favicon.png
deleted file mode 100644
index b907634e..00000000
Binary files a/assets/favicon.png and /dev/null differ
diff --git a/assets/images/default-image.png b/assets/images/default-image.png
deleted file mode 100644
index a34ff9fc..00000000
Binary files a/assets/images/default-image.png and /dev/null differ
diff --git a/assets/img/favicon.png b/assets/img/favicon.png
new file mode 100644
index 00000000..649c93b5
Binary files /dev/null and b/assets/img/favicon.png differ
diff --git a/assets/js/app.js b/assets/js/app.js
deleted file mode 100644
index 9c6c6967..00000000
--- a/assets/js/app.js
+++ /dev/null
@@ -1 +0,0 @@
-/** Custom scripts */
diff --git a/assets/scss/common/_custom.scss b/assets/scss/common/_custom.scss
deleted file mode 100644
index 2816e2ba..00000000
--- a/assets/scss/common/_custom.scss
+++ /dev/null
@@ -1,431 +0,0 @@
-/** Custom styles */
-
-body {
- font-family: "Open Sans", Arial, Helvetica, sans-serif;
-}
-
-::selection {
- background-color: RGB(0 90 156 / 20%);
-}
-
-h2 {
- font-weight: 500;
-}
-
-h3 {
- font-weight: 500;
-}
-
-a {
- color: #004b4e;
-}
-
-.strong {
- font-weight: 500;
-}
-
-.header-bar {
- border-top: 10px solid;
- border-image-source: linear-gradient(90deg, #d39a1e, #004b4e);
- border-image-slice: 1;
-}
-
-[data-bs-theme="dark"] .header-bar {
- border-top: 10px solid;
- border-image-source: linear-gradient(90deg, #d39a1e, #004b4e);
- border-image-slice: 1;
-}
-
-.icon-tabler-inline {
- margin-right: 0.1em;
- margin-left: 0.1em;
-}
-
-/*
-button tweaks
-*/
-
-body .btn-black {
- color: #fff;
- background-color: #000;
- border-color: #000;
-}
-
-body .btn-black:hover {
- color: #000;
- background-color: #fff;
- border-color: #000;
-}
-
-[data-bs-theme="dark"] body .btn-black {
- color: #000 !important;
- background-color: #fff;
- border-color: #fff;
-}
-
-[data-bs-theme="dark"] body .btn-black:hover {
- color: #fff !important;
- background-color: #000;
- border-color: #fff;
-}
-
-
-
-/*
-change bw icons to white in dark mode
-*/
-
-.svg-icon-bw g {
- fill: #000;
-}
-
-[data-bs-theme="dark"] .svg-icon-bw g {
- fill: #fff;
-}
-
-/*
-code snippet tweaks (pre and code)
-*/
-
-code {
- background: #f0f0f0;
-}
-
-pre > .btn-copy {
- background-color: #d39a1e;
- border-color: #004b4e;
-}
-
-pre > .btn-copy:hover {
- background-color: #004b4e;
- border-color: #d39a1e;
-}
-
-pre > .hljs {
- background: #f0f0f0;
-}
-
-.hljs-string {
- color: #0950a4;
-}
-
-summary {
- font-weight: 500;
-}
-
-blockquote {
- font-size: 1rem;
-}
-
-/*
-COLORS
-*/
-.color-twitter-blue {
- color: #1da1f2;
-}
-
-.color-black {
- color: #000;
-}
-
-.color-green {
- color: #198754;
-}
-
-.color-red {
- color: #dc3545
-}
-
-.color-fido-yellow {
- color: #d39a1e
-}
-
-.color-fido-green {
- color: #004b4e
-}
-
-.bg-color-green {
- background-color: #198754;
-}
-
-
-/*
-SPECIFIC PAGE OVERRIDES
-*/
-
-/*
-HEADER MENU
-*/
-
-.offcanvas .nav-link.active {
- color: #004b4e;
- font-weight: 700;
-}
-
-[data-bs-theme="dark"] .offcanvas .nav-link.active {
- color: #d39a1e;
- font-weight: 700;
-}
-
-.offcanvas .nav-link:hover {
- color: #d39a1e;
-}
-
-[data-bs-theme="dark"] .offcanvas .nav-link:hover {
- color: #d39a1e;
-}
-
-/*
-SIDEBAR MENU
-*/
-
-.btn-toggle-nav a.active {
- color: #004b4e;
-}
-
-[data-bs-theme="dark"] .btn-toggle-nav a.active {
- color: #d39a1e;
-}
-
-.btn-toggle-nav a:hover {
- color: #d39a1e;
-}
-
-[data-bs-theme="dark"] .btn-toggle-nav a:hover {
- color: #d39a1e;
-}
-
-/*
-Specific to FAQ content
-*/
-#faq #content > details {
- margin-top: 0.7em;
- margin-bottom: 0.7em;
-}
-
-#faq #content > details > summary {
- font-weight: 600;
- font-size: 1.1em;
-}
-
-.embed-responsive-item {
- aspect-ratio: 16/9;
- width: 100%;
- max-width: 536px;
-}
-
-/*
-Specific to device support page
-*/
-#device-support-table table {
- --#{$prefix}table-bg: #{$light};
-}
-
-[data-bs-theme="dark"] {
- #device-support-table table {
- --#{$prefix}table-bg: #{$dark};
- }
-}
-
-#device-support-table th:first-child,
-td:first-child {
- position: sticky;
- left: 0;
- z-index: 1;
-}
-
-/*
-YouTube preview image on homepage
-*/
-.youtube-preview {
- img {
- width: 90%;
- max-width: 536px;
- height: auto;
- }
-}
-
-
-/** FONTS **/
-
-/** Google Fonts **/
-
-/* open-sans-300 - latin */
-@font-face {
- font-family: "Open Sans";
- font-style: normal;
- font-weight: 300;
- src: url("/fonts/open-sans-v29-latin-300.eot");
- src: local(""),
- url("/fonts/open-sans-v29-latin-300.eot?#iefix") format("embedded-opentype"),
- url("/fonts/open-sans-v29-latin-300.woff2") format("woff2"),
- url("/fonts/open-sans-v29-latin-300.woff") format("woff"),
- url("/fonts/open-sans-v29-latin-300.ttf") format("truetype"),
- url("/fonts/open-sans-v29-latin-300.svg#OpenSans") format("svg");
- font-display: swap;
-}
-
-/* open-sans-regular - latin */
-@font-face {
- font-family: "Open Sans";
- font-style: normal;
- font-weight: 400;
- src: url("/fonts/open-sans-v29-latin-regular.eot");
- src: local(""),
- url("/fonts/open-sans-v29-latin-regular.eot?#iefix") format("embedded-opentype"),
- url("/fonts/open-sans-v29-latin-regular.woff2") format("woff2"),
- url("/fonts/open-sans-v29-latin-regular.woff") format("woff"),
- url("/fonts/open-sans-v29-latin-regular.ttf") format("truetype"),
- url("/fonts/open-sans-v29-latin-regular.svg#OpenSans") format("svg");
- font-display: swap;
-}
-
-/* open-sans-500 - latin */
-@font-face {
- font-family: "Open Sans";
- font-style: normal;
- font-weight: 500;
- src: url("/fonts/open-sans-v29-latin-500.eot");
- src: local(""),
- url("/fonts/open-sans-v29-latin-500.eot?#iefix") format("embedded-opentype"),
- url("/fonts/open-sans-v29-latin-500.woff2") format("woff2"),
- url("/fonts/open-sans-v29-latin-500.woff") format("woff"),
- url("/fonts/open-sans-v29-latin-500.ttf") format("truetype"),
- url("/fonts/open-sans-v29-latin-500.svg#OpenSans") format("svg");
- font-display: swap;
-}
-
-/* open-sans-600 - latin */
-@font-face {
- font-family: "Open Sans";
- font-style: normal;
- font-weight: 600;
- src: url("/fonts/open-sans-v29-latin-600.eot");
- src: local(""),
- url("/fonts/open-sans-v29-latin-600.eot?#iefix") format("embedded-opentype"),
- url("/fonts/open-sans-v29-latin-600.woff2") format("woff2"),
- url("/fonts/open-sans-v29-latin-600.woff") format("woff"),
- url("/fonts/open-sans-v29-latin-600.ttf") format("truetype"),
- url("/fonts/open-sans-v29-latin-600.svg#OpenSans") format("svg");
- font-display: swap;
-}
-
-/* open-sans-700 - latin */
-@font-face {
- font-family: "Open Sans";
- font-style: normal;
- font-weight: 700;
- src: url("/fonts/open-sans-v29-latin-700.eot");
- src: local(""),
- url("/fonts/open-sans-v29-latin-700.eot?#iefix") format("embedded-opentype"),
- url("/fonts/open-sans-v29-latin-700.woff2") format("woff2"),
- url("/fonts/open-sans-v29-latin-700.woff") format("woff"),
- url("/fonts/open-sans-v29-latin-700.ttf") format("truetype"),
- url("/fonts/open-sans-v29-latin-700.svg#OpenSans") format("svg");
- font-display: swap;
-}
-
-/* open-sans-800 - latin */
-@font-face {
- font-family: "Open Sans";
- font-style: normal;
- font-weight: 800;
- src: url("/fonts/open-sans-v29-latin-800.eot");
- src: local(""),
- url("/fonts/open-sans-v29-latin-800.eot?#iefix") format("embedded-opentype"),
- url("/fonts/open-sans-v29-latin-800.woff2") format("woff2"),
- url("/fonts/open-sans-v29-latin-800.woff") format("woff"),
- url("/fonts/open-sans-v29-latin-800.ttf") format("truetype"),
- url("/fonts/open-sans-v29-latin-800.svg#OpenSans") format("svg");
- font-display: swap;
-}
-
-/* open-sans-300italic - latin */
-@font-face {
- font-family: "Open Sans";
- font-style: italic;
- font-weight: 300;
- src: url("/fonts/open-sans-v29-latin-300italic.eot");
- src: local(""),
- url("/fonts/open-sans-v29-latin-300italic.eot?#iefix") format("embedded-opentype"),
- url("/fonts/open-sans-v29-latin-300italic.woff2") format("woff2"),
- url("/fonts/open-sans-v29-latin-300italic.woff") format("woff"),
- url("/fonts/open-sans-v29-latin-300italic.ttf") format("truetype"),
- url("/fonts/open-sans-v29-latin-300italic.svg#OpenSans") format("svg");
- font-display: swap;
-}
-
-/* open-sans-italic - latin */
-@font-face {
- font-family: "Open Sans";
- font-style: italic;
- font-weight: 400;
- src: url("/fonts/open-sans-v29-latin-italic.eot");
- src: local(""),
- url("/fonts/open-sans-v29-latin-italic.eot?#iefix") format("embedded-opentype"),
- url("/fonts/open-sans-v29-latin-italic.woff2") format("woff2"),
- url("/fonts/open-sans-v29-latin-italic.woff") format("woff"),
- url("/fonts/open-sans-v29-latin-italic.ttf") format("truetype"),
- url("/fonts/open-sans-v29-latin-italic.svg#OpenSans") format("svg");
- font-display: swap;
-}
-
-/* open-sans-500italic - latin */
-@font-face {
- font-family: "Open Sans";
- font-style: italic;
- font-weight: 500;
- src: url("/fonts/open-sans-v29-latin-500italic.eot");
- src: local(""),
- url("/fonts/open-sans-v29-latin-500italic.eot?#iefix") format("embedded-opentype"),
- url("/fonts/open-sans-v29-latin-500italic.woff2") format("woff2"),
- url("/fonts/open-sans-v29-latin-500italic.woff") format("woff"),
- url("/fonts/open-sans-v29-latin-500italic.ttf") format("truetype"),
- url("/fonts/open-sans-v29-latin-500italic.svg#OpenSans") format("svg");
- font-display: swap;
-}
-
-/* open-sans-600italic - latin */
-@font-face {
- font-family: "Open Sans";
- font-style: italic;
- font-weight: 600;
- src: url("/fonts/open-sans-v29-latin-600italic.eot");
- src: local(""),
- url("/fonts/open-sans-v29-latin-600italic.eot?#iefix") format("embedded-opentype"),
- url("/fonts/open-sans-v29-latin-600italic.woff2") format("woff2"),
- url("/fonts/open-sans-v29-latin-600italic.woff") format("woff"),
- url("/fonts/open-sans-v29-latin-600italic.ttf") format("truetype"),
- url("/fonts/open-sans-v29-latin-600italic.svg#OpenSans") format("svg");
- font-display: swap;
-}
-
-/* open-sans-700italic - latin */
-@font-face {
- font-family: "Open Sans";
- font-style: italic;
- font-weight: 700;
- src: url("/fonts/open-sans-v29-latin-700italic.eot");
- src: local(""),
- url("/fonts/open-sans-v29-latin-700italic.eot?#iefix") format("embedded-opentype"),
- url("/fonts/open-sans-v29-latin-700italic.woff2") format("woff2"),
- url("/fonts/open-sans-v29-latin-700italic.woff") format("woff"),
- url("/fonts/open-sans-v29-latin-700italic.ttf") format("truetype"),
- url("/fonts/open-sans-v29-latin-700italic.svg#OpenSans") format("svg");
- font-display: swap;
-}
-
-/* open-sans-800italic - latin */
-@font-face {
- font-family: "Open Sans";
- font-style: italic;
- font-weight: 800;
- src: url("/fonts/open-sans-v29-latin-800italic.eot");
- src: local(""),
- url("/fonts/open-sans-v29-latin-800italic.eot?#iefix") format("embedded-opentype"),
- url("/fonts/open-sans-v29-latin-800italic.woff2") format("woff2"),
- url("/fonts/open-sans-v29-latin-800italic.woff") format("woff"),
- url("/fonts/open-sans-v29-latin-800italic.ttf") format("truetype"),
- url("/fonts/open-sans-v29-latin-800italic.svg#OpenSans") format("svg");
- font-display: swap;
-}
diff --git a/assets/scss/common/_variables-custom.scss b/assets/scss/common/_variables-custom.scss
deleted file mode 100644
index 33a8a396..00000000
--- a/assets/scss/common/_variables-custom.scss
+++ /dev/null
@@ -1 +0,0 @@
-/* Put your custom SCSS variables here */
\ No newline at end of file
diff --git a/assets/scss/theme/theme.scss b/assets/scss/theme/theme.scss
new file mode 100644
index 00000000..020cbb46
--- /dev/null
+++ b/assets/scss/theme/theme.scss
@@ -0,0 +1,25 @@
+.navbar-nav .nav-link.active {
+ font-weight: 500;
+}
+
+a:hover {
+ font-weight: bold;
+}
+
+.fade-out-text {
+ background-image: linear-gradient(to left, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1)); /* Adjust gradient direction and colors as needed */
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+@if $enable-dark-mode {
+ @include color-mode(dark) {
+ .fade-out-text {
+ background-image: linear-gradient(to left, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1)); /* Adjust gradient direction and colors as needed */
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ }
+ }
+}
\ No newline at end of file
diff --git a/cf-build.sh b/cf-build.sh
new file mode 100755
index 00000000..1e988f4f
--- /dev/null
+++ b/cf-build.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+if [ "$CF_PAGES_BRANCH" == "production" ]; then
+ git fetch --unshallow && hugo --gc --minify
+
+elif [ "$CF_PAGES_BRANCH" == "staging" ]; then
+ # Adds the CF pages URL as the Hugo base URL
+ git fetch --unshallow && hugo --gc --minify --baseUrl $CF_PAGES_URL
+
+else
+ # Else run the dev script
+ hugo server
+fi
diff --git a/config/_default/hugo.toml b/config/_default/hugo.toml
index 3ea87253..b5bea7d4 100644
--- a/config/_default/hugo.toml
+++ b/config/_default/hugo.toml
@@ -1,85 +1,12 @@
-title = "passkeys.dev"
-baseurl = "https://passkeys.dev/"
-canonifyURLs = true
-disableAliases = true
-disableHugoGeneratorInject = true
-# disableKinds = ["taxonomy", "term"]
-enableEmoji = true
-enableGitInfo = true
-enableRobotsTXT = false
-paginate = 10
-rssLimit = 10
-summarylength = 20 # 70 (default)
-
-# Multilingual
-defaultContentLanguage = "en"
-disableLanguages = []
-defaultContentLanguageInSubdir = false
-
-#copyRight = "Copyright (c) 2023 Hyas"
-
-[build.buildStats]
- enable = true
-
-[outputs]
- home = ["HTML", "RSS", "searchIndex"]
- section = ["HTML", "RSS", "SITEMAP"]
-
-[outputFormats.searchIndex]
- mediaType = "application/json"
- baseName = "search-index"
- isPlainText = true
- notAlternative = true
+baseURL = 'https://passkeys.dev/'
+languageCode = 'en-us'
+title = 'passkeys.dev'
-# Add output format for section sitemap.xml
-[outputFormats.SITEMAP]
-mediaType = "application/xml"
-baseName = "sitemap"
-isHTML = false
-isPlainText = true
-noUgly = true
-rel = "sitemap"
-
-[sitemap]
- changefreq = "weekly"
- filename = "sitemap.xml"
- priority = 0.5
-
-[caches]
- [caches.getjson]
- dir = ":cacheDir/:project"
- maxAge = "30m"
-
-[taxonomies]
- contributor = "contributors"
- category = "categories"
- tag = "tags"
-
-[permalinks]
- blog = "/blog/:slug/"
-## docs = "/docs/:sections[1:]/:slug/"
-# docs = "/docs/1.0/:sections[1:]/:slug/"
-
-[minify.tdewolff.html]
- keepWhitespace = false
+enableGitInfo = true
+enableRobotsTXT = true
-[related]
- threshold = 80
- includeNewer = true
- toLower = false
- [[related.indices]]
- name = "categories"
- weight = 100
- [[related.indices]]
- name = "tags"
- weight = 80
- [[related.indices]]
- name = "date"
- weight = 10
+[build]
+ writeStats = true
-[imaging]
- anchor = "Smart"
- bgColor = "#ffffff"
- hint = "photo"
- quality = 75
- resampleFilter = "Box"
+[[module.imports]]
+ path = 'github.com/gethinode/hinode'
diff --git a/config/_default/languages.toml b/config/_default/languages.toml
index bad0acb3..65d4696a 100644
--- a/config/_default/languages.toml
+++ b/config/_default/languages.toml
@@ -1,9 +1,6 @@
[en]
- languageName = "English"
- contentDir = "content/en"
- weight = 10
- [en.params]
- languageISO = "EN"
- languageTag = "en-US"
- footer = 'Privacy Policy'
- #alertText = 'Doks version 1.0 just shipped!'
\ No newline at end of file
+ languageName = "English"
+ contentDir = "content/en"
+ weight = 1
+ [en.params.head]
+ tagline = "Passkeys Developer Resources"
\ No newline at end of file
diff --git a/config/_default/markup.toml b/config/_default/markup.toml
deleted file mode 100644
index 6eaba1e2..00000000
--- a/config/_default/markup.toml
+++ /dev/null
@@ -1,33 +0,0 @@
-defaultMarkdownHandler = "goldmark"
-
-[goldmark]
- [goldmark.extensions]
- linkify = false
- [goldmark.parser]
- autoHeadingID = true
- autoHeadingIDType = "github"
- [goldmark.parser.attribute]
- block = true
- title = true
- [goldmark.renderer]
- unsafe = true
-
-[highlight]
- anchorLineNos = false
- codeFences = true
- guessSyntax = false
- hl_Lines = ''
- hl_inline = false
- lineAnchors = ''
- lineNoStart = 1
- lineNos = false
- lineNumbersInTable = false
- noClasses = false
- noHl = false
- style = 'monokai'
- tabWidth = 2
-
-[tableOfContents]
- endLevel = 3
- ordered = false
- startLevel = 2
diff --git a/config/_default/menus.toml b/config/_default/menus.toml
deleted file mode 100644
index e69de29b..00000000
diff --git a/config/_default/menus/menus.en.toml b/config/_default/menus/menus.en.toml
index 2941e45f..2d1169f4 100644
--- a/config/_default/menus/menus.en.toml
+++ b/config/_default/menus/menus.en.toml
@@ -1,54 +1,108 @@
+
+[[main]]
+ name = "Docs"
+ pageRef = "/docs/"
+ weight = 10
+
+[[main]]
+ name = "Device Support"
+ pageRef = "/device-support/"
+ weight = 20
+
+[[main]]
+ name = "About"
+ pageRef = "/about/"
+ weight = 30
+
[[main]]
-name = "Docs"
-url = "/docs/intro/what-are-passkeys/"
-# url = "/docs/1.0/prologue/introduction/"
-weight = 10
+ name = "Discussions"
+ pre = "fa fa-comments"
+ url = "https://passkeys.dev/discuss"
+ weight = 110
+ [main.params]
+ icon = true
+
-#[[main]]
-#name = "FAQs"
-#url = "/faq/"
-#weight = 20
+[[main]]
+ name = "GitHub"
+ pre = "fab fa-github"
+ url = "https://github.com/passkeydeveloper"
+ weight = 120
+ [main.params]
+ icon = true
[[main]]
-name = "Device Support"
-url = "/device-support/"
-weight = 30
+ name = "Bluesky"
+ pre = "fab fa-bluesky"
+ url = "https://bsky.app/profile/passkeys.dev"
+ weight = 140
+ [main.params]
+ icon = true
[[main]]
-name = "About"
-url = "/about/"
-weight = 90
-
-[[social]]
-name = "Discussions"
-pre = ''
-url = "https://passkeys.dev/discuss"
-weight = 15
-
-[[social]]
-name = "GitHub"
-pre = ''
-url = "https://github.com/passkeydeveloper/passkeys.dev"
-weight = 20
-
-[[social]]
-name = "Mastodon"
-pre = ''
-url = "https://fosstodon.org/@passkeysdev"
-weight = 30
-
-[[social]]
-name = "X"
-pre = ''
-url = "https://x.com/@passkeysdev"
-weight = 40
-
-[[footer]]
-name = "about passkeys.dev"
-url = "/about/"
-weight = 10
-
-[[footer]]
-name = "Creative Commons license"
-url = "https://passkeys.dev/about/#copyright-and-attributions"
-weight = 15
\ No newline at end of file
+ name = "Mastodon"
+ pre = "fab fa-mastodon"
+ url = "https://fosstodon.org/@passkeysdev"
+ weight = 140
+ [main.params]
+ icon = true
+
+[[footer]]
+ name = "Links"
+ weight = 10
+
+[[footer]]
+ parent = "Links"
+ name = "Docs"
+ pageRef = "/docs/"
+ weight = 10
+
+[[footer]]
+ parent = "Links"
+ name = "About"
+ pageRef = "/about/"
+ weight = 20
+
+[[footer]]
+ parent = "Links"
+ name = "Device Support"
+ pageRef = "/device-support/"
+ weight = 30
+
+[[footer]]
+ name = "Resources"
+ weight = 20
+
+[[footer]]
+ parent = "Resources"
+ name = "Passkey Central"
+ url = "https://passkeycentral.org"
+ weight = 10
+
+[[footer]]
+ parent = "Resources"
+ name = "Dev Discussions"
+ pageRef = "https://passkeys.dev/discuss"
+ weight = 20
+
+[[footer]]
+ parent = "Resources"
+ name = "FIDO Alliance"
+ pageRef = "https://fidoalliance.org"
+ weight = 30
+
+[[footer]]
+ name = "Tools"
+ weight = 30
+
+[[footer]]
+ parent = "Tools"
+ name = "Client Feature Detect"
+ url = "https://featuredetect.passkeys.dev"
+ weight = 10
+
+[[footer]]
+ parent = "Tools"
+ name = "WebAuthn Response Decoder"
+ url = "https://debugger.simplewebauthn.dev/"
+ weight = 20
diff --git a/config/_default/module.toml b/config/_default/module.toml
deleted file mode 100644
index 53615c2a..00000000
--- a/config/_default/module.toml
+++ /dev/null
@@ -1,105 +0,0 @@
-# mounts
-## archetypes
-[[mounts]]
- source = "node_modules/@hyas/doks-core/archetypes"
- target = "archetypes"
-
-[[mounts]]
- source = "archetypes"
- target = "archetypes"
-
-## assets
-[[mounts]]
- source = "node_modules/@hyas/core/assets"
- target = "assets"
-
-[[mounts]]
- source = "node_modules/@hyas/images/assets"
- target = "assets"
- excludeFiles = "/scss/**.scss"
-
-[[mounts]]
- source = "node_modules/@hyas/doks-core/assets"
- target = "assets"
- excludeFiles = ["scss/common/_variables-custom.scss", "scss/common/_custom.scss"]
-
-[[mounts]]
- source = "node_modules/flexsearch"
- target = "assets/js/vendor/flexsearch"
-
-[[mounts]]
- source = "node_modules/katex"
- target = "assets/js/vendor/katex"
-
-[[mounts]]
- source = "node_modules/mermaid"
- target = "assets/js/vendor/mermaid"
-
-[[mounts]]
- source = "node_modules/@tabler/icons/icons"
- target = "assets/svgs/tabler-icons"
-
-[[mounts]]
- source = "assets"
- target = "assets"
-
-## content
-[[mounts]]
- source = "content"
- target = "content"
-
-## data
-[[mounts]]
- source = "node_modules/@hyas/doks-core/data"
- target = "data"
-
-[[mounts]]
- source = "config/_default/hyas"
- target = "data"
-
-[[mounts]]
- source = "data"
- target = "data"
-
-## i18n
-[[mounts]]
- source = "node_modules/@hyas/doks-core/i18n"
- target = "i18n"
-
-[[mounts]]
- source = "i18n"
- target = "i18n"
-
-## layouts
-[[mounts]]
- source = "node_modules/@hyas/core/layouts"
- target = "layouts"
-
-[[mounts]]
- source = "node_modules/@hyas/seo/layouts"
- target = "layouts"
-
-[[mounts]]
- source = "node_modules/@hyas/images/layouts"
- target = "layouts"
-
-[[mounts]]
- source = "node_modules/@hyas/doks-core/layouts"
- target = "layouts"
-
-[[mounts]]
- source = "node_modules/@hyas/inline-svg/layouts"
- target = "layouts"
-
-[[mounts]]
- source = "layouts"
- target = "layouts"
-
-## static
-[[mounts]]
- source = "node_modules/@hyas/doks-core/static"
- target = "static"
-
-[[mounts]]
- source = "static"
- target = "static"
diff --git a/config/_default/params.toml b/config/_default/params.toml
index 4675c4ec..cceedb09 100644
--- a/config/_default/params.toml
+++ b/config/_default/params.toml
@@ -1,142 +1,92 @@
-# Hugo
-title = "passkeys.dev"
-description = "A collection of resources and insights to help you deploy passkeys, including practical user experiences, device ecosystem support, frequently asked questions, and more."
-images = ["cover.png"]
-
-## custom
-themeColor = "#004b4e"
-
-[social]
-twitter = "passkeysdev"
-
-# Doks (@hyas/doks-core)
-[doks]
- # Color mode
- colorMode = "auto" # auto (default), light or dark
- colorModeToggler = true # true (default) or false (this setting is only relevant when colorMode = auto)
-
- # Navbar
- navbarSticky = true # true (default) or false
- containerBreakpoint = "lg" # "", "sm", "md", "lg" (default), "xl", "xxl", or "fluid"
-
- ## Button
- navBarButton = false # false (default) or true
- navBarButtonUrl = "/docs/prologue/introduction/"
- navBarButtonText = "Get started"
-
- # FlexSearch
- flexSearch = true # true (default) or false
- searchExclKinds = [] # list of page kinds to exclude from search indexing (e.g. ["home", "taxonomy", "term"] )
- searchExclTypes = [] # list of content types to exclude from search indexing (e.g. ["blog", "docs", "legal", "contributors", "categories"])
- showSearch = [] # [] (all pages, default) or homepage (optionally) and list of sections (e.g. ["homepage", "blog", "guides"])
- indexSummary = false # true or false (default); whether to index only the `.Summary` instead of the full `.Content`; limits the respective JSON field size and thus increases loading time
-
- ## Search results
- showDate = false # false (default) or true
- showSummary = true # true (default) or false
- searchLimit = 99 # 0 (no limit, default) or natural number
-
- # Global alert
- alert = false # false (default) or true
- alertDismissable = true # true (default) or false
-
- # Bootstrap
- bootstrapJavascript = false # false (default) or true
-
- # Nav
- sectionNav = ["docs", "guides"] # ["docs"] (default) or list of sections (e.g. ["docs", "guides"])
- toTopButton = false # false (default) or true
- breadcrumbTrail = false # false (default) or true
- headlineHash = true # true (default) or false
- scrollSpy = true # true (default) or false
-
- # Multilingual
- multilingualMode = false # false (default) or true
- showMissingLanguages = false # whether or not to show untranslated languages in the language menu; true (default) or false
-
- # Versioning
- docsVersioning = false # false (default) or true
- docsVersion = "1.0"
-
- # UX
- headerBar = true # true (default) or false
- backgroundDots = true # true (default) or false
-
- # Homepage
- sectionFooter = true # false (default) or true
-
- # Blog
- relatedPosts = false # false (default) or true
- imageList = true # true (default) or false
- imageSingle = true # true (default) or false
-
- # KaTex
- katex = false
-
- # Repository
- editPage = false # false (default) or true
- lastMod = false # false (default) or true
- repoHost = "GitHub" # GitHub (default), Gitea, GitLab, Bitbucket, or BitbucketServer
- docsRepo = "https://github.com/passkeydeveloper/passkeys.dev"
- docsRepoBranch = "main" # main (default), master, or
- docsRepoSubPath = "" # "" (none, default) or
-
- # SCSS colors
- # backGround = "yellowgreen"
- ## Dark theme
- # textDark = "#dee2e6" # "#dee2e6" (default), "#dee2e6" (orignal), or custom color
- # accentDark = "#5d2f86" # "#5d2f86" (default), "#5d2f86" (original), or custom color
- ## Light theme
- # textLight = "#1d2d35" # "#1d2d35" (default), "#1d2d35" (orignal), or custom color
- # accentLight = "#8ed6fb" # "#8ed6fb" (default), "#8ed6fb" (orignal), or custom color
-
- [doks.menu]
- [doks.menu.section]
- auto = true # true (default) or false
- collapsibleSidebar = true # true (default) or false
-
-# Debug
-[render_hooks.image]
- errorLevel = 'ignore' # ignore (default), warning, or error (fails the build)
-
-[render_hooks.link]
- errorLevel = 'ignore' # ignore (default), warning, or error (fails the build)
- highlightBroken = false # true or false (default)
-
-# Images (@hyas/images)
-[hyas_images]
- [hyas_images.landscape]
- normalize = "1360x765" # "1600x900" (default)
- lqip = "16x9" # "16x9" (default)
- widths = [480, 640, 800, 1024]
- [hyas_images.portrait]
- normalize = "765x1360" # "900x1600" (default)
- lqip = "9x16" # "9x16" (default)
- widths = [480, 640, 800, 1024]
-
-# Inline SVG (@hyas/inline-svg)
-[inline_svg]
- iconSetDir = "tabler-icons" # "tabler-icons" (default)
-
-# SEO (@hyas/seo)
-[seo]
- [seo.title]
- separator = " | "
- suffix = ""
- [seo.favicons]
- sizes = []
- icon = "favicon.png" # favicon.png (default)
- svgIcon = "favicon.svg" # favicon.svg (default)
- maskIcon = "mask-icon.svg" # mask-icon.svg (default)
- maskIconColor = "white" # white (default)
- [seo.schemas]
- type = "Organization" # Organization (default) or Person
- logo = "favicon-512x512.png" # Logo of Organization — favicon-512x512.png (default)
- name = "Hyas" # Name of Organization or Person
- sameAs = [] # E.g. ["https://github.com/gethyas/hyas", "https://fosstodon.org/@hyas"]
- images = ["cover.png"] # ["cover.png"] (default)
- article = [] # Article sections
- newsArticle = [] # NewsArticle sections
- blogPosting = ["blog"] # BlogPosting sections
- product = [] # Product sections
-
+[style]
+ primary = "#006b60"
+
+[main]
+
+ description = "A collection of resources and insights to help you deploy passkeys, including practical user experiences, device ecosystem support, frequently asked questions, and more."
+ images = ["/img/share-cover.png"]
+
+[main.externalLinks]
+ cue = false
+ tab = true
+
+[navigation]
+ logo = "/img/logos/pdd-logo-color-nopad-light.svg"
+ title = "passkeys.dev"
+ breadcrumb = false
+ toc = true
+ sidebar = true
+ fixed = true
+
+[footer]
+ license = 'CC BY-NC-ND 4.0'
+ description = 'This site is brought to you by members of the W3C WebAuthn Community Adoption Group and the FIDO Alliance.'
+
+[favicon]
+ logo = "img/favicon.png"
+ sizes = [16, 32, 48]
+
+
+[schema]
+ type = "Organization"
+ name = "passkeys.dev"
+ locale = "en-US"
+ github = "https://github.com/passkeydeveloper/passkeys.dev"
+ [logo]
+ url = "img/share-cover.png"
+ width = 1280
+ height = 640
+ [image]
+ url = "img/share-cover.png"
+ width = 1280
+ height = 640
+
+[opengraph]
+ images = ["/img/logo.png"]
+ locale = "en_US"
+
+[docs]
+ github = "https://github.com/passkeydeveloper/passkeys.dev"
+
+[sharing]
+ enabled = true
+ sort = "weight"
+ reverse = false
+ webshare = true
+
+[[sharing.providers]]
+ name = "link"
+ url = "{url}"
+ icon = "fas link"
+ weight = 10
+ clipboard = true
+
+[[sharing.providers]]
+ name = "Bluesky"
+ url = "https://bsky.app/intent/compose?text={url}"
+ icon = "fab bluesky"
+ weight = 20
+
+[[sharing.providers]]
+ name = "Mastodon"
+ url = "https://s2f.kytta.dev/?text={url}"
+ icon = "fab mastodon"
+ weight = 30
+
+[[sharing.providers]]
+ name = "LinkedIn"
+ url = "https://www.linkedin.com/sharing/share-offsite/?url={url}"
+ icon = "fab linkedin"
+ weight = 40
+
+[[sharing.providers]]
+ name = "Threads"
+ url = "https://www.threads.net/intent/post?text={url}"
+ icon = "fab threads"
+ weight = 50
+
+[[sharing.providers]]
+ name = "WhatsApp"
+ url = "whatsapp://send?text={title}%20{url}"
+ icon = "fab whatsapp"
+ weight = 60
diff --git a/config/babel.config.js b/config/babel.config.js
deleted file mode 100644
index 9bfc128c..00000000
--- a/config/babel.config.js
+++ /dev/null
@@ -1,18 +0,0 @@
-module.exports = {
- presets: [
- [
- '@babel/preset-env',
- {
- targets: {
- browsers: [
- // Best practice: https://github.com/babel/babel/issues/7789
- '>=1%',
- 'not ie 11',
- 'not op_mini all',
- ],
- },
- },
- ],
- ],
- };
-
\ No newline at end of file
diff --git a/config/development/config.toml b/config/development/config.toml
deleted file mode 100644
index 67b14e98..00000000
--- a/config/development/config.toml
+++ /dev/null
@@ -1,3 +0,0 @@
-# Overrides for production environment
-canonifyURLs = true
-baseurl = "/"
diff --git a/config/next/config.toml b/config/next/config.toml
deleted file mode 100644
index a130ff0f..00000000
--- a/config/next/config.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-# Overrides for next environment
-canonifyURLs = false
diff --git a/config/postcss.config.js b/config/postcss.config.js
deleted file mode 100644
index 1cc2d54e..00000000
--- a/config/postcss.config.js
+++ /dev/null
@@ -1,58 +0,0 @@
-const autoprefixer = require('autoprefixer');
-const purgecss = require('@fullhuman/postcss-purgecss');
-const whitelister = require('purgecss-whitelister');
-
-module.exports = {
- plugins: [
- autoprefixer(),
- purgecss({
- content: [ './hugo_stats.json' ],
- extractors: [
- {
- extractor: (content) => {
- const els = JSON.parse(content).htmlElements;
- return els.tags.concat(els.classes, els.ids);
- },
- extensions: ['json'],
- },
- ],
- dynamicAttributes: [
- 'aria-expanded',
- 'data-bs-popper',
- 'data-bs-target',
- 'data-bs-theme',
- 'data-dark-mode',
- 'data-global-alert',
- 'data-pane', // tabs.js
- 'data-popper-placement',
- 'data-sizes',
- 'data-toggle-tab', // tabs.js
- 'id',
- 'size',
- 'type',
- ],
- safelist: [
- 'active',
- 'btn-clipboard', // clipboards.js
- 'clipboard', // clipboards.js
- 'disabled',
- 'hidden',
- 'modal-backdrop', // search-modal.js
- 'selected', // search-modal.js
- 'show',
- 'img-fluid',
- 'blur-up',
- 'lazyloaded',
- 'container-fw ',
- ...whitelister([
- './assets/scss/**/*.css',
- './assets/scss/**/*.scss',
- // './node_modules/katex/dist/katex.css',
- './node_modules/@hyas/doks-core/assets/scss/components/_code.scss',
- './node_modules/@hyas/doks-core/assets/scss/components/_expressive-code.scss',
- './node_modules/@hyas/doks-core/assets/scss/common/_syntax.scss',
- ]),
- ],
- }),
- ],
-}
diff --git a/config/production/config.toml b/config/production/config.toml
index 9310827f..0735bd9e 100644
--- a/config/production/config.toml
+++ b/config/production/config.toml
@@ -1,3 +1,3 @@
# Overrides for production environment
canonifyURLs = true
-baseurl = "https://passkeys.dev/"
+baseurl = "https://passkeys.dev/"
\ No newline at end of file
diff --git a/content/_index.en.md b/content/_index.en.md
deleted file mode 100644
index a0d5f0b5..00000000
--- a/content/_index.en.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title : "Passkey Developer Resources"
-description: "Hello passkeys, goodbye passwords! passkeys.dev is a collection of resources and insights to help you deploy passkeys, including practical user experiences, device ecosystem support, frequently asked questions, and more."
-lead: "Hello passkeys, goodbye passwords! passkeys.dev is a collection of resources and insights to help you deploy passkeys, including practical user experiences, device ecosystem support, frequently asked questions, and more."
-date: 2020-10-06T08:47:36+00:00
-draft: false
-images: []
----
diff --git a/content/about/_index.md b/content/about/_index.md
deleted file mode 100644
index 7ad66dcd..00000000
--- a/content/about/_index.md
+++ /dev/null
@@ -1,91 +0,0 @@
----
-layout: fullpage
-title: "About"
-description: "About passkeys.dev"
-date: 2022-09-26T19:48:01.955Z
-draft: false
-images: []
----
-
-passkeys.dev is brought to you by the [W3C WebAuthn Community Adoption Group](https://www.w3.org/community/webauthn-adoption/) and members of the [FIDO Alliance](https://fidoalliance.org/).
-
-
-
-## Engage and Contribute
-
-W3C WebAuthn Community Adoption Group {{< icon-external-link size=24 >}}
-
-GitHub {{< icon-external-link size=24 >}}
-
-Suggest content or report a site issue {{< icon-external-link size=24 >}}
-
-Passkeys Developer Discussions (passkeys.dev/discuss) {{< icon-external-link size=24 >}}
-
-Mastodon {{< icon-brand-mastodon size=24 >}}
-
-- Passkeys Developer {{< icon-external-link size=24 >}}
-- W3C Developers {{< icon-external-link size=24 >}}
-
-X (Twitter)
-
-- Passkeys Dev {{< icon-external-link size=24 >}}
-- FIDO Alliance {{< icon-external-link size=24 >}}
-- W3C Developers {{< icon-external-link size=24 >}}
-
-### Contribute
-
-Contributing guidance coming soon!
-
-## Maintainers
-
-Tim Cappalli |
-{{< icon-external-link size=24 >}}
-{{< icon-brand-mastodon size=24 >}}
-{{< icon-brand-threads size=24 >}}
-{{< icon-home-check size=24 >}}
-
-Matthew Miller |
-{{< icon-external-link size=24 >}}
-{{< icon-brand-mastodon size=24 >}}
-{{< icon-home-check size=24 >}}
-
-## Contributors
-
-- Anders Åberg
-- Dirk Balfanz
-- Arnar Birgisson
-- Christiaan Brand
-- Garrett Davidson
-- Jesse Endahl
-- Eiji Kitamura {{< icon-external-link size=24 >}}
-- Akshay Kumar
-- Dominique Hazael-Massieux {{< icon-external-link size=24 >}}
-- Jeff Hodges
-- Adam Langley
-- Ricky Mondello
-- Maud Nalpas {{< icon-external-link size=24 >}}
-- Cody Salas
-
-## Copyright and Attributions
-
-Unless otherwise indicated, passkeys.dev content is available under the terms of the [Creative Commons Attribution-ShareAlike](https://creativecommons.org/licenses/by-sa/2.5/) license (CC-BY-SA), v2.5 or any later version.
-
-Code samples are in the [public domain CC0](https://creativecommons.org/publicdomain/zero/1.0/). No licensing notice is necessary but if you need one, you can use: `Any copyright is dedicated to the Public Domain: https://creativecommons.org/publicdomain/zero/1.0/`.
-
-### Other Attributions
-
-**passkeys.dev is powered by [Doks](https://getdoks.org/) and [Hugo](https://gohugo.io/). Special thanks to [Henk Verlinde](https://github.com/h-enk).**
-
-AirDrop, Apple, iPadOS, iCloud Keychain, iPhone, MacBook, and macOS are trademarks of Apple Inc., registered in the U.S. and other countries and regions.
-
-Android and ChromeOS are trademarks of Google LLC.
-
-Ubuntu is a trademark of Canonical Limited and is used under license.
-
-Windows is a registered trademark of Microsoft Corporation in the United States and/or other countries.
-
-The passkey icon is a trademark of FIDO Alliance, Inc.
-
-FIDO® is a trademark (registered in numerous countries) of FIDO Alliance, Inc.
diff --git a/content/about/roadmap.md b/content/about/roadmap.md
deleted file mode 100644
index a1b7164d..00000000
--- a/content/about/roadmap.md
+++ /dev/null
@@ -1,64 +0,0 @@
----
-title: "Site Roadmap"
-description: "Future content and feature plans for passkeys.dev"
-date: 2022-10-11T01:20:36.292Z
-lastmod: 2022-10-17T04:29:19.336Z
-draft: false
-images: []
----
-
-## Content and Tools
-
-
-
-
-
-
Item
-
Type
-
Estimated Arrival
-
-
-
-
Front End Requirements
-
Content
-
Q3CY23
-
-
-
Back End Requirements
-
Content
-
Q3CY23
-
-
-
Security Considerations
-
Content
-
Q3CY23
-
-
-
Frequently Asked Questions
-
Content
-
H2CY23
-
-
-
Deployment Considerations: Consumer Services
-
Content
-
H2CY23
-
-
-
Deployment Considerations: High Value and Regulated Consumer
-
Content
-
2HCY23
-
-
-
Deployment Considerations: Work/School
-
Content
-
H2CY23
-
-
-
Persona-based demo site
-
Demo
-
H2CY23
-
-
-
-
-You can request content by [creating an issue on GitHub ](https://github.com/passkeydeveloper/passkeys.dev/issues/new/choose) (select the New Content Suggestion option).
diff --git a/content/device-support/_index.md b/content/device-support/_index.md
deleted file mode 100644
index 5fff4095..00000000
--- a/content/device-support/_index.md
+++ /dev/null
@@ -1,705 +0,0 @@
----
-layout: fullpage
-title: "Device Support"
-description: "Detailed information about passkey support across devices and ecosystems"
-lead: ""
-date: 2022-08-05T18:08:48.678Z
-draft: false
-images: []
-weight: 100
----
-
-This page, along with the rest of passkeys.dev, is targeted at relying party developers and is not intended to be an end user facing resource.
-
-> Said differently, **please don’t link to this page from end user focused resources** 😉
-
-## Overview
-
-Support for passkeys is currently rolling out across major operating systems and browsers. This page will be updated as the ecosystem evolves. The [matrix below](#matrix) maps out the various features that support the passkey experience. Additional information about each platform is available in the [Reference section of Docs](/docs/reference/android).
-
-Passkeys created in **iOS or iPadOS** can be used on:
-
-- The same iPhone or iPad
-- iPhones and iPads using the same Apple ID (synced automatically)
-- Macs using the same Apple ID (synced automatically)
-- Macs using [FIDO Cross-Device Authentication](/docs/reference/terms/#cross-device-authentication-cda)
-- Windows devices using [FIDO Cross-Device Authentication](/docs/reference/terms/#cross-device-authentication-cda)
-- Chromebooks and other ChromeOS devices using [FIDO Cross-Device Authentication](/docs/reference/terms/#cross-device-authentication-cda)
-- Ubuntu devices in Edge and Chrome using [FIDO Cross-Device Authentication](/docs/reference/terms/#cross-device-authentication-cda)
-
-Passkeys created in **Android** can be used on:
-
-- The same Android device
-- Android devices using the same Google account (synced automatically)
-- Macs using [FIDO Cross-Device Authentication](/docs/reference/terms/#cross-device-authentication-cda)
-- Windows devices using [FIDO Cross-Device Authentication](/docs/reference/terms/#cross-device-authentication-cda)
-- iPhones and iPads using [FIDO Cross-Device Authentication](/docs/reference/terms/#cross-device-authentication-cda)
-- Chromebooks and other ChromeOS devices using [FIDO Cross-Device Authentication](/docs/reference/terms/#cross-device-authentication-cda)
-- Ubuntu devices in Edge and Chrome using [FIDO Cross-Device Authentication](/docs/reference/terms/#cross-device-authentication-cda)
-
-Passkeys created in **macOS** can be used on:
-
-- Macs using the same Apple ID (synced automatically)
-- iPhones and iPads using the same Apple ID (synced automatically)
- - Passkeys created on a Mac and synced to an iPhone and/or iPad via iCloud Keychain can be used in all the places listed above under "iOS or iPadOS"
-
-[Device-bound passkeys](/docs/reference/terms/#device-bound-passkey) created in **Windows** can be used on:
-
-- the same Windows device that created them
-
-## Matrix
-
-
diff --git a/content/docs/_index.md b/content/docs/_index.md
deleted file mode 100644
index 9f778c29..00000000
--- a/content/docs/_index.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-title : "Docs"
-description: "Docs Doks."
-lead: ""
-date: 2020-10-06T08:48:23+00:00
-draft: false
-images: []
-sidebar:
- collapsed: true
----
diff --git a/content/docs/demos-examples/_index.md b/content/docs/demos-examples/_index.md
deleted file mode 100644
index 880e9eda..00000000
--- a/content/docs/demos-examples/_index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title : "Demos & Examples"
-description: "Resources for demoing and testing passkeys"
-lead: ""
-date: 2023-09-19T16:40:11.007Z
-draft: false
-images: []
-weight: 1100
-sidebar:
- collapsed: true
----
diff --git a/content/docs/demos-examples/active-deployments.md b/content/docs/demos-examples/active-deployments.md
deleted file mode 100644
index a36e3032..00000000
--- a/content/docs/demos-examples/active-deployments.md
+++ /dev/null
@@ -1,34 +0,0 @@
----
-title: "Active Deployments"
-description: "Known live deployments of services offering sign in with passkeys"
-lead: "Some examples of live services that offer sign-in with passkeys."
-date: 2023-09-19T15:33:17.279Z
-draft: false
-images: []
-menu:
- docs:
- parent: "tools-libraries"
-weight: 1110
-toc: false
-layout: matrix
----
-
-The table below lists a few known active passkeys deployments which largely follow best practices and patterns. Its purpose is to provide developers with real-world examples and is not intended to be an end user facing resource.
-
-> Said differently, please don't link to this page from end user focused resources 😉
-
-
-| Service Name | Service Type | Web Support | App Support | Notes | Links |
-|---------------------------------------------------|-----------------------|-------------|-------------|---------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------|
-| [Air New Zealand](https://www.airnewzealand.com/) | Travel | ✅ | ❌ | | [Support](https://www.airnewzealand.com/cyber-security-account-protection) |
-| [Best Buy](https://www.bestbuy.com) | Retail | ✅ | ❌ | | |
-| [GitHub](https://github.com) | Software as a Service | ✅ | ✅ | | [Support](https://docs.github.com/en/authentication/authenticating-with-a-passkey/about-passkeys) |
-| [Google](https://accounts.google.com) | Software as a Service | ✅ | ✅ | | [Support](https://support.google.com/accounts/answer/13548313?hl=en) |
-| [Hancock](https://hancock.ink/) | Software as a Service | ✅ | n/a | | |
-| [Hyatt](https://hyatt.com) | Travel | ✅ | ❌ | | [Support](https://www.hyatt.com/en-US/member/passkey/what-is-passkey) |
-| [Kayak](https://www.kayak.com/) | Travel | ✅ | ✅ | | |
-| [Nintendo](https://www.nintendo.com/) | Gaming | ✅ | ✅ | | [Support](https://en-americas-support.nintendo.com/app/answers/detail/a_id/62531) |
-| [PayPal](https://www.paypal.com/) | Finance | ✅ | ✅ | | [Support](https://www.paypal.com/us/cshelp/article/what-is-a-passkey-and-how-do-i-use-it-to-log-in-to-my-paypal-account-help997) |
-| [Shop](https://shop.app/) | Finance | ✅ | ✅ | | [Support](https://help.shop.app/hc/en-us/articles/12637752526868-Set-up-a-Shop-Passkey) |
-| [TikTok](https://www.tiktok.com/) | Social Media | ☑️ | ❓ | * Asia, Africa, Australia, and South America only | [Support](https://support.tiktok.com/en/log-in-troubleshoot/log-in/log-in-with-a-passkey) |
-| [Zoho](https://www.zoho.com/) | Software as a Service | ✅ | ✅ | | [Support](https://help.zoho.com/portal/en/kb/accounts/sign-in-za/articles/passkey) |
diff --git a/content/docs/demos-examples/demos.md b/content/docs/demos-examples/demos.md
deleted file mode 100644
index 7fbff866..00000000
--- a/content/docs/demos-examples/demos.md
+++ /dev/null
@@ -1,25 +0,0 @@
----
-title: "Demo Sites & Services"
-description: "Sites and services to demo passkeys"
-lead: "Sites and services to demo passkeys"
-date: 2023-09-19T16:45:00.148Z
-draft: false
-images: []
-menu:
- docs:
- parent: "demos-examples"
-weight: 1120
-toc: true
----
-
-## General Passkey Demo Sites
-
-- [webauthn.io](https://webauthn.io)
-
-## Vendor Demo Sites
-
-These demo sites have been created and are maintained by FIDO2/WebAuthn vendors in the industry.
-
-- [passkeys.io (Hanko)](https://www.passkeys.io/)
-- [passkeys.guru (Descope)](https://passkeys.guru/)
-- [passkey.org (Yubico)](https://passkey.org)
diff --git a/content/docs/implement/_index.md b/content/docs/implement/_index.md
deleted file mode 100644
index c0312737..00000000
--- a/content/docs/implement/_index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title : "Implement"
-description: "Implement passkeys"
-lead: ""
-date: 2022-09-24T15:57:34.857Z
-draft: true
-images: []
-weight: 500
-sidebar:
- collapsed: true
----
diff --git a/content/docs/implement/requirements.md b/content/docs/implement/requirements.md
deleted file mode 100644
index 9a1a0668..00000000
--- a/content/docs/implement/requirements.md
+++ /dev/null
@@ -1,27 +0,0 @@
----
-title: "Requirements"
-description: ""
-lead: ""
-date: 2022-09-24T16:02:27.390Z
-draft: true
-images: []
-menu:
- docs:
- parent: "implement"
-weight: 501
-toc: true
----
-
-## Back End
-
-Your back end will need to generate a challenge, and a set of configuration parameters for WebAuthn.
-
-This challenge
-
-### Session Data
-
-### Persistent Data
-
-Each passkey will
-
-## Front End
diff --git a/content/docs/intro/_index.md b/content/docs/intro/_index.md
deleted file mode 100644
index 0c10f461..00000000
--- a/content/docs/intro/_index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title : "Intro"
-description: "Intro to passkeys"
-lead: ""
-date: 2022-09-24T15:57:34.857Z
-draft: false
-images: []
-weight: 100
-sidebar:
- collapsed: true
----
diff --git a/content/docs/intro/what-are-passkeys.md b/content/docs/intro/what-are-passkeys.md
deleted file mode 100644
index 3b839280..00000000
--- a/content/docs/intro/what-are-passkeys.md
+++ /dev/null
@@ -1,27 +0,0 @@
----
-title: "What are passkeys?"
-description: "Passkeys are a replacement for passwords. A password is something that can be remembered and typed, and a passkey is a secret stored on one’s devices, unlocked with biometrics."
-lead: "Passkeys are a replacement for passwords. A password is something that can be remembered and typed, and a passkey is a secret stored on one’s devices, unlocked with biometrics."
-date: 2022-09-24T16:02:27.390Z
-draft: false
-images: []
-menu:
- docs:
- parent: "intro"
-weight: 102
-toc: true
----
-
-Passkeys are:
-
-**Intuitive** Creating and using passkeys is as simple as consenting to save and use them. No having to create a password.
-
-**Automatically unique per-service** By design, passkeys are unique per-service. There’s no chance to reuse them.
-
-**Breach-resistant** A passkey is only stored on a user’s devices. [Relying Party (RP)](/docs/reference/terms/#relying-party-rp) servers store public keys. Even servers that assist in the syncing of passkeys across a user’s devices never have the ability to view or use the private keys for a user's passkeys.
-
-**Phishing-resistant** Rather than trust being rooted in a human who has to verify they’re signing into the right website or app, browser, and operating systems enforce that passkeys are only ever used for the appropriate service.
-
-
-
-> The guidance on this site is currently targeted towards sites and services that are using either password only or password + OTP (SMS, app TOTP, app push, magic link) sign in flows. Future guidance will include more advanced and higher assurance scenarios.
diff --git a/content/docs/reference/_index.md b/content/docs/reference/_index.md
deleted file mode 100644
index 5d78af68..00000000
--- a/content/docs/reference/_index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: "Reference"
-description: ""
-lead: ""
-date: 2020-10-06T08:49:15+00:00
-draft: false
-images: []
-weight: 1000
-sidebar:
- collapsed: true
----
diff --git a/content/docs/reference/chromeos.md b/content/docs/reference/chromeos.md
deleted file mode 100644
index 8e59b8bc..00000000
--- a/content/docs/reference/chromeos.md
+++ /dev/null
@@ -1,29 +0,0 @@
----
-title: "Chrome OS"
-description: "Resources for passkeys in Google's Chrome OS"
-lead: "Resources for passkeys in Google's Chrome OS"
-date: 2022-09-03T16:09:38.358Z
-draft: false
-images: []
-menu:
- docs:
- parent: "reference"
-weight: 1002
-toc: true
----
-
-{{% ds-cda %}}
-
-## Overview
-
-Creation of passkeys in Chrome OS is not currently supported.
-
-Passkeys from Android, iOS, and iPadOS can be used to sign in to web services on Chrome OS using [FIDO Cross-Device Authentication](../terms#cross-device-authentication-cda).
-
-## Platform Notes
-
-> Coming Soon
-
-## Resources
-
-> Coming Soon
diff --git a/content/docs/reference/known-issues.md b/content/docs/reference/known-issues.md
deleted file mode 100644
index def9a722..00000000
--- a/content/docs/reference/known-issues.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-title: "Known Issues"
-description: "A list of known issues with passkey implementations"
-date: 2022-09-03T16:09:38.358Z
-draft: false
-images: []
-menu:
- docs:
- parent: "reference"
-weight: 1101
-toc: false
-layout: matrix
----
-
-
-## User Verification
-
-The following list of passkey providers have not implemented [User Verification](../terms#user-verification-uv) in a spec-compliant manner.
-
-| **Provider** | **Architecture** | **UV Required Behavior** | **UV Flag** |
-| ------------ | ---------------- | ----------------------------- | ------------------------ |
-| 1Password | Extension | ❌ Handles request without UV | ❌ Always replies `True` |
-| 1Password | Native | ✅ Performs UV | ✅ UV flag accurate |
-| Bitwarden | Extension | ❌ Handles request without UV | ❌ Always replies `True` |
-| KeepassXC | Extension | ❌ Handles request without UV | ❌ Always replies `True` |
-| Proton Pass | Extension | ❌ Handles request without UV | ❌ Always replies `True` |
-| Proton Pass | Native | ❌ Handles request without UV | ❌ Always replies `True` |
-| Strongbox | Native | ❌ Handles request without UV | ❌ Always replies `True` |
-
-> **Architecture**: `Extension` = web browser extension, `Native` = OS native app using provider APIs
diff --git a/content/docs/tools-libraries/_index.md b/content/docs/tools-libraries/_index.md
deleted file mode 100644
index ed744f4d..00000000
--- a/content/docs/tools-libraries/_index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title : "Tools & Libraries"
-description: "Tools and libraries for FIDO2, WebAuthn, and passkeys"
-lead: "Tools and libraries for FIDO2, WebAuthn, and passkeys"
-date: 2022-09-24T15:57:34.857Z
-draft: false
-images: []
-weight: 700
-sidebar:
- collapsed: true
----
diff --git a/content/docs/use-cases/_index.md b/content/docs/use-cases/_index.md
deleted file mode 100644
index 33664237..00000000
--- a/content/docs/use-cases/_index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title : "Use Cases"
-description: "Implement passkeys"
-lead: ""
-date: 2022-09-28T18:53:38.996Z
-draft: false
-images: []
-weight: 300
-sidebar:
- collapsed: true
----
diff --git a/content/en/_index.md b/content/en/_index.md
new file mode 100644
index 00000000..9fd91050
--- /dev/null
+++ b/content/en/_index.md
@@ -0,0 +1,10 @@
+---
+title: Passkeys Developer Resources
+description: Hello passkeys! Goodbye passwords.
+actions:
+ getstarted:
+ url: "docs/intro/what-are-passkeys/"
+ title: "Get Started"
+ icon: "fas book-open"
+ weight: 1
+---
\ No newline at end of file
diff --git a/content/en/about/_index.md b/content/en/about/_index.md
new file mode 100644
index 00000000..02b5877d
--- /dev/null
+++ b/content/en/about/_index.md
@@ -0,0 +1,82 @@
+---
+title: About passkeys.dev
+description: A chronological overview of key releases since the initial launch of Hinode.
+layout: minimal
+type: minimal
+---
+
+passkeys.dev is brought to you by members of the [W3C WebAuthn Community Adoption Group](https://www.w3.org/community/webauthn-adoption/) and the [FIDO Alliance](https://fidoalliance.org/).
+
+## Engage and Contribute
+
+{{< card-group padding="3" gutter="3" wrapper="mt-4 mb-4" cols="2">}}
+ {{< card title="Ask & Discuss" icon="fa fa-comments" >}}
+
+- [W3C WebAuthn Community Adoption Group](https://www.w3.org/community/webauthn-adoption/)
+- [Passkeys Developer Discussions (passkeys.dev/discuss)](https://github.com/orgs/passkeydeveloper/discussions)
+ {{< /card >}}
+ {{< card title="Github" icon="fab github" >}}
+- [Suggest content or report a site issue](https://github.com/passkeydeveloper/passkeys.dev/issues/new/choose)
+ {{< /card >}}
+ {{< card title="Bluesky" icon="fab bluesky" >}}
+- [Passkeys Developer](https://fosstodon.org/@passkeysdev)
+ {{< /card >}}
+ {{< card title="Mastodon" icon="fab mastodon" >}}
+- [Passkeys Developer](https://fosstodon.org/@passkeysdev)
+- [W3C Developer](https://w3c.social/@w3cdevs)
+ {{< /card >}}
+{{< /card-group >}}
+
+Contributing guidance coming soon!
+
+## Maintainers
+
+Tim Cappalli
+[{{< fab fa-github >}}](https://github.com/timcappalli)
+[{{< fab fa-mastodon >}}](https://infosec.exchange/@timcappalli)
+[{{< fas fa-at >}}](https://www.threads.net/@timcappalli)
+[{{< fas fa-house >}}](https://timcappalli.me/)
+
+Matthew Miller
+[{{< fab fa-github >}}](https://github.com/MasterKale)
+[{{< fab fa-mastodon >}}](https://infosec.exchange/@iamkale)
+[{{< fas fa-house >}}](https://millerti.me/)
+
+## Contributors
+
+- Anders Åberg
+- Dirk Balfanz
+- Arnar Birgisson
+- Christiaan Brand
+- Garrett Davidson
+- Jesse Endahl
+- Eiji Kitamura [{{< fab github >}}](https://github.com/agektmr)
+- Akshay Kumar
+- Dominique Hazael-Massieux [{{< fab github >}}](https://github.com/dontcallmedom)
+- Jeff Hodges
+- Adam Langley
+- Ricky Mondello
+- Maud Nalpas [{{< fab github >}}](https://github.com/maudnals)
+- Cody Salas
+
+## Copyright and Attributions
+
+Unless otherwise indicated, passkeys.dev content is licensed under a [Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License](https://creativecommons.org/licenses/by-nc-nd/4.0/). Additional Terms: You may only link to this content. Copying, distributing, or modifying the content is not permitted.
+
+Code samples are in the [public domain CC0](https://creativecommons.org/publicdomain/zero/1.0/). No licensing notice is necessary but if you need one, you can use: `Any copyright is dedicated to the Public Domain: https://creativecommons.org/publicdomain/zero/1.0/`.
+
+### Other Attributions
+
+**passkeys.dev is powered by [Hinode](https://gethinode.com/) and [Hugo](https://gohugo.io/).**
+
+AirDrop, Apple, iPadOS, iCloud Keychain, iPhone, MacBook, and macOS are trademarks of Apple Inc., registered in the U.S. and other countries and regions.
+
+Android and ChromeOS are trademarks of Google LLC.
+
+Ubuntu is a trademark of Canonical Limited and is used under license.
+
+Windows is a registered trademark of Microsoft Corporation in the United States and/or other countries.
+
+The passkey icon is a trademark of FIDO Alliance, Inc.
+
+FIDO® is a trademark (registered in numerous countries) of FIDO Alliance, Inc.
diff --git a/content/en/device-support/_index.md b/content/en/device-support/_index.md
new file mode 100644
index 00000000..9ccf5989
--- /dev/null
+++ b/content/en/device-support/_index.md
@@ -0,0 +1,681 @@
+---
+title: "Device Support"
+description: "Detailed information about passkey support across devices and ecosystems"
+layout: full-page
+type: misc
+---
+
+This page, along with the rest of passkeys.dev, is targeted at relying party developers and is not intended to be an end user facing resource.
+
+> Said differently, **please don’t link to this page from end user focused resources** 😉
+
+## Matrix {#matrix}
+
+This matrix represents the default capabilities for a user out of the box. Additional capabilities may be available when a user installs a different passkey provider.
+
+{{< button color="dark" href="https://featuredetect.passkeys.dev" size="md" >}}Test this client!{{< /button >}}
+
+### Basic Capabilities {#basics}
+
+{{< unsafe >}}
+
+
+ 1
+ Device-bound passkeys supported
+
+ 3
+ Windows 11 22H2+
+
+ 4
+ Experimental (behind flag)
+
+ 5
+ Partial support
+
+ 6
+ See details on the Android reference page
+
+ 7
+ See details on iOS reference page
+
+ 8
+ See details on macOS reference page
+
+
+{{< /unsafe >}}
diff --git a/content/en/docs/_index.md b/content/en/docs/_index.md
new file mode 100644
index 00000000..d5797773
--- /dev/null
+++ b/content/en/docs/_index.md
@@ -0,0 +1,7 @@
+---
+title: Docs
+redirect: "/docs/"
+_build:
+ list: false
+ render: false
+---
\ No newline at end of file
diff --git a/content/en/docs/advanced/_index.md b/content/en/docs/advanced/_index.md
new file mode 100644
index 00000000..52e2cca1
--- /dev/null
+++ b/content/en/docs/advanced/_index.md
@@ -0,0 +1,4 @@
+---
+title: Advanced
+description: "Advanced developer guides."
+---
\ No newline at end of file
diff --git a/content/en/docs/advanced/related-origins/index.md b/content/en/docs/advanced/related-origins/index.md
new file mode 100644
index 00000000..cda44f25
--- /dev/null
+++ b/content/en/docs/advanced/related-origins/index.md
@@ -0,0 +1,222 @@
+---
+title: "Related Origin Requests"
+description: "The Related Origin Requests (ROR) feature allows an RP to enable a passkey to be created and used across a limited set of related origins."
+date: 2024-08-22T15:20:51.937Z
+layouts: docs
+---
+
+## Use Cases
+
+The two use cases for Related Origin Requests (ROR) are deployments which use different country code top-level domains (ccTLD) across the world, and deployments where different branding is used for different services.
+
+To address these use cases, it is recommended to leverage industry-standard federation protocols such as [OpenID Connect](https://openid.net/specs/openid-connect-core-1_0.html). This approach facilitates a centralized login experience, by using a dedicated login page (e.g., login.example.com) that serves as the authentication point for all origins and services.
+
+**ROR is designed to be used when federation is _not_ possible.**
+
+> [!NOTE]
+> ROR is a WebAuthn feature for the web. App platforms have existing mechanisms for mapping native apps to one or more web origins: [Digital Asset Links](https://developers.google.com/identity/credential-sharing/set-up) for Android and [Associated Domains](https://developer.apple.com/documentation/xcode/supporting-associated-domains) on Apple platforms.
+
+### Country Code Top Level Domains (ccTLDs) {#cctld}
+
+Many global organizations utilize [country code top level domains (ccTLDs)](https://icannwiki.org/Country_code_top-level_domain#Current_ccTLDs) to cater to their international services. For instance, a shopping website might use `shopping.com` for users in the United States, while also having `shopping.ca` for Canada, `shopping.co.uk` for the United Kingdom, `shopping.ie` for Ireland, and `shopping.sg` for Singapore, among others. However, a passkey created on `shopping.com` can't be used on `shopping.sg`, and vice versa.
+
+### Alternate Branding
+
+Some organizations offer additional services with different or extended branding and share the same accounts. For instance, a shopping site might have their own credit card or their own travel services, which are accessed via different websites.
+
+## How It Works
+
+Related Origin Requests (ROR) works by allowing a Relying Party (RP) to provide a list of valid origins for a given Relying Party ID (RP ID).
+
+During a WebAuthn ceremony, if the RP ID and origin do not match, the WebAuthn client can query the RP for a list of valid origins. The client processes that origin list and then re-evaluates the binding based on this additional context. If an origin is matched, the client will continue with the request in the context of the RP ID.
+
+A label, in the context of this feature, is the name directly preceding the [effective top level domain](https://developer.mozilla.org/en-US/docs/Glossary/eTLD). For instance, `shopping` is the label for `https://shopping.com`, `https://shopping.co.uk`, `https://shopping.co.jp`, `https://shopping.net`, and `https://shopping.org`. Labels are used as a way to support the large number of entries required to support [ccTLDs](#cctld), while enabling clients to restrict the number of unique origins to prevent abuse.
+
+If there are 30 origins in the list, all with the same label, these count as 1 unique label. WebAuthn requires client implementations to support at least 5 unique labels, however there are no known clients which support more than 5, so that should be treated as the maximum for deployments.
+
+Below are three examples of origin lists and their respective label counts.
+
+{{< nav type="pills" id="pills-1" >}}
+ {{< nav-item header="1 Label" show="true" >}}
+
+ 1. `shopping`
+
+```json
+{
+ "origins": [
+ "https://shopping.com",
+ "https://shopping.co.uk",
+ "https://shopping.co.jp",
+ "https://shopping.ie",
+ "https://shopping.ca",
+ "https://shopping.net",
+ "https://shopping.org",
+ "https://shopping.github.io"
+ ]
+}
+```
+
+ {{< /nav-item >}}
+ {{< nav-item header="3 Labels" >}}
+
+ 1. `shopping`
+ 1. `myshoppingrewards`
+ 1. `myshoppingtravel`
+
+ ```json
+ {
+ "origins": [
+ "https://shopping.com",
+ "https://shopping.co.uk",
+ "https://shopping.co.jp",
+ "https://shopping.ie",
+ "https://shopping.ca",
+ "https://myshoppingrewards.com",
+ "https://myshoppingrewards.co.uk",
+ "https://myshoppingrewards.co.jp",
+ "https://myshoppingrewards.ie",
+ "https://myshoppingrewards.ca",
+ "https://myshoppingtravel.com",
+ "https://myshoppingtravel.co.uk",
+ "https://myshoppingtravel.co.jp",
+ "https://myshoppingtravel.ie",
+ "https://myshoppingtravel.ca"
+ ]
+ }
+ ```
+
+ {{< /nav-item >}}
+ {{< nav-item header="5 Labels" >}}
+
+ 1. `shopping`
+ 1. `myshoppingcard`
+ 1. `myshoppingrewards`
+ 1. `myshoppingcreditcard`
+ 1. `myshoppingtravel`
+
+```json
+{
+ "origins": [
+ "https://shopping.com",
+ "https://shopping.co.uk",
+ "https://shopping.co.jp",
+ "https://shopping.ie",
+ "https://shopping.ca",
+ "https://myshoppingcard.us",
+ "https://myshoppingrewards.com",
+ "https://myshoppingrewards.co.uk",
+ "https://myshoppingrewards.co.jp",
+ "https://myshoppingrewards.ie",
+ "https://myshoppingrewards.ca",
+ "https://myshoppingcreditcard.co.uk",
+ "https://myshoppingcreditcard.co.jp",
+ "https://myshoppingcreditcard.ie",
+ "https://myshoppingcreditcard.ca",
+ "https://myshoppingtravel.com",
+ "https://myshoppingtravel.co.uk",
+ "https://myshoppingtravel.co.jp",
+ "https://myshoppingtravel.ie",
+ "https://myshoppingtravel.ca"
+ ]
+}
+```
+
+ {{< /nav-item >}}
+{{< /nav >}}
+
+## Requirements
+
+### Client Support
+
+The [Device Support matrix](/device-support/#ror) lists the browsers which support Related Origin Requests. The [Passkeys Feature Detect page](https://featuredetect.passkeys.dev) will also attempt to detect ROR support in the browser in which the page was loaded.
+
+To dynamically detect support for Related Origin Requests on an enrollment or login page, Relying Parties should check for `relatedOrigins` in the [WebAuthn Get Client Capabilities (`PublicKeyCredential.getClientCapabilities()`)](https://w3c.github.io/webauthn/#sctn-getClientCapabilities) response.
+
+If Related Origin Requests is not supported by the client, fallback logic can be used. See [Existing Deployments](#existing-deployments) below.
+
+### Relying Party Changes
+
+A JSON document must be hosted at the WebAuthn well-known path for the Relying Party ID, `/.well-known/webauthn`.
+
+For example, if the RP ID is `shopping.com`, the full URL would be `https://shopping.com/.well-known/webauthn`.
+
+The server must respond with a content type of `application/json`.
+
+The JSON document must have a member named `origins`, containing an array of valid origins for use with passkeys scoped for the RP ID.
+
+> See [Deployment Considerations](#deployment-considerations) below for details on choosing an RP ID.
+
+Below is an example for the RP ID `shopping.com`.
+
+{{< nav type="tabs" id="tabs-1" >}}
+ {{< nav-item header="https://shopping.com/.well-known/webauthn" show="true" >}}
+
+```json
+{
+ "origins": [
+ "https://shopping.com",
+ "https://myshoppingrewards.com",
+ "https://myshoppingcreditcard.com",
+ "https://myshoppingtravel.com",
+ "https://shopping.co.uk",
+ "https://shopping.co.jp",
+ "https://shopping.ie",
+ "https://shopping.ca"
+ ]
+}
+```
+
+ {{< /nav-item >}}
+{{< /nav >}}
+
+## Deployment Considerations
+
+### Greenfield Deployments
+
+The most important design decision for a greenfield deployment using ROR is picking a common Relying Party ID (RP ID) to be used for passkeys across all origins. All WebAuthn requests across all related origins will use that as `rp.id`.
+
+It is recommended to pick the most commonly used and/or understood domain for the common RP ID. This is typically the domain closely associated with the organization's brand, and is often the `.com`.
+
+### Existing Deployments
+
+For deployments where passkeys are already rolled out with multiple RP IDs or in cases where Related Origin Requests is not supported by the browser, there are some unique considerations and requirements.
+
+#### Considerations
+
+- Users with a passkey for the "local" RP ID / origin will be able to use all passkeys experiences as normal.
+- Users with a passkey for another RP ID / related origin, will require an identifier first flow and a backend lookup.
+
+#### Requirements
+
+- Each existing RP ID will need to host the WebAuthn well-known document, with all of the other origins listed in it. This will allow reciprocal use of passkeys
+- The account database will need to know which RP ID was used for each passkey (this could be an explicit property or inferred based on other data)
+- The username field on the login page will need to support fallback to an identifier first flow with backend lookup
+
+#### Flow
+
+This flow assumes the [autofill UI](/docs/reference/terms/#autofill-ui) for passkeys is being used.
+
+1. Make a conditional WebAuthn request normally on page load
+2. If the promise resolves, process the WebAuthn response as normal and sign the user in
+3. If the the user enters a username and continues:
+ - abort the conditional WebAuthn request
+ - send a request to your backend to retrieve the RP ID for the username
+4. Redirect the user to the origin matching the RP ID (typically using a federation protocol)
+5. Fetch fresh WebAuthn parameters from the backend
+6. Call WebAuthn with the fresh parameters and the correct RP ID
+7. Redirect the user back to the original origin with the necessary artifacts (typically a federated assertion or token)
+
+#### Example
+
+In this example, passkeys have previously been rolled out to the following users:
+
+- `https://shopping.com` users, with an RP ID of `shopping.com`
+- `https://shopping.co.uk` users, with an RP ID of `shopping.co.uk`
+
+A user with a passkey for `shopping.com` navigates to `https://shopping.com`, clicks into the username field, selects their passkey, performs user verification, and is then signed in!
+
+A user with a passkey for `shopping.co.uk` has traveled to the US and navigates to `https://shopping.co.uk`. Based on location data, the user is redirected to `https://shopping.com`. They click into the username field and do not see any passkey available. They then type their username and click continue. A backend lookup occurs, the user is redirected to `https://shopping.co.uk`, WebAuthn is now invoked with an RP ID of `shopping.co.uk`, the user selects their passkey, performs user verification, and is redirected back to `https://shopping.com`!
+
+## Additional Information
+
+{{< button color="light" size="sm" icon="fas fa-circle-info" cue=false order="first" tooltip="Go to reference in the WebAuthn specification" href="https://w3c.github.io/webauthn/#sctn-related-origins" >}}WebAuthn Spec Reference{{< /button >}}
diff --git a/content/en/docs/intro/what-are-passkeys.md b/content/en/docs/intro/what-are-passkeys.md
new file mode 100644
index 00000000..9c2dd3ef
--- /dev/null
+++ b/content/en/docs/intro/what-are-passkeys.md
@@ -0,0 +1,30 @@
+---
+title: "What are passkeys?"
+description: "Passkeys are a replacement for passwords. A password is something that can be remembered and typed, and a passkey is a secret stored on one’s devices, unlocked with biometrics."
+date: 2022-09-24T16:02:27.390Z
+layout: docs
+aliases:
+ - "/docs/intro/"
+ - "/docs/"
+---
+
+
+
+## Passkeys are:
+
+{{< card-group padding="3" gutter="3" cols="2" wrapper="mt-4 mb-5">}}
+ {{< card title="Intuitive" icon="fa-solid fa-wand-magic-sparkles" align="center">}}
+ Creating and using passkeys is as simple as consenting to save and use them. No having to create a password.
+ {{< /card >}}
+ {{< card title="Automatically unique" icon="fa-regular fa-snowflake" align="center">}}
+ By design, passkeys are unique per-service. There’s no chance to reuse them.
+ {{< /card >}}
+ {{< card title="Breach-resistant" icon="fa-solid fa-people-robbery" align="center">}}
+ A passkey is only stored on a user’s devices. [Relying Party (RP)](/docs/reference/terms/#relying-party-rp) servers store public keys. Even servers that assist in the syncing of passkeys across a user’s devices never have the ability to view or use the private keys for a user's passkeys.
+ {{< /card >}}
+ {{< card title="Phishing-resistant" icon="fa-solid fa-user-shield" align="center">}}
+ Rather than trust being rooted in a human who has to verify they’re signing into the right website or app, browsers and operating systems enforce that passkeys are only ever used for the appropriate service.
+ {{< /card >}}
+{{< /card-group >}}
+
+> The guidance on this site is currently targeted towards sites and services that are using either password only or password + OTP (SMS, app TOTP, app push, magic link) sign in flows. Future guidance will include more advanced and higher assurance scenarios.
diff --git a/content/en/docs/reference/_index.md b/content/en/docs/reference/_index.md
new file mode 100644
index 00000000..e65f8b54
--- /dev/null
+++ b/content/en/docs/reference/_index.md
@@ -0,0 +1,4 @@
+---
+title: Reference
+description: "Detailed references for platforms, specifications, terminology, and other information."
+---
\ No newline at end of file
diff --git a/content/docs/reference/android.md b/content/en/docs/reference/android.md
similarity index 72%
rename from content/docs/reference/android.md
rename to content/en/docs/reference/android.md
index fb55ea19..566d64f9 100644
--- a/content/docs/reference/android.md
+++ b/content/en/docs/reference/android.md
@@ -2,33 +2,36 @@
title: "Android"
description: "Resources for passkeys in Android"
date: 2022-09-03T16:09:38.358Z
-draft: false
-images: []
-menu:
- docs:
- parent: "reference"
-weight: 1001
-toc: true
+type: docs
+layout: docs
---
-{{% ds-pa %}}
+{{< card-group padding="3" gutter="3" cols="2">}}
+ {{< card title="Local Authenticator" align="center" color="body" icon="fas fa-circle-check fa-2xl" style="text-success">}}
+ (create and use passkeys from the local device)
+ {{< /card >}}
+ {{< card title="External Authenticator" align="center" color="body" icon="fas fa-circle-check fa-2xl" style="text-success">}}
+ (create and use passkeys from another device)
+ {{< /card >}}
+{{< /card-group >}}
## Overview
The platform authenticator in Android 9+ has the following capabilities:
- creating and using passkeys that are backed up to Google Password Manager
-- using a passkey from the local Android device to sign into services on another device (such as a laptop or desktop), using FIDO [Cross-Device Authentication](../terms#cross-device-authentication-cda)
+- using a passkey from the local Android device to sign into services on another device (such as a laptop or desktop), using FIDO [Cross-Device Authentication](/terms#cross-device-authentication-cda)
Android 14 adds the following capabilities:
-- creating and using passkeys in a [third-party passkey provider](../terms/#third-party-passkey-provider)
+- creating and using passkeys in a [third-party passkey provider](/terms/#third-party-passkey-provider)
+ - NOTE: some Android devices from a small number of OEMs do not support third party passkey providers in Android 14
## Platform Notes
### Cross-Device Authentication
-Android devices can be an [authenticator](../terms/#cda-authenticator) for [FIDO Cross-Device Authentication (CDA)](../terms#cross-device-authentication-cda).
+Android devices can be an [authenticator](/terms/#cda-authenticator) for [FIDO Cross-Device Authentication (CDA)](/terms#cross-device-authentication-cda).
Android devices can be persistently linked to the browsers/platforms below:
@@ -47,7 +50,9 @@ When an authenticator is not persistently linked, a QR code must be scanned on e
### Native APIs
-- **Credential Manager** is a new Android Jetpack API that supports multiple sign-in methods, including passkeys, in a single API, thus simplifying the integration for developers.
+- **Credential Manager** is a new Android Jetpack API that supports multiple sign-in methods, including passkeys, in a single API, thus simplifying the integration for developers.
+
+ {{< button color="light" size="sm" icon="fab fa-android" cue=false order="first" tooltip="Go to the Android developer docs" href="https://developer.android.com/training/sign-in/passkeys" >}}Credential Manager API{{< /button >}}
### WebViews
@@ -57,16 +62,17 @@ When an authenticator is not persistently linked, a QR code must be scanned on e
WebAuthn is currently not directly supported in embedded WebViews on Android, but adding additional code can allow you to break out of the EWV to call the platform's Credential Manager APIs.
-This is documented at [Android Developer: "Integrate Credential Manager with WebView {{< icon-external-link size=20 >}}](https://developer.android.com/training/sign-in/credential-manager-webview).
+This is documented at [Android Developer: "Integrate Credential Manager with WebView](https://developer.android.com/training/sign-in/credential-manager-webview).
-> **NOTE:**
+> **NOTE:**
+>
> Embedded WebViews run in the context of the calling app, meaning only passkeys for the linked web domain (RP ID) can be created or used for sign in.
>
> Said differently, only use EWV when sign in is handled by your own service (non-federated). When supporting multiple identity providers, System WebView should be used (see below).
-
+{{< button color="light" size="sm" icon="fab fa-android" cue=false order="first" tooltip="Go to the Android developer docs" href="https://developer.android.com/develop/ui/views/layout/webapps/webview" >}}WebView docs @ Android Developer{{< /button >}}
-
+{{% comment %}} TODO: add screenshot example {{% /comment %}}
#### System WebViews (SWV)
@@ -74,9 +80,9 @@ This is documented at [Android Developer: "Integrate Credential Manager with Web
Sites loaded in `Custom Tabs` are isolated from the calling app and run in the context of the top level site, just like in a full browser. This means that sign in flows on third party domains, such as a federated identity provider, can use passkeys for signing in.
-
+{{< button color="light" size="sm" icon="fab fa-android" cue=false order="first" tooltip="Go to the Android developer docs" href="https://developer.chrome.com/docs/android/custom-tabs/guide-get-started" >}}Custom Tabs docs @ Android Developer{{< /button >}}
-
+{{% comment %}} TODO: add screenshot example {{% /comment %}}
### User Verification Behavior
diff --git a/content/en/docs/reference/chromeos.md b/content/en/docs/reference/chromeos.md
new file mode 100644
index 00000000..3d4fbb53
--- /dev/null
+++ b/content/en/docs/reference/chromeos.md
@@ -0,0 +1,30 @@
+---
+title: "Chrome OS"
+description: "Resources for passkeys in Google's Chrome OS"
+date: 2022-09-03T16:09:38.358Z
+type: docs
+layout: docs
+---
+
+{{< card-group padding="3" gutter="3" cols="2">}}
+ {{< card title="Local Authenticator" align="center" color="body" icon="fa fa-calendar-plus fa-2xl" style="text-warning">}}
+ (create and use passkeys from the local device)
+ {{< /card >}}
+ {{< card title="External Authenticator" align="center" color="body" icon="fas fa-circle-check fa-2xl" style="text-success">}}
+ (create and use passkeys from another device)
+ {{< /card >}}
+{{< /card-group >}}
+
+## Overview
+
+Creation of passkeys in Chrome OS is not currently supported.
+
+Passkeys from Android, iOS, and iPadOS can be used to sign in to web services on Chrome OS using [FIDO Cross-Device Authentication](/terms#cross-device-authentication-cda).
+
+## Platform Notes
+
+> Coming Soon
+
+## Resources
+
+> Coming Soon
diff --git a/content/docs/reference/ios.md b/content/en/docs/reference/ios.md
similarity index 70%
rename from content/docs/reference/ios.md
rename to content/en/docs/reference/ios.md
index d080e1bd..05fe3d72 100644
--- a/content/docs/reference/ios.md
+++ b/content/en/docs/reference/ios.md
@@ -2,16 +2,18 @@
title: "iOS & iPadOS"
description: "Resources for passkeys in Apple's iOS and iPadOS"
date: 2022-09-03T16:09:38.358Z
-draft: false
-images: []
-menu:
- docs:
- parent: "reference"
-weight: 1003
-toc: true
+type: docs
+layout: docs
---
-{{% ds-full %}}
+{{< card-group padding="3" gutter="3" cols="2">}}
+ {{< card title="Local Authenticator" align="center" color="body" icon="fas fa-circle-check fa-2xl" style="text-success">}}
+ (create and use passkeys from the local device)
+ {{< /card >}}
+ {{< card title="External Authenticator" align="center" color="body" icon="fas fa-circle-check fa-2xl" style="text-success">}}
+ (create and use passkeys from another device)
+ {{< /card >}}
+{{< /card-group >}}
## Overview
@@ -19,18 +21,22 @@ The platform authenticators in iOS 16+ and iPadOS 16+ have the following capabil
- creating and using passkeys that are backed up to iCloud Keychain
- creating and using passkeys on/from another device, such as:
- - an iPhone or iPad signed in to a different iCloud account, using FIDO [Cross-Device Authentication](../terms#cross-device-authentication-cda)
- - an Android phone or tablet, using FIDO [Cross-Device Authentication](../terms#cross-device-authentication-cda)
- - a FIDO2 security key1
-- using a passkey from the local iOS or iPadOS device to sign into services on another device (such as a laptop or desktop), using FIDO [Cross-Device Authentication](../terms#cross-device-authentication-cda)
+ - an iPhone or iPad signed in to a different iCloud account, using FIDO [Cross-Device Authentication](/terms#cross-device-authentication-cda)
+ - an Android phone or tablet, using FIDO [Cross-Device Authentication](/terms#cross-device-authentication-cda)
+ - a FIDO2 security key{{< sup 1 >}}
+- using a passkey from the local iOS or iPadOS device to sign into services on another device (such as a laptop or desktop), using FIDO [Cross-Device Authentication](/terms#cross-device-authentication-cda)
-
1 On iOS and iPadOS, user verification methods (device PIN, biometric, etc) must already be configured on the security key prior to credential creation
+{{< unsafe >}}
+
+
{{< sup 1 >}} On iOS and iPadOS, user verification methods (device PIN, biometric, etc) must already be configured on the security key prior to credential creation
+
+{{< /unsafe >}}
## Platform Notes
### Cross-Device Authentication
-iOS and iPadOS support both [client](../terms/#cda-client) and [authenticator](../terms/#cda-client) roles for [Cross-Device Authentication (CDA)](../terms#cross-device-authentication-cda).
+iOS and iPadOS support both [client](/terms/#cda-client) and [authenticator](/terms/#cda-client) roles for [Cross-Device Authentication (CDA)](/terms#cross-device-authentication-cda).
iOS and iPadOS devices (as authenticators) do not support persistent linking for Cross-Device Authentication. When an authenticator is not persistently linked, a QR code must be scanned on every use.
@@ -38,7 +44,7 @@ iOS and iPadOS devices (as authenticators) do not support persistent linking for
WebAuthn credentials created using the platform authenticator in iOS/iPadOS 15 and earlier ***will not*** not be converted to passkeys but will remain available for the lifetime of the device.
-
+{{% comment %}} TODO: cross link to generic content about "upgrading to a passkey" {{% /comment %}}
To replace a legacy platform credential with a passkey, start a credential registration ceremony and pass **the same user handle** (user.id) in the request. iOS/iPadOS will overwrite the legacy credential with a new passkey that will be backed up to iCloud Keychain.
### WebViews
@@ -47,14 +53,15 @@ To replace a legacy platform credential with a passkey, start a credential regis
`WKWebView` is the embedded WebView (EWV) on iOS and iPadOS. Embedded WebViews allow the calling app full control over the embedded web session, including modifying and intercepting requests, so many web platform features are limited in these contexts.
-> **NOTE:**
+> **NOTE:**
+>
> Embedded WebViews run in the context of the calling app, meaning only passkeys for the linked web domain (RP ID) can be created or used for sign in.
>
> Said differently, only use EWV when sign in is handled by your own service (non-federated). When supporting multiple identity providers, System WebView should be used (see below).
-
+{{< button color="light" size="sm" icon="fab fa-apple" cue=false order="first" tooltip="Go to the Apple developer docs" href="https://developer.apple.com/documentation/webkit/wkwebview" >}}WKWebView docs @ Apple Developer{{< /button >}}
-
+{{% comment %}} TODO: add screenshot example {{% /comment %}}
#### System WebViews
@@ -62,9 +69,9 @@ To replace a legacy platform credential with a passkey, start a credential regis
Sites loaded in `ASWebAuthenticationSession` are isolated from the calling app and run in the context of the top level site, just like in a full browser. This means that sign in flows on third party domains, such as a federated identity provider, can use passkeys for signing in.
-
+{{< button color="light" size="sm" icon="fab fa-apple" cue=false order="first" tooltip="Go to the Apple developer docs" href="https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession" >}}ASWebAuthenticationSession docs @ Apple Developer{{< /button >}}
-
+{{% comment %}} TODO: add screenshot example {{% /comment %}}
### User Verification Behavior
diff --git a/content/en/docs/reference/known-issues.md b/content/en/docs/reference/known-issues.md
new file mode 100644
index 00000000..bd91043b
--- /dev/null
+++ b/content/en/docs/reference/known-issues.md
@@ -0,0 +1,75 @@
+---
+title: "Known Issues"
+description: "A list of known issues with passkey implementations"
+date: 2022-09-03T16:09:38.358Z
+toc: false
+type: docs
+layout: docs
+---
+
+## Passkey Metadata
+
+### Samsung Pass
+
+According to Samsung documentation ([source](https://www.samsung.com/us/apps/samsung-pass/)), Samsung Pass creates [synced passkeys](terms#synced-passkey) which are available on other devices where Samsung Pass is installed.
+
+During testing on 2024-09-05, it was observed that passkeys created in Samsung Pass return the backup eligible flag as false, signaling a [device-bound passkey](terms#device-bound-passkey).
+
+{{< accordion id="accordion-default" >}}
+ {{< accordion-item header="Sample passkey registration from Samsung Pass" show="false" >}}
+Test device details:
+
+- Galaxy S22
+- Android 14 (UP1A.231005.007.S901USQS6EXG8)
+- One UI 6.1
+- Samsung Pass 4.4.02.7
+
+[View decoded details](https://debugger.simplewebauthn.dev/?credential=ewogICJpZCI6ICJ6NnBMNU11UXdrWGxtOHc1ZWtBaXlWT0ZsTmplUXlsWWhULTd6TTdqN1dVIiwKICAicmF3SWQiOiAiejZwTDVNdVF3a1hsbTh3NWVrQWl5Vk9GbE5qZVF5bFloVC03ek03ajdXVSIsCiAgInJlc3BvbnNlIjogewogICAgImF0dGVzdGF0aW9uT2JqZWN0IjogIm8yTm1iWFJtY0dGamEyVmtaMkYwZEZOMGJYU2pZMkZzWnlaamMybG5XRWN3UlFJZ1dYemEtYmUwRDFQRU83MVZtTDBzSzB2c0ZMMjN2WG11RVdzSU1EQzYzMGNDSVFESTk0TGk4M3RDOU9iWXNsX0tMZWV0SllKRjFMWWhYNFA0LUxyUGxlVVFKbU40TldPQldRSm9NSUlDWkRDQ0FnaWdBd0lCQWdJSkFQVjh2MFc4Q3ZoTU1Bd0dDQ3FHU000OUJBTUNCUUF3Z2FZeEh6QWRCZ05WQkFNVEZsTmhiWE4xYm1jZ1JXeGxZM1J5YjI1cFkzTWdRMEV4SERBYUJnTlZCQW9URTFOaGJYTjFibWNnUld4bFkzUnliMjVwWTNNeEZ6QVZCZ05WQkFzVERsTmhiWE4xYm1jZ1RXOWlhV3hsTVJNd0VRWURWUVFIRXdwVGRYZHZiaUJqYVhSNU1Rc3dDUVlEVlFRR0V3SkxVakVxTUNnR0NnbVNKb21UOGl4a0FRRU1HbE5oYlhOMWJtZEVaWFpwWTJWU2IyOTBRMEZMWlhsZlJVTkRNQjRYRFRJek1Ea3hPVEExTkRreE5Gb1hEVFF6TURreE5EQTFORGt4TkZvd2Z6RUxNQWtHQTFVRUJoTUNTMUl4SERBYUJnTlZCQW9NRTFOaGJYTjFibWNnUld4bFkzUnliMjVwWTNNeElqQWdCZ05WQkFzTUdVRjFkR2hsYm5ScFkyRjBiM0lnUVhSMFpYTjBZWFJwYjI0eExqQXNCZ05WQkFNTUpWTmhiWE4xYm1jZ1JXeGxZM1J5YjI1cFkzTWdSa2xFVHpJZ1FYUjBaWE4wWVhScGIyNHdXVEFUQmdjcWhrak9QUUlCQmdncWhrak9QUU1CQndOQ0FBUVpva0s0ZDVRZGhOOWZGSlRiX1QyMDZVMVdteFFSQ0picWItVUNhcTlzaVBWS0JBNlRhU3JQQ0lVOEdqZVhiVWE4NUZZWUg2RU1XaF9RT25OalFXV2JvME13UVRBTUJnTlZIUk1CQWY4RUFqQUFNQTRHQTFVZER3RUJfd1FFQXdJR3dEQWhCZ3NyQmdFRUFZTGxIQUVCQkFRU0JCQlRRVTFUVlU1SEFBQUFBQUFBQUFBQU1Bd0dDQ3FHU000OUJBTUNCUUFEU0FBd1JRSWhBSUJDWGVfNEFsRUNpcDJHM25UUzBHclJ0SUhiYVZXXzBoTHk4eXMzRWR5b0FpQUVUTWN6NzZncXpMb0hRT0Rra2tfbmJTRXUwV0FHUGg3YkszWS0xbTZ1WldoaGRYUm9SR0YwWVZpa2RLYnFraFBKbkM5MHNpU1NzeURQUUNZcWxNR3BVS0E1ZnlrbEMyQ0VIdkJGQUFBQUFGTkJUVk5WVGtjQUFBQUFBQUFBQUFBQUlNLXFTLVRMa01KRjVadk1PWHBBSXNsVGhaVFkza01wV0lVX3U4ek80LTFscFFFQ0F5WWdBU0ZZSUU1SFFEc0UwWjBLcmV2RW02N3dGd040M285QjhoTlFnbDNWSVctaXVhVE1JbGdnM0JQYVotNjhSOUUwZGwtdmlLUWRqTEJfN1FZOXpXZFBEMTFZb1AwMFQ0SSIsCiAgICAiY2xpZW50RGF0YUpTT04iOiAiZXlKMGVYQmxJam9pZDJWaVlYVjBhRzR1WTNKbFlYUmxJaXdpWTJoaGJHeGxibWRsSWpvaWFHSkJhVXRrY0U1WU9UQkZZVmxaVGxBdGFWRlRiakJHVEdsSFNuRkNVRmRVUVVKRWJrSTRabmh4ZW5OcFF6ZHhObFl4VVVOSmNVWk1UbFZ3ZFRCTVFXeDVXSE14YUUxRVRGaE9WbGQ2TjBoT1FsOHdhbmNpTENKdmNtbG5hVzRpT2lKb2RIUndjem92TDNkbFltRjFkR2h1TG1sdklpd2lZM0p2YzNOUGNtbG5hVzRpT21aaGJITmxMQ0p2ZEdobGNsOXJaWGx6WDJOaGJsOWlaVjloWkdSbFpGOW9aWEpsSWpvaVpHOGdibTkwSUdOdmJYQmhjbVVnWTJ4cFpXNTBSR0YwWVVwVFQwNGdZV2RoYVc1emRDQmhJSFJsYlhCc1lYUmxMaUJUWldVZ2FIUjBjSE02THk5bmIyOHVaMnd2ZVdGaVVHVjRJbjAiLAogICAgInRyYW5zcG9ydHMiOiBbCiAgICAgICJoeWJyaWQiLAogICAgICAiaW50ZXJuYWwiCiAgICBdLAogICAgInB1YmxpY0tleUFsZ29yaXRobSI6IC03LAogICAgInB1YmxpY0tleSI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVUa2RBT3dUUm5RcXQ2OFNicnZBWEEzamVqMEh5RTFDQ1hkVWhiNks1cE16Y0U5cG43cnhIMFRSMlg2LUlwQjJNc0hfdEJqM05aMDhQWFZpZ19UUlBnZyIsCiAgICAiYXV0aGVudGljYXRvckRhdGEiOiAiZEticWtoUEpuQzkwc2lTU3N5RFBRQ1lxbE1HcFVLQTVmeWtsQzJDRUh2QkZBQUFBQUZOQlRWTlZUa2NBQUFBQUFBQUFBQUFBSU0tcVMtVExrTUpGNVp2TU9YcEFJc2xUaFpUWTNrTXBXSVVfdTh6TzQtMWxwUUVDQXlZZ0FTRllJRTVIUURzRTBaMEtyZXZFbTY3d0Z3TjQzbzlCOGhOUWdsM1ZJVy1pdWFUTUlsZ2czQlBhWi02OFI5RTBkbC12aUtRZGpMQl83UVk5eldkUEQxMVlvUDAwVDRJIgogIH0sCiAgInR5cGUiOiAicHVibGljLWtleSIsCiAgImNsaWVudEV4dGVuc2lvblJlc3VsdHMiOiB7CiAgICAiY3JlZFByb3BzIjogewogICAgICAicmsiOiB0cnVlCiAgICB9CiAgfSwKICAiYXV0aGVudGljYXRvckF0dGFjaG1lbnQiOiAicGxhdGZvcm0iCn0)
+
+```json
+{
+ "id": "z6pL5MuQwkXlm8w5ekAiyVOFlNjeQylYhT-7zM7j7WU",
+ "rawId": "z6pL5MuQwkXlm8w5ekAiyVOFlNjeQylYhT-7zM7j7WU",
+ "response": {
+ "attestationObject": "o2NmbXRmcGFja2VkZ2F0dFN0bXSjY2FsZyZjc2lnWEcwRQIgWXza-be0D1PEO71VmL0sK0vsFL23vXmuEWsIMDC630cCIQDI94Li83tC9ObYsl_KLeetJYJF1LYhX4P4-LrPleUQJmN4NWOBWQJoMIICZDCCAgigAwIBAgIJAPV8v0W8CvhMMAwGCCqGSM49BAMCBQAwgaYxHzAdBgNVBAMTFlNhbXN1bmcgRWxlY3Ryb25pY3MgQ0ExHDAaBgNVBAoTE1NhbXN1bmcgRWxlY3Ryb25pY3MxFzAVBgNVBAsTDlNhbXN1bmcgTW9iaWxlMRMwEQYDVQQHEwpTdXdvbiBjaXR5MQswCQYDVQQGEwJLUjEqMCgGCgmSJomT8ixkAQEMGlNhbXN1bmdEZXZpY2VSb290Q0FLZXlfRUNDMB4XDTIzMDkxOTA1NDkxNFoXDTQzMDkxNDA1NDkxNFowfzELMAkGA1UEBhMCS1IxHDAaBgNVBAoME1NhbXN1bmcgRWxlY3Ryb25pY3MxIjAgBgNVBAsMGUF1dGhlbnRpY2F0b3IgQXR0ZXN0YXRpb24xLjAsBgNVBAMMJVNhbXN1bmcgRWxlY3Ryb25pY3MgRklETzIgQXR0ZXN0YXRpb24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQZokK4d5QdhN9fFJTb_T206U1WmxQRCJbqb-UCaq9siPVKBA6TaSrPCIU8GjeXbUa85FYYH6EMWh_QOnNjQWWbo0MwQTAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB_wQEAwIGwDAhBgsrBgEEAYLlHAEBBAQSBBBTQU1TVU5HAAAAAAAAAAAAMAwGCCqGSM49BAMCBQADSAAwRQIhAIBCXe_4AlECip2G3nTS0GrRtIHbaVW_0hLy8ys3EdyoAiAETMcz76gqzLoHQODkkk_nbSEu0WAGPh7bK3Y-1m6uZWhhdXRoRGF0YVikdKbqkhPJnC90siSSsyDPQCYqlMGpUKA5fyklC2CEHvBFAAAAAFNBTVNVTkcAAAAAAAAAAAAAIM-qS-TLkMJF5ZvMOXpAIslThZTY3kMpWIU_u8zO4-1lpQECAyYgASFYIE5HQDsE0Z0KrevEm67wFwN43o9B8hNQgl3VIW-iuaTMIlgg3BPaZ-68R9E0dl-viKQdjLB_7QY9zWdPD11YoP00T4I",
+ "clientDataJSON": "eyJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIiwiY2hhbGxlbmdlIjoiaGJBaUtkcE5YOTBFYVlZTlAtaVFTbjBGTGlHSnFCUFdUQUJEbkI4ZnhxenNpQzdxNlYxUUNJcUZMTlVwdTBMQWx5WHMxaE1ETFhOVld6N0hOQl8wanciLCJvcmlnaW4iOiJodHRwczovL3dlYmF1dGhuLmlvIiwiY3Jvc3NPcmlnaW4iOmZhbHNlLCJvdGhlcl9rZXlzX2Nhbl9iZV9hZGRlZF9oZXJlIjoiZG8gbm90IGNvbXBhcmUgY2xpZW50RGF0YUpTT04gYWdhaW5zdCBhIHRlbXBsYXRlLiBTZWUgaHR0cHM6Ly9nb28uZ2wveWFiUGV4In0",
+ "transports": [
+ "hybrid",
+ "internal"
+ ],
+ "publicKeyAlgorithm": -7,
+ "publicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETkdAOwTRnQqt68SbrvAXA3jej0HyE1CCXdUhb6K5pMzcE9pn7rxH0TR2X6-IpB2MsH_tBj3NZ08PXVig_TRPgg",
+ "authenticatorData": "dKbqkhPJnC90siSSsyDPQCYqlMGpUKA5fyklC2CEHvBFAAAAAFNBTVNVTkcAAAAAAAAAAAAAIM-qS-TLkMJF5ZvMOXpAIslThZTY3kMpWIU_u8zO4-1lpQECAyYgASFYIE5HQDsE0Z0KrevEm67wFwN43o9B8hNQgl3VIW-iuaTMIlgg3BPaZ-68R9E0dl-viKQdjLB_7QY9zWdPD11YoP00T4I"
+ },
+ "type": "public-key",
+ "clientExtensionResults": {
+ "credProps": {
+ "rk": true
+ }
+ },
+ "authenticatorAttachment": "platform"
+}
+```
+
+ {{< /accordion-item >}}
+{{< /accordion >}}
+
+## User Verification
+
+The following list of passkey providers have not implemented [User Verification](terms#user-verification-uv) in a spec-compliant manner.
+
+{{< table >}}
+
+| **Provider** | **Architecture** | **`uv`=`required`** | **`uv`=`preferred`** |
+| ------------- | ---------------- | ------------------------------------------------------ | ------------------------------------- |
+| 1Password | Extension | ❌ Handles request without performing UV, sets UV true | ❌ Sets UV true without performing UV |
+| 1Password | Native | ✅ Performs UV | ✅ UV flag accurate |
+| Bitwarden | Extension | ❌ Handles request without performing UV, sets UV true | ❌ Sets UV true without performing UV |
+| KeepassXC | Extension | ❌ Handles request without performing UV, sets UV true | ❌ Sets UV true without performing UV |
+| Okta Personal | Extension | ❌ Handles request without performing UV, sets UV true | ❌ Sets UV true without performing UV |
+| Proton Pass | Extension | ❌ Handles request without performing UV, sets UV true | ❌ Sets UV true without performing UV |
+| Proton Pass | Native | ❌ Handles request without performing UV, sets UV true | ❌ Sets UV true without performing UV |
+| Strongbox | Native | ❌ Handles request without performing UV, sets UV true | ❌ Sets UV true without performing UV |
+{{< /table >}}
+
+> **Architecture**: `Extension` = web browser extension, `Native` = OS native app using provider APIs
diff --git a/content/docs/reference/macos.md b/content/en/docs/reference/macos.md
similarity index 78%
rename from content/docs/reference/macos.md
rename to content/en/docs/reference/macos.md
index 96ac4a5a..44589d9c 100644
--- a/content/docs/reference/macos.md
+++ b/content/en/docs/reference/macos.md
@@ -2,16 +2,18 @@
title: "macOS"
description: "Resources for passkeys in Apple macOS"
date: 2022-09-03T16:09:38.358Z
-draft: false
-images: []
-menu:
- docs:
- parent: "reference"
-weight: 1004
-toc: true
+type: docs
+layout: docs
---
-{{% ds-full %}}
+{{< card-group padding="3" gutter="3" cols="2">}}
+ {{< card title="Local Authenticator" align="center" color="body" icon="fas fa-circle-check fa-2xl" style="text-success">}}
+ (create and use passkeys from the local device)
+ {{< /card >}}
+ {{< card title="External Authenticator" align="center" color="body" icon="fas fa-circle-check fa-2xl" style="text-success">}}
+ (create and use passkeys from another device)
+ {{< /card >}}
+{{< /card-group >}}
## Overview
@@ -19,17 +21,21 @@ The platform authenticator in macOS Ventura (13) has the following capabilities:
- creating and using passkeys that are backed up to iCloud Keychain
- creating and using passkeys on/from another device, such as:
- - an iPhone or iPad signed in to a different iCloud account, using FIDO [Cross-Device Authentication](../terms#cross-device-authentication-cda)
- - an Android device, using FIDO [Cross-Device Authentication](../terms#cross-device-authentication-cda)
- - a FIDO2 security key1
+ - an iPhone or iPad signed in to a different iCloud account, using FIDO [Cross-Device Authentication](/terms#cross-device-authentication-cda)
+ - an Android device, using FIDO [Cross-Device Authentication](/terms#cross-device-authentication-cda)
+ - a FIDO2 security key{{< sup 1 >}}
-
1 On macOS, user verification methods (device PIN, biometric, etc) must already be configured on the security key prior to credential creation
+{{< unsafe >}}
+
+
{{< sup 1 >}} On macOS, user verification methods (device PIN, biometric, etc) must already be configured on the security key prior to credential creation
+
+{{< /unsafe >}}
## Platform Notes
### Cross-Device Authentication
-macOS does not currently support persistent linking of external authenticators for [Cross-Device Authentication](../terms#cross-device-authentication-cda) at the operating system level.
+macOS does not currently support persistent linking of external authenticators for [Cross-Device Authentication](/terms#cross-device-authentication-cda) at the operating system level.
Persistent linking is available between Android devices (authenticator) and Chrome and Edge (clients) on macOS.
@@ -39,27 +45,24 @@ When an authenticator is not persistently linked, a QR code must be scanned on e
WebAuthn credentials created using the platform authenticator in macOS Monterey (12) and earlier ***will not*** be converted to passkeys but will remain available for the lifetime of the device.
-
+{{% comment %}} TODO: cross link to generic content about "upgrading to a passkey" {{% /comment %}}
To replace a legacy platform credential with a passkey, start a credential registration ceremony and pass **the same user handle** (user.id) in the request. macOS will overwrite the legacy credential with a new passkey that will be backed up to iCloud Keychain.
-### Browser Behavior
-
-**Edge**: credentials created by Edge are currently [***device-bound*** passkeys](/docs/reference/terms/#device-bound-passkey), are not backed up to iCloud Keychain, and are ***not available outside of Edge***.
-
### WebViews
#### Embedded WebViews
`WKWebView` is the embedded WebView (EWV) on macOS. Embedded WebViews allow the calling app full control over the embedded web session, including modifying and intercepting requests, so many web platform features are limited in these contexts.
-> **NOTE:**
+> **NOTE:**
+>
> Embedded WebViews run in the context of the calling app, meaning only passkeys for the linked web domain (RP ID) can be created or used for sign in.
>
> Said differently, only use EWV when sign in is handled by your own service (non-federated). When supporting multiple identity providers, System WebView should be used (see below).
-
+{{< button color="light" size="sm" icon="fab fa-apple" cue=false order="first" tooltip="Go to the Apple developer docs" href="https://developer.apple.com/documentation/webkit/wkwebview" >}}WKWebView docs @ Apple Developer{{< /button >}}
-
+{{% comment %}} TODO: add screenshot example {{% /comment %}}
#### System WebViews
@@ -67,9 +70,9 @@ To replace a legacy platform credential with a passkey, start a credential regis
Sites loaded in `ASWebAuthenticationSession` are isolated from the calling app and run in the context of the top level site, just like in a full browser instance. This means that sign in flows on third party domains, such as a federated identity provider, can use passkeys for signing in.
-
+{{< button color="light" size="sm" icon="fab fa-apple" cue=false order="first" tooltip="Go to the Apple developer docs" href="https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession" >}}ASWebAuthenticationSession docs @ Apple Developer{{< /button >}}
-
+{{% comment %}} TODO: add screenshot example {{% /comment %}}
### User Verification Behavior
diff --git a/content/docs/reference/specs.md b/content/en/docs/reference/specs.md
similarity index 87%
rename from content/docs/reference/specs.md
rename to content/en/docs/reference/specs.md
index f13b3fdb..b25264e5 100644
--- a/content/docs/reference/specs.md
+++ b/content/en/docs/reference/specs.md
@@ -1,15 +1,9 @@
---
title: "Specifications"
description: "List of specifications that enable passkeys"
-lead: ""
date: 2022-08-04T17:33:14.682Z
-draft: false
-images: []
-menu:
- docs:
- parent: "reference"
-weight: 1111
-toc: true
+layout: docs
+
---
The two primary technical specifications that work together to enable passkeys are Web Authentication, commonly referred to as WebAuthn, and the Client to Authenticator Protocol (CTAP), commonly referred to as FIDO2.
@@ -34,7 +28,7 @@ CTAP is implemented by authenticator and device vendors and abstracts away all o
***Current Version***: [CTAP 2.1](https://fidoalliance.org/specs/fido-v2.1-ps-20210615/fido-client-to-authenticator-protocol-v2.1-ps-errata-20220621.html)
-***Next Version***: [CTAP 2.2 (Review Draft 01)](https://fidoalliance.org/specs/fido-v2.2-rd-20230321/fido-client-to-authenticator-protocol-v2.2-rd-20230321.html)
+***Next Version***: [CTAP 2.2 (Review Draft 02)](https://fidoalliance.org/specs/fido-v2.2-rd-20241003/fido-client-to-authenticator-protocol-v2.2-rd-20241003.html)
The next version of CTAP is currently under development at the FIDO Alliance.
diff --git a/content/docs/reference/terms/index.md b/content/en/docs/reference/terms/index.md
similarity index 72%
rename from content/docs/reference/terms/index.md
rename to content/en/docs/reference/terms/index.md
index b9cb9e40..f30a8c19 100644
--- a/content/docs/reference/terms/index.md
+++ b/content/en/docs/reference/terms/index.md
@@ -1,15 +1,8 @@
---
title: "Terms"
description: "A list of terms which are used frequently throughout this site and in discussions about passkeys, FIDO2, and WebAuthn."
-lead: "Here's a list of terms which are used frequently throughout this site and in discussions about passkeys, FIDO2, and WebAuthn."
date: 2020-11-12T13:26:54+01:00
-draft: false
-images: []
-menu:
- docs:
- parent: "reference"
-weight: 1110
-toc: true
+layout: docs
---
## 2FA user
@@ -32,7 +25,7 @@ A [Relying Party (RP)](#relying-party-rp) authenticates a user without any prior
Attestation is an optional statement provided by an authenticator which can be used by a Relying Party to identify and verify the provenance of the authenticator.
-
+{{< button color="light" size="sm" icon="fas fa-circle-info" cue=false order="first" tooltip="Go to reference in the WebAuthn specification" href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#sctn-attestation" >}}WebAuthn Spec Reference{{< /button >}}
## Authentication factor
@@ -44,15 +37,15 @@ A privacy preserving list UI element that is rendered by the browser (or the OS
This UI element provides a list of passkeys that are available for the [Relying Party (RP)](#relying-party-rp) on the local device, and may also provide an option to kick off [Cross-Device Authentication (CDA)](#cross-device-authentication-cda) or use a FIDO2 security key.
-A generic example of an autofill UI for passkeys is shown below:
-
-
+{{< image src="pkdd-signin-username-autofill.png" class="col-10 col-md-7" wrapper="text-center" caption="A generic example of an autofill UI for passkeys" title="Sample sign in screen with the autofill UI rendered under the username field, showing a passkey for bob@example.com, an other accounts option and a passkey from another device option">}}
The technical name for this feature in the WebAuthn and Credential Management specifications is "Conditional Mediation".
-
+{{< button color="light" size="sm" icon="fas fa-circle-info" cue=false order="first" tooltip="Go to reference in the WebAuthn specification" href="https://w3c.github.io/webauthn/#dom-publickeycredential-isconditionalmediationavailable" >}}WebAuthn Spec Reference{{< /button >}}
-
+{{< button color="light" size="sm" icon="fas fa-circle-info" cue=false order="first" tooltip="Go to reference in the Credential Management specification" href="https://w3c.github.io/webappsec-credential-management/#mediation-requirements">}}
+ Credential Management Spec Reference
+{{< /button >}}
## Cross-Device Authentication (CDA)
@@ -76,6 +69,12 @@ See [_Autofill UI_](#autofill-ui)
See [_Autofill UI_](#autofill-ui)
+## Credential Exchange
+
+A standardized process to securely transfer passkeys, passwords, and other types of information from one [passkey provider](#passkey-provider) to another.
+
+{{< button color="light" size="sm" icon="fas fa-circle-info" cue=false order="first" tooltip="Go to the FIDO Credential Exchange Specifications" href="https://fidoalliance.org/specifications-credential-exchange-specifications/" >}}FIDO Credential Exchange Specifications{{< /button >}}
+
## Device-bound passkey
A FIDO2 [Discoverable Credential](#discoverable-credential) that is bound to a single authenticator. For example, FIDO2 security keys typically hold device-bound passkeys as the credential cannot leave the device. Device-bound passkeys have been previously referred to as _single-device passkeys_.
@@ -86,7 +85,7 @@ A Discoverable Credential (known in previous version of WebAuthn as a "resident
[Passkeys](#passkey) are Discoverable Credentials.
-
+{{< button color="light" size="sm" icon="fas fa-circle-info" cue=false order="first" tooltip="Go to reference in the WebAuthn specification" href="https://www.w3.org/TR/webauthn-2/#discoverable-credential" >}}WebAuthn Spec Reference{{< /button >}}
## First-Party Passkey Provider
@@ -128,15 +127,13 @@ The informal name for creating a relationship between a [Cross-Device Authentica
Both the client and authenticator must support the functionality.
-Example with an Android phone linked to a Windows 11 device:
-
-
+{{< image src="pkdd-terms-cda-pl-androidwin.png" class="col-10 col-md-7" wrapper="text-center" caption="Example with an Android phone linked to a Windows 11 device" title="A screenshot of the Windows Hello prompt asking the user to choose where to save their new passkey. The list of options includes an entry with a phone icon titled cappy-p7p as an example of a phone that has been persistently linked to the access device the user is current registering a new passkey from.">}}
## Platform authenticator
A FIDO authenticator that is built-in to a user's device.
-
+{{< button color="light" size="sm" icon="fas fa-circle-info" cue=false order="first" tooltip="Go to reference in the WebAuthn specification" href="https://www.w3.org/TR/webauthn-2/#sctn-authenticator-taxonomy" >}}WebAuthn Spec Reference{{< /button >}}
## Reauthentication
@@ -148,13 +145,13 @@ For example, this can happen before making sensitive changes to an account (addi
The website that is trying to ascertain and verify the identity of the user or perform FIDO authentication.
-
+{{< button color="light" size="sm" icon="fas fa-circle-info" cue=false order="first" tooltip="Go to reference in the WebAuthn specification" href="https://www.w3.org/TR/webauthn-2/#webauthn-relying-party" >}}WebAuthn Spec Reference{{< /button >}}
## Roaming authenticator
A FIDO authenticator usable with any device the user is trying to sign-in from. Roaming authenticators attach to users' devices in using USB, NFC, and/or Bluetooth. These authenticators are often referred to as "security keys". A smartphone can also act as a roaming authenticator using [FIDO Cross-Device Authentication](#cross-device-authentication-cda).
-
+{{< button color="light" size="sm" icon="fas fa-circle-info" cue=false order="first" tooltip="Go to reference in the WebAuthn specification" href="https://www.w3.org/TR/webauthn-2/#sctn-authenticator-taxonomy" >}}WebAuthn Spec Reference{{< /button >}}
## Signing in
@@ -178,16 +175,16 @@ A [Passkey Provider](#passkey-provider) that plugs in to the OS via platform API
A test of User Presence (UP) is used to ensure the user is in local proximity to the authenticator during an authentication or credential creation ceremony. UP is often satisfied by pressing a button or metallic area of a security key, or interacting with a platform authenticator on a device.
-
+{{< button color="light" size="sm" icon="fas fa-circle-info" cue=false order="first" tooltip="Go to reference in the WebAuthn specification" href="https://www.w3.org/TR/webauthn-2/#test-of-user-presence" >}}WebAuthn Spec Reference{{< /button >}}
## User Verification (UV)
User Verification (UV) requires the user to either perform a biometric gesture, enter the device PIN, or enter the device password for the authenticator to authorize creation and/or use of the credential.
-
+{{< button color="light" size="sm" icon="fas fa-circle-info" cue=false order="first" tooltip="Go to reference in the WebAuthn specification" href="https://www.w3.org/TR/webauthn-2/#user-verification" >}}WebAuthn Spec Reference{{< /button >}}
## User-Verifying Roaming Authenticator
A User-Verifying Roaming Authentication (UVRA), also known as a first-factor roaming authenticator, can [verify individual](#user-verification-uv) users through the use of biometrics, or through the user entering a device PIN. An important class of UVRAs are smartphones, in which case the “attachment” typically happens over a wireless connection.
-
+{{< button color="light" size="sm" icon="fas fa-circle-info" cue=false order="first" tooltip="Go to reference in the WebAuthn specification" href="https://www.w3.org/TR/webauthn-2/#first-factor-roaming-authenticator" >}}WebAuthn Spec Reference{{< /button >}}
diff --git a/content/docs/reference/terms/pkdd-signin-username-autofill.png b/content/en/docs/reference/terms/pkdd-signin-username-autofill.png
similarity index 100%
rename from content/docs/reference/terms/pkdd-signin-username-autofill.png
rename to content/en/docs/reference/terms/pkdd-signin-username-autofill.png
diff --git a/content/docs/reference/terms/pkdd-terms-cda-pl-androidwin.png b/content/en/docs/reference/terms/pkdd-terms-cda-pl-androidwin.png
similarity index 100%
rename from content/docs/reference/terms/pkdd-terms-cda-pl-androidwin.png
rename to content/en/docs/reference/terms/pkdd-terms-cda-pl-androidwin.png
diff --git a/content/docs/reference/windows.md b/content/en/docs/reference/windows.md
similarity index 54%
rename from content/docs/reference/windows.md
rename to content/en/docs/reference/windows.md
index 547a3f95..1395162d 100644
--- a/content/docs/reference/windows.md
+++ b/content/en/docs/reference/windows.md
@@ -2,43 +2,43 @@
title: "Windows"
description: "Resources for passkeys in Microsoft Windows"
date: 2022-09-03T16:09:38.358Z
-draft: false
-images: []
-menu:
- docs:
- parent: "reference"
-weight: 1005
-toc: true
+type: docs
+layout: docs
---
-{{% ds-la_p-ea_s %}}
+{{< card-group padding="3" gutter="3" cols="2">}}
+ {{< card title="Local Authenticator" align="center" color="body" icon="fa fa-circle-check fa-2xl" style="text-warning">}}
+ (create and use passkeys from the local device)
+ {{< /card >}}
+ {{< card title="External Authenticator" align="center" color="body" icon="fas fa-circle-check fa-2xl" style="text-success">}}
+ (create and use passkeys from another device)
+ {{< /card >}}
+{{< /card-group >}}
## Overview
Windows Hello, the local platform authenticator in Windows 10 and 11, has the following capabilities:
-- creating and using [***device-bound*** passkeys](../terms#device-bound-passkey) on the local device
-- creating and using [***device-bound*** passkeys](../terms#device-bound-passkey) on a FIDO2 security key
+- creating and using [***device-bound*** passkeys](/terms#device-bound-passkey) on the local device
+- creating and using [***device-bound*** passkeys](/terms#device-bound-passkey) on a FIDO2 security key
The following is also possible in Windows 11 version 23H2 and newer:
-- using passkeys from iOS and iPadOS devices for signing into services in all browser and native apps using [FIDO Cross-Device Authentication](../terms#cross-device-authentication-cda)
-- using passkeys from Android devices for signing into services in all browser and native apps using [FIDO Cross-Device Authentication](../terms#cross-device-authentication-cda)
+- using passkeys from iOS and iPadOS devices for signing into services in all browser and native apps using [FIDO Cross-Device Authentication](/terms#cross-device-authentication-cda)
+- using passkeys from Android devices for signing into services in all browser and native apps using [FIDO Cross-Device Authentication](/terms#cross-device-authentication-cda)
The following is also possible in both Windows 10 and Windows 11 (earlier than 23H2):
-- using passkeys from iOS and iPadOS devices in Chrome (108+) and Edge (108+) for signing in to web services using [FIDO Cross-Device Authentication](../terms#cross-device-authentication-cda)
-- using passkeys from Android devices in Chrome (108+) and Edge (108+) for signing in to web services using [FIDO Cross-Device Authentication](../terms#cross-device-authentication-cda)
+- using passkeys from iOS and iPadOS devices in Chrome (108+) and Edge (108+) for signing in to web services using [FIDO Cross-Device Authentication](/terms#cross-device-authentication-cda)
+- using passkeys from Android devices in Chrome (108+) and Edge (108+) for signing in to web services using [FIDO Cross-Device Authentication](/terms#cross-device-authentication-cda)
## Platform Notes
-- The [authenticatorAttachment property of responses](https://w3c.github.io/webauthn/#dom-publickeycredential-authenticatorattachment), planned for specification delivery in WebAuthn L3, is not currently available in responses to `navigator.credentials.get` when using the platform authenticator or a hardware security key. It is supplied during credential creation, or when using [FIDO Cross-Device Authentication](/docs/reference/terms/#cross-device-authentication-cda) for an authentication ceremony.
-
### Cross-Device Authentication
-Starting in Windows 11 version 23H2, [FIDO Cross-Device Authentication (CDA)](../terms#cross-device-authentication-cda) is supported globally at the operating system level and available for all apps and browsers. Persistent linking is available between Android devices (authenticator) and Windows 11 23H2+. iOS and iPadOS do not support persistent linking.
+Starting in Windows 11 version 23H2, [FIDO Cross-Device Authentication (CDA)](/terms#cross-device-authentication-cda) is supported globally at the operating system level and available for all apps and browsers. Persistent linking is available between Android devices (authenticator) and Windows 11 23H2+. iOS and iPadOS do not support persistent linking.
-In Windows versions prior to 11 23H2, including Windows 10, support for [FIDO Cross-Device Authentication (CDA)](../terms#cross-device-authentication-cda) is only available in Chrome and Edge. It is not available globally. Persistent linking is available between Android devices (authenticator) and Chrome and Edge (clients) on these versions. iOS and iPadOS do not support persistent linking.
+In Windows versions prior to 11 23H2, including Windows 10, support for [FIDO Cross-Device Authentication (CDA)](/terms#cross-device-authentication-cda) is only available in Chrome and Edge. It is not available globally. Persistent linking is available between Android devices (authenticator) and Chrome and Edge (clients) on these versions. iOS and iPadOS do not support persistent linking.
### User Verification Behavior
@@ -46,7 +46,7 @@ When a user tries to interact with a passkey on Windows 11, an available screen
Where these biometrics are not configured or available, both passkey creation and authentication fall back to asking for the Windows Hello PIN.
-#### Chrome 120
+#### Chrome 120+
- When biometrics are not configured on Windows, or not available on the device:
- The behavior for both `userVerification='required'` and `userVerification='preferred'` are the same: Windows Hello asks for the device PIN for both passkey creation and authentication. Since user verification fails locally, the server only receives a successful response with the UV flag to be `true`.
@@ -54,4 +54,4 @@ Where these biometrics are not configured or available, both passkey creation an
## Resources
-> Coming Soon
+- [Support for passkeys in Windows (Microsoft)](https://learn.microsoft.com/en-us/windows/security/identity-protection/passkeys/)
diff --git a/content/en/docs/tools-libraries/_index.md b/content/en/docs/tools-libraries/_index.md
new file mode 100644
index 00000000..218291c2
--- /dev/null
+++ b/content/en/docs/tools-libraries/_index.md
@@ -0,0 +1,4 @@
+---
+title: Tools & Libraries
+description: "Detailed references for platforms, specifications, terminology, and other information."
+---
\ No newline at end of file
diff --git a/content/docs/tools-libraries/libraries.md b/content/en/docs/tools-libraries/libraries.md
similarity index 94%
rename from content/docs/tools-libraries/libraries.md
rename to content/en/docs/tools-libraries/libraries.md
index 089a61f5..141dc6a6 100644
--- a/content/docs/tools-libraries/libraries.md
+++ b/content/en/docs/tools-libraries/libraries.md
@@ -1,15 +1,9 @@
---
title: "Libraries"
description: "A list of libraries for passkeys and FIDO2/WebAuthn"
-lead: ""
date: 2022-09-24T16:02:27.390Z
-draft: false
-images: []
-menu:
- docs:
- parent: "tools-libraries"
-weight: 701
-toc: true
+layout: docs
+type: docs
---
## Selection criteria
@@ -81,6 +75,7 @@ The ["Awesome WebAuthn"](https://github.com/herrjemand/awesome-webauthn) GitHub
### .NET
- [FIDO2 .NET Library](https://fido2-net-lib.passwordless.dev/) (Anders Åberg, Alex Seigler)
+- [Passkeys for ASP.NET](https://www.identityserver.com/products/fido2-for-aspnet) (IdentityServer.com)
### Go
@@ -99,3 +94,7 @@ The ["Awesome WebAuthn"](https://github.com/herrjemand/awesome-webauthn) GitHub
- [webauthn-ruby](https://github.com/cedarcode/webauthn-ruby) (Cedarcode)
- [devise-passkeys](https://github.com/ruby-passkeys/devise-passkeys) (Ruby Passkeys, wrapper around `webauthn-ruby`)
- [warden-webauthn](https://github.com/ruby-passkeys/warden-webauthn) (Ruby Passkeys, wrapper around `webauthn-ruby`)
+
+### Swift
+
+- [Swift WebAuthn](https://github.com/swift-server/swift-webauthn) ([Swift Server Workgroup](https://www.swift.org/sswg/))
diff --git a/content/docs/tools-libraries/test-sites.md b/content/en/docs/tools-libraries/test-sites.md
similarity index 56%
rename from content/docs/tools-libraries/test-sites.md
rename to content/en/docs/tools-libraries/test-sites.md
index 7537c5d7..9ff93ecb 100644
--- a/content/docs/tools-libraries/test-sites.md
+++ b/content/en/docs/tools-libraries/test-sites.md
@@ -1,15 +1,9 @@
---
title: "Test Sites & Tools"
-description: ""
-lead: ""
+description: "A list of helpful WebAuthn test sites and other developer tools."
date: 2022-09-24T16:02:27.390Z
-draft: false
-images: []
-menu:
- docs:
- parent: "tools-libraries"
-weight: 702
-toc: true
+layout: docs
+type: docs
---
## FIDO2/WebAuthn Tools
@@ -28,3 +22,18 @@ toc: true
- [Yubico WebAuthn Developers Demo Site](https://demo.yubico.com/webauthn-developers)
The ["Awesome WebAuthn"](https://github.com/herrjemand/awesome-webauthn) GitHub repo is also regularly updated with tools and demos from the community.
+
+## Demo Sites
+
+### General Passkey Demos
+
+- [webauthn.io](https://webauthn.io)
+
+### Vendor Demo Sites
+
+These demo sites have been created and are maintained by FIDO2/WebAuthn vendors in the industry.
+
+- [passkeys.io (Hanko)](https://www.passkeys.io/)
+- [passkeys.guru (Descope)](https://passkeys.guru/)
+- [passkey.org (Yubico)](https://passkey.org)
+- [패스키 체험 (SK Telecom)](https://www.passkey-sktelecom.com/experience)
diff --git a/content/docs/use-cases/bootstrapping/index.md b/content/en/docs/use-cases/bootstrapping/index.md
similarity index 70%
rename from content/docs/use-cases/bootstrapping/index.md
rename to content/en/docs/use-cases/bootstrapping/index.md
index ed9adbe6..69e666bc 100644
--- a/content/docs/use-cases/bootstrapping/index.md
+++ b/content/en/docs/use-cases/bootstrapping/index.md
@@ -1,11 +1,8 @@
---
title : "Bootstrapping"
description: "Bootstrapping an account on the web"
-lead: "Bootstrapping an account on the web"
date: 2022-10-10T19:52:26.819Z
-draft: false
-images: ['pkdd-signin-username-next.png']
-weight: 310
+#images: ['pkdd-signin-username-next.png']
---
## Authenticating the user
@@ -16,7 +13,7 @@ To bootstrap an account, serve the user a sign-in page.
Start off by asking the user for their account identifier, typically a username or email address:
-
+{{< image src="pkdd-signin-username-next.png" class="col-10 col-md-7" wrapper="text-center" title="Sample sign in screen with a username field and next button">}}
To support the [autofill UI](/docs/reference/terms/#autofill-ui) for passkeys, make sure to:
@@ -32,50 +29,54 @@ To support the [autofill UI](/docs/reference/terms/#autofill-ui) for passkeys, m
2. On page load, check to see if autofill UI (conditional mediation) is available using an if statement, then call `navigator.credentials.get()` with `mediation: "conditional"` and `userVerification: "preferred"`.
-```html
-
-```
+ })();
+
+ ```
This will cause the following to happen:
-- Retrieve the authentication options from your server. Return at least a random `challenge` and `rpId` to be associated with this authentication request.
+- Retrieve the authentication options from your server. Return at least a random challenge to be associated with this authentication request.
-- When the user interacts with the username field, the browser and platform will check whether a passkey exists in the platform authenticator that can be used with the relying party.
If this is the case, the passkey will be presented to the user as an option to choose (along with other credentials that can be auto-filled, such as usernames stored in the browser’s password manager). The browser/platform might render a UI similar to the one shown below, although the exact look and feel will vary from platform to platform (Windows vs. Android vs. iOS), and from form factor to form factor (desktop vs. mobile):
+- When the user interacts with the username field, the browser and platform will check whether a passkey exists in the platform authenticator that can be used with the relying party
+
+ If this is the case, the passkey will be presented to the user as an option to choose (along with other credentials that can be auto-filled, such as usernames stored in the browser’s password manager).
+
+ The browser/platform might render a UI similar to the one shown below, although the exact look and feel will vary from platform to platform (Windows vs. Android vs. iOS), and from form factor to form factor (desktop vs. mobile):
-
+{{< image src="pkdd-signin-username-autofill.png" class="col-10 col-md-7" wrapper="text-center" title="Sample sign in screen with the autofill UI rendered under the username field, showing a passkey for bob@example.com, an other accounts option and a passkey from another device option">}}
- If the user selects the passkey, the platform UI will guide the user through a (often biometrics-based) user verification check.
@@ -107,7 +108,7 @@ If the user used a passkey from another device (such as a phone, tablet, or FIDO
In such a scenario, offer the user the choice to create a passkey on their local device. This will result in a more seamless user experience in the future, as the user will not be required to use their other device.
-
+{{< image src="pkdd-interstitial-cdalocal.png" class="col-10 col-md-7" wrapper="text-center" title="A sample interstitial with the title: Set up a passkey on this device, with the passkey icon to the left. Below is text that reads: Next time you sign in, would you like to use this device instead of your phone? Under that is a button that says yes and a link that says not now.">}}
### A note about user verification
@@ -133,7 +134,7 @@ If passkeys are supported, this will return `true`. If they aren't supported, th
Serve an opt-in or "upsell" modal/interstitial or page to the user offering them to create a passkey:
-
+{{< image src="pkdd-interstitial-upgradeaccount.png" class="col-10 col-md-7" wrapper="text-center" title="A sample interstitial with the title: Faster, safer sign-in with passkeys, with the passkey icon to the left. Below is text that reads: You can now sign into this site using your face, fingerprint, or device PIN! Under that is a button that says create a passkey and a link that says not now.">}}
> Consider showing (or linking to) longer descriptions explaining that all users that are able to unlock the current device will be able to access the account at the relying party to ensure that the user is giving fully informed consent.
@@ -201,8 +202,7 @@ navigator.credentials.create({
})
```
-{{< callout context="note" title="A note on attestation" icon="info-circle" >}}
-We recommend that most relying parties not specify the attestation conveyance parameter `attestation` (thus defaulting to none), or instead explicitly use the value `indirect`. This guarantees the most streamlined user experience (platforms are likely to obtain consent from the user for other types of attestation conveyances, which likely results in a larger fraction of unsuccessful credential creations due to users canceling the creation).
-{{< /callout >}}
+> [!NOTE] A note on attestation
+> We recommend that most relying parties not specify the attestation conveyance parameter `attestation` (thus defaulting to none), or instead explicitly use the value `indirect`. This guarantees the most streamlined user experience (platforms are likely to obtain consent from the user for other types of attestation conveyances, which likely results in a larger fraction of unsuccessful credential creations due to users canceling the creation).
When the WebAuthn call resolves, send the response to your server and associate the returned public key and credential ID with the previously authenticated user account.
diff --git a/content/docs/use-cases/bootstrapping/pkdd-interstitial-cdalocal.png b/content/en/docs/use-cases/bootstrapping/pkdd-interstitial-cdalocal.png
similarity index 100%
rename from content/docs/use-cases/bootstrapping/pkdd-interstitial-cdalocal.png
rename to content/en/docs/use-cases/bootstrapping/pkdd-interstitial-cdalocal.png
diff --git a/content/docs/use-cases/bootstrapping/pkdd-interstitial-upgradeaccount.png b/content/en/docs/use-cases/bootstrapping/pkdd-interstitial-upgradeaccount.png
similarity index 100%
rename from content/docs/use-cases/bootstrapping/pkdd-interstitial-upgradeaccount.png
rename to content/en/docs/use-cases/bootstrapping/pkdd-interstitial-upgradeaccount.png
diff --git a/content/docs/use-cases/bootstrapping/pkdd-signin-username-autofill.png b/content/en/docs/use-cases/bootstrapping/pkdd-signin-username-autofill.png
similarity index 100%
rename from content/docs/use-cases/bootstrapping/pkdd-signin-username-autofill.png
rename to content/en/docs/use-cases/bootstrapping/pkdd-signin-username-autofill.png
diff --git a/content/docs/use-cases/bootstrapping/pkdd-signin-username-next.png b/content/en/docs/use-cases/bootstrapping/pkdd-signin-username-next.png
similarity index 100%
rename from content/docs/use-cases/bootstrapping/pkdd-signin-username-next.png
rename to content/en/docs/use-cases/bootstrapping/pkdd-signin-username-next.png
diff --git a/content/docs/use-cases/reauth/index.md b/content/en/docs/use-cases/reauth/index.md
similarity index 63%
rename from content/docs/use-cases/reauth/index.md
rename to content/en/docs/use-cases/reauth/index.md
index 1e47da3c..ba02d82a 100644
--- a/content/docs/use-cases/reauth/index.md
+++ b/content/en/docs/use-cases/reauth/index.md
@@ -1,11 +1,9 @@
---
title : "Reauthentication"
description: "Performing a reauthentication with passkeys"
-lead: "Performing a reauthentication with passkeys"
date: 2022-10-10T19:52:16.153Z
-draft: false
-images: []
-weight: 320
+type: docs
+layout: docs
---
Reauthentication might happen for the following reasons:
@@ -14,7 +12,7 @@ Reauthentication might happen for the following reasons:
- The user session expired due to inactivity, and the user wants to sign in again
- The user is about to perform a sensitive action, and needs to re-confirm control over the user session
-You’ll use passkeys that you set up in the [previous section](../bootstrapping) to reauthenticate the user in each of these situations. The WebAuthn API call is the same in all three cases, but the UI treatment that you provide is slightly different. Since the particular account is specified by you, the platform will not offer the user to select a different account on your service.
+You’ll use passkeys that you set up in the [previous section](/bootstrapping) to reauthenticate the user in each of these situations. The WebAuthn API call is the same in all three cases, but the UI treatment that you provide is slightly different. Since the particular account is specified by you, the platform will not offer the user to select a different account on your service.
## Sensitive Actions
@@ -22,13 +20,13 @@ Let’s look at the UI for the last case first: when it’s time to re-authentic
If _no such credential ID is available_, serve a traditional login challenge suitable for reauthentication, for example:
-
+{{< image src="pkdd-reauth-password.png" class="col-10 col-md-7" wrapper="text-center" title="Sample reauthentication screen with a title of: Let's make sure it's you, then showing Account: bob@example.com with a password caption and password field below, and a try another way link and next button at the bottom">}}
> We recommend that on this login challenge page, users can’t change their account identifier. Also, the login challenge should be something that an unauthorized user of the device can’t pass.
If, however, you do find at least one passkey credential ID for the user, then you can use passkeys for reauthentication:
-
+{{< image src="pkdd-reauth-passkey.png" class="col-10 col-md-7" wrapper="text-center" title="Sample reauthentication screen with a title of: Let's make sure it's you, then showing Account: bob@example.com, with text below reading: You'll use your passkey to verify it's you, and a try another way link and a Go button with the passkey icon at the bottom">}}
When the user is ready (in the above example, when they click on the "Go" button), call `navigator.credentials.get()`, passing in all the user’s passkey credential IDs:
@@ -52,7 +50,7 @@ navigator.credentials.get({
});
```
-> NOTE: Be sure to read the guidance around userVerification from the [previous page](../bootstrapping#a-note-about-user-verification)
+> NOTE: Be sure to read the guidance around userVerification from the [previous page](/bootstrapping#a-note-about-user-verification)
If the user instead clicks on "Try another way", you should offer them other sign in methods (password, etc.) to reauthenticate them (assuming the user has such other sign in methods available to them).
@@ -64,19 +62,19 @@ Now let’s look at the case where the reauthentication is triggered because the
You, as the relying party, might then serve a sign-in page like this:
-
+{{< image src="pkdd-reauth-logout-passkey.png" class="col-10 col-md-7" wrapper="text-center" title="Sample reauthentication screen with a title of: Welcome back!, then showing a button with the passkey icon and text reading sign in as bob@example.com, with a link below saying Use a different account">}}
-If the user clicks on "Use a different account", then you should enter an account bootstrap flow as explained on the previous page, repeating the steps in [Bootstrapping an account](../bootstrapping), where the platform will let them select which account they want to use.
+If the user clicks on "Use a different account", then you should enter an account bootstrap flow as explained on the previous page, repeating the steps in [Bootstrapping an account](/bootstrapping), where the platform will let them select which account they want to use.
> In this case, you should also give the user the ability to completely remove the suggested account from being listed on the sign-in page.
But if the user clicks the "Sign in as" button, check whether you have at least one passkey credential ID associated with the user. If no credential ID is available, serve a traditional login challenge suitable for reauthentication, for example:
-
+{{< image src="pkdd-reauth-logout-password.png" class="col-10 col-md-7" wrapper="text-center" title="Sample reauthentication screen with a title of: Welcome back!, then showing a button with the passkey icon and text reading sign in as bob@example.com, with a link below saying Use a different account">}}
If, however, you _do_ find at least one passkey credential ID for the user, then you can use passkeys for reauthentication:
-
+{{< image src="pkdd-reauth-logout-passkey-knowncid.png" class="col-10 col-md-7" wrapper="text-center" title="Sample reauthentication screen with a title of: Welcome back!, then showing a button with the passkey icon and text reading sign in as bob@example.com, with a link below saying Try another way">}}
When the user is ready (in the above example, when they click on the “Go!” button), call `navigator.credentials.get()`, exactly as shown above (i.e., by passing in all the user’s passkey credential IDs).
diff --git a/content/docs/use-cases/reauth/pkdd-reauth-logout-passkey-knowncid.png b/content/en/docs/use-cases/reauth/pkdd-reauth-logout-passkey-knowncid.png
similarity index 100%
rename from content/docs/use-cases/reauth/pkdd-reauth-logout-passkey-knowncid.png
rename to content/en/docs/use-cases/reauth/pkdd-reauth-logout-passkey-knowncid.png
diff --git a/content/docs/use-cases/reauth/pkdd-reauth-logout-passkey.png b/content/en/docs/use-cases/reauth/pkdd-reauth-logout-passkey.png
similarity index 100%
rename from content/docs/use-cases/reauth/pkdd-reauth-logout-passkey.png
rename to content/en/docs/use-cases/reauth/pkdd-reauth-logout-passkey.png
diff --git a/content/docs/use-cases/reauth/pkdd-reauth-logout-password.png b/content/en/docs/use-cases/reauth/pkdd-reauth-logout-password.png
similarity index 100%
rename from content/docs/use-cases/reauth/pkdd-reauth-logout-password.png
rename to content/en/docs/use-cases/reauth/pkdd-reauth-logout-password.png
diff --git a/content/docs/use-cases/reauth/pkdd-reauth-passkey.png b/content/en/docs/use-cases/reauth/pkdd-reauth-passkey.png
similarity index 100%
rename from content/docs/use-cases/reauth/pkdd-reauth-passkey.png
rename to content/en/docs/use-cases/reauth/pkdd-reauth-passkey.png
diff --git a/content/docs/use-cases/reauth/pkdd-reauth-password.png b/content/en/docs/use-cases/reauth/pkdd-reauth-password.png
similarity index 100%
rename from content/docs/use-cases/reauth/pkdd-reauth-password.png
rename to content/en/docs/use-cases/reauth/pkdd-reauth-password.png
diff --git a/content/privacy-policy.en.md b/content/en/privacy-policy.md
similarity index 90%
rename from content/privacy-policy.en.md
rename to content/en/privacy-policy.md
index d91f0d9e..345c72c4 100644
--- a/content/privacy-policy.en.md
+++ b/content/en/privacy-policy.md
@@ -1,9 +1,8 @@
---
title: "Privacy Policy"
description: "We do not use cookies and we do not collect any personal data."
-date: 2022-10-11T01:40:04.273Z
-draft: false
-images: []
+type: minimal
+layout: minimal
---
__TLDR__: We do not use cookies and we do not collect any personal data.
diff --git a/content/faq/_index.md b/content/faq/_index.md
deleted file mode 100644
index 9b3e8644..00000000
--- a/content/faq/_index.md
+++ /dev/null
@@ -1,95 +0,0 @@
----
-title: "Frequently Asked Questions"
-description: ""
-lead: "put some intro text here"
-date: 2022-08-04T18:01:38.505Z
-draft: true
-images: []
-toc: true
----
-
-## Intro to passkeys
-
-{{< details "What is a passkey?" >}}
-Commodo pariatur laboris excepteur excepteur ut nostrud voluptate.
-{{< /details >}}
-
-{{< details "What is the difference between a passkey and a multi-device credential?" >}}
-They are the same. "Multi-device credential" is the official name in the WebAuthn specification, whereas "passkey" is a more user friendly term (similar to "password").
-{{< /details >}}
-
-{{< details "What is the difference between a single-device passkey and a passkey?" >}}
-A single-device passkey is bound to a device and cannot be backed up or synced.
-{{< /details >}}
-
-{{< details "Do security keys support passkeys?" >}}
-Today, security keys can hold single-device passkeys, as they are bound to the authenticator. Security key vendors may decide to offer multi-device passkey authenticators in the future.
-
-Security keys also support second-factor only credentials (often referred to as U2F credentials), which are _not_ passkeys.
-{{< /details >}}
-
-{{< details "What is the difference between a passkey and a multi-device credential?" >}}
-Pariatur aliquip ea ea ea.
-{{< /details >}}
-
-## Ecosystem and Compatibility
-
-{{< details "Which platforms support passkeys?" >}}
-Aliquip pariatur qui dolore proident cillum officia. See the [Ecosystem](/ecosystem) page for more details.
-{{< /details >}}
-
-{{< details "Can I use passkeys to authenticate across different platforms and/or ecosystems?" >}}
-Lorem aute quis laborum non adipisicing sit anim minim laborum reprehenderit deserunt aliquip culpa.
-{{< /details >}}
-
-{{< details "How does the user sign-in if a passkey for the Relying Party (RP) is not already available on the device?" >}}
-This is best understood with an example: say the user has an Android phone where they already have a credential for the [RP](/docs/reference/terms/#relying-party-rp). Now they want to sign-in to the RP’s website on Windows where they have never signed into the website before.
-
-For existing devices, the user will point their browser to the RP’s website in Windows. They see a 'sign-in' button on the login web page and hit that button.The user sees the option to link a new phone or use a previously linked one. If the user selects the linked phone and the phone is physically close to the Windows device, the user sees a pop-up from Android asking in essence “I see you are trying to sign-in on this nearby computer, here are the accounts I have.” The user chooses an account at which point Android asks "Please perform your unlock to approve sign-in to the computer with this account". The user performs the unlock and they are signed-in to the website.
-
-Alternatively, the user can use a security key that has been enrolled with the RP. In this instance, the user will point their browser to the RP website on the Windows computer. They see a ‘sign-in’ button on the RP’s login web page and hit that button. When the RP asks for FIDO authentication, the user is able to insert or tap their Security Key to unlock and they are signed-in to the website.
-
-The flow described in this example would work regardless of the OS the user’s mobile phone is running and the OS and browser available on the target device for login (eg, computer, tablet, TV etc). The target user experience is very similar to that of a phone push notification approval prompt commonly used today as a second-factor today. The crucial difference is that the approval is now phishing-resistant — this is because, when you approve a login on another device on a conventional phone approval, you don’t really know whether your other device is pointed to the correct website or a look-alike phishing site relaying information in real-time. In addition, the mobile device approval also replaces the password (as opposed to being used as a second factor adjunct).
-{{< /details >}}
-
-{{< details "How can the user switch to a new mobile platform using passkeys (eg, from iOS to Android or vice versa)?" >}}
-If the user still has their old device, they can use it to sign into their new device (using the FIDO Cross Device Authentication flow). If they don’t, then the [RP](/docs/reference/terms/#relying-party-rp) can treat sign-in from the new device (which might be from a different vendor) as a normal account recovery situation and take appropriate steps to sign in the user. The RP would then usually create a new multi-device credential on the new device (which runs a different platform OS than the user’s previous device). If the user no longer plans to use their old device, they can let the RP know, and the RP can then delete the credential of the old device from their server records — thus, the credential on the old device will no longer be accepted for sign-in.
-
-If the user is still in possession of their old device, the RP can also use the credential on that old device (say, an Android device) to sign the user into the new device (say, an iOS device) without going through an account recovery step. See previous question for more detail the old mobile can be used to sign-in to the new mobile in a simple phishing resistant way.
-
-Additionally, a user can use a security key to securely authenticate to a new device.
-{{< /details >}}
-
-## Security
-
-{{< details "Why are passkeys better than password + second factor?" >}}
-Passwords and second-factors, such as one time passwords (OTPs) and phone push notification approvals, are inconvenient and insecure. They can be phished, and they are being phished at scale today. Passkeys are designed to solve this problem. They have three fundamental advantages over using passwords (even when used with traditional second-factors):
-
-**Sign-in is easier for the user:** It’s the same biometric or PIN users use to unlock their device. The user doesn’t need to deal with typing passwords or OTPs.
-
-**Sign-in is fundamentally safer (phishing-resistant):** Phishing-resistance of sign-in is a core design goal of FIDO and is built into every sign-in event that leverages FIDO. Furthermore, breaches of password databases (which can be an attractive target for hackers) no longer pose a threat.
-
-**Sign-in is more robust:** Users often forget passwords and don’t set up backup emails and phone numbers. With passkeys, the credentials are backed up and are therefore protected from loss. If the user gets a new phone the credentials can easily be restored to the new phone. When signing in from a new device, the existence of a passkey is a powerful trust signal that websites can leverage to make recovering access to the account radically safer and simpler, since it means that the platform vendor has already verified the user.
-{{< /details >}}
-
-{{< details "Are passkeys considered multi-factor authentication?" >}}
-Passkeys are present on a user’s devices (something the user "has") and – if the Relying Party requests this – can only be exercised by the user with a biometric or PIN (something the user “is” or ”knows”). Thus, authentication with a passkey embodies the core principle of multi-factor security.
-{{< /details >}}
-
-{{< details "Can I use passkeys to authenticate across different platforms and/or ecosystems?" >}}
-Lorem aute quis laborum non adipisicing sit anim minim laborum reprehenderit deserunt aliquip culpa.
-{{< /details >}}
-
-## Privacy
-
-{{< details "Do passkeys change FIDO's privacy posture?" >}}
-We expect all platforms implementing passkeys to adhere to FIDO’s [Privacy Principles](https://media.fidoalliance.org/wp-content/uploads/2014/12/FIDO_Alliance_Whitepaper_Privacy_Principles.pdf), including usage of personal data for the sole purpose of FIDO operations.
-{{< /details >}}
-
-{{< details "Is the user's biometric information safe?" >}}
-Yes, there are no changes to user verification methods or their security properties as part of the effort – and user biometrics will never leave the device.
-{{< /details >}}
-
-{{< details "Can I use passkeys to authenticate across different platforms and/or ecosystems?" >}}
-Lorem aute quis laborum non adipisicing sit anim minim laborum reprehenderit deserunt aliquip culpa.
-{{< /details >}}
diff --git a/cspell.json b/cspell.json
index 3abaf2c9..3342ace1 100644
--- a/cspell.json
+++ b/cspell.json
@@ -1,6 +1,6 @@
{
"version": "0.2",
- "ignorePaths": [],
+ "ignorePaths": ["static/_redirects"],
"dictionaryDefinitions": [],
"dictionaries": [],
"words": [],
diff --git a/data/docs-versions.yml b/data/docs-versions.yml
deleted file mode 100644
index 8e7e5dd9..00000000
--- a/data/docs-versions.yml
+++ /dev/null
@@ -1,60 +0,0 @@
-# - group: v1.x
-# baseurl: "https://getbootstrap.com"
-# description: "Every minor and patch release from v1 is listed below."
-# versions:
-# - v: "1.0.0"
-# - v: "1.1.0"
-# - v: "1.1.1"
-# - v: "1.2.0"
-# - v: "1.3.0"
-# - v: "1.4.0"
-#
-# - group: v2.x
-# baseurl: "https://getbootstrap.com"
-# description: "Every minor and patch release from v2 is listed below."
-# versions:
-# - v: "2.0.0"
-# - v: "2.0.1"
-# - v: "2.0.2"
-# - v: "2.0.3"
-# - v: "2.0.4"
-# - v: "2.1.0"
-# - v: "2.1.1"
-# - v: "2.2.0"
-# - v: "2.2.1"
-# - v: "2.2.2"
-# - v: "2.3.0"
-# - v: "2.3.1"
-# - v: "2.3.2"
-#
-# - group: v3.x
-# baseurl: "https://getbootstrap.com/docs"
-# description: "Every minor and patch release from v3 is listed below. Last update was v3.4.1."
-# versions:
-# - v: "3.3"
-# - v: "3.4"
-#
-# - group: v4.x
-# baseurl: "https://getbootstrap.com/docs"
-# description: "Our previous major release with its minor releases. Last update was v4.6.0."
-# versions:
-# - v: "4.0"
-# - v: "4.1"
-# - v: "4.2"
-# - v: "4.3"
-# - v: "4.4"
-# - v: "4.5"
-# - v: "4.6"
-
-- group: v0.x
- baseurl: "/docs"
- description: "Current major release. Last update was v0.2.0."
- versions:
- - v: "0.1"
- - v: "0.2"
-
-- group: v1.x
- baseurl: "/docs"
- description: "Every minor and patch release from v1 is listed below. Last update was v1.0.0."
- versions:
- - v: "1.0"
diff --git a/data/docs.yml b/data/docs.yml
new file mode 100644
index 00000000..eb957fc7
--- /dev/null
+++ b/data/docs.yml
@@ -0,0 +1,37 @@
+# This file holds all menu entries for the docs sidebar
+
+- title: Intro
+ pages:
+ - title: What are passkeys?
+
+- title: Use Cases
+ pages:
+ - title: Bootstrapping
+ - title: Reauthentication
+ link: reauth
+
+- title: Advanced
+ pages:
+ - title: Related Origin Requests
+ link: related-origins
+
+- title: Tools & Libraries
+ pages:
+ - title: Libraries
+ - title: Test & Demo Sites
+ link: test-sites
+
+
+- title: Reference
+ pages:
+ - title: Android
+ - title: "iOS & iPadOS"
+ link: ios
+ - title: Chrome OS
+ link: chromeos
+ - title: macOS
+ - title: Windows
+ - title: Known Issues
+ - title: Specifications
+ link: specs
+ - title: Terms
diff --git a/functions/hi-from-lambda.js b/functions/hi-from-lambda.js
deleted file mode 100644
index 88e4fa00..00000000
--- a/functions/hi-from-lambda.js
+++ /dev/null
@@ -1,11 +0,0 @@
-exports.handler = (event, context, callback) => {
- callback (null, {
- statusCode: 200,
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- message: 'Hi from Lambda.',
- }),
- });
-}
diff --git a/go.mod b/go.mod
new file mode 100644
index 00000000..a5156329
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,20 @@
+module hinode.passkeys.dev
+
+go 1.23.4
+
+require (
+ github.com/airbnb/lottie-web v5.12.2+incompatible // indirect
+ github.com/gethinode/hinode v0.27.27 // indirect
+ github.com/gethinode/mod-bootstrap v1.3.2 // indirect
+ github.com/gethinode/mod-csp v1.0.7 // indirect
+ github.com/gethinode/mod-flexsearch/v2 v2.0.3 // indirect
+ github.com/gethinode/mod-fontawesome v1.10.1 // indirect
+ github.com/gethinode/mod-google-analytics v1.3.1 // indirect
+ github.com/gethinode/mod-katex v1.1.3 // indirect
+ github.com/gethinode/mod-leaflet v1.2.1 // indirect
+ github.com/gethinode/mod-lottie v1.5.13 // indirect
+ github.com/gethinode/mod-simple-datatables v1.1.6 // indirect
+ github.com/gethinode/mod-utils/v2 v2.8.6 // indirect
+ github.com/nextapps-de/flexsearch v0.0.0-20240501124520-961c3ae84a87 // indirect
+ github.com/twbs/bootstrap v5.3.3+incompatible // indirect
+)
diff --git a/go.sum b/go.sum
new file mode 100644
index 00000000..82e3b789
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,32 @@
+github.com/airbnb/lottie-web v5.12.2+incompatible h1:Ldogtlhiucf7mMsgisyxSBY0qunV44+lpa9Icy2KoQc=
+github.com/airbnb/lottie-web v5.12.2+incompatible/go.mod h1:nTss557UK9FGnp8QYlCMO29tjUHwbdAHG/DprbGfHGE=
+github.com/gethinode/hinode v0.27.17 h1:rPQmxmFCBIT+S3WBfHRp41d6QYzf/Z/i0BuLi8cvEeo=
+github.com/gethinode/hinode v0.27.17/go.mod h1:k+TUNPNBbNY2kNlzDySw3k/GuDHetfKN/qTXKHwlbk0=
+github.com/gethinode/hinode v0.27.18 h1:rlksX+VmW37ORcoyE9n33uFF6NdINgmN5fsTtgag7lk=
+github.com/gethinode/hinode v0.27.18/go.mod h1:k+TUNPNBbNY2kNlzDySw3k/GuDHetfKN/qTXKHwlbk0=
+github.com/gethinode/hinode v0.27.27 h1:05bBO+MIEoB4PWv1Xm1+xnmwLJ3WKxqz/+AkgRLrYb8=
+github.com/gethinode/hinode v0.27.27/go.mod h1:3dUk4HAyMEHjuu01TOzUTfTk3fezSqE9oQ8tpSuTGQQ=
+github.com/gethinode/mod-bootstrap v1.3.2 h1:mf9Qgr+xHZeHjZGYFdurETfdEKKldB158fpjH0GoaNU=
+github.com/gethinode/mod-bootstrap v1.3.2/go.mod h1:CL9IDot6nbXIWJYE/KxfsTdYYEJIGL17BXbAYPn+wVQ=
+github.com/gethinode/mod-csp v1.0.7 h1:V4D8vYA/jJ2Nv9kPz5gt96fkVd3NtT7sBqVhnG5TvAU=
+github.com/gethinode/mod-csp v1.0.7/go.mod h1:Nb22QMicoUHgZQUKP5TCgVrSI8K3KU7jLuLBShmotjg=
+github.com/gethinode/mod-flexsearch/v2 v2.0.3 h1:lC4UN9DPYyj3lsRm86Rt+kKx2DmAS10dOxbM/1H8fVw=
+github.com/gethinode/mod-flexsearch/v2 v2.0.3/go.mod h1:d7MMkVlz0l6cEk76e0mkveEsDxGfu5Sv+HUIhoGguhE=
+github.com/gethinode/mod-fontawesome v1.10.1 h1:gXQ75VXI+a0W2ALkAFHd/QFQ/VoZR6eujX0Hm7DkG94=
+github.com/gethinode/mod-fontawesome v1.10.1/go.mod h1:xBKsZH3WJtMOItZVlp9SbO51uaBy6IbvUZSKpNu3b6Y=
+github.com/gethinode/mod-google-analytics v1.3.1 h1:WPXrsO6Kpp0k8PYY9a1JyiZgYGMlkBfHY8eEg6CfcL0=
+github.com/gethinode/mod-google-analytics v1.3.1/go.mod h1:dl628cFozpCvoIMCiV7ujzQipjxcm3eatXrSfLPWNII=
+github.com/gethinode/mod-katex v1.1.3 h1:fRgoBZVCJeLUFqGrGweg4FhCcbGsyqNRmd9WezG/CUQ=
+github.com/gethinode/mod-katex v1.1.3/go.mod h1:byAfpI3wuqNJIooTGVEGc1cjBhhCy4+CcK1H6495MYg=
+github.com/gethinode/mod-leaflet v1.2.1 h1:p0bKi+F5vbXwYknBvFEN9KymK8PRqKaYhVz5O1QPs/c=
+github.com/gethinode/mod-leaflet v1.2.1/go.mod h1:Ei0x9WiL7Dbi4JeG6yI1CE63bT1QJ8sKi67Jea1wFSE=
+github.com/gethinode/mod-lottie v1.5.13 h1:Vth/OZDjfBZ9Kz5ew3tXGj9tU6w4StIta6qgfa1daZo=
+github.com/gethinode/mod-lottie v1.5.13/go.mod h1:tMFSUW9z3kC8IvDfs1ph9MGjuZFRBrpCnpodrwY+L4w=
+github.com/gethinode/mod-simple-datatables v1.1.6 h1:7nPeRwHlYbmlNEg7fBV6FyXqpxWW6ZAemaZyYxpIF8U=
+github.com/gethinode/mod-simple-datatables v1.1.6/go.mod h1:bvMdmQFk4Hvyltf/QhMqUaApvPbIGTnbI3JLjOEh8go=
+github.com/gethinode/mod-utils/v2 v2.8.6 h1:gtTtL37YPq1n/POIzbj40aYOg1VaZq8IjqwSf2V5yo0=
+github.com/gethinode/mod-utils/v2 v2.8.6/go.mod h1:GTYeknoLujNjfDxI+V9Dcug26CYJSTJ0B/U2dagw9oY=
+github.com/nextapps-de/flexsearch v0.0.0-20240501124520-961c3ae84a87 h1:6PNbL0/LxO8Xl8MZSe5uvCidYNpFTz9nlWTqj2qdlzA=
+github.com/nextapps-de/flexsearch v0.0.0-20240501124520-961c3ae84a87/go.mod h1:5GdMfPAXzbA2gXBqTjC6l27kioSYzHlqDMh0+wyx7sU=
+github.com/twbs/bootstrap v5.3.3+incompatible h1:goFoqinzdHfkeegpFP7pvhbd0g+A3O2hbU3XCjuNrEQ=
+github.com/twbs/bootstrap v5.3.3+incompatible/go.mod h1:fZTSrkpSf0/HkL0IIJzvVspTt1r9zuf7XlZau8kpcY0=
diff --git a/hugo_stats.json b/hugo_stats.json
index 778f5141..689b1856 100644
--- a/hugo_stats.json
+++ b/hugo_stats.json
@@ -2,41 +2,29 @@
"htmlElements": {
"tags": [
"a",
- "article",
- "aside",
- "base",
"blockquote",
"body",
"br",
"button",
- "circle",
"code",
- "details",
"div",
"em",
"figcaption",
"figure",
"footer",
"form",
- "g",
"h1",
"h2",
"h3",
"h4",
"h5",
"head",
- "header",
- "hr",
"html",
- "i",
"img",
"input",
- "kbd",
"label",
"li",
- "line",
"link",
- "main",
"meta",
"nav",
"noscript",
@@ -45,373 +33,471 @@
"path",
"pre",
"script",
- "section",
"small",
"span",
"strong",
- "style",
- "summary",
"sup",
"svg",
+ "symbol",
"table",
"tbody",
"td",
- "template",
"th",
"thead",
- "time",
"title",
"tr",
"ul",
- "wbr"
+ "use"
],
"classes": [
- "DocSearch-Label",
- "about",
+ "accordion",
+ "accordion-body",
+ "accordion-button",
+ "accordion-collapse",
+ "accordion-header",
+ "accordion-item",
"active",
- "align-middle",
+ "align-items-center",
+ "align-self-center",
+ "align-top",
"anchor",
- "badge",
- "bg-color-green",
- "bg-light",
- "bi",
- "bi-box-arrow-up-right",
- "bi-calendar-plus",
- "bi-chat-square-text-fill",
- "bi-check-circle",
- "bi-check-circle-fill",
- "bi-circle-half",
- "bi-github",
- "bi-house-heart",
- "bi-mastodon",
- "bi-pencil",
- "bi-twitter-x",
- "bi-usb-drive",
- "bi-wrench-adjustable-circle-fill",
- "bi-x-circle-fill",
+ "ball",
+ "bg-body",
+ "bg-body-tertiary",
+ "blockquote",
+ "blockquote-alert",
+ "blockquote-alert-heading",
+ "blockquote-alert-note",
"border",
+ "border-0",
+ "border-top",
+ "bottom-0",
+ "bottom-bar",
"btn",
- "btn-black",
"btn-close",
- "btn-lg",
+ "btn-dark",
"btn-light",
- "btn-link",
- "callout",
- "callout-body",
- "callout-content",
- "callout-icon",
- "callout-note",
- "callout-title",
+ "btn-outline-secondary",
+ "btn-primary",
+ "btn-sm",
+ "btn-social",
+ "btn-toggle-group",
+ "btn-toggle-nav",
"card",
"card-body",
+ "card-icon",
"card-list",
- "categories",
- "chroma",
+ "card-text",
+ "card-title",
+ "checkbox",
"col",
+ "col-10",
+ "col-12",
+ "col-4",
"col-lg-10",
- "col-lg-11",
- "col-lg-12",
- "col-lg-16",
- "col-lg-5",
+ "col-lg-2",
"col-lg-8",
- "col-lg-9",
"col-md-12",
- "col-xl-3",
- "col-xl-4",
+ "col-md-2",
+ "col-md-3",
+ "col-md-4",
+ "col-md-7",
+ "col-md-8",
+ "col-md-9",
+ "col-sm-12",
"col-xl-8",
- "col-xl-9",
- "color-black",
- "color-green",
- "color-red",
- "container",
+ "collapse",
+ "collapsed",
"container-fluid",
- "container-lg",
- "content",
- "contributors",
- "created-date",
+ "container-xxl",
+ "d-block",
"d-flex",
+ "d-grid",
+ "d-inline-flex",
"d-lg-block",
- "d-lg-none",
"d-md-block",
"d-md-none",
"d-none",
- "d-xl-block",
- "d-xl-none",
- "device-support",
- "docs",
- "docs-content",
- "docs-links",
- "docs-sidebar",
- "docs-sidebar-offset",
- "docs-sidebar-top",
- "docs-toc",
- "docs-toc-offset",
- "doks-sidebar",
- "error404",
- "expressive-code",
+ "d-none-dark",
+ "d-none-inline-dark",
+ "d-none-inline-light",
+ "d-none-light",
+ "display-1",
+ "display-4",
+ "display-6",
+ "emphasis",
+ "end-0",
+ "fa",
+ "fa-10x",
+ "fa-2xl",
+ "fa-4x",
+ "fa-android",
+ "fa-apple",
+ "fa-at",
+ "fa-bluesky",
+ "fa-calendar-plus",
+ "fa-circle-check",
+ "fa-circle-info",
+ "fa-circle-xmark",
+ "fa-comments",
+ "fa-ellipsis",
+ "fa-face-frown",
+ "fa-fw",
+ "fa-github",
+ "fa-house",
+ "fa-key",
+ "fa-link",
+ "fa-linkedin",
+ "fa-mastodon",
+ "fa-moon",
+ "fa-people-robbery",
+ "fa-share-nodes",
+ "fa-snowflake",
+ "fa-sort",
+ "fa-sun",
+ "fa-threads",
+ "fa-user-shield",
+ "fa-wand-magic-sparkles",
+ "fa-whatsapp",
+ "fa-xl",
+ "fab",
+ "fade-out-text",
+ "fas",
+ "figure-caption",
+ "fixed-top",
"flex-column",
+ "flex-fill",
"flex-grow-1",
- "flex-lg-row",
- "flex-md-row",
- "flex-row",
- "flex-sm-row",
- "flex-xl-nowrap",
+ "flex-shrink-0",
"footer",
+ "footer-muted",
"form-control",
- "form-control-lg",
- "frame",
- "fs-4",
- "fs-5",
+ "fs-3",
"fs-6",
+ "fs-lg-5",
+ "fs-md-5",
"fst-italic",
+ "fw-30",
"fw-bold",
- "fw-semibold",
- "gx-5",
- "h-auto",
- "h4",
- "h5",
- "header",
- "header-bar",
+ "fw-bolder",
+ "fw-medium",
+ "fw-normal",
+ "g-3",
+ "gap-1",
+ "gap-2",
+ "h-100",
+ "h6",
+ "heading",
"highlight",
- "home",
- "icon",
- "icon-tabler",
- "icon-tabler-arrow-left",
- "icon-tabler-arrow-right",
- "icon-tabler-dots-vertical",
- "icon-tabler-menu",
- "icon-tabler-moon",
- "icon-tabler-search",
- "icon-tabler-sun",
- "icon-tabler-x",
- "info-circle",
+ "hstack",
+ "img-fluid",
+ "invisible",
+ "is-search",
"justify-content-between",
"justify-content-center",
- "justify-content-end",
+ "label",
"lead",
- "list",
- "list-inline",
- "list-inline-item",
- "list-nested",
+ "lh-1",
+ "link-bg-footer",
"list-unstyled",
- "list-view",
- "m-2",
- "mb-0",
+ "m-0",
+ "main-content",
+ "main-nav-toggler",
+ "mb-1",
"mb-2",
"mb-3",
"mb-4",
"mb-5",
- "me-2",
+ "mb-lg-5",
"me-auto",
- "me-lg-1",
- "me-lg-3",
- "message",
- "modal",
- "modal-body",
- "modal-content",
- "modal-dialog",
- "modal-dialog-scrollable",
- "modal-footer",
- "modal-fullscreen-md-down",
- "modal-header",
- "modal-title",
- "ms-2",
- "ms-3",
+ "middle-bar",
+ "min-vh-100",
+ "mode-switch",
"ms-auto",
- "ms-lg-2",
+ "ms-md-3",
"mt-0",
"mt-3",
"mt-4",
"mt-5",
- "mt-n3",
- "mx-2",
+ "mt-md-0",
"mx-auto",
- "mx-xl-auto",
+ "my-2",
"my-3",
+ "my-auto",
+ "my-md-0",
"nav",
"nav-item",
"nav-link",
+ "nav-pills",
+ "nav-tabs",
"navbar",
"navbar-brand",
- "navbar-expand-lg",
+ "navbar-collapse",
+ "navbar-container",
+ "navbar-expand-md",
+ "navbar-fixed-top",
+ "navbar-mode-selector",
"navbar-nav",
- "not-content",
+ "navbar-nav-scroll",
+ "navbar-toggler",
+ "no-js",
"offcanvas",
"offcanvas-body",
- "offcanvas-end",
"offcanvas-header",
"offcanvas-start",
"offcanvas-title",
- "order-3",
- "order-lg-4",
+ "order-first",
"p-0",
+ "p-1",
"p-2",
"p-3",
- "page-footer-meta",
- "page-links",
- "page-nav",
+ "p-4",
"pb-2",
"pb-3",
+ "pb-5",
"pe-1",
- "pe-4",
- "privacy-policy",
+ "position-fixed",
+ "position-relative",
+ "ps-0",
+ "ps-1",
"ps-3",
+ "pt-2",
+ "pt-3",
"pt-4",
- "px-0",
- "px-4",
- "query-no-results",
- "rounded-pill",
+ "pt-5",
+ "pt-md-0",
+ "px-3",
+ "px-xxl-0",
+ "py-1",
+ "py-3",
+ "py-5",
+ "rounded",
"row",
- "search-form",
+ "row-cols-1",
+ "row-cols-2",
+ "row-cols-lg-3",
+ "row-cols-md-2",
+ "row-cols-sm-1",
+ "row-cols-sm-3",
+ "search",
"search-input",
- "search-loading",
- "search-no-recent",
- "search-no-results",
- "search-result",
- "search-results",
- "search-text",
- "section",
- "section-nav",
- "section-sm",
- "single",
- "social-link",
- "status",
+ "search-suggestions",
+ "shadow",
+ "show",
+ "sidebar",
+ "sidebar-item",
+ "sidebar-item-group",
+ "sidebar-overflow",
+ "small",
"sticky-top",
"stretched-link",
- "submitted",
- "svg-icon-bw",
- "svg-inline",
+ "svg-inline--fa",
+ "syntax-highlight",
+ "tab-content",
+ "tab-pane",
"table",
"table-responsive",
"table-striped",
- "tags",
- "taxonomy",
- "text-bg-secondary",
- "text-bg-warning",
+ "text-bg-body",
+ "text-body",
"text-body-secondary",
"text-center",
+ "text-danger",
+ "text-dark",
"text-decoration-none",
"text-end",
- "text-lg-end",
- "text-lg-start",
"text-muted",
- "text-reset",
- "title",
- "title-submitted",
- "toc-mobile",
- "visually-hidden",
+ "text-nowrap",
+ "text-secondary",
+ "text-start",
+ "text-success",
+ "text-uppercase",
+ "text-warning",
+ "toast",
+ "toast-body",
+ "toast-container",
+ "toast-header",
+ "toc",
+ "toc-button",
+ "toc-panel",
+ "toc-sidebar",
+ "toggler-icon",
+ "top-bar",
"w-100",
- "wrap",
- "youtube-preview"
+ "w-25"
],
"ids": [
"2-factor-authentication-2fa",
"2fa-user",
- "Layer_1",
"TableOfContents",
"a-note-about-user-verification",
- "about",
+ "about-passkeysdev",
+ "accordion-default",
+ "accordion-default-heading-0",
+ "accordion-default-item-0",
"account-bootstrapping",
+ "additional-information",
"advanced",
+ "alternate-branding",
"attestation",
"authenticating-the-user",
"authentication-factor",
"autofill-ui",
"basic",
+ "basics",
"browser-behavior",
- "buttonColorMode",
+ "categories",
+ "cctld",
"cda-authenticator",
"cda-client",
"chrome-120",
"chrome-120-with-icloud-keychain-on-macos-14",
+ "client-support",
"client-to-authenticator-protocol-ctap",
"community-resources",
"conditional-mediation",
"conditional-ui",
- "content",
- "content-and-tools",
- "contribute",
+ "considerations",
"contributors",
"copyright-and-attributions",
+ "credential-exchange",
"cross-device-authentication",
"cross-device-authentication-cda",
- "date",
+ "demo-sites",
+ "deployment-considerations",
"developer-experience",
"developer-involvement-and-maintenance",
"device-bound-passkey",
+ "device-support-native-apps",
"device-support-table",
+ "device-support-table-adv",
"discoverable-credential",
"docs",
- "doks-docs-nav",
+ "embedded-webviews",
+ "embedded-webviews-ewv",
"engage-and-contribute",
+ "example",
+ "existing-deployments",
"expired-sessions-and-logout",
+ "fa-calendar-plus",
+ "fa-circle-check",
+ "fa-comments",
+ "fa-face-frown",
+ "fa-snowflake",
+ "fab-android",
+ "fab-apple",
+ "fab-bluesky",
+ "fab-github",
+ "fab-linkedin",
+ "fab-mastodon",
+ "fab-threads",
+ "fab-whatsapp",
+ "fas-angle-left",
+ "fas-angle-right",
+ "fas-angles-left",
+ "fas-angles-right",
+ "fas-at",
+ "fas-circle-check",
+ "fas-circle-info",
+ "fas-circle-xmark",
+ "fas-ellipsis",
+ "fas-house",
+ "fas-key",
+ "fas-link",
+ "fas-moon",
+ "fas-people-robbery",
+ "fas-share-nodes",
+ "fas-sort",
+ "fas-sun",
+ "fas-user-shield",
+ "fas-wand-magic-sparkles",
"fido2webauthn-tools",
"first-party-passkey-provider",
- "general-passkey-demo-sites",
+ "flow",
+ "fn1",
+ "fn2",
+ "fn3",
+ "fn4",
+ "fn5",
+ "fn6",
+ "fn7",
+ "fn8",
+ "general-passkey-demos",
"go",
- "h-rh-i-0",
- "h-rh-i-1",
- "h-rh-i-2",
- "h-rh-i-3",
- "h-rh-i-4",
- "icon-protected",
+ "greenfield-deployments",
+ "how-it-works",
"java",
"java-1",
"legacy-credentials",
"licensing",
"logging-in",
"login-challenge",
- "main",
"maintainers",
"matrix",
- "meta",
+ "native-apis",
+ "native-apps",
+ "nav-pills-1",
+ "nav-tabs-1",
+ "navbar-0-collapse",
+ "navbar-mode",
+ "navbar-mode-checkbox",
"net",
- "offcanvasNavMain",
- "offcanvasNavMainLabel",
- "offcanvasNavSection",
- "offcanvasNavSectionLabel",
+ "offcanvas-label",
+ "offcanvass-sidebar",
"opting-the-user-into-passkeys",
"other-attributions",
"other-fido2webauthn-libraries",
"overview",
"passkey",
+ "passkey-metadata",
"passkey-provider",
+ "passkeys-are",
"persistent-linking",
+ "pills-1-0",
+ "pills-1-1",
+ "pills-1-2",
+ "pills-1-btn-0",
+ "pills-1-btn-1",
+ "pills-1-btn-2",
"platform-authenticator",
"platform-notes",
"python",
- "query",
"reauthentication",
+ "relying-party-changes",
"relying-party-rp",
+ "requirements",
+ "requirements-1",
"resources",
"roaming-authenticator",
+ "ror",
"ruby",
"rust",
"safari-on-ios--ipados-17",
"safari-on-macos-14",
"sample-code",
- "search-form",
- "searchModal",
- "searchModalLabel",
- "searchResults",
- "searchToggleDesktop",
- "searchToggleMobile",
+ "samsung-pass",
"selection-criteria",
"sensitive-actions",
+ "sidebar-collapse-0-1",
+ "sidebar-collapse-1-1",
+ "sidebar-collapse-2-1",
+ "sidebar-collapse-3-1",
+ "sidebar-collapse-4-1",
"signing-in",
"single-device-passkey",
- "socialMenu",
- "supfive",
- "supfour",
- "supone",
- "supthree",
- "suptwo",
"synced-passkey",
+ "system-webviews",
+ "system-webviews-swv",
+ "tabs-1-0",
+ "tabs-1-btn-0",
"third-party-passkey-provider",
- "title",
- "toc",
+ "toast-container",
+ "toast-copied-code-message",
+ "toast-message-link-0",
+ "toc-collapse",
"typescript",
"updated-for-passkeys",
+ "use-cases",
"user-presence-up",
"user-verification",
"user-verification-behavior",
@@ -424,7 +510,7 @@
"w3c-web-authentication-webauthn",
"webauthn-versions-and-capabilities",
"website-visitors",
- "whats-next"
+ "webviews"
]
}
}
diff --git a/i18n/de.yaml b/i18n/de.yaml
deleted file mode 100644
index d1f125ee..00000000
--- a/i18n/de.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- id: get-started
- translation: "Loslegen"
-
-- id: on-this-page
- translation: "Auf dieser Seite"
diff --git a/i18n/en.yaml b/i18n/en.yaml
deleted file mode 100644
index 05ff248f..00000000
--- a/i18n/en.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-- id: get-started
- translation: "Get Started"
-
-- id: on-this-page
- translation: "On this page"
-
-- id: search-text
- translation: "Search docs..."
-
-- id: 404-title
- translation: "Page not found :("
-
-- id: 404-text
- translation: "The page you are looking for doesn't exist or has been moved."
-
-- id: browse
- translation: "Browse"
diff --git a/i18n/nl.yaml b/i18n/nl.yaml
deleted file mode 100644
index 2899edae..00000000
--- a/i18n/nl.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-- id: get-started
- translation: "Aan de slag"
-
-- id: on-this-page
- translation: "Op deze pagina"
-
-- id: search-text
- translation: "Zoeken..."
-
-- id: 404-title
- translation: "Pagina niet gevonden :("
-
-- id: 404-text
- translation: "De gezochte pagina bestaat niet of deze is verplaatst."
-
-- id: browse
- translation: "Browse"
diff --git a/images/doks.png b/images/doks.png
deleted file mode 100644
index 1f5d0800..00000000
Binary files a/images/doks.png and /dev/null differ
diff --git a/images/screenshot.png b/images/screenshot.png
deleted file mode 100644
index 072753bb..00000000
Binary files a/images/screenshot.png and /dev/null differ
diff --git a/images/tn.png b/images/tn.png
deleted file mode 100644
index ff29c682..00000000
Binary files a/images/tn.png and /dev/null differ
diff --git a/layouts/_default/_markup/render-link.html b/layouts/_default/_markup/render-link.html
deleted file mode 100644
index 5a977469..00000000
--- a/layouts/_default/_markup/render-link.html
+++ /dev/null
@@ -1 +0,0 @@
-{{ .Text | safeHTML }}
\ No newline at end of file
diff --git a/layouts/_default/fullpage.html b/layouts/_default/fullpage.html
deleted file mode 100644
index 76fe6330..00000000
--- a/layouts/_default/fullpage.html
+++ /dev/null
@@ -1,25 +0,0 @@
-{{ define "main" }}
-
-
{{ .Title }}
-
-
- {{ .Content }}
-
-
-
-
-
-{{ end }}
\ No newline at end of file
diff --git a/layouts/_default/single.html b/layouts/_default/single.html
deleted file mode 100644
index 372835e3..00000000
--- a/layouts/_default/single.html
+++ /dev/null
@@ -1,63 +0,0 @@
-{{ define "main" }}
-
- {{ if (in site.Params.doks.sectionNav .Section) -}}
-
-
-
- {{ end -}}
- {{ if and (eq site.Params.doks.containerBreakpoint "fluid") (in .Site.Params.mainSections .Type) }}
-
- {{ end }}
- {{ if ne .Params.toc false -}}
-
- {{ end -}}
- {{ if .Params.toc -}}
-
- {{ else -}}
-
- {{ end -}}
- {{ if site.Params.doks.breadcrumbTrail -}}
-
-
- {{ end }}
-
{{ .Title }}
-
{{ .Params.lead | safeHTML }}
- {{ if ne .Params.toc false -}}
-
- {{ end -}}
-
- {{ if site.Params.doks.headlineHash -}}
- {{ partial "main/headline-hash" .Content }}
- {{ else -}}
- {{ .Content }}
- {{ end -}}
-
- {{ partial "main/docs-navigation.html" . }}
-
-
- {{ if and (eq site.Params.doks.containerBreakpoint "fluid") (in .Site.Params.mainSections .Type) }}
-
- {{ end }}
-
-{{ end }}
\ No newline at end of file
diff --git a/layouts/about/about.html b/layouts/about/about.html
deleted file mode 100644
index 6072fefb..00000000
--- a/layouts/about/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-{{ define "main" }}
-
-
{{ .Title }}
-
-
- {{ .Content }}
-
-
-
-
-
-{{ end }}
\ No newline at end of file
diff --git a/layouts/about/single.html b/layouts/about/single.html
deleted file mode 100644
index 5ed296ee..00000000
--- a/layouts/about/single.html
+++ /dev/null
@@ -1,25 +0,0 @@
-{{ define "main" }}
-
-
{{ .Title }}
-
-
- {{ .Content }}
-
-
-
-
-
-{{ end }}
\ No newline at end of file
diff --git a/layouts/device-support/single.html b/layouts/device-support/single.html
deleted file mode 100644
index 76fe6330..00000000
--- a/layouts/device-support/single.html
+++ /dev/null
@@ -1,25 +0,0 @@
-{{ define "main" }}
-
-
{{ .Title }}
-
-
- {{ .Content }}
-
-
-
-
-
-{{ end }}
\ No newline at end of file
diff --git a/layouts/docs/list.html b/layouts/docs/list.html
new file mode 100644
index 00000000..a3388449
--- /dev/null
+++ b/layouts/docs/list.html
@@ -0,0 +1,23 @@
+{{ define "main" }}
+
+
+
+
{{ if eq .CurrentSection .FirstSection }}{{ .Section | humanize }}{{ else }}{{ .Title }}{{ end }}
+ {{ with .Content }}
{{ . }}
{{ end }}
+
+ {{ $currentSection := .CurrentSection }}
+ {{ range where .Site.RegularPages.ByTitle "Section" .Section }}
+ {{ if in (.RelPermalink | string) $currentSection.RelPermalink }}
+