···1010Tessen has been first archived by the original developer and maintainer, and then forked. This marks
1111the first new release under new maintenance.
12121313+### Added
1414+1515+- support for `prs` as a third password backend besides `pass` and `gopass`
1616+1317## [2.2.3] - 2024-03-05
14181519### Fixed
+9-8
README.md
···2233[](https://tangled.org/@jcg.re/tessen)
4455-`tessen` is a bash script that can autotype and copy data from [password-store][1] and [gopass][2]
66-files. A wayland native dmenu is required to use tessen and the following dmenu backends are
77-recognized
55+`tessen` is a bash script that can autotype and copy data from [password-store][1], [gopass][2]
66+and [prs][36]. A wayland native dmenu is required to use tessen and the following dmenu backends
77+are recognized
8899- [fuzzel][4]
1010- [tofi][15]
···24242525### Why use `tessen`?
26262727-- `tessen` can autotype or copy (or do both at the same time!) your password store and gopass data
2828- including all of your key-value pair data
2727+- `tessen` can autotype or copy (or do both at the same time!) your password store, gopass and prs
2828+ data including all of your key-value pair data
29293030 From what the original author observed, most scripts out there do not autotype and copy all of
3131 your key-value pair data. They also do not offer choices about autotyping or copying data with the
···51515252- [bash][16]
53535454-- at least one pass backend is needed - either [password-store][1] or [gopass][2]
5454+- at least one pass backend is needed - either [password-store][1], [gopass][2] or [prs][36]
55555656- at least one Wayland native dmenu backend, preferably [fuzzel][4], or [tofi][15], [bemenu][5],
5757 [yofi][32], [wofi][6], [rofi][3]
···130130131131## Features
132132133133-- autotype or copy (or both at the same time!) data, including all valid key-value pairs, in pass
134134- and gopass
133133+- autotype or copy (or both at the same time!) data, including all valid key-value pairs, in pass,
134134+ gopass and prs
135135- generate TOTP/HOTP
136136- open URLs
137137- use custom values for `user`, `password`, `url`, `autotype` keys
···228228[33]: https://social.treehouse.systems/@psykose/109967460650885493
229229[34]: https://pkgs.alpinelinux.org/packages?name=tessen
230230[35]: https://search.nixos.org/packages?query=tessen
231231+[36]: https://timvisee.com/projects/prs/
+1-1
config
···44# configuration file for tessen
55# place this file in $XDG_CONFIG_HOME/tessen/config
6677-# the default pass program to use - pass or gopass
77+# the default pass program to use - pass, gopass or prs
88# pass_backend="pass"
991010# the default dmenu backend program to use - rofi, fuzzel, bemenu, rofi, or dmenu
+15-15
man/tessen.1.scd
···2233# NAME
4455-tessen - autotype and copy *pass*(1) and *gopass*(1) data on wayland
55+tessen - autotype and copy *pass*(1), *gopass*(1) and *prs*(1) data on wayland
6677# SYNOPSIS
88···1111# DESCRIPTION
12121313tessen is a *bash*(1) script that helps to autotype and copy data encrypted
1414-using *pass*(1) and *gopass*(1). It can also open URLs, generate HOTP and TOTP,
1515-and execute custom autotype operations.
1414+using *pass*(1), *gopass*(1) and *prs*(1). It can also open URLs, generate HOTP
1515+and TOTP, and execute custom autotype operations.
16161717tessen has been written for wlroots based wayland compositors like *sway*(1)
1818that support the virtual-keyboard-unstable-v1 protocol. It will NOT work on
···2121The options understood by tessen are:
22222323*-p*, *--pass*, *--pass=*[pass backend]
2424- specify either *pass* or *gopass*
2424+ specify either *pass*, *gopass* or *prs*
25252626*-d*, *--dmenu*, *--dmenu=*[dmenu backend]
2727 specify a dmenu backend - the list of recognized backends are *fuzzel*,
···41414242## DEFAULT BEHAVIOR
43434444-If a pass backend is not specified, tessen tries to find either one of *pass*(1)
4545-or *gopass*(1) in the order mentioned here.
4444+If a pass backend is not specified, tessen tries to find either one of
4545+*pass*(1), *gopass*(1) or *prs*(1) in the order mentioned here.
46464747tessen assumes that the data organization format is the same as mentioned on
4848-the home page of password store, when using *pass*(1) and *gopass*(1)
4848+the home page of password store, when using *pass*(1), *gopass*(1) and *prs*(1)
49495050https://www.passwordstore.org/#organization
5151···6767If an action is not specified, tessen shows an additional menu with the option
6868to either autotype or copy data.
69697070-If data is copied, it will be removed from the clipboard after
7171-*PASSWORD_STORE_CLIP_TIME* when using *pass*(1) and after *cliptimeout* when
7272-using *gopass*(1). If *PASSWORD_STORE_CLIP_TIME* is not set, a default value of
7373-15 seconds is assumed.
7070+If data is copied, it will be removed from the clipboard after a timeout. The
7171+timeout is read from *PASSWORD_STORE_CLIP_TIME* when using *pass*(1) and from
7272+*cliptimeout* when using *gopass*(1). If no timeout is found, it falls back to a
7373+default of 15 seconds.
74747575A delay of 100 milliseconds will be used between successive autotype operations.
7676This can be changed using the 'delay' option in the *tessen*(5) configuration
···9595- *bash*(1)
9696- at least one wayland native dmenu backend - *fuzzel*(1), *tofi*(1),
9797 *bemenu*(1), *wofi*(1), *rofi*(1), *dmenu*
9898-- at least one pass backend - either *pass*(1) or *gopass*(1)
9898+- at least one pass backend - either *pass*(1), *gopass*(1) or *prs*(1)
9999- *wtype*(1) (if you want to autotype data)
100100- *wl-clipboard*(1) (if you want to copy and paste data)
101101- *scdoc*(1) (optional, to build this man page)
···117117*tessen*(5) config file.
118118119119The *otpauth://* format is supported and used if *pass-otp*(1) is installed when
120120-using *pass*(1). *gopass*(1) supports this feature natively.
120120+using *pass*(1). *gopass*(1) and *prs*(1) support this feature natively.
121121122122A value for the 'autotype' key can be specified in password files for custom
123123autotype behavior which overrides the default behavior of autotyping the
···191191192192# SEE ALSO
193193194194-*tessen*(5), *pass*(1), *gopass*(1) *pass-otp*(1), *fuzzel*(1), *tofi*(1),
195195-*bemenu*(1), *wofi*(1), *rofi*(1), *wl-clipboard*(1), *wtype*(1),
194194+*tessen*(5), *pass*(1), *gopass*(1), *prs*(1), *pass-otp*(1), *fuzzel*(1),
195195+**tofi*(1), bemenu*(1), *wofi*(1), *rofi*(1), *wl-clipboard*(1), *wtype*(1),
196196*notify-send*(1)
197197198198# AUTHORS
+4-4
man/tessen.5.scd
···35353636 *pass_backend*
37373838- The default pass backend to use - either *pass*(1) or *gopass*(1)
3838+ The default pass backend to use - either *pass*(1), *gopass*(1) or *prs*(1)
39394040 *dmenu_backend*
4141···134134135135# SEE ALSO
136136137137-*tessen*(5), *pass*(1), *gopass*(1) *pass-otp*(1), *fuzzel*(1), *tofi*(1),
138138-*bemenu*(1), *wofi*(1), *rofi*(1), *wl-clipboard*(1), *wtype*(1),
139139-*notify-send*(1)
137137+*tessen*(5), *pass*(1), *gopass*(1), *prs*(1), *pass-otp*(1), *fuzzel*(1),
138138+***tofi*(1), bemenu*(1), wofi*(1), *rofi*(1), *wl-clipboard*(1), *wtype*(1),
139139+**notify-send*(1)
140140141141# AUTHORS
142142
+16-6
tessen
···11#!/usr/bin/env bash
22# SPDX-License-Identifier: GPL-2.0-only
33# Copyright (C) 2021-2024 Ayush Agarwal <ayush at ayushnix dot com>
44+# Copyright (C) 2025 JC Grünhage <me at jcg dot re>
45#
56# tessen - a data selection interface for pass and gopass on Wayland
67# ------------------------------------------------------------------------------
···97989899 if [[ $_PASS_BACKEND == "pass" ]]; then
99100 mapfile -t passdata < <(pass show "$_TSN_PASSFILE" 2> /dev/null)
101101+ if [[ ${#passdata[@]} -eq 0 ]]; then
102102+ _die "the selected file is empty"
103103+ fi
104104+ elif [[ $_PASS_BACKEND == "prs" ]]; then
105105+ mapfile -t passdata < <(prs show --quiet "$_TSN_PASSFILE")
100106 if [[ ${#passdata[@]} -eq 0 ]]; then
101107 _die "the selected file is empty"
102108 fi
···314320315321 if [[ $_PASS_BACKEND == "pass" ]]; then
316322 tmp_otp="$(pass otp "$_TSN_PASSFILE")"
323323+ elif [[ $_PASS_BACKEND == "prs" ]]; then
324324+ tmp_otp="$(prs otp show --quiet "$_TSN_PASSFILE")"
317325 elif [[ $_PASS_BACKEND == "gopass" ]]; then
318326 tmp_otp="$(gopass otp -o "$_TSN_PASSFILE")"
319327 fi
···394402 printf "%s\n" "invalid clipboard timeout value in PASSWORD_STORE_CLIP_TIME" >&2
395403 return 1
396404 fi
405405+ elif [[ $_PASS_BACKEND == "prs" ]]; then
406406+ tsn_cliptime="15"
397407 elif [[ $_PASS_BACKEND == "gopass" ]]; then
398408 tsn_cliptime="$(gopass config core.cliptimeout)"
399409 tsn_cliptime="${tsn_cliptime##*: }"
···430440431441validate_pass_backend() {
432442 if ! is_installed "$1"; then
433433- _die "please install a valid password store backend: pass | gopass"
443443+ _die "please install a valid password store backend: pass | gopass | prs"
434444 fi
435435- if [[ $1 == "pass" ]] || [[ $1 == "gopass" ]]; then
445445+ if [[ $1 == "pass" ]] || [[ $1 == "gopass" ]] || [[ $1 == "prs" ]]; then
436446 _PASS_BACKEND="$1"
437447 else
438438- _die "please specify a valid password store backend: pass | gopass"
448448+ _die "please specify a valid password store backend: pass | gopass | prs"
439449 fi
440450}
441451···526536}
527537528538find_pass_backend() {
529529- local -a tmp_pass_arr=('pass' 'gopass')
539539+ local -a tmp_pass_arr=('pass' 'gopass' 'prs')
530540 local idx
531541532542 for idx in "${tmp_pass_arr[@]}"; do
···536546 fi
537547 done
538548 if [[ -z $_PASS_BACKEND ]]; then
539539- _die "please install a valid password store backend: pass | gopass"
549549+ _die "please install a valid password store backend: pass | gopass | prs"
540550 fi
541551542552 unset -v idx tmp_pass_arr
···811821 fi
812822813823 trap '_clear' EXIT TERM INT
814814- if [[ $_PASS_BACKEND == "pass" ]]; then
824824+ if [[ $_PASS_BACKEND == "pass" ]] || [[ $_PASS_BACKEND == "prs" ]]; then
815825 get_pass_files
816826 elif [[ $_PASS_BACKEND == "gopass" ]]; then
817827 get_gopass_files