├── .gitignore
├── icon.png
├── .DS_Store
├── icon.icns
├── icon-idle.png
├── icon-recording.png
├── .vscode
├── extensions.json
└── settings.json
├── .prettierrc
├── config.js
├── .deepsource.toml
├── config.template.js
├── .github
└── workflows
│ └── build.yml
├── LICENSE
├── package.json
├── camera.html
├── README.md
├── index.html
├── main.js
└── renderer.js
/.gitignore:
--------------------------------------------------------------------------------
1 | dist
2 | .env
3 | node_modules
--------------------------------------------------------------------------------
/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/goshops-com/clipshare/HEAD/icon.png
--------------------------------------------------------------------------------
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/goshops-com/clipshare/HEAD/.DS_Store
--------------------------------------------------------------------------------
/icon.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/goshops-com/clipshare/HEAD/icon.icns
--------------------------------------------------------------------------------
/icon-idle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/goshops-com/clipshare/HEAD/icon-idle.png
--------------------------------------------------------------------------------
/icon-recording.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/goshops-com/clipshare/HEAD/icon-recording.png
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | "esbenp.prettier-vscode"
4 | ]
5 | }
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5",
4 | "tabWidth": 2,
5 | "semi": true
6 | }
7 |
--------------------------------------------------------------------------------
/config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | accessKey: 'undefined',
3 | accessSecret: 'undefined',
4 | endpoint: 'undefined',
5 | region: 'undefined',
6 | };
7 |
--------------------------------------------------------------------------------
/.deepsource.toml:
--------------------------------------------------------------------------------
1 | version = 1
2 |
3 | [[analyzers]]
4 | name = "javascript"
5 |
6 | [analyzers.meta]
7 | environment = [
8 | "nodejs",
9 | "browser"
10 | ]
--------------------------------------------------------------------------------
/config.template.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | accessKey: '%%ACCESS_KEY%%',
3 | accessSecret: '%%ACCESS_SECRET%%',
4 | endpoint: '%%ENDPOINT%%',
5 | region: '%%REGION%%',
6 | };
7 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "editor.formatOnSave": true,
3 | "editor.defaultFormatter": "esbenp.prettier-vscode",
4 | "editor.tabSize": 2,
5 | "editor.insertSpaces": true,
6 | "editor.detectIndentation": false
7 | }
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: Build/release
2 |
3 | on: push
4 |
5 | jobs:
6 | release:
7 | runs-on: ${{ matrix.os }}
8 |
9 | strategy:
10 | matrix:
11 | os: [macos-latest, ubuntu-latest, windows-latest]
12 |
13 | steps:
14 | - name: Check out Git repository
15 | uses: actions/checkout@v1
16 |
17 | - name: Install Node.js, NPM and Yarn
18 | uses: actions/setup-node@v1
19 | with:
20 | node-version: 22
21 |
22 | - name: Build/release Electron app
23 | env:
24 | MAC_ARGS: ${{ matrix.os == 'macos-latest' && '--x64 --arm64 --universal' || '' }}
25 | uses: samuelmeuli/action-electron-builder@v1
26 | with:
27 | # GitHub token, automatically provided to the action
28 | # (No need to define this secret in the repo settings)
29 | github_token: ${{ secrets.github_token }}
30 |
31 | args: ${{ env.MAC_ARGS}}
32 |
33 | # If the commit is tagged with a version (e.g. "v1.0.0"),
34 | # release the app after building
35 | release: ${{ startsWith(github.ref, 'refs/tags/v') }}
36 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) [year] [fullname]
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "clipshare",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "main.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "start": "electron .",
9 | "build": "node build.js",
10 | "release": "electron-builder"
11 | },
12 | "build": {
13 | "appId": "com.gopersonal.clipshare",
14 | "mac": {
15 | "target": "dmg",
16 | "hardenedRuntime": true,
17 | "gatekeeperAssess": false,
18 | "entitlements": "build/entitlements.mac.plist",
19 | "entitlementsInherit": "build/entitlements.mac.plist",
20 | "extendInfo": {
21 | "NSMicrophoneUsageDescription": "Please give us access to your microphone",
22 | "NSCameraUsageDescription": "Please give us access to your camera",
23 | "com.apple.security.device.audio-input": true,
24 | "com.apple.security.device.camera": true
25 | }
26 | },
27 | "dmg": {
28 | "contents": [
29 | {
30 | "x": 410,
31 | "y": 150,
32 | "type": "link",
33 | "path": "/Applications"
34 | },
35 | {
36 | "x": 130,
37 | "y": 150,
38 | "type": "file"
39 | }
40 | ],
41 | "window": {
42 | "width": 540,
43 | "height": 380
44 | }
45 | },
46 | "win": {
47 | "target": "nsis",
48 | "requestedExecutionLevel": "requireAdministrator"
49 | },
50 | "linux": {
51 | "target": "AppImage",
52 | "category": "Utility",
53 | "publish": [
54 | "github"
55 | ]
56 | },
57 | "files": [
58 | ".env",
59 | "**/*",
60 | "!**/node_modules/*/{CHANGELOG.md,README.md,README,readme.md,readme}",
61 | "!**/node_modules/*/{test,__tests__,tests,powered-test,example,examples}",
62 | "!**/node_modules/*.d.ts",
63 | "!**/node_modules/.bin",
64 | "!**/*.{iml,o,hprof,orig,pyc,pyo,rbc,swp,csproj,sln,xproj}",
65 | "!.editorconfig",
66 | "!**/._*",
67 | "!**/{.DS_Store,.git,.hg,.svn,CVS,RCS,SCCS,.gitignore,.gitattributes}",
68 | "!**/{__pycache__,thumbs.db,.flowconfig,.idea,.vs,.nyc_output}",
69 | "!**/{appveyor.yml,.travis.yml,circle.yml}",
70 | "!**/{npm-debug.log,yarn.lock,.yarn-integrity,.yarn-metadata.json}"
71 | ],
72 | "protocols": {
73 | "name": "clipshare-protocol",
74 | "schemes": [
75 | "clipshare"
76 | ]
77 | }
78 | },
79 | "keywords": [],
80 | "author": "",
81 | "license": "ISC",
82 | "devDependencies": {
83 | "electron": "^31.4.0",
84 | "electron-builder": "^24.13.3",
85 | "electron-packager": "^17.1.2"
86 | },
87 | "dependencies": {
88 | "auto-launch": "^5.0.6",
89 | "aws-sdk": "^2.1677.0",
90 | "dotenv": "^16.4.5",
91 | "ulid": "^2.3.0"
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/camera.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Camera Feed
7 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
115 |
116 |
117 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ClipShare
2 |
3 | **ClipShare** is a serverless screen recording application built as an open-source alternative to Loom. It empowers users to effortlessly record their screens, optionally capture camera footage, and seamlessly upload the recordings to an S3-compatible storage service. Powered by Electron, ClipShare offers a cross-platform solution that's both powerful and easy to deploy.
4 |
5 | 
6 |
7 | ## 🎥 Video Demo
8 |
9 | Check out [ClipShare in action](https://clipshare.gopersonal.com/01J64TT8C7BJD6G37SB7AP203B.webm).
10 |
11 | ## 🚀 Features
12 |
13 | - **📹 Screen Recording**: Capture your entire screen or specific windows with crystal-clear audio.
14 | - **🎥 Camera Integration**: Add a personal touch by including your camera feed in recordings.
15 | - **🚀 Auto-Launch**: Start ClipShare automatically when your system boots up.
16 | - **🖥️ Tray Icon**: Quick access to ClipShare from your system tray for seamless workflow integration.
17 | - **☁️ Serverless Architecture**: Upload recordings directly to an S3 bucket without the need for a backend server.
18 | - **🛠️ Customizable**: Easily configure recording settings, storage options, and more.
19 |
20 | ## 🏁 Getting Started
21 |
22 | ### Prerequisites
23 |
24 | Before you begin, ensure you have the following installed:
25 |
26 | - [Node.js](https://nodejs.org/) (v14 or higher)
27 | - [npm](https://www.npmjs.com/) (v6 or higher)
28 | - An S3-compatible storage service (e.g., AWS S3, MinIO, DigitalOcean Spaces)
29 |
30 | ### Installation
31 |
32 | 1. Clone the repository:
33 |
34 | 2. Install the dependencies:
35 |
36 | ```bash
37 | npm install
38 | ```
39 |
40 | 3. Create a `.env` file in the root directory:
41 |
42 | ```plaintext
43 | ACCESS_KEY=your_access_key
44 | ACCESS_SECRET=your_secret_key
45 | ENDPOINT=https://s3.yourservice.com
46 | REGION=us-east-1
47 | BUCKET_NAME=your-bucket-name
48 | URL_PREFIX=https://your-custom-domain.com/
49 | ACL=public-read
50 | PRESIGN_URL=false
51 | PRESIGN_URL_EXPIRY=3600
52 | ```
53 |
54 | Notes:
55 |
56 | * `URL_PREFIX` is optional. If provided, it will be used as a prefix for the uploaded file URLs.
57 | * `ACL` is optional; default is `public-read`. Other values, such as `private` or `authenticated-read`, may be configured, depending on your object storage provider. This value will be used as the canned ACL when saving recordings.
58 | * `PRESIGN_URL` is optional; default is `false`. If set to `true`, recording URL will be signed, allowing use of a private bucket.
59 | * `PRESIGN_URL_EXPIRY` is optional; default is 86400 (1 day). This value is the expiry for the signed URL, in seconds.
60 |
61 | ### Building the Application
62 |
63 | To build ClipShare for your platform:
64 |
65 | ```bash
66 | npm run build
67 | ```
68 |
69 | This command packages the application and places it in the `dist/` directory.
70 |
71 | ### Running the Application
72 |
73 | For development:
74 |
75 | ```bash
76 | npm start
77 | ```
78 |
79 | For production, run the packaged application from the `dist/` directory.
80 |
81 | ## 📘 Usage
82 |
83 | 1. **Launch**: Start ClipShare from your applications menu or use auto-launch.
84 | 2. **Access**: Click the tray icon to open the main interface.
85 | 3. **Record**: Choose your recording options and click "Start Recording".
86 | 4. **Stop**: Click "Stop Recording" when finished.
87 | 5. **Share**: After automatic upload, use the provided URL to share your recording.
88 |
89 | ## 🏠 Self-Hosted Setup
90 |
91 | If you don't intend to use an external S3 service, you can set up a MinIO docker container for local storage. Here's an example `docker-compose.yml` file:
92 |
93 | ```yaml
94 | version: '3'
95 | services:
96 | minio:
97 | image: minio/minio
98 | ports:
99 | - "9000:9000"
100 | - "9001:9001"
101 | volumes:
102 | - ./data:/data
103 | environment:
104 | MINIO_ROOT_USER: your_access_key
105 | MINIO_ROOT_PASSWORD: your_secret_key
106 | command: server /data --console-address ":9001"
107 | ```
108 |
109 | To use this setup:
110 |
111 | 1. Save the above content in a `docker-compose.yml` file.
112 | 2. Run `docker-compose up -d` to start the MinIO server.
113 | 3. Access the MinIO console at `http://localhost:9001` and create a bucket.
114 | 4. Update your `.env` file with the following:
115 |
116 | ```plaintext
117 | ACCESS_KEY=your_access_key
118 | ACCESS_SECRET=your_secret_key
119 | ENDPOINT=http://localhost:9000
120 | REGION=us-east-1
121 | BUCKET_NAME=your-bucket-name
122 | ```
123 |
124 | This configuration allows you to use ClipShare with a self-hosted S3-compatible storage solution.
125 |
126 | ## 🛠️ Troubleshooting
127 |
128 | - **Environment Variables**: Ensure your `.env` file is correctly formatted and in the root directory.
129 | - **Auto-Launch Issues**: Check your system's startup application settings.
130 | - **Recording Quality**: Adjust bitrate and resolution in the app settings for optimal performance.
131 |
132 | ## 🤝 Contributing
133 |
134 | We welcome contributions! Please follow these steps:
135 |
136 | 1. Fork the repository
137 | 2. Create a new branch: `git checkout -b feature/your-feature-name`
138 | 3. Make your changes and commit them: `git commit -m 'Add some feature'`
139 | 4. Push to the branch: `git push origin feature/your-feature-name`
140 | 5. Submit a pull request
141 |
142 | Please read our [Contributing Guidelines](CONTRIBUTING.md) for more details.
143 |
144 | ## 📜 License
145 |
146 | This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
147 |
148 | ## 🙏 Acknowledgments
149 |
150 | - [Electron](https://www.electronjs.org/) for making cross-platform desktop apps easy
151 | - [AWS SDK](https://aws.amazon.com/sdk-for-javascript/) for S3 integration
152 | - All our amazing contributors and users!
153 |
154 | ---
155 |
156 | Built with ❤️ by the ClipShare team. Happy recording!
157 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Clipshare
7 |
8 |
9 |
22 |
23 |
24 |