Skip to content

Commit c5e7807

Browse files
release(v1.0.1): improve UX, fix backup validation, update filters, and refine documentation
- Enhanced "What is this app?" section for better clarity - Disabled progress bar animation after reaching 100% - Fixed spelling in progress indicator ("completed") - Added strict validation for renamed and tampered backup files - Improved error handling for backup decryption failures - Updated FilterType display labels for better readability - Added supportive guidance for passphrase input field - Refined popover in filter section - Removed outdated diagrams and prepared for updated versions
1 parent 34ae826 commit c5e7807

File tree

8 files changed

+102
-44
lines changed

8 files changed

+102
-44
lines changed

CHANGELOG.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Changelog
2+
3+
All notable changes to this project will be documented in this file.
4+
This project adheres to [Semantic Versioning](https://semver.org/).
5+
6+
---
7+
8+
## [1.0.1] - 2025-10-01
9+
### Fixed
10+
- Corrected spelling in the data scanning progress indicator (`complete``completed`).
11+
- Fixed issue where uploading a renamed backup file incorrectly showed a success message and caused console errors. Now displays a proper warning message.
12+
- Fixed bug where modified backup files could be uploaded without showing the “Backup file decryption process failed” message. Application now blocks invalid files gracefully.
13+
- Adjusted manifest and resource paths for deployment to ensure correct loading of icons and manifest data.
14+
- Updated `What is this app?` section text for better clarity.
15+
16+
### Changed
17+
- Updated progress bar behavior: animation now stops when progress reaches 100% to avoid confusion.
18+
- Improved display labels for filter types to be more user-friendly:
19+
- **Unfollowers Only → Unfollowers**
20+
- **Mixed Results → Mixed Connections**
21+
- **Settled Results → Settled Connections**
22+
- **Fans Only → Fans**
23+
- Added helper text to the passphrase input field to guide users on how to paste values (`Ctrl + V` / `Cmd + V`).
24+
- Enhanced popover content in the filter section for better user guidance.
25+
26+
### Removed
27+
- Deleted outdated software architecture diagram images (to be replaced with updated versions containing borders and shadows).
28+
29+
---
30+
31+
## [1.0.0] - 2025-09-30
32+
### Added
33+
- Initial stable release of **GitHub Connection Visualizer**.
34+
- Core features:
35+
- GitHub data scanning with support for large-scale accounts.
36+
- Intelligent clustering into Unfollowers, Fans, and Settled Connections.
37+
- Data scanning monitor with progress tracking.
38+
- Encrypted backup and restore functionality.
39+
- User-friendly filtering and sorting mechanisms.
40+
- Full documentation, including README, software architecture diagrams, and usage notes.
41+
- Production-grade UI/UX with dark theme and glassmorphism effects.

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ The application integrates with the GitHub API to fetch user follower and follow
4747
### Intelligent Data Sorting and Filtering
4848
Connections are automatically analyzed and classified into four categories:
4949

50-
- **Unfollowers only**: Users you follow who do not follow you back.
51-
- **Fans only**: Users who follow you but you do not follow back.
52-
- **Mixed results**: A combined view of fans and unfollowers for quick review.
53-
- **Settled results**: Mutual followers, showing balanced and established connections.
50+
- **Unfollowers**: People you follow, but they do not follow you back.
51+
- **Fans**: People who follow you, but you do not follow them back.
52+
- **Mixed Connections**: Only shows Unfollowers and Fans.
53+
- **Settled Connections**: People where you both follow each other.
5454

5555
This structured filtering allows users to focus on managing their GitHub relationships based on real needs.
5656

index.html

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@
240240
</div>
241241
<div class="col-12 text-center">
242242
<span class="header-color text-capitalize">This app has a small learning
243-
curve. For the best experience, we recommend reading the Usage Notes
243+
curve. For the best experience, It is recommend reading the Usage Notes
244244
before you start.</span>
245245
</div>
246246
<div class="col-12 pt-3">
@@ -275,8 +275,8 @@
275275
To handle this, the app uses a <strong
276276
class="text-color">Data Scanning
277277
Monitor</strong> and a <strong
278-
class="text-color">progress tracking
279-
mechanism</strong> that lets you gather data in
278+
class="text-color">Progress Tracking
279+
Mechanism</strong> that lets you gather data in
280280
safe, repeatable steps until the scan is complete.
281281
</li>
282282
<li class="text-color">You can also pause at any time by
@@ -458,10 +458,11 @@
458458
</div>
459459
<div class="col-12">
460460
<div class="col-12 text-start">
461-
<span class="text-color">Backup Passphrase</span>
461+
<span class="text-color">Backup Passphrase</span><br/>
462+
<span class="muted-text-color">Paste your passphrase using <span class="badge badge-wrapper rounded-pill fw-normal px-2 py-1">Ctrl</span> <span class="text-color">+</span> <span class="badge badge-wrapper rounded-pill fw-normal px-2 py-1">V</span> on Windows/Linux or <span class="badge badge-wrapper rounded-pill fw-normal px-2 py-1">Cmd</span> <span class="text-color">+</span> <span class="badge badge-wrapper rounded-pill fw-normal px-2 py-1">V</span> on macOS.</span>
462463
</div>
463464
<div class="col-12 pt-2">
464-
<div class="input-group shadow-none pt-3">
465+
<div class="input-group shadow-none pt-2">
465466
<input type="text"
466467
class="form-control rounded-start-5 shadow-none input-field pt-2 pb-2 ps-3 pe-3"
467468
placeholder="Enter Passphrase" minlength="24"
@@ -516,10 +517,10 @@
516517
data-bs-custom-class="custom-popover"
517518
data-bs-title="Info for Filter Options" data-bs-content="
518519
<ul style='margin:0; padding-left:18px;'>
519-
<li><strong>Unfollowers Only:</strong> Shows users you follow who do not follow you back.</li>
520-
<li><strong>Fans Only:</strong> Shows users who follow you but you do not follow back.</li>
521-
<li><strong>Mixed Results:</strong> Displays only Unfollowers and Fans, excluding settled users.</li>
522-
<li><strong>Settled Results:</strong> Shows users where both sides follow each other.</li>
520+
<li><strong>Unfollowers:</strong> People you follow, but they do not follow you back.</li>
521+
<li><strong>Fans:</strong> People who follow you, but you do not follow them back.</li>
522+
<li><strong>Mixed Connections:</strong> Only shows Unfollowers and Fans.</li>
523+
<li><strong>Settled Connections:</strong> People where you both follow each other.</li>
523524
</ul>">
524525
<i class="bi bi-info-circle-fill text-color fs-5"></i>
525526
</button>
@@ -532,31 +533,31 @@
532533
class="btn btn-secondary button-wrapper rounded-5 shadow-none ps-3 pe-3"
533534
for="filter-type-1">
534535
<i class="bi bi-heartbreak-fill"></i>&nbsp;
535-
Unfollowers Only
536+
Unfollowers
536537
</label>
537538
<input type="radio" class="btn-check" name="filter-type" id="filter-type-2"
538539
autocomplete="off" value="FANS_ONLY">
539540
<label
540541
class="btn btn-secondary button-wrapper rounded-5 shadow-none ps-3 pe-3"
541542
for="filter-type-2">
542543
<i class="bi bi-star-fill"></i>&nbsp;
543-
Fans Only
544+
Fans
544545
</label>
545546
<input type="radio" class="btn-check" name="filter-type" id="filter-type-3"
546547
autocomplete="off" value="MIXED_RESULT">
547548
<label
548549
class="btn btn-secondary button-wrapper rounded-5 shadow-none ps-3 pe-3"
549550
for="filter-type-3">
550551
<i class="bi bi-leaf-fill"></i>&nbsp;
551-
Mixed Result
552+
Mixed Connections
552553
</label>
553554
<input type="radio" class="btn-check" name="filter-type" id="filter-type-4"
554555
autocomplete="off" value="SETTLED_RESULT">
555556
<label
556557
class="btn btn-secondary button-wrapper rounded-5 shadow-none ps-3 pe-3"
557558
for="filter-type-4">
558559
<i class="bi bi-shield-lock-fill"></i>&nbsp;
559-
Settled Resultes
560+
Settled Connections
560561
</label>
561562
</div>
562563
</div>

js/service/EncryptDataManageService.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -76,18 +76,18 @@ export class EncryptDataManageService{
7676
}
7777

7878
async decryptData(encryptedPayload){
79-
// get the salt value
80-
const salt = CryptoRelatedValueGenerator.convertFromBase64(encryptedPayload.salt);
81-
// get the initialize vector value
82-
const iv = CryptoRelatedValueGenerator.convertFromBase64(encryptedPayload.iv);
83-
// get the data value
84-
const data = CryptoRelatedValueGenerator.convertFromBase64(encryptedPayload.cipher);
85-
// construct the key
86-
const key = await this.#generateDeriveKey(salt);
87-
8879
let decodedAndDecryptedPayload = null;
8980

9081
try{
82+
// get the salt value
83+
const salt = CryptoRelatedValueGenerator.convertFromBase64(encryptedPayload.salt);
84+
// get the initialize vector value
85+
const iv = CryptoRelatedValueGenerator.convertFromBase64(encryptedPayload.iv);
86+
// get the data value
87+
const data = CryptoRelatedValueGenerator.convertFromBase64(encryptedPayload.cipher);
88+
// construct the key
89+
const key = await this.#generateDeriveKey(salt);
90+
9191
// construct the plainBuffer
9292
const plainBuffer = await crypto.subtle.decrypt(
9393
{

js/service/ImportExportFileManageService.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,17 @@ export class ImportExportFileManageService{
8787
// check if the UserSession available or not
8888
if(userSession != null){
8989
// UserSession available and get the upload file extension
90-
const uploadfileExtension = fileUploadEvent.target.files[0].name.split(".")[3].toLowerCase();
90+
let uploadfileExtension = "";
91+
92+
// get the file name detail combination array
93+
const uploadFileNameDetailCombinationArray = fileUploadEvent.target.files[0].name.split(".");
94+
95+
// check if the upload file name has a valid extracable detail length for extact the file extenstion
96+
if (uploadFileNameDetailCombinationArray.length > 1) {
97+
// upload file name has a valid extracable detail length and assign the file extenstion
98+
uploadfileExtension = uploadFileNameDetailCombinationArray[uploadFileNameDetailCombinationArray.length - 1].toLowerCase();
99+
}
100+
91101
// get the upload file MIME type
92102
const uploadfileMimeType = fileUploadEvent.target.files[0].type;
93103

js/ui/ComponentRenderer.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,22 +244,29 @@ export class ComponentRenderer{
244244
// check if the following scan process complete or not
245245
if(followingPresentage >= 100){
246246
// following scan process complete
247-
this.#followingScanCompleteIndicator.innerHTML = "Complete";
247+
this.#followingScanCompleteIndicator.innerHTML = "Completed";
248+
// remove the following scan complete indicator progressbar animation bahavior to stable
249+
this.#followingProgressRepresenter.className = "progress-bar progress-bar-striped";
248250

249251
}else{
250252
// following scan process not complete and still have to scan user data
251253
this.#followingScanCompleteIndicator.innerHTML = "Remaning User Data...";
252-
254+
// implement the following scan complete indicator progressbar animation bahavior
255+
this.#followingProgressRepresenter.className = "progress-bar progress-bar-striped progress-bar-animated";
253256
}
254257

255258
// check if the follower scan process complete or not
256259
if(followerPresentage >= 100){
257260
// follower scan process complete
258-
this.#followerScanCompleteIndicator.innerHTML = "Complete";
261+
this.#followerScanCompleteIndicator.innerHTML = "Completed";
262+
// remove the follower scan complete indicator progressbar animation bahavior to stable
263+
this.#followerProgressRepresenter.className = "progress-bar progress-bar-striped";
259264

260265
}else{
261266
// follower scan process not complete and still have to scan user data
262267
this.#followerScanCompleteIndicator.innerHTML = "Remaning User Data...";
268+
// implement the follower scan complete indicator progressbar animation bahavior
269+
this.#followerProgressRepresenter.className = "progress-bar progress-bar-striped progress-bar-animated";
263270
}
264271

265272
// update the inner content of the follower progress wrapper

js/util/CryptoRelatedValueGenerator.js

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,29 @@
1-
export class CryptoRelatedValueGenerator{
2-
3-
static generateRandomBytes(targetLength){
1+
export class CryptoRelatedValueGenerator {
2+
3+
static generateRandomBytes(targetLength) {
44
// created the unitArray
55
const unitArray = new Uint8Array(targetLength);
66
crypto.getRandomValues(unitArray);
77

88
return unitArray;
99
}
1010

11-
static convertToBase64(bufferValue){
11+
static convertToBase64(bufferValue) {
1212
// covert the ArrayBuffer into byte array
1313
const bytes = new Uint8Array(bufferValue);
14-
14+
1515
let binary = "";
1616

17-
for(const byte of bytes){
17+
for (const byte of bytes) {
1818
binary += String.fromCharCode(byte);
1919
}
2020

2121
return btoa(binary);
2222
}
2323

24-
static convertFromBase64(targetString){
25-
// decode the Base64 binary string
24+
static convertFromBase64(targetString) {
2625
const binary = atob(targetString);
27-
26+
2827
const bytes = new Uint8Array(binary.length);
2928

3029
for(let i = 0; i < binary.length; i++){
@@ -34,20 +33,20 @@ export class CryptoRelatedValueGenerator{
3433
return bytes;
3534
}
3635

37-
static generatePassphrase(targetLength){
38-
if(targetLength < 24){
36+
static generatePassphrase(targetLength) {
37+
if (targetLength < 24) {
3938
targetLength = 24;
4039
}
4140

4241
// create all the character collection
4342
const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+-=[]{}|;:,.<>?";
44-
43+
4544
const randomValues = new Uint32Array(targetLength);
4645
crypto.getRandomValues(randomValues);
4746

4847
let passphrase = "";
4948

50-
for(let x = 0; x < targetLength; x++){
49+
for (let x = 0; x < targetLength; x++) {
5150
passphrase += characters[randomValues[x] % characters.length];
5251
}
5352

manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"short_name": "GHCV",
44
"description": "Discover And Manage Your GitHub Connections With Ease.",
55
"start_url": "./",
6-
"version": "1.0.0",
6+
"version": "1.0.1",
77
"display": "standalone",
88
"background_color": "#131315",
99
"theme_color": "#191d24",

0 commit comments

Comments
 (0)