<commit_before>---
layout: page
title: PPM
subtitle: Pascal Password Manager
---
<!-- content! -->
<h1>ppm
<a href="https://github.com/{{ site.author.github }}/ppm" title="GitHub">
<span><i class="fa fa-github"></i></span>
</a>
</h1>

This is the password manager I use. Code safely runs only in the browser.

Python and Android versions are also available.

<h3>Generate password</h3>

<form onsubmit="calculate(); return false">
<p>
<label for="password" style="width: 100px;">Password:</label>
<input id="password" name="password" type="password" value="<PASSWORD>" size="32">
</p>
<p>
<label for="keyword" style="width: 100px;">Keyword:</label>
<input id="keyword" name="keyword" type="text" value="reddit" size="32">
</p>
<input class="btn js-textareacopybtn" type="submit" name="btn" value="Calculate" />
</form>
<div id="out" style="margin-top: 10px; padding: 10px 5px; color: #444; line-height: 1.5;">
<b>Credits for Scrypt implementation: <a href="https://github.com/dchest/scrypt-async-js">dchest/scrypt-async-js</a></b>
<script src="/js/scrypt.js"></script>
<script>
var f = document.forms[0];

function calculate() {

var btn = f.btn;
var out = document.querySelector('#out');

var password = f.password.value;
var keyword = f.keyword.value;

btn.disabled = true;
btn.value = 'Wait...';

const copyToClipboard = (function initClipboardText() {
  const id = 'copy-to-clipboard-helper';
  const element = document.getElementById(id);
  const textarea = element || document.createElement('textarea');

  if (!element) {
    textarea.id = id;
    // Place in top-left corner of screen regardless of scroll position.
    textarea.style.position = 'fixed';
    textarea.style.top = 0;
    textarea.style.left = 0;<commit_msg>force lowercase<commit_after>---
layout: page
title: PPM
subtitle: Pascal Password Manager
---
<!-- content! -->
<h1>ppm
<a href="https://github.com/{{ site.author.github }}/ppm" title="GitHub">
<span><i class="fa fa-github"></i></span>
</a>
</h1>

This is the password manager I use. Code safely runs only in the browser.

Python and Android versions are also available.

<h3>Generate password</h3>

<form onsubmit="calculate(); return false">
<p>
<label for="password" style="width: 100px;">Password:</label>
<input id="password" name="password" type="password" value="<PASSWORD>" size="32">
</p>
<p>
<label for="keyword" style="width: 100px;">Keyword:</label>
<input id="keyword" name="keyword" type="text" value="reddit" size="32" onchange="this.value = this.value.toLowerCase();">
</p>
<input class="btn js-textareacopybtn" type="submit" name="btn" value="Calculate" />
</form>
<div id="out" style="margin-top: 10px; padding: 10px 5px; color: #444; line-height: 1.5;">
<b>Credits for Scrypt implementation: <a href="https://github.com/dchest/scrypt-async-js">dchest/scrypt-async-js</a></b>
<script src="/js/scrypt.js"></script>
<script>
var f = document.forms[0];

function calculate() {

var btn = f.btn;
var out = document.querySelector('#out');

var password = f.password.value;
var keyword = f.keyword.value;

btn.disabled = true;
btn.value = 'Wait...';

const copyToClipboard = (function initClipboardText() {
  const id = 'copy-to-clipboard-helper';
  const element = document.getElementById(id);
  const textarea = element || document.createElement('textarea');

  if (!element) {
    textarea.id = id;
    // Place in top-left corner of screen regardless of scroll position.
    textarea.style.position = 'fixed';
    textarea.style.top = 0;
    textarea.style.left = 0;
{'fraction_non_alphanumeric': 0.1838360842344906, 'fraction_numerical': 0.015367103016505406, 'mean_word_length': 4.877926421404682, 'pattern_counts': {'":': 0, '<': 69, '<?xml version=': 0, '>': 69, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2151133', 'n_tokens_mistral': 1215, 'n_tokens_neox': 1155, 'n_words': 310}