├── .babelrc ├── .gitignore ├── .nvmrc ├── LICENSE ├── README.md ├── app ├── app.html ├── bundle.css ├── index.html └── main_app.js ├── assets ├── cloneable_large.png └── cloneable_large.svg ├── build ├── icon.icns ├── icon.png ├── mac │ └── bin │ │ └── wget ├── start.js ├── webpack.app.config.js ├── webpack.base.config.js ├── webpack.e2e.config.js ├── webpack.unit.config.js └── win │ └── bin │ └── wget.exe ├── config ├── env_development.json ├── env_production.json └── env_test.json ├── e2e └── utils.js ├── index.html ├── main_app.js ├── package-lock.json ├── package.json ├── postcss.config.js ├── resources ├── icon.icns ├── icon.ico └── icons │ └── 512x512.png ├── src ├── App.jsx ├── binaries.js ├── css │ ├── additional-styles │ │ ├── flatpickr.css │ │ ├── range-slider.css │ │ ├── theme.css │ │ ├── toggle-switch.css │ │ └── utility-patterns.css │ ├── app.css │ ├── dist.css │ ├── style.css │ ├── tailwind.config.js │ └── vendor │ │ ├── accordion.css │ │ └── react-tabs.css ├── db.js ├── favicon.svg ├── get-platform.js ├── helpers │ └── window.js ├── main.js ├── main.jsx ├── menu │ ├── app_menu_template.js │ ├── dev_menu_template.js │ └── edit_menu_template.js ├── pages │ ├── Dashboard.jsx │ ├── Download.jsx │ ├── Downloads.jsx │ ├── Help.jsx │ ├── NewDownload.jsx │ └── Settings.jsx ├── partials │ ├── Header.jsx │ ├── SettingsTabs.jsx │ ├── Sidebar.jsx │ ├── actions │ │ ├── DateSelect.jsx │ │ ├── Datepicker.jsx │ │ └── FilterButton.jsx │ └── header │ │ └── Help.jsx ├── utils │ ├── GetStatusBadge.jsx │ ├── Transition.jsx │ └── Utils.js └── wget │ └── index.js └── vite.config.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/preset-react", 4 | [ 5 | "@babel/env", 6 | { 7 | "targets": { 8 | "browsers": "last 2 Chrome versions", 9 | "node": "current" 10 | } 11 | } 12 | ] 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | Thumbs.db 4 | *.log 5 | 6 | /dist 7 | /temp 8 | 9 | # ignore everything in 'app' folder what had been generated from 'src' folder 10 | /app/app.js 11 | /app/main.js 12 | /app/**/*.map 13 | 14 | example.com 15 | example.org 16 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v16.13.1 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cloneable 2 | 3 | [](./LICENSE) 4 | 5 | > The all-in-one website downloader tool for offline browsing, archiving, backups, and more. 6 | 7 | ## Screenshots 8 | 9 | [](https://cloneable.app) 10 | [](https://cloneable.app) 11 | [](https://cloneable.app) 12 | 13 | ## Downloads 14 | 15 | Downloadable binaries are currently not available, but will be soon. For now, follow the steps in the Installation section. 16 | 17 | ### Requirements 18 | 19 | If you want to use your own version of `wget`, your system must have that installed and you must set that path in your settings. Binaries of `wget` is included with this software but they're not guaranteed to work properly on all systems. 20 | 21 | ## Installation 22 | 23 | To run Cloneable locally in development mode: 24 | 25 | ``` 26 | git clone git@github.com:CloneableApp/Cloneable.git 27 | cd Cloneable 28 | nvm install 29 | nvm use 30 | npm install 31 | npm start 32 | ``` 33 | 34 | To get a working binary created in `dist/`: 35 | 36 | ``` 37 | nvm install 38 | nvm use 39 | npm install 40 | npm postinstall # might be necessary 41 | npm run app:dist 42 | ``` 43 | 44 | ## Information 45 | 46 | Cloneable is a free and open source desktop application that can clone websites to your local computer automatically, with smart handling of links, images, files, stylesheets, and more, so sites load seamlessly for offline browsing. 47 | 48 | It is built with [Electron](https://www.electronjs.org/) and [React](https://reactjs.org). Check the [package.json](./package.json) for a list of all dependencies. 49 | 50 | Behind the scenes, Cloneable relies heavily on [wget](https://www.gnu.org/software/wget/). 51 | 52 | ## TODO 53 | 54 | - Add dark mode 55 | - Add internationalization 56 | - Add pagination to Clones page 57 | - Add different format options to supply cookies (instead of just Netscape cookies.txt format) 58 | - Add ability to stop and continue Clones, saving progress 59 | 60 | ## Getting Help 61 | 62 | Feel free to open an issue here, or email me at [cloneableapp@gmail.com](mailto:cloneableapp@gmail.com). 63 | 64 | ## ❤️ Donating 65 | 66 | If you would like to support development of this project, please consider donating. We currently prefer Ko-fi to accept donations. [Here's our Ko-fi page](https://ko-fi.com/cloneable). 67 | ## License 68 | 69 | Cloneable is released under the [GNU General Public License v3.0](./LICENSE). 70 | 71 | --- 72 | 73 | ## For further information check [cloneable.app](https://cloneable.app) 74 | -------------------------------------------------------------------------------- /app/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
37 | If you have a question that's not answered here, don't hestitate to contact us at cloneableapp@gmail.com or interact with us on GitHub. 38 |
52 | If Cloneable is missing a feature that you want, don't hestitate to contact us by emailing us at cloneableapp@gmail.com or contacting us on GitHub. 53 | 54 | We try to make the software as flexible and useful as possible. 55 |
66 | The founder of Cloneable is web developer who loves making useful tools. Email me at cloneableapp@gmail.com if you want to chat. 67 |
84 | The filters are a configurable way to control how a website is crawled. 85 | 86 | 87 | There are a few different kinds of filters. See the questions below for individual help with each one. 88 |
99 | By default, Cloneable will only crawl the domain of the main URL you give it. But sometimes you'll want to allow Cloneable 100 | to crawl other domains, too. For example, if a website hosts its media files (images, videos) on a different domain, you might want to add that domain 101 | to this setting so that you can download those media files, too. 102 |
113 | This setting has two different modes, depending on if you include a Regex wildcard character (*, ?, [, ]) or not. 114 | 115 | If you don't include a wildcard character, this setting will act as a list of suffixes to accept in the crawl. 116 | For example, if you set this to "png", the crawl will only download files ending in "png". 117 | 118 | If you do include a Regex wildcard character, this setting will act as a list of patterns to match against the filename (not just a suffix). 119 | For example, if you set this to "*mortgage*", the crawl will only download files with "mortgage" in the filename. 120 |
131 | This setting has two different modes, depending on if you include a Regex wildcard character (*, ?, [, ]) or not. 132 | 133 | If you don't include a wildcard character, this setting will act as a list of suffixes to reject in the crawl. 134 | For example, if you set this to "png", the crawl will not download files ending in "png". 135 | 136 | If you do include a Regex wildcard character, this setting will act as a list of patterns to match against the filename (not just a suffix). 137 | For example, if you set this to "*mortgage*", the crawl will not download files with "mortgage" in the filename. 138 |
149 | While "Accept filters" and "Reject filters" work on filenames, this setting works on directory names. For example, 150 | in the URL https://example.com/one/index.html, "one" is a directory name while "index.html" is a filename. 151 | 152 | If left blank, the crawl will follow all directories (except the ones in "Exclude directories" setting). But if you provide 153 | a value for this setting, the crawl will only follow directories in the given list. 154 | 155 | For example, if you set this to "one", all of the pages under https://example.com/one/ will be crawled, but not any pages under 156 | https://example.com/two/ or https://example.com/three/ etc. 157 |
168 | While "Accept filters" and "Reject filters" work on filenames, this setting works on directory names. For example, 169 | in the URL https://example.com/one/index.html, "one" is a directory name while "index.html" is a filename. 170 | 171 | If you provide a value for this setting, the crawl will not follow directories in the given list. 172 |
189 | It means the bundled version of wget does not work on your system. Please install wget separately, 190 | and set the path to the binary in your Clone settings under the Advanced tab. 191 |
202 | Here are a list of common error codes: 203 | 204 | 1 - Generic error code. 205 | 2 - Parse error — for instance, when parsing options. 206 | 3 - File I/O error. 207 | 4 - Network failure. 208 | 5 - SSL verification failure. 209 | 6 - Username/password authentication failure. 210 | 7 - Protocol errors. 211 | 8 - Server issued an error response. 212 |
223 | Please contact us at cloneableapp@gmail.com with details and we will try to help. Please include the error message and the "Detailed Logs" from the Clone, and any other info you think may be helpful. 224 | 225 | Or open an issue on our GitHub repo. 226 |
243 | Cloneable expects the file to be in the Netscape cookies format. There are some free tools online for generation and conversion of cookies form your browser to this format. 244 |
255 | Your cookies file will be stored in a file called cookies.txt in the root of the chosen working directory of the Clone. 256 |
273 | Double Down icon by Icons8 274 |
145 | This is a helpful name to identify this Clone. It will also be used as the folder name to store the Clone under. 146 |
162 | This is the full URL of the website to clone (like https://example.com or https://en.wikipedia.org/wiki/Dog). 163 |
195 | Adjust the settings for this Clone. (You can always adjust these defaults on the global Settings page). 196 |
233 | When ready, start the Cloning process. Progress will show here. 234 |
367 | {cloneData ? cloneData : null} 368 |
27 | These are the global default settings that will prepopulate the settings for each Clone you start. 28 | You can adjust these settings for each Clone before starting. 29 |