Skip to content

Commit c1834f9

Browse files
committed
docs: rewrite README; feat: default Full Screen checked
1 parent 908a6f7 commit c1834f9

4 files changed

Lines changed: 94 additions & 24 deletions

File tree

README.md

Lines changed: 92 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,105 @@
1-
# online webClip
2-
[Demo](https://ivi.cx)
1+
# WebClip
2+
3+
Generate and sign Apple WebClip configuration profiles (`.mobileconfig`) for iOS and macOS — entirely from an online web UI.
4+
5+
[![Demo](https://img.shields.io/badge/demo-ivi.cx-blue)](https://ivi.cx)
36

47
![preview](preview.webp)
58

6-
### build from source
7-
- `git clone https://github.com/aolose/webClip.git`
8-
- `cd src`
9-
- `go mod tidy`
10-
- `go build`
9+
## What it does
10+
11+
WebClip provides a browser-based form for creating Apple MDM-style web clips. Fill in the name, URL, icon, and optional flags (fullscreen, removable, precomposed, etc.), and you get a `.mobileconfig` profile ready to install on any iOS or macOS device. When certificate paths are supplied, profiles are automatically signed with OpenSSL S/MIME for enterprise deployment.
12+
13+
## Features
1114

12-
### run
13-
generate unsigned webClip file
15+
- **Web UI** — no command-line needed for end users; fill in fields and download.
16+
- **Unsigned profiles** — works out of the box with `./main -web=./public`.
17+
- **Signed profiles** — provide `-crt`, `-key`, `-ca` flags to sign with OpenSSL.
18+
- **In-memory cache** — generated profiles cached for 24 hours with automatic cleanup.
19+
- **REST API** — create, list, download, and remove profiles programmatically.
20+
- **GitHub release** — tag a version; CI builds and publishes a Linux binary + assets.
21+
22+
## Quick Start
23+
24+
```sh
25+
git clone https://github.com/aolose/webClip.git
26+
cd webClip/src
27+
go mod tidy
28+
go build
29+
./main -web=../public
1430
```
15-
./main -web=./public
31+
32+
Open `http://127.0.0.1:7001` in a browser.
33+
34+
## Usage
35+
36+
### Unsigned profiles
37+
38+
```sh
39+
./main -web=./public
1640
```
1741

18-
generate signed webClip file
42+
### Signed profiles (OpenSSL required)
43+
44+
```sh
45+
./main -web=./public \
46+
-crt=/path/to/server.crt \
47+
-key=/path/to/server.key \
48+
-ca=/path/to/ca.crt
1949
```
50+
51+
For Caddy-managed certs:
52+
53+
```sh
2054
./main -web=./public \
21-
-crt=/etc/letsencrypt/live/xxxx.com/cert.pem \
22-
-key=/etc/letsencrypt/live/xxxx.com/privkey.pem \
23-
-ca=/etc/letsencrypt/live/xxxx.com/chain.pem
55+
-crt=/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/example.com/example.crt \
56+
-key=/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/example.com/example.key \
57+
-ca=/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/example.com/example.crt
2458
```
25-
open `http://127.0.0.1:7001`
2659

27-
### add service (ubuntu)
28-
- edit webclip.service
29-
- `cp webclip.service /etc/systemd/system/webclip.service`
30-
- `systemctl daemon-reload`
31-
- `service webclip start`
60+
### CLI flags
61+
62+
| Flag | Default | Description |
63+
|--------|-------------|----------------------------|
64+
| `-web` | `../public` | Static assets directory |
65+
| `-crt` | `""` | Signer certificate path |
66+
| `-key` | `""` | Private key path |
67+
| `-ca` | `""` | CA certificate chain path |
68+
69+
## API
70+
71+
All endpoints are under `/i`.
72+
73+
| Method | Path | Description |
74+
|--------|----------|---------------------------------|
75+
| POST | `/i/cfg` | Create a new webclip profile |
76+
| GET | `/i/cfg` | Download a cached profile by ID |
77+
| GET | `/i/ls` | List all cached profiles |
78+
| POST | `/i/rm` | Remove cached profile(s) |
79+
80+
## Deploy as a systemd service (Linux)
81+
82+
1. Edit `webclip.service` with your paths and certificate flags.
83+
2. Install and start:
84+
85+
```sh
86+
sudo cp webclip.service /etc/systemd/system/webclip.service
87+
sudo systemctl daemon-reload
88+
sudo systemctl enable --now webclip
89+
```
90+
91+
## Build from source
92+
93+
- Go 1.22+
94+
- OpenSSL (only needed for signed profiles)
95+
96+
```sh
97+
git clone https://github.com/aolose/webClip.git
98+
cd webClip/src
99+
go mod tidy
100+
go build
101+
```
32102

103+
## Release
33104

34-
#### vlang version
35-
https://github.com/aolose/webclip-vlang
105+
Pushing a tag matching `v*` triggers the [GitHub Actions workflow](.github/workflows/release.yml), which builds a Linux amd64 binary, packages it with the public assets, and publishes a GitHub release.

public/a.png

-3.17 KB
Loading

public/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ <h1>Create a webClip</h1>
472472
<span>Organization</span> </code> <input type="text"/> </label> <label class="r"> <code> <span>Display Name</span>
473473
</code> <input type="text"/> </label> <label class="r rr"> <code> <span>Description</span>
474474
</code><textarea maxlength="256"></textarea></label>
475-
<label class="r"><code><span>Full Screen</span></code><label class="to"><input type="checkbox" id="fs"><span></span></label></label>
475+
<label class="r"><code><span>Full Screen</span></code><label class="to"><input type="checkbox" id="fs" checked><span></span></label></label>
476476
<label class="r"><code><span>Removable</span></code><label class="to"><input type="checkbox" id="rm" checked><span></span></label></label>
477477
<label class="r"><code><span>Precomposed</span></code><label class="to"><input type="checkbox" id="pc" checked><span></span></label></label>
478478
<label class="r"><code><span>Ignore Manifest Scope</span></code><label class="to"><input type="checkbox" id="ims"><span></span></label></label>

src/api/api.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,4 +303,4 @@ func Run(webRoot string, crt string, key string, ca string) {
303303
}
304304
}
305305

306-
const defaultIcon = "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"
306+
const defaultIcon = "iVBORw0KGgoAAAANSUhEUgAAALQAAAC0CAMAAAAKE/YAAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAxFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDYuMC1jMDA2IDc5LjE2NDc1MywgMjAyMS8wMi8xNS0xMTo1MjoxMyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzJGRTA2MkY2RUJBMTFGMUI0RjdDRDZCOUY1MTZEOUMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzJGRTA2MkU2RUJBMTFGMUI0RjdDRDZCOUY1MTZEOUMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIwMjEgV2luZG93cyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJCMDY5MkI5OUFBNkI1NUM1Q0RGMEMwRjY5QTRDNzVFQyIgc3RSZWY6ZG9jdW1lbnRJRD0iQjA2OTJCOTlBQTZCNTVDNUNERjBDMEY2OUE0Qzc1RUMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7L+9k2AAAABlBMVEUAAAD///+l2Z/dAAABwElEQVR42uzcy44DIQxE0fL///RI2U9CB/wocr1utY6iFsHGRmEYAg0aNGjQoEGDBg0aNGjQoEFfjNYrrNCSHVqyQ0t2aMkPLUP0eXM+WoZoGaJliM4xg64yp6IFugadZq5FB2gvcyU6DNFhiLbIxhPNVejwQ9sUaxLNBeiMd6eis94dhlFfgDzw++vcGqGyP3UdAr+z6J+oR0trFr2LYvSiRZ+iEC0taLQWVWgdjRq01KxWO/kLtQaYH6s1wfxUPQStTLQM0SPID9FDzCPQqev0FPMAdO7eY4y5HZ28NRXordSlF52dbgn0Xjp+NVqgi4o1oI3R6QVIgQYNGjRo0KCn7UxBszUl3fp5tEAPV4MeV+rVIHV3Ud0TnXu6BbrsxHaOegY6rwtBY9QDzsafs69HB+iNj/p+dBiuHqDr0JZ9eZ5oek3L0JatyCNKkb/RqZ6gjgJ0gK4aGYlmc95E0dXoKENHqzlnSu5ydJSio9G8Ma5qcCSXom5AR5d5bwT7s6i13+OR+puHCtGLdy0dNu9fK7BoOUg+chfCMuWMOLh1AjRo0KBBgwYNGjRo0KBBgwYNGjRo0KBBgwY9Lv4EGACS3GAjriceHwAAAABJRU5ErkJggg=="

0 commit comments

Comments
 (0)