Category Archives: Bitwarden

Convert 2FAuth TOTP codes to Bitwarden Authenticator

  1. Select codes in 2FAuth and export them as a list of otpauth URIs.
  2. Save the Python script below as convert-2fauth-to-bitwarden.py
  3. Run the command below to create Bitwarden Authenticator JSON export file.
python3 convert-2fauth-to-bitwarden.py -o bitwarden_export.json 2fauth_export_otpauth.txt
#!/usr/bin/env python3
import json
import uuid
import argparse

def parse_otpauth_uri(uri):
    parts = uri.split('?')
    label = parts[0].split('/')[-1]
    service, account = label.split(':', 1) if ':' in label else (label, '')
    return {'service': service, 'account': account}

def convert_otpauth_to_bitwarden(input_file, output_file):
    with open(input_file, 'r', encoding='utf-8') as f:
        uris = [line.strip() for line in f if line.strip().startswith('otpauth://')]
    
    items = []
    for uri in uris:
        parsed = parse_otpauth_uri(uri)
        bw_item = {
            "id": str(uuid.uuid4()).upper(),
            "type": 1,
            "name": f"{parsed['service']}",
            "favorite": False,
            "login": {
                "username": parsed['account'],
                "totp": uri,
            }
        }
        items.append(bw_item)
    
    output = {"encrypted": False, "items": items}
    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(output, f, indent=2, ensure_ascii=False)
    
    print(f"Converted {len(items)} items to {output_file}")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Convert otpauth URIs → Bitwarden JSON")
    parser.add_argument("input", help="File with otpauth URIs")
    parser.add_argument("-o", "--output", default="bitwarden_export.json")
    args = parser.parse_args()
    convert_otpauth_to_bitwarden(args.input, args.output)

Systemd configuration for Bitwarden

If you run Bitwarden eg. in Proxmox LXC you need to make sure Bitwarden start automatically. Create a configuration file in /etc/systemd/system/bitwarden.service with the following contents.

[Unit]
Description=Bitwarden
Requires=docker.service
After=docker.service

[Service]
User=bitwarden
Restart=on-failure
ExecStart=/opt/bitwarden/bitwarden.sh start
ExecStop=/opt/bitwarden/bitwarden.sh stop

# Script starts docker images and ends
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=default.target

Enable it, start it and check the logs.

systemctl daemon-reload
systemctl enable bitwarden
systemctl start bitwarden
journalctl -f -u bitwarden