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 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** — all content auto-deletes after 24 hours. Nothing lingers.
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
@@ -396,7 +396,8 @@ input[type=text]:focus {
396
396
 
397
397
  .item-actions {
398
398
  display: flex;
399
- gap: 8px;
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: 6px 8px;
447
+ padding: 5px 7px;
447
448
  cursor: pointer;
448
- font-size: 14px;
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>