instbyte 1.8.0 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/client/css/app.css +304 -3
- package/client/index.html +3 -0
- package/client/js/app.js +500 -225
- package/package.json +1 -1
- package/server/cleanup.js +3 -4
- package/server/config.js +1 -0
- package/server/db.js +4 -0
- package/server/server.js +108 -3
package/README.md
CHANGED
|
@@ -63,7 +63,7 @@ One person runs the server — everyone else on the same WiFi opens the URL in t
|
|
|
63
63
|
|
|
64
64
|
**Sharing is instant:**
|
|
65
65
|
- Type or paste text → hit Send
|
|
66
|
-
- Paste anywhere on the page → auto-sends
|
|
66
|
+
- Paste anywhere on the page → auto-sends text or uploads images directly
|
|
67
67
|
- Drag a file anywhere onto the page → uploads
|
|
68
68
|
- Click any text item → copies to clipboard
|
|
69
69
|
- Click any file item → downloads
|
|
@@ -125,7 +125,7 @@ Instbyte works out of the box with zero configuration. All options are optional
|
|
|
125
125
|
| `server.port` | `3000` | Port to run on. Overridden by `PORT` env var if set |
|
|
126
126
|
| `auth.passphrase` | `""` | Shared passphrase for access. Empty = no auth |
|
|
127
127
|
| `storage.maxFileSize` | `"2GB"` | Max upload size. Accepts `KB`, `MB`, `GB` |
|
|
128
|
-
| `storage.retention` | `"24h"` | How long before items auto-delete. Accepts `h`, `d` |
|
|
128
|
+
| `storage.retention` | `"24h"` | How long before items auto-delete. Accepts `h`, `d`, or `"never"` to disable cleanup entirely |
|
|
129
129
|
| `branding.appName` | `"Instbyte"` | App name in header and browser tab |
|
|
130
130
|
| `branding.primaryColor` | `"#111827"` | Primary brand color in hex. Full palette auto-derived |
|
|
131
131
|
| `branding.logoPath` | — | Path to your logo file relative to where you run the command |
|
|
@@ -163,7 +163,7 @@ The difference between *a tool you use* and *a tool you own.*
|
|
|
163
163
|
|
|
164
164
|
**Smart port handling** — if port 3000 is busy, Instbyte finds the next available port automatically.
|
|
165
165
|
|
|
166
|
-
**Short-lived by design** —
|
|
166
|
+
**Short-lived by design** — content auto-deletes after 24 hours by default. Configure retention per your needs, or disable cleanup entirely.
|
|
167
167
|
|
|
168
168
|
**QR join** — built-in QR code so phones can join instantly without typing the URL.
|
|
169
169
|
|
|
@@ -175,6 +175,9 @@ The difference between *a tool you use* and *a tool you own.*
|
|
|
175
175
|
|
|
176
176
|
**Presence awareness** — see how many people are currently connected in real time.
|
|
177
177
|
|
|
178
|
+
**Read receipts** — see how many devices have viewed each shared item. Updates live as teammates open the page.
|
|
179
|
+
|
|
180
|
+
**Item management** — add optional titles to label any item for future reference. Edit text items inline without deleting and re-pasting. Pinned items are protected from both manual deletion and auto-cleanup.
|
|
178
181
|
---
|
|
179
182
|
|
|
180
183
|
## Keyboard Shortcuts
|
package/client/css/app.css
CHANGED
|
@@ -396,7 +396,8 @@ input[type=text]:focus {
|
|
|
396
396
|
|
|
397
397
|
.item-actions {
|
|
398
398
|
display: flex;
|
|
399
|
-
gap:
|
|
399
|
+
gap: 6px;
|
|
400
|
+
align-items: flex-start;
|
|
400
401
|
}
|
|
401
402
|
|
|
402
403
|
.empty-state {
|
|
@@ -443,11 +444,16 @@ input[type=text]:focus {
|
|
|
443
444
|
background: #f9fafb;
|
|
444
445
|
border: 1px solid #e5e7eb;
|
|
445
446
|
border-radius: 6px;
|
|
446
|
-
padding:
|
|
447
|
+
padding: 5px 7px;
|
|
447
448
|
cursor: pointer;
|
|
448
|
-
font-size:
|
|
449
|
+
font-size: 13px;
|
|
449
450
|
line-height: 1;
|
|
450
451
|
color: #6b7280;
|
|
452
|
+
width: 28px;
|
|
453
|
+
height: 28px;
|
|
454
|
+
display: flex;
|
|
455
|
+
align-items: center;
|
|
456
|
+
justify-content: center;
|
|
451
457
|
}
|
|
452
458
|
|
|
453
459
|
.icon-btn:hover {
|
|
@@ -707,6 +713,12 @@ input[type=text]:focus {
|
|
|
707
713
|
font-size: 12px;
|
|
708
714
|
}
|
|
709
715
|
|
|
716
|
+
.markdown-preview {
|
|
717
|
+
padding: 4px 0;
|
|
718
|
+
max-height: 500px;
|
|
719
|
+
overflow-y: auto;
|
|
720
|
+
}
|
|
721
|
+
|
|
710
722
|
.preview-truncated {
|
|
711
723
|
font-size: 11px;
|
|
712
724
|
color: #9ca3af;
|
|
@@ -881,6 +893,159 @@ input[type=text]:focus {
|
|
|
881
893
|
background: #e5e7eb;
|
|
882
894
|
}
|
|
883
895
|
|
|
896
|
+
.item-title {
|
|
897
|
+
font-size: 11px;
|
|
898
|
+
font-weight: 600;
|
|
899
|
+
color: #6b7280;
|
|
900
|
+
text-transform: uppercase;
|
|
901
|
+
letter-spacing: 0.05em;
|
|
902
|
+
margin-bottom: 4px;
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
.title-input {
|
|
906
|
+
font-size: 12px;
|
|
907
|
+
padding: 3px 7px;
|
|
908
|
+
border: 1px solid #d1d5db;
|
|
909
|
+
border-radius: 5px;
|
|
910
|
+
margin-bottom: 4px;
|
|
911
|
+
width: 200px;
|
|
912
|
+
display: block;
|
|
913
|
+
color: #111827;
|
|
914
|
+
background: #fff;
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
.title-input:focus {
|
|
918
|
+
outline: none;
|
|
919
|
+
border-color: var(--color-primary);
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
.edit-textarea {
|
|
923
|
+
width: min(600px, 60vw);
|
|
924
|
+
min-height: 80px;
|
|
925
|
+
padding: 8px 10px;
|
|
926
|
+
border: 1px solid #d1d5db;
|
|
927
|
+
border-radius: 6px;
|
|
928
|
+
font-size: 14px;
|
|
929
|
+
font-family: system-ui;
|
|
930
|
+
resize: vertical;
|
|
931
|
+
display: block;
|
|
932
|
+
box-sizing: border-box;
|
|
933
|
+
line-height: 1.5;
|
|
934
|
+
color: #111827;
|
|
935
|
+
background: #f9fafb;
|
|
936
|
+
margin-bottom: 6px;
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
.edit-textarea:focus {
|
|
940
|
+
outline: none;
|
|
941
|
+
border-color: var(--color-primary);
|
|
942
|
+
background: #fff;
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
.edit-hint {
|
|
946
|
+
font-size: 11px;
|
|
947
|
+
color: #9ca3af;
|
|
948
|
+
margin-bottom: 4px;
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
.expiry-badge {
|
|
952
|
+
display: inline-block;
|
|
953
|
+
font-size: 10px;
|
|
954
|
+
font-weight: 500;
|
|
955
|
+
padding: 1px 6px;
|
|
956
|
+
border-radius: 4px;
|
|
957
|
+
margin-left: 6px;
|
|
958
|
+
vertical-align: middle;
|
|
959
|
+
background: #fef3c7;
|
|
960
|
+
color: #92400e;
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
.expiry-badge.expiry-gone {
|
|
964
|
+
background: #fee2e2;
|
|
965
|
+
color: #991b1b;
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
.seen-count {
|
|
969
|
+
font-size: px;
|
|
970
|
+
color: #9ca3af;
|
|
971
|
+
margin-left: 6px;
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
.more-wrapper {
|
|
975
|
+
position: relative;
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
.more-btn {
|
|
979
|
+
font-size: 16px;
|
|
980
|
+
padding: 4px 7px;
|
|
981
|
+
letter-spacing: 0;
|
|
982
|
+
line-height: 1;
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
.more-dropdown {
|
|
986
|
+
position: absolute;
|
|
987
|
+
bottom: calc(100% + 6px);
|
|
988
|
+
right: 0;
|
|
989
|
+
background: #fff;
|
|
990
|
+
border: 1px solid #e5e7eb;
|
|
991
|
+
border-radius: 8px;
|
|
992
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
|
|
993
|
+
z-index: 100;
|
|
994
|
+
min-width: 160px;
|
|
995
|
+
overflow: hidden;
|
|
996
|
+
display: none;
|
|
997
|
+
padding: 4px;
|
|
998
|
+
}
|
|
999
|
+
|
|
1000
|
+
.more-dropdown.open {
|
|
1001
|
+
display: block;
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
.more-dropdown button {
|
|
1005
|
+
display: block;
|
|
1006
|
+
width: 100%;
|
|
1007
|
+
text-align: left;
|
|
1008
|
+
background: none;
|
|
1009
|
+
border: none;
|
|
1010
|
+
padding: 8px 12px;
|
|
1011
|
+
font-size: 13px;
|
|
1012
|
+
color: #374151;
|
|
1013
|
+
cursor: pointer;
|
|
1014
|
+
border-radius: 6px;
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
.more-dropdown button:hover {
|
|
1018
|
+
background: #f3f4f6;
|
|
1019
|
+
color: #111827;
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
.more-dropdown .dropdown-label {
|
|
1023
|
+
font-size: 11px;
|
|
1024
|
+
color: #9ca3af;
|
|
1025
|
+
padding: 6px 12px 2px;
|
|
1026
|
+
font-weight: 500;
|
|
1027
|
+
text-transform: uppercase;
|
|
1028
|
+
letter-spacing: 0.05em;
|
|
1029
|
+
cursor: default;
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
.icon-btn i {
|
|
1033
|
+
width: 14px;
|
|
1034
|
+
height: 14px;
|
|
1035
|
+
display: block;
|
|
1036
|
+
stroke-width: 2;
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
.icon-btn.pinned i {
|
|
1040
|
+
color: #f59e0b;
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
.item-new {
|
|
1044
|
+
border-left: 3px solid #22c55e;
|
|
1045
|
+
padding-left: 13px;
|
|
1046
|
+
background: #f0fdf4;
|
|
1047
|
+
transition: background 1.5s ease, border-color 1.5s ease;
|
|
1048
|
+
}
|
|
884
1049
|
|
|
885
1050
|
/* ============================================================
|
|
886
1051
|
MOBILE
|
|
@@ -1339,6 +1504,74 @@ input[type=text]:focus {
|
|
|
1339
1504
|
background: #2d3148;
|
|
1340
1505
|
}
|
|
1341
1506
|
|
|
1507
|
+
.markdown-preview {
|
|
1508
|
+
color: #e5e7eb;
|
|
1509
|
+
}
|
|
1510
|
+
|
|
1511
|
+
.item-title {
|
|
1512
|
+
color: #6b7280;
|
|
1513
|
+
}
|
|
1514
|
+
|
|
1515
|
+
.title-input {
|
|
1516
|
+
background: #252836;
|
|
1517
|
+
border-color: #2d3148;
|
|
1518
|
+
color: #f3f4f6;
|
|
1519
|
+
}
|
|
1520
|
+
|
|
1521
|
+
.edit-textarea {
|
|
1522
|
+
background: #252836;
|
|
1523
|
+
border-color: #2d3148;
|
|
1524
|
+
color: #f3f4f6;
|
|
1525
|
+
}
|
|
1526
|
+
|
|
1527
|
+
.edit-textarea:focus {
|
|
1528
|
+
background: #1a1d27;
|
|
1529
|
+
border-color: #4b5563;
|
|
1530
|
+
}
|
|
1531
|
+
|
|
1532
|
+
.expiry-badge {
|
|
1533
|
+
background: #422006;
|
|
1534
|
+
color: #fbbf24;
|
|
1535
|
+
}
|
|
1536
|
+
|
|
1537
|
+
.expiry-badge.expiry-gone {
|
|
1538
|
+
background: #2d1515;
|
|
1539
|
+
color: #f87171;
|
|
1540
|
+
}
|
|
1541
|
+
|
|
1542
|
+
.seen-count {
|
|
1543
|
+
color: #6b7280;
|
|
1544
|
+
}
|
|
1545
|
+
|
|
1546
|
+
.more-dropdown {
|
|
1547
|
+
background: #1a1d27;
|
|
1548
|
+
border-color: #2d3148;
|
|
1549
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
|
|
1550
|
+
}
|
|
1551
|
+
|
|
1552
|
+
.more-dropdown button {
|
|
1553
|
+
color: #d1d5db;
|
|
1554
|
+
}
|
|
1555
|
+
|
|
1556
|
+
.more-dropdown button:hover {
|
|
1557
|
+
background: #252836;
|
|
1558
|
+
color: #f3f4f6;
|
|
1559
|
+
}
|
|
1560
|
+
|
|
1561
|
+
.more-dropdown .dropdown-label {
|
|
1562
|
+
color: #6b7280;
|
|
1563
|
+
}
|
|
1564
|
+
|
|
1565
|
+
.icon-btn.pinned i {
|
|
1566
|
+
color: #f59e0b;
|
|
1567
|
+
}
|
|
1568
|
+
|
|
1569
|
+
.item-new {
|
|
1570
|
+
border-left: 3px solid #16a34a;
|
|
1571
|
+
padding-left: 13px;
|
|
1572
|
+
background: #052e16;
|
|
1573
|
+
}
|
|
1574
|
+
|
|
1342
1575
|
#uploadStatus {
|
|
1343
1576
|
background: #1a1d27 !important;
|
|
1344
1577
|
color: #e5e7eb !important;
|
|
@@ -1665,6 +1898,74 @@ input[type=text]:focus {
|
|
|
1665
1898
|
background: #2d3148;
|
|
1666
1899
|
}
|
|
1667
1900
|
|
|
1901
|
+
.markdown-preview {
|
|
1902
|
+
color: #e5e7eb;
|
|
1903
|
+
}
|
|
1904
|
+
|
|
1905
|
+
.item-title {
|
|
1906
|
+
color: #6b7280;
|
|
1907
|
+
}
|
|
1908
|
+
|
|
1909
|
+
.title-input {
|
|
1910
|
+
background: #252836;
|
|
1911
|
+
border-color: #2d3148;
|
|
1912
|
+
color: #f3f4f6;
|
|
1913
|
+
}
|
|
1914
|
+
|
|
1915
|
+
.edit-textarea {
|
|
1916
|
+
background: #252836;
|
|
1917
|
+
border-color: #2d3148;
|
|
1918
|
+
color: #f3f4f6;
|
|
1919
|
+
}
|
|
1920
|
+
|
|
1921
|
+
.edit-textarea:focus {
|
|
1922
|
+
background: #1a1d27;
|
|
1923
|
+
border-color: #4b5563;
|
|
1924
|
+
}
|
|
1925
|
+
|
|
1926
|
+
.expiry-badge {
|
|
1927
|
+
background: #422006;
|
|
1928
|
+
color: #fbbf24;
|
|
1929
|
+
}
|
|
1930
|
+
|
|
1931
|
+
.expiry-badge.expiry-gone {
|
|
1932
|
+
background: #2d1515;
|
|
1933
|
+
color: #f87171;
|
|
1934
|
+
}
|
|
1935
|
+
|
|
1936
|
+
.seen-count {
|
|
1937
|
+
color: #6b7280;
|
|
1938
|
+
}
|
|
1939
|
+
|
|
1940
|
+
.more-dropdown {
|
|
1941
|
+
background: #1a1d27;
|
|
1942
|
+
border-color: #2d3148;
|
|
1943
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
|
|
1944
|
+
}
|
|
1945
|
+
|
|
1946
|
+
.more-dropdown button {
|
|
1947
|
+
color: #d1d5db;
|
|
1948
|
+
}
|
|
1949
|
+
|
|
1950
|
+
.more-dropdown button:hover {
|
|
1951
|
+
background: #252836;
|
|
1952
|
+
color: #f3f4f6;
|
|
1953
|
+
}
|
|
1954
|
+
|
|
1955
|
+
.more-dropdown .dropdown-label {
|
|
1956
|
+
color: #6b7280;
|
|
1957
|
+
}
|
|
1958
|
+
|
|
1959
|
+
.icon-btn.pinned i {
|
|
1960
|
+
color: #f59e0b;
|
|
1961
|
+
}
|
|
1962
|
+
|
|
1963
|
+
.item-new {
|
|
1964
|
+
border-left: 3px solid #16a34a;
|
|
1965
|
+
padding-left: 13px;
|
|
1966
|
+
background: #052e16;
|
|
1967
|
+
}
|
|
1968
|
+
|
|
1668
1969
|
#uploadStatus {
|
|
1669
1970
|
background: #1a1d27 !important;
|
|
1670
1971
|
color: #e5e7eb !important;
|
package/client/index.html
CHANGED
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
|
|
10
10
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github.min.css">
|
|
11
11
|
<link rel="stylesheet" href="/css/app.css">
|
|
12
|
+
|
|
13
|
+
<script src="https://unpkg.com/lucide@0.513.0/dist/umd/lucide.min.js"></script>
|
|
12
14
|
</head>
|
|
13
15
|
|
|
14
16
|
<body>
|
|
@@ -87,6 +89,7 @@
|
|
|
87
89
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
|
|
88
90
|
<script src="/js/app.js"></script>
|
|
89
91
|
|
|
92
|
+
|
|
90
93
|
</body>
|
|
91
94
|
|
|
92
95
|
</html>
|