├── _images └── screenshot.png ├── frontend ├── src │ ├── langs │ │ ├── index.js │ │ └── en-us.json │ ├── assets │ │ ├── images │ │ │ ├── icon.png │ │ │ ├── logo.ico │ │ │ └── logo.png │ │ └── fonts │ │ │ ├── nunito-v16-latin-regular.woff2 │ │ │ └── OFL.txt │ ├── utils │ │ ├── platform.js │ │ ├── i18n.js │ │ ├── extra_theme.js │ │ ├── render.js │ │ ├── version.js │ │ ├── rgb.js │ │ └── theme.js │ ├── components │ │ ├── icons │ │ │ ├── WindowMin.vue │ │ │ ├── WindowMax.vue │ │ │ ├── WindowClose.vue │ │ │ └── WindowRestore.vue │ │ ├── common │ │ │ ├── OsIcon.vue │ │ │ ├── IconButton.vue │ │ │ ├── ResizeableWrapper.vue │ │ │ └── ToolbarControlWidget.vue │ │ ├── sidebar │ │ │ └── BrowserPane.vue │ │ └── content │ │ │ └── ContentPane.vue │ ├── styles │ │ ├── content.scss │ │ └── style.scss │ ├── style.css │ ├── main.js │ ├── App.vue │ ├── stores │ │ ├── tailscale.js │ │ └── preferences.js │ └── AppContent.vue ├── .prettierrc ├── index.html ├── README.md ├── package.json └── vite.config.js ├── backend ├── services │ ├── trayicons │ │ ├── active.png │ │ └── inactive.png │ ├── tray_service.go │ ├── system_service.go │ ├── preferences_service.go │ └── tailscale_service.go ├── types │ ├── js_resp.go │ ├── view_type.go │ ├── ts_types.go │ └── preferences.go ├── consts │ └── default_config.go ├── utils │ ├── constraints.go │ ├── string │ │ ├── key_convert.go │ │ ├── common.go │ │ └── any_convert.go │ ├── ts │ │ └── status.go │ └── slice │ │ └── slice_util.go └── storage │ ├── local_storage.go │ └── preferences.go ├── .gitignore ├── cattail.desktop ├── Makefile ├── wails.json ├── README.md ├── main.go ├── go.mod └── go.sum /_images/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nerdyslacker/cattail/HEAD/_images/screenshot.png -------------------------------------------------------------------------------- /frontend/src/langs/index.js: -------------------------------------------------------------------------------- 1 | import en from './en-us' 2 | 3 | export const lang = { 4 | en, 5 | } 6 | -------------------------------------------------------------------------------- /frontend/src/assets/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nerdyslacker/cattail/HEAD/frontend/src/assets/images/icon.png -------------------------------------------------------------------------------- /frontend/src/assets/images/logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nerdyslacker/cattail/HEAD/frontend/src/assets/images/logo.ico -------------------------------------------------------------------------------- /frontend/src/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nerdyslacker/cattail/HEAD/frontend/src/assets/images/logo.png -------------------------------------------------------------------------------- /backend/services/trayicons/active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nerdyslacker/cattail/HEAD/backend/services/trayicons/active.png -------------------------------------------------------------------------------- /backend/services/trayicons/inactive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nerdyslacker/cattail/HEAD/backend/services/trayicons/inactive.png -------------------------------------------------------------------------------- /frontend/src/assets/fonts/nunito-v16-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nerdyslacker/cattail/HEAD/frontend/src/assets/fonts/nunito-v16-latin-regular.woff2 -------------------------------------------------------------------------------- /backend/types/js_resp.go: -------------------------------------------------------------------------------- 1 | package types 2 | 3 | type JSResp struct { 4 | Success bool `json:"success"` 5 | Msg string `json:"msg"` 6 | Data any `json:"data,omitempty"` 7 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | build/bin 3 | node_modules/ 4 | jspm_packages/ 5 | .env 6 | .env.development.local 7 | .env.test.local 8 | .env.production.local 9 | .env.local 10 | .npm 11 | wailsjs 12 | dist 13 | frontend/package.json.md5 -------------------------------------------------------------------------------- /frontend/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "tabWidth": 4, 4 | "singleQuote": true, 5 | "semi": false, 6 | "bracketSameLine": true, 7 | "endOfLine": "auto", 8 | "htmlWhitespaceSensitivity": "ignore" 9 | } 10 | -------------------------------------------------------------------------------- /cattail.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=Cattail 3 | Comment=An unofficial Tailscale client. 4 | Exec=sh -c "$HOME/.local/bin/cattail" 5 | Icon=com.cattail 6 | Type=Application 7 | Categories=Network; 8 | SingleMainWindow=true 9 | X-GNOME-UsesNotifications=true 10 | -------------------------------------------------------------------------------- /frontend/src/utils/platform.js: -------------------------------------------------------------------------------- 1 | import { Environment } from 'wailsjs/runtime/runtime.js' 2 | 3 | let os = '' 4 | 5 | export async function loadEnvironment() { 6 | const env = await Environment() 7 | os = env.platform 8 | } 9 | 10 | export function isMacOS() { 11 | return os === 'darwin' 12 | } 13 | -------------------------------------------------------------------------------- /backend/consts/default_config.go: -------------------------------------------------------------------------------- 1 | package consts 2 | 3 | const DEFAULT_FONT_SIZE = 14 4 | const DEFAULT_ASIDE_WIDTH = 300 5 | const DEFAULT_WINDOW_WIDTH = 1024 6 | const DEFAULT_WINDOW_HEIGHT = 768 7 | const MIN_WINDOW_WIDTH = 960 8 | const MIN_WINDOW_HEIGHT = 640 9 | const DEFAULT_LOAD_SIZE = 10000 10 | const DEFAULT_SCAN_SIZE = 3000 11 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 |
22 | No advertised routes
346 |