Skip to content

Commit 4992e80

Browse files
Eranclaude
andcommitted
v0.0.7 - configurable app name + README for public sharing
- Remove all hardcoded "Studio Shimshi" references from HTML/title/placeholders - Add Business/App Name field to Settings modal (stored in localStorage) - applyConfig() now updates page title and header from saved app name - Add README.md with setup instructions and feature overview Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 7e9cc92 commit 4992e80

File tree

2 files changed

+89
-6
lines changed

2 files changed

+89
-6
lines changed

README.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# WhatsApp Manager — Evolution API UI
2+
3+
A browser-based WhatsApp management interface built on top of [Evolution API v2](https://github.com/EvolutionAPI/evolution-api). No installation, no Node.js, no build step — just open `index.html`.
4+
5+
---
6+
7+
## Prerequisites
8+
9+
- A running **Evolution API v2** instance (self-hosted)
10+
- A connected WhatsApp instance on that server
11+
- A modern browser (Chrome / Edge / Firefox)
12+
13+
---
14+
15+
## Setup
16+
17+
1. Download or clone this repo
18+
2. Open `index.html` directly in your browser
19+
3. Click the **Settings** gear button in the top-right
20+
4. Fill in:
21+
- **Business / App Name** — display name shown in the header (e.g. your company name)
22+
- **Server URL** — your Evolution API base URL (e.g. `https://your-server.com`)
23+
- **Instance Name** — the WhatsApp instance name configured in your Evolution API
24+
- **API Key** — your Evolution API key
25+
5. Click **Save** — credentials are stored locally in your browser (never sent anywhere else)
26+
27+
---
28+
29+
## Features
30+
31+
### Messaging
32+
| Type | Description |
33+
|------|-------------|
34+
| Text | Send text messages to one or multiple recipients (chip-based input) |
35+
| Media | Send images, videos, documents with optional caption |
36+
| Voice Note | Send audio files as voice messages |
37+
| Location | Send GPS coordinates with place name and address |
38+
| Contact | Share a contact card (vCard) |
39+
| Reaction | React to a specific message with an emoji |
40+
| Poll | Create a poll with up to 12 options |
41+
| Buttons | Send interactive button messages |
42+
| List | Send interactive list messages with sections |
43+
| Status/Story | Post WhatsApp status updates (text, image, video, audio) |
44+
45+
### Groups
46+
- **Browse & Send** — fetch all groups, select one or more, broadcast a message
47+
- **Create Group** — create a new group with participants
48+
- **Manage Group** — update subject, description, picture, participants, settings, invite links, ephemeral timer
49+
50+
### Bulk Sending
51+
- Send to multiple recipients or groups with a **randomized delay** between messages (configurable min/max seconds) to simulate human sending behavior
52+
53+
### Phone Number Handling
54+
- Validates phone numbers using [libphonenumber-js](https://github.com/nicolo-ribaudo/libphonenumber-js)
55+
- Auto-normalizes local numbers to E.164 format (e.g. `0501234567``972501234567` for IL)
56+
- Configure default country in Settings for local number parsing
57+
58+
---
59+
60+
## Security
61+
62+
- All credentials (API key, instance name, server URL) are stored exclusively in your **browser's localStorage**
63+
- Nothing is hardcoded — the repo contains zero credentials
64+
- Credentials never leave your browser except in direct API calls to your own Evolution API server
65+
66+
---
67+
68+
## License
69+
70+
MIT — free to use and modify.

index.html

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<head>
44
<meta charset="UTF-8" />
55
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
6-
<title>Organization Title — WhatsApp Manager</title>
6+
<title>WhatsApp Manager</title>
77
<script src="https://unpkg.com/libphonenumber-js@1.11.4/bundle/libphonenumber-max.js"></script>
88
<script src="https://cdn.tailwindcss.com"></script>
99
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet"/>
@@ -47,7 +47,7 @@
4747
<svg class="w-5 h-5 text-white" fill="currentColor" viewBox="0 0 24 24"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg>
4848
</div>
4949
<div>
50-
<h1 class="text-base font-bold text-gray-900">Organization Title</h1>
50+
<h1 id="header-title" class="text-base font-bold text-gray-900">WhatsApp Manager</h1>
5151
<p class="text-xs text-gray-500">WhatsApp Manager</p>
5252
</div>
5353
</div>
@@ -57,7 +57,7 @@ <h1 class="text-base font-bold text-gray-900">Organization Title</h1>
5757
Connected
5858
</div>
5959
<div class="text-xs text-gray-400">
60-
Instance: <span id="header-instance" class="font-semibold text-gray-600">MyInstance</span>
60+
Instance: <span id="header-instance" class="font-semibold text-gray-600"></span>
6161
</div>
6262
<button onclick="openConfig()" class="flex items-center gap-1.5 text-sm text-gray-500 hover:text-gray-800 border border-gray-200 hover:border-gray-300 px-3 py-1.5 rounded-lg transition-colors" title="Connection Settings">
6363
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"/><circle cx="12" cy="12" r="3" stroke-width="2"/></svg>
@@ -79,6 +79,11 @@ <h2 class="text-base font-bold text-gray-900">Connection Settings</h2>
7979
</button>
8080
</div>
8181
<div class="px-6 py-5 space-y-4">
82+
<div>
83+
<label class="block text-sm font-medium text-gray-700 mb-1.5">Business / App Name</label>
84+
<input id="cfg-app-name" type="text" placeholder="WhatsApp Manager" class="w-full border border-gray-300 rounded-lg px-3.5 py-2.5 text-sm"/>
85+
<p class="text-xs text-gray-400 mt-1">Shown in the header. Leave blank to use the default.</p>
86+
</div>
8287
<div>
8388
<label class="block text-sm font-medium text-gray-700 mb-1.5">Server URL <span class="text-red-400">*</span></label>
8489
<input id="cfg-base" type="text" placeholder="https://your-server.example.com" class="w-full border border-gray-300 rounded-lg px-3.5 py-2.5 text-sm"/>
@@ -337,7 +342,7 @@ <h2 class="text-lg font-semibold text-gray-800 mb-1">Send Location</h2>
337342
</div>
338343
<div>
339344
<label class="block text-sm font-medium text-gray-700 mb-1.5">Place Name</label>
340-
<input id="loc-name" type="text" placeholder="Organization Title" class="w-full border border-gray-300 rounded-lg px-3.5 py-2.5 text-sm"/>
345+
<input id="loc-name" type="text" placeholder="Our Office" class="w-full border border-gray-300 rounded-lg px-3.5 py-2.5 text-sm"/>
341346
</div>
342347
<div>
343348
<label class="block text-sm font-medium text-gray-700 mb-1.5">Address</label>
@@ -954,7 +959,7 @@ <h3 class="text-sm font-semibold text-gray-800">My Profile Info</h3>
954959
<h3 class="text-sm font-semibold text-gray-800">Update Display Name</h3>
955960
<div>
956961
<label class="block text-sm font-medium text-gray-700 mb-1.5">New Name <span class="text-red-400">*</span></label>
957-
<input id="profile-new-name" type="text" placeholder="Organization Title" class="w-full border border-gray-300 rounded-lg px-3.5 py-2.5 text-sm"/>
962+
<input id="profile-new-name" type="text" placeholder="My Business" class="w-full border border-gray-300 rounded-lg px-3.5 py-2.5 text-sm"/>
958963
</div>
959964
<button onclick="updateProfileName()" class="btn-send w-full text-white font-semibold py-2.5 rounded-lg text-sm flex items-center justify-center gap-2">
960965
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"/></svg>
@@ -1093,7 +1098,8 @@ <h3 class="text-sm font-semibold text-gray-800">Privacy Settings</h3>
10931098
apikey: '',
10941099
country: 'IL',
10951100
delayMin: 1,
1096-
delayMax: 3
1101+
delayMax: 3,
1102+
appName: 'WhatsApp Manager'
10971103
};
10981104

10991105
function getCfg() {
@@ -1104,6 +1110,7 @@ <h3 class="text-sm font-semibold text-gray-800">Privacy Settings</h3>
11041110
country: localStorage.getItem('wa_country') || 'IL',
11051111
delayMin: parseFloat(localStorage.getItem('wa_delay_min')) || 1,
11061112
delayMax: parseFloat(localStorage.getItem('wa_delay_max')) || 3,
1113+
appName: localStorage.getItem('wa_app_name') || 'WhatsApp Manager',
11071114
};
11081115
}
11091116

@@ -1116,11 +1123,15 @@ <h3 class="text-sm font-semibold text-gray-800">Privacy Settings</h3>
11161123

11171124
function applyConfig() {
11181125
const cfg = getCfg();
1126+
const name = cfg.appName || 'WhatsApp Manager';
1127+
document.getElementById('header-title').textContent = name;
1128+
document.title = name;
11191129
document.getElementById('header-instance').textContent = cfg.instance;
11201130
}
11211131

11221132
function openConfig() {
11231133
const cfg = getCfg();
1134+
document.getElementById('cfg-app-name').value = cfg.appName !== 'WhatsApp Manager' ? cfg.appName : '';
11241135
document.getElementById('cfg-base').value = cfg.base;
11251136
document.getElementById('cfg-instance').value = cfg.instance;
11261137
document.getElementById('cfg-apikey').value = cfg.apikey;
@@ -1148,6 +1159,7 @@ <h3 class="text-sm font-semibold text-gray-800">Privacy Settings</h3>
11481159
}
11491160

11501161
function saveConfig() {
1162+
const appName = document.getElementById('cfg-app-name').value.trim() || DEFAULTS.appName;
11511163
const base = document.getElementById('cfg-base').value.trim().replace(/\/$/, '');
11521164
const instance = document.getElementById('cfg-instance').value.trim();
11531165
const apikey = document.getElementById('cfg-apikey').value.trim();
@@ -1165,6 +1177,7 @@ <h3 class="text-sm font-semibold text-gray-800">Privacy Settings</h3>
11651177
status.textContent = '⚠ Min delay must be less than or equal to Max delay.';
11661178
return;
11671179
}
1180+
localStorage.setItem('wa_app_name', appName);
11681181
localStorage.setItem('wa_base', base);
11691182
localStorage.setItem('wa_instance', instance);
11701183
localStorage.setItem('wa_apikey', apikey);

0 commit comments

Comments
 (0)