Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
237feca
Polish Hub chrome, hover sidebar, and Q-App tabs UX
protocondrea Apr 14, 2026
8050893
Refactor Hub shell color system to neutral dark with blue accent
protocondrea Apr 15, 2026
478a659
Refine Hub shell color system, surface hierarchy, and top bar layering
protocondrea Apr 16, 2026
c109b1c
Refine Hub main page layout with adaptive onboarding-based priority
protocondrea Apr 16, 2026
43ab5f9
Checkpoint: stable dashboard layout before responsive fix
protocondrea Apr 16, 2026
1684da2
Finalize dashboard layout, Info panel behavior, and layout alignment
protocondrea Apr 16, 2026
759cd4e
Bump preview build marker to 91
protocondrea Apr 16, 2026
c63ca34
Checkpoint current dashboard dev state
protocondrea Apr 16, 2026
7c91b18
Checkpoint 2
protocondrea Apr 16, 2026
354af4d
Checkpoint 3
protocondrea Apr 16, 2026
c99277b
Checkpoint 4
protocondrea Apr 17, 2026
47f9a4c
before coin
protocondrea Apr 17, 2026
a7aff0a
Refine Featured Q-Apps intro preview behavior
protocondrea Apr 17, 2026
69812e0
before blue
protocondrea Apr 17, 2026
2a56167
checkpoint invites
protocondrea Apr 17, 2026
3e09042
Checkpoint group activity empty states
protocondrea Apr 17, 2026
021dcd8
before typeface
protocondrea Apr 18, 2026
4aea35c
before light
protocondrea Apr 18, 2026
f6764d1
Polish dashboard shell, tabs, and profile interactions
protocondrea Apr 18, 2026
140d11f
Refine dashboard nav utilities and stabilize group activity layout
protocondrea Apr 18, 2026
1f58f58
Polish featured apps header and center account identity field
protocondrea Apr 18, 2026
4edbbbd
Polish dashboard card alignment and status dividers
protocondrea Apr 18, 2026
f896c73
q-apps
protocondrea Apr 18, 2026
cddedc4
Add always-on featured Q-App border glow
protocondrea Apr 18, 2026
4fd032b
Polish featured Q-App glow and avatar tilt
protocondrea Apr 18, 2026
5702e90
quitter finish
protocondrea Apr 19, 2026
4ffc197
Add account overview status indicator
protocondrea Apr 19, 2026
cba2185
Merge branch 'hub-interactions-polish' into hub-qapp-widgets
protocondrea Apr 19, 2026
1d8efc6
Polish dashboard status, widgets, and onboarding
protocondrea Apr 20, 2026
5e159fa
checkpoint: before account
protocondrea Apr 20, 2026
d637963
Refine tool panel flows and dashboard modals
protocondrea Apr 21, 2026
f465e4f
Add QORTINO workstation card foundation
protocondrea Apr 21, 2026
420c395
Refine QORTINO card, notifications, and EarBump player
protocondrea Apr 22, 2026
945ee75
Refine QORTINO dashboard and interaction flows
protocondrea Apr 22, 2026
75dcc3b
Ignore local preview logs and external workspaces
protocondrea Apr 22, 2026
ed5fc13
Refine dashboard panels and activity widgets
protocondrea Apr 23, 2026
92c7745
before arrange
protocondrea Apr 23, 2026
60d9ee6
Refine dashboard responsive layout
protocondrea Apr 23, 2026
36de7cd
Polish dashboard actions and backup flows
protocondrea Apr 23, 2026
069a911
before login
protocondrea Apr 24, 2026
bdc63cc
Refine auth entry flow and access settings
protocondrea Apr 24, 2026
44716b9
Refine account settings profile spacing
protocondrea Apr 24, 2026
3e4c1c8
Update navbar mode toggle icons
protocondrea Apr 24, 2026
56327cc
Refine auth flow and core onboarding
protocondrea Apr 25, 2026
239c588
Redesign auth node and core setup flows
protocondrea Apr 26, 2026
ccb39f6
Polish auth, dashboard, and QORTINO flows
protocondrea Apr 27, 2026
398fb11
Refresh featured apps and notification dialogs
protocondrea Apr 27, 2026
639f438
Polish auth screen and dashboard details
protocondrea Apr 27, 2026
73e6889
Remove unused debug cleanup code
protocondrea Apr 27, 2026
f44f48d
Remove stale Qortino debug overrides
protocondrea Apr 27, 2026
128737e
Remove stale dashboard preview overrides
protocondrea Apr 27, 2026
8f0a970
Remove Quitter widget debug feed path
protocondrea Apr 27, 2026
0ab8ae2
Remove Groups widget debug data path
protocondrea Apr 27, 2026
f4d44c6
Remove dashboard minter preview flag
protocondrea Apr 27, 2026
85071dc
Remove dashboard status preview leftovers
protocondrea Apr 28, 2026
1499e11
Remove redundant root Electron lockfile entries
protocondrea Apr 28, 2026
baba5a5
Trim unused getting started debug helpers
protocondrea Apr 28, 2026
75ac06d
Remove unreachable dashboard cleanup leftovers
protocondrea Apr 28, 2026
90e28ae
Refresh auth and legacy dialog surfaces
protocondrea Apr 29, 2026
4738fe6
before last
protocondrea Apr 29, 2026
0fd9650
Refine dialog surfaces and connection mode actions
protocondrea Apr 29, 2026
20613fe
Use opaque paper surfaces for modern dialogs
protocondrea Apr 29, 2026
2edbdf7
revert electron changes in src
Philreact Apr 29, 2026
b0d933a
remove sw-clear
Philreact Apr 29, 2026
5e3402b
switch static video assets to webm
Philreact Apr 29, 2026
719fa45
added missing languages and fixed lang selection
Philreact Apr 30, 2026
c4174a9
added translations
Philreact Apr 30, 2026
b31586a
fix languages
Philreact Apr 30, 2026
1365547
fixes to api base
Philreact Apr 30, 2026
6a43653
added languages
Philreact Apr 30, 2026
b7279e8
remove clear sw
Philreact Apr 30, 2026
bd34ff1
revert vite config
Philreact Apr 30, 2026
c81da2a
remove buildversion constant
Philreact Apr 30, 2026
6e4f95d
added languages to authenticationform
Philreact Apr 30, 2026
8b5be20
fixes to languages
Philreact Apr 30, 2026
f905b8b
fix languages
Philreact Apr 30, 2026
f9d7f8d
formatting
Philreact Apr 30, 2026
d80af22
more language fixes
Philreact Apr 30, 2026
bdaad0d
lang fixes
Philreact Apr 30, 2026
aeebddb
added language code
Philreact Apr 30, 2026
9e6e6c7
fixes to tabs, virtualized lists for group activity, fix minting comp…
Philreact May 1, 2026
8941d55
started refactor of HomeDesktop
Philreact May 1, 2026
fcd1bec
remove unused code
Philreact May 1, 2026
202c7e8
refactor infopreviewpanel
Philreact May 1, 2026
3f8a328
continue migration of infopreviewpanel
Philreact May 1, 2026
2c70c9e
moved wallet activity to its own component
Philreact May 1, 2026
6af213e
fixes to blocking, lazy load of promotions, cpu optimizations
Philreact May 2, 2026
03f0921
fix devmode and tabs
Philreact May 2, 2026
60aa5f0
fixes to quitter feed and core setup features
Philreact May 3, 2026
0955761
formatting
Philreact May 3, 2026
251958c
started on fixing light-mode
Philreact May 3, 2026
8c6aae6
fix music api calls and results
Philreact May 3, 2026
db4334d
fixes to core setup, languages and light mode
Philreact May 4, 2026
d1f44d7
added filter for wallets if user has more than 8 wallets
Philreact May 4, 2026
76858f7
optimize homepage performance
Philreact May 5, 2026
e272907
optimize music player
Philreact May 5, 2026
76e65c3
cleanup logs
Philreact May 5, 2026
5d3673b
added mark all as unread
Philreact May 5, 2026
9bbd9c6
fixes to qapp notifications, languages, subscriptions
Philreact May 8, 2026
1b41fc5
added languages
Philreact May 9, 2026
b2df6f0
fixes to language, ui fixes
Philreact May 10, 2026
2d720b0
fixes to ui, wallets, auth
Philreact May 13, 2026
e3ada1b
added bookmarks
Philreact May 13, 2026
7a0d3a2
fixes to bookmarks
Philreact May 13, 2026
7d39543
disable custom theming for now.
Philreact May 13, 2026
f6ae534
fixes
Philreact May 13, 2026
a2dc7d8
fixes to theme, ignore invites join requests, dev mode tab
Philreact May 14, 2026
f619277
fixes
Philreact May 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,18 @@ release-builds/
scripts/i18n_report*
*wallet-storage.json

# Local dev/preview console captures
devserver*.err
devserver*.out
preview*.err
preview*.out
previewserver*.err
previewserver*.out

# Local external reference workspaces
/external/qapp-core-inspect/
/external/quittersource/

squashfs-root/
appimagetool-x86_64.AppImage
*.bak
Expand Down
4 changes: 3 additions & 1 deletion electron/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,13 @@
"electron-unhandled": "~4.0.1",
"electron-updater": "^6.6.2",
"electron-window-state": "^5.0.3",
"extract-zip": "^2.0.1"
"extract-zip": "^2.0.1",
"write-file-atomic": "^7.0.1"
},
"devDependencies": {
"@electron/notarize": "^2.5.0",
"@electron/rebuild": "^3.7.2",
"@types/write-file-atomic": "^4.0.3",
"electron": "^32.3.1",
"electron-builder": "^25.1.8",
"shelljs": "^0.8.5",
Expand Down
35 changes: 28 additions & 7 deletions electron/src/core.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1825,13 +1825,12 @@ export async function downloadCoreWindows() {

export async function installCore(executeProgress) {
executeProgress();
return new Promise(async (res, rej) => {
if (process.platform === 'win32') {
await downloadCoreWindows();
} else {
await javaversion();
}
});
if (process.platform === 'win32') {
await downloadCoreWindows();
} else {
await javaversion();
}
return true;
}

export async function startCore() {
Expand Down Expand Up @@ -2184,6 +2183,28 @@ export async function bootstrap(): Promise<boolean> {
}
}

/** When Core can reach `/admin/bootstrap`, runs existing {@link bootstrap}. Otherwise deletes chain `db` (if needed) and {@link startCore}. */
export async function bootstrapOrClearChainAndStart(): Promise<boolean> {
try {
const isInstalled = await isCoreInstalled();
if (!isInstalled) return false;

const running = await isCoreRunning();
if (running) {
const bootOk = await bootstrap();
if (bootOk) return true;
}

const delOk = await deleteDB();
if (!delOk && (await dbExists())) return false;

await startCore();
return true;
} catch (error) {
return false;
}
}

const rmAsync = promisify(fs.rm ?? fs.rmdir); // Node 14+ supports fs.rm

async function readJsonIfExists<T = any>(file: string): Promise<T | null> {
Expand Down
13 changes: 9 additions & 4 deletions electron/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ import {
import { log as loggerLog, error as loggerError } from './logger';
import {
ElectronCapacitorApp,
flushMiscPersistentStore,
flushPersistentStore,
loadPersistedAllowedDomainsAtStartup,
setupContentSecurityPolicy,
setupReloadWatcher,
} from './setup';
Expand Down Expand Up @@ -141,9 +144,7 @@ async function setupMultiInstanceUserData(basePort = 55000, maxInstances = 10) {
if (!(await isPortTaken(port))) {
// First instance — use default Electron behavior
if (i === 0) {
loggerLog(
`🟢 Using default userData path: ${app.getPath('userData')}`
);
loggerLog(`🟢 Using default userData path: ${app.getPath('userData')}`);
} else {
const instanceName = `qortal-instance-${i + 1}`;
const userDataPath = path.join(app.getPath('appData'), instanceName);
Expand All @@ -163,10 +164,12 @@ async function setupMultiInstanceUserData(basePort = 55000, maxInstances = 10) {

// Run Application
(async () => {
setupMultiInstanceUserData();
await setupMultiInstanceUserData();

await app.whenReady();

loadPersistedAllowedDomainsAtStartup();

// Set Content Security Policy
setupContentSecurityPolicy(myCapacitorApp.getCustomURLScheme());

Expand All @@ -193,6 +196,8 @@ async function setupMultiInstanceUserData(basePort = 55000, maxInstances = 10) {
// Set isQuitting flag before the app quits
app.on('before-quit', () => {
setIsQuitting(true);
flushPersistentStore();
flushMiscPersistentStore();
});

// Handle when all of our windows are close (platforms have their own expectations).
Expand Down
59 changes: 58 additions & 1 deletion electron/src/preload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,23 @@ import { contextBridge, shell, ipcRenderer } from 'electron';
try {
// Expose Electron API
contextBridge.exposeInMainWorld('electronAPI', {
openExternal: (url) => shell.openExternal(url),
openExternal: (url: string) => {
if (typeof url !== 'string') {
return;
}
try {
const parsed = new URL(url.trim());
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
return;
}
if (!parsed.hostname) {
return;
}
void shell.openExternal(parsed.toString());
} catch {
// Invalid URL
}
},
setAllowedDomains: (domains) => {
ipcRenderer.send('set-allowed-domains', domains);
},
Expand All @@ -18,8 +34,18 @@ try {
windowMinimize: () => ipcRenderer.invoke('window:minimize'),
windowMaximize: () => ipcRenderer.invoke('window:maximize'),
windowClose: () => ipcRenderer.invoke('window:close'),
focusWindow: () => ipcRenderer.invoke('window:focus'),
getWindowState: () =>
ipcRenderer.invoke('window:isMaximized').then((isMaximized: boolean) => ({ isMaximized })),
onWindowStateChange: (callback: (state: { isMaximized: boolean }) => void) => {
const handler = (_event, isMaximized: boolean) => {
callback({ isMaximized });
};
ipcRenderer.on('window:state-changed', handler);
return () => {
ipcRenderer.removeListener('window:state-changed', handler);
};
},
getPlatform: () => ipcRenderer.invoke('window:getPlatform'),
showAppMenu: (x?: number, y?: number) =>
ipcRenderer.invoke('window:showAppMenu', { x, y }),
Expand Down Expand Up @@ -48,6 +74,31 @@ try {
ipcRenderer.invoke('file:deleteFile', filePath),
});

// Generic persistent store (persistent-store.json, in-memory cache + debounced writes in main)
contextBridge.exposeInMainWorld('appStorage', {
get: async (key) => {
return ipcRenderer.invoke('persistentStore:get', key);
},
set: async (key, value) => {
return ipcRenderer.invoke('persistentStore:set', key, value);
},
delete: async (key) => {
return ipcRenderer.invoke('persistentStore:delete', key);
},
});

contextBridge.exposeInMainWorld('miscStorage', {
get: async (key) => {
return ipcRenderer.invoke('miscPersistentStore:get', key);
},
set: async (key, value) => {
return ipcRenderer.invoke('miscPersistentStore:set', key, value);
},
delete: async (key) => {
return ipcRenderer.invoke('miscPersistentStore:delete', key);
},
});

// Expose it
contextBridge.exposeInMainWorld('walletStorage', {
get: async (key) => {
Expand Down Expand Up @@ -148,6 +199,12 @@ try {
const raw = await ipcRenderer.invoke('coreSetup:bootstrap');
return raw;
},
bootstrapOrClearChainAndStart: async () => {
const raw = await ipcRenderer.invoke(
'coreSetup:bootstrapOrClearChainAndStart'
);
return raw;
},
onProgress: (cb: (p: any) => void) => {
const h = (_e: unknown, p: any) => cb(p);
ipcRenderer.on('coreSetup:progress', h);
Expand Down
Loading