{"id":27122222,"url":"https://github.com/vmapps/tagscards","last_synced_at":"2026-05-08T01:45:57.212Z","repository":{"id":53639087,"uuid":"257102330","full_name":"vmapps/tagscards","owner":"vmapps","description":"Store and tag your favorite contact cards","archived":false,"fork":false,"pushed_at":"2021-03-20T03:36:40.000Z","size":10792,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-07T11:31:26.278Z","etag":null,"topics":["bootstrap","contacts","flask","python3","rethinkdb","tags"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vmapps.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-04-19T21:07:00.000Z","updated_at":"2020-05-12T17:22:14.000Z","dependencies_parsed_at":"2022-09-12T05:41:14.077Z","dependency_job_id":null,"html_url":"https://github.com/vmapps/tagscards","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/vmapps/tagscards","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vmapps%2Ftagscards","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vmapps%2Ftagscards/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vmapps%2Ftagscards/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vmapps%2Ftagscards/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vmapps","download_url":"https://codeload.github.com/vmapps/tagscards/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vmapps%2Ftagscards/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32763518,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-07T02:14:30.463Z","status":"ssl_error","status_checked_at":"2026-05-07T02:14:29.405Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["bootstrap","contacts","flask","python3","rethinkdb","tags"],"created_at":"2025-04-07T11:26:19.500Z","updated_at":"2026-05-08T01:45:57.198Z","avatar_url":"https://github.com/vmapps.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# tagscards\nStore and tag your favorite contact cards\n\n## Purpose \nPurpose of this very simple tool is to :\n- create contact cards \n- store cards into database\n- search for contacts using tags\n\n## Requirements\nSome modules are packaged with application :\n- [Bootstrap 4](https://getbootstrap.com/)\n- [Font Awesome](https://fontawesome.com/)\n- [jQuery](https://jquery.com/)\n- [Jquery Suggestags](https://github.com/amsify42/jquery.amsify.suggestags)\n\nFollowing python modules are required :\n- [Flask](https://flask.palletsprojects.com/)\n- [RethinkDB](https://rethinkdb.com/)\n\nModules could be installed using following command:\n```\n$ pip install -r requirements.txt\n```\n## Database initialization\n:warning: Following steps are now optional if you run `manage.py --init` (see section `Run`)\n\nFirst, you will have to generate SHA-256 password from the user `admin` (password will be `tagscards` here):\n```\n$ python3\n\u003e\u003e\u003e from werkzeug.security import generate_password_hash\n\u003e\u003e\u003e print( generate_password_hash(\"\u003cyour_admin_password\u003e\",\"sha256\") )\nsha256$zwmdPo4e$59122744f59e7197a396c3db3fa340eba975ae2316b5685e3e3091a6e932a024\n```\nThen, using RethinkDB Data Explorer (`http://localhost:8080/#dataexplorer`), you will initialize the database :\n- create database `\u003cyour_database_name\u003e`\n- create table `contacts`\n- create tables `users` (different than RethinkDB internal one)\n- create user `admin`\n```\nr.dbCreate('\u003cyour_database_name\u003e')\n\nr.db('\u003cyour_database_name\u003e).tableCreate('contacts')\n\nr.db('\u003cyour_database_name\u003e).tableCreate('users')\n\nr.db('\u003cyour_database_name\u003e).table('users').insert({\n       username: 'admin', \n       email: '\u003cyour_email\u003e',\n       password: '\u003cyour_hashed_password\u003e'\n})\n```\n## Configuration\nA sample of settings is located into `web/config-sample.py` file.\nYou should first copy that sample file to `web/config.py` :\n```\ncp web/config-sample.py web/config.py\n````\nThen, edit the `web/config.py` file to setup following variables :\n```\n...\n# setup\nTAGSCARDS_DATABASE = '\u003cyour_database_name\u003e'\nTAGSCARDS_PASSWORD = '\u003cyour_admin_password\u003e'\nTAGSCARDS_FULLAUTH = False (True if you want authentication for all pagesr)\nTAGSCARDS_TIMEOUTS = \u003ctimeout_session\u003e\n\n# database\nRETHINKDB_HOST = 'localhost'\nRETHINKDB_PORT = 28015\n...\n```\n## Run\nFinally, use script `manage.py` ro init to database and run the flask server :\n```\n$ ./manage.py --help\nUsage: ./manage.py [options]\n\nOptions:\n       -b, --bind=ADDRESS   bind to specific ip ADDRESS (default 0.0.0.0)\n       -d, --debug          run in debug mode (default False)\n       -i, --init           initialize database, tables and user admin\n       -h, --help           display this help and exit\n       -p, --port=PORT      listen to specific PORT (default 8000)\n       -t, --thread         run in threaded mode (default False)\n\n$ ./manage.py --init\n[1/4] database \"test\" created !\n[2/4] table \"contacts\" created !\n[3/4] table \"users\" created !\n[4/4] user \"admin\" created  (password=\"tagscards\") !\n\n$ ./manage.py --thread\n```\n## Import contacts\nContacts can be imported from CSV file:\n- CSV file must contain one contact per line\n- Each line must contain fields must be separated with semicolons\n- Required fields are `fullname;role;email;pgp;phone;website;tags`\n- Tags must be separated with commas `tag1,tag2,tag3`\n```\nJoe Smith;Unix Administrator;john.smith@company.com;0x12345678;11-22-33-44;http://github.com/;unix,admin\nJohn Doe;Security Analyst;john.doe@company.com;0x12ABCDEF;55-66-77-88;http://github.com/;security,analyst\nFoo Bar;Windows Administrator;foo.bar@company.com;0x98765432;12-34-56-78;http://github.com/;windows,admin\n```\n## Some features\n- Bootstrap 4 ready\n- Tags input with auto-completion\n- Admin user authentication\n- Sorting (asc/desc) on columns\n- Export contacts as JSON/CSV files\n- Export contacts as EMAIL recipients\n- Export to vCard\n- :lock: Bulk mode to add/del tags\n- :lock: Import from CSV\n- :lock: Users management\n\n## Todo list\n- [x] ~~bootstrap 4 integration~~\n- [x] ~~autocompletion for tags input~~\n- [x] ~~search with multiple tags~~\n- [x] ~~actions to add/edit/delete records~~\n- [x] ~~add PGP field~~\n- [x] ~~add position field~~\n- [x] ~~add website field~~\n- [x] ~~add sort asc/desc on fields~~\n- [x] ~~add icons support~~\n- [x] ~~fields text search support~~\n- [x] ~~login/logout functions~~\n- [x] ~~add session timeout~~\n- [x] ~~export as vCard format~~\n- [x] ~~add users management~~\n- [x] ~~export contacts as JSON file~~\n- [x] ~~export users as JSON/CSV file~~\n- [x] ~~import contacts from CSV file~~\n- [x] ~~manage flask messages~~\n- [x] ~~add fields for notes (reserved to admins)~~\n- [x] ~~bulk mode to add/remove tags on multiple contacts~~\n- [ ] manage pagination\n- [ ] syntax check when editing fields\n- [ ] pretty nice things to enhace interface\n- [ ] export for bulk mode\n- [ ] ...\n\n## Samples \n![tagscards1](samples/tagscards1.png)\n![tagscards2](samples/tagscards2.png)\n![tagscards3](samples/tagscards3.png)\n![tagscards4](samples/tagscards4.png)\n![tagscards5](samples/tagscards5.png)\n![tagscards6](samples/tagscards6.png)\n![tagscards7](samples/tagscards7.png)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvmapps%2Ftagscards","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvmapps%2Ftagscards","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvmapps%2Ftagscards/lists"}