{"id":29827573,"url":"https://github.com/tatsumoto-ren/bashcities","last_synced_at":"2025-07-29T06:13:20.877Z","repository":{"id":113320310,"uuid":"476955649","full_name":"tatsumoto-ren/bashcities","owner":"tatsumoto-ren","description":"A Neocities client written in Bash.","archived":false,"fork":false,"pushed_at":"2025-01-02T08:59:07.000Z","size":35,"stargazers_count":19,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-02T09:41:37.607Z","etag":null,"topics":["bash","neocities"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tatsumoto-ren.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null},"funding":{"patreon":"tatsumoto_ren","liberapay":"Tatsumoto","custom":"https://tatsumoto.neocities.org/blog/donating-to-tatsumoto.html"}},"created_at":"2022-04-02T05:22:51.000Z","updated_at":"2025-01-02T08:58:30.000Z","dependencies_parsed_at":"2023-12-31T00:22:53.617Z","dependency_job_id":"a556f5c7-0674-4eb0-a603-58993a6fe13f","html_url":"https://github.com/tatsumoto-ren/bashcities","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/tatsumoto-ren/bashcities","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tatsumoto-ren%2Fbashcities","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tatsumoto-ren%2Fbashcities/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tatsumoto-ren%2Fbashcities/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tatsumoto-ren%2Fbashcities/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tatsumoto-ren","download_url":"https://codeload.github.com/tatsumoto-ren/bashcities/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tatsumoto-ren%2Fbashcities/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267639229,"owners_count":24119770,"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","status":"online","status_checked_at":"2025-07-29T02:00:12.549Z","response_time":2574,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["bash","neocities"],"created_at":"2025-07-29T06:13:20.332Z","updated_at":"2025-07-29T06:13:20.871Z","avatar_url":"https://github.com/tatsumoto-ren.png","language":"Shell","funding_links":["https://patreon.com/tatsumoto_ren","https://liberapay.com/Tatsumoto","https://tatsumoto.neocities.org/blog/donating-to-tatsumoto.html"],"categories":[],"sub_categories":[],"readme":"# bashcities\n\n[![AUR](https://img.shields.io/badge/AUR-install-blue)](https://aur.archlinux.org/packages/bashcities)\n[![Chat](https://img.shields.io/badge/chat-join-green)](https://tatsumoto-ren.github.io/blog/join-our-community.html)\n![GitHub](https://img.shields.io/github/license/tatsumoto-ren/bashcities)\n\n\u003e A neocities client that actually works.\n\nI use [neocities](https://neocities.org/) to host some sites.\nOne day the official CLI client stopped working completely,\nso I wrote this one in bash.\n\n## Installation\n\n### Arch Linux and pacman-based distros\n\nIf your distribution is based on Arch Linux,\nyou can install the [AUR package](https://aur.archlinux.org/packages/bashcities)\nand skip to [Setup](#setup).\n\n### Other distros\n\nIf you want to package this program for your distro and know how to do it,\nplease create a pull request.\n\n\u003cdetails\u003e\n\n\u003csummary\u003eManual installation\u003c/summary\u003e\n\n1) Install dependencies.\n   The dependencies are very basic and I expect that you already have them.\n\n   * `bash`\n   * `python`\n   * `curl`\n   * `git` (recommended, but optional)\n2) Save the executable somewhere and make sure it's in your `PATH`.\n   For example, like this.\n\n   ```\n   $ git clone 'https://github.com/tatsumoto-ren/bashcities.git' ~/.local/share/neocities\n   $ ln -s ~/.local/share/neocities/bashcities ~/.local/bin/bashcities\n   ```\n\n\u003c/details\u003e\n\n## Setup\n\n1) Grab your API Key.\n   Go to the [Neocities settings](https://neocities.org/settings/),\n   click \"Manage Site Settings\" \u003e \"API Key\".\n   Usually it looks like this: `da77c3530c30593663bf7b797323e48c`.\n1) Initialize a new profile.\n   Run `bashcities init new_profile`.\n   `new_profile` can be any string (without spaces).\n   It doesn't have to be equal to your site name.\n1) The profile file will be saved in `~/.config/neocities/`.\n   Edit it and specify the directory of your site and the API key.\n\nVariables in the config file:\n\n* `site_directory`. The path to the local folder that contains your site.\n* `api_key`. This key is required for authentication on Neocities.\n* `ignore_regex`. A regular expression that defines files to be ignored.\n   They won't be uploaded to the remote.\n* `n_concurrent_tasks`. Uploading files one by one can take time.\n   You can choose to upload multiple files at the same time,\n   and it will make updating faster.\n\n## Running\n\nWhen you run `bashcities`, you have to specify a profile name.\n\n```\n$ bashcities --profile my_site\n$ bashcities -p my_site\n```\n\nYou may want to add this command as an alias to your `~/.bashrc` (or `~/.zshrc`, etc.).\n\n```\nalias neo='bashcities --profile my_site'\n```\n\nTo print a help page, run `bashcities --help`.\n\n## Usage\n\nYour site has to be managed by `git`.\nIf it's not, initialize a git repository or use the `--no-git` switch.\n\nIf you manage your site with `git`,\n`bashcities` will not upload files that you haven't added to the index.\nThis behavior resembles that of the official CLI client.\n\n### Update your site\n\n```\n$ neo push\n```\n\nUploads all files that differ from the remote.\nIt skips files that haven't been changed.\nFiles that aren't present locally are deleted from the remote.\nChanges that haven't been committed aren't pushed.\n\n### See status\n\n```\n$ neo status\n```\n\nLists all files that differ from the remote.\nThese files will be updated on the next `push`.\n\n### List files\n\n```\n$ neo list\n```\n\nList all files on the remote.\n\n### Upload a new file\n\n```\n$ neo upload file.html\n```\n\nUploads `file.html` to the remote.\n\n```\n$ neo upload 'articles/about.html'\n```\n\nDirectory structure is preserved.\n\n### Delete a file\n\n```\n$ neo delete 'articles/about.html'\n```\n\nDeletes `file.html` from the remote.\n\n### Backup your site\n\n```\n$ neo download\n```\n\nDownloads a full copy of your site\nand saves it to a new folder in the directory of the site.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftatsumoto-ren%2Fbashcities","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftatsumoto-ren%2Fbashcities","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftatsumoto-ren%2Fbashcities/lists"}