{"id":17700737,"url":"https://github.com/cdown/jingui","last_synced_at":"2025-03-31T02:28:38.976Z","repository":{"id":25346983,"uuid":"28774477","full_name":"cdown/jingui","owner":"cdown","description":"A simple password manager designed to adhere to the Unix philosophy.","archived":false,"fork":false,"pushed_at":"2016-11-04T03:54:51.000Z","size":28,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-06T07:30:58.080Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cdown.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-01-04T13:09:31.000Z","updated_at":"2022-08-08T21:49:48.000Z","dependencies_parsed_at":"2022-08-08T22:31:36.210Z","dependency_job_id":null,"html_url":"https://github.com/cdown/jingui","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdown%2Fjingui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdown%2Fjingui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdown%2Fjingui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdown%2Fjingui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cdown","download_url":"https://codeload.github.com/cdown/jingui/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246405979,"owners_count":20771860,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-24T17:42:57.932Z","updated_at":"2025-03-31T02:28:38.956Z","avatar_url":"https://github.com/cdown.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Linux build status][travis-image]][travis-builds]\n[![Coverage][coveralls-image]][coveralls]\n[![Code health][landscape-image]][landscape]\n[![Dependencies][requires-image]][requires]\n\n[travis-builds]: https://travis-ci.org/cdown/jingui\n[travis-image]: https://img.shields.io/travis/cdown/jingui/master.svg?label=build\n[coveralls]: https://coveralls.io/r/cdown/jingui\n[coveralls-image]: https://img.shields.io/coveralls/cdown/jingui/master.svg\n[landscape]: https://landscape.io/github/cdown/jingui/master\n[landscape-image]: https://landscape.io/github/cdown/jingui/master/landscape.svg\n[requires]: https://requires.io/github/cdown/jingui/requirements/?branch=master\n[requires-image]: https://img.shields.io/requires/github/cdown/jingui.svg?label=deps\n\n[jingui][] (from \"金柜/金匱\" (\"strongbox\"), or perhaps \"[金龟/金龜][]\" if it is\nrunning particularly slowly on your machine ;-)), is a simple password manager\ndesigned to adhere to the Unix philosophy. It uses [GPG][] for encryption and\nsigning, and [git][] for history.\n\n## Work in progress\n\nBe warned, jingui is very much a work in progress. Much of the stuff you will\nread below has either not been implemented yet, or has only been partially\nimplemented. You should not expect any kind of security from this version of\njingui.\n\n## Usage\n\nFirst, make sure you have GPG and git set up as required. If you don't, take a\nlook at [GPG's getting started document][] and the [Git documentation][] to\nlearn more.\n\nNow, we need to tell jingui which PGP key we should use. `-i` (or `--init`)\ntells jingui that you want to initialise the password store and provide this\ninformation. `jg` is the jingui binary.\n\n    # If you only have one PGP secret key, it will find it automatically\n    jg -i\n\n    # If you have multiple, you need to tell it which one\n    jg -i 0xDF8D21B616118070\n\nNow that we've got the password store set up, we can start to add passwords and\nother metadata. Make sure [`$EDITOR`][] or [`$VISUAL`][] are set appropriately\nin your environment.\n\n    # Add a new password in your editor, or edit an existing one\n    jg -e example\n\n    # Add a username\n    jg -e example username\n\n    # You can also use slashes instead of separate arguments\n    jg -e example/username\n\nThese hierarchies are totally arbitrary, you can use whatever hierarchies make\nsense to you.\n\nOnce you've edited the file, it will be encrypted with PGP by GPG and stored in\nGit. You can now copy it to your clipboard, or show it in your terminal:\n\n    # Copy password for \"example\" to clipboard\n    jg example\n\n    # Show username for \"example\"\n    jg -s example username\n\nAs you've probably noticed, the first positional argument specifies the\nservice, and the second specifies the type of data to retrieve (the \"field\").\nAs mentioned above, these hierarchies are only a suggestion, you can use any\nhierarchy structure that makes sense to you. Both of these arguments can\ncontain arbitrary data, which means that if you have two accounts on a service,\nyou can do something like this:\n\n    # Copy password for personal Google account\n    jg google personal\n\n    # Copy password for work Google account\n    jg google work\n\n## Implementation details\n\nEach piece of metadata in the hierarchy is stored in a separate file. The main\nmotivation for this is to avoid conflicts in Git when merging other changes.\nThe filenames of these files are pseudorandom UUIDs, they are not linked to the\ncontent.\n\nWhen editing the files, the temporary files are stored in memory if at all\npossible. I suggest you also make sure that your editor doesn't leave its data\nlying around on disk.\n\n## Motivation for creation\n\nFor a few years now, I have used (and helped develop, although less in recent\ntimes) [pass][], which uses [GPG][] and [git][] to manage passwords. However,\nit has some limitations that I don't like:\n\n- No concept of metadata, everything other than the password is stored as\n  freeform text and is not easily usable. This makes it difficult to easily use\n  metadata at a later point, instead relying on manual intervention;\n- The original script has become quite convoluted, largely due to corner cases\n  and complexity compromises that are for edge-case systems;\n- No automated tests of any kind;\n- Commands like `generate` overwrite metadata, metadata is treated as a\n  second-class citizen;\n- Filenames are not encrypted, they are stored raw.\n\njingui, like pass (which very much inspired it), uses GPG and git, but is\ndesigned to be much more flexible without losing the simplicity (both in user\nexperience and use of existing tools) that makes pass great. Here are some ways\nthat jingui attemps to alleviate the problems mentioned above:\n\n- jingui treats everything (usernames, passwords, etc) as metadata. There are\n  no special provisions for passwords. This ensures that metadata other than\n  passwords is not treated as a second-class citizen;\n- jingui attempts to have test coverage for all situations that can occur when\n  using the program;\n- jingui errs towards simplicity rather than functionality, and the internal\n  code is clean and clearly separates functionality into different objects;\n- jingui does not have any connection between the filename a piece of metadata\n  gets and the name of the metadata. Instead, random UUIDs are generated for\n  each separate metadata file.\n\nEach entry in jingui is a plain text file, encrypted and signed using your PGP\nkey. The default action is to copy a password to your clipboard, but you can\nshow it by using `-s`.\n\n[jingui]: https://github.com/cdown/jingui\n[pass]: http://www.passwordstore.org/\n[GPG]: https://www.gnupg.org/\n[git]: http://git-scm.com/\n[GPG's getting started document]: https://www.gnupg.org/gph/en/manual/c14.html\n[Git documentation]: http://git-scm.com/doc\n[`$EDITOR`]: http://en.wikibooks.org/wiki/Guide_to_Unix/Environment_Variables#EDITOR\n[`$VISUAL`]: http://en.wikibooks.org/wiki/Guide_to_Unix/Environment_Variables#VISUAL\n[金龟/金龜]: http://baike.baidu.com/view/395421.htm\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcdown%2Fjingui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcdown%2Fjingui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcdown%2Fjingui/lists"}