Professional Asset Management System - A modern desktop application for managing Unity, Unreal Engine, and general web assets with an elegant and intuitive interface.
- Overview
- Features
- Tech Stack
- Project Structure
- Installation
- Usage
- Configuration
- Database Schema
- Architecture
- Customization
- Build & Distribution
- Development
- License
Assets Store is a cross-platform desktop application built with Electron that helps developers and content creators organize and manage their digital assets efficiently. Whether you're working with Unity assets, Unreal Engine content, or general web resources, Assets Store provides a centralized, searchable database with a beautiful user interface.
- π¨ Professional UI - Clean, modern interface with sidebar navigation
- π Multilingual - Full support for Portuguese (pt-BR) and English (en-US)
- π¨ Themeable - Three beautiful themes (Default/Purple, Light/Blue, Dark/Purple)
- π Secure - Proper IPC communication with contextBridge
- π¦ Type-Safe - 100% TypeScript with strict mode
- β‘ Fast - Vite bundler + better-sqlite3 sync API
- π§ͺ Tested - Vitest unit tests for utilities
| Feature | Description |
|---|---|
| β CRUD Operations | Full Create, Read, Update, Delete operations for assets |
| π Real-time Search | Instantly filter assets by title as you type |
| πΌοΈ Image Preview | Upload and preview images using secure base64 encoding |
| π Clickable URLs | Unity, Unreal Engine, and general links open in external browser |
| πΎ Local Storage | SQLite database stored locally in project directory |
| π Asset Listing | Paginated view with asset cards showing all details |
| βοΈ Easy Editing | Double-click any asset to edit its details |
| ποΈ Safe Deletion | Confirmation dialog before deleting assets |
| π₯ Import / Export | Import and export assets as JSON files |
| π±οΈ Drag & Drop | Drag images directly onto the form to upload |
| Feature | Description |
|---|---|
| π¨ Theme System | Choose from 3 pre-configured themes |
| π i18n Support | Switch between Portuguese and English seamlessly |
| π± Responsive | Adapts to different window sizes (min: 800x600) |
| π― Intuitive Navigation | Sidebar menu for quick page switching |
| π‘ Visual Feedback | Hover effects, active states, and smooth transitions |
| β‘ Performance | Efficient rendering and minimal resource usage |
| π Lucide Icons | Professional SVG icon library instead of emojis |
| π£ Toast Notifications | Non-blocking success/error feedback |
| π¬ Custom Modals | Styled confirm/alert dialogs replacing native popups |
| β³ Loading Skeletons | Animated placeholders during data loading |
| π¬ Page Transitions | Smooth fade-in animations between pages |
| π₯οΈ Custom Titlebar | Frameless window with styled min/max/close buttons |
| β¨οΈ Keyboard Shortcuts | Ctrl+N new, Ctrl+F search, Escape cancel |
| π Pagination | Navigate large asset collections page by page |
| Technology | Version | Purpose |
|---|---|---|
| Electron | 39.1.2 | Cross-platform desktop framework |
| TypeScript | 5.9 | Type-safe JavaScript (strict mode) |
| Vite | 5.4.21 | Fast bundler and dev server |
| better-sqlite3 | 12.8 | Synchronous SQLite engine |
| Lucide | latest | SVG icon library |
| electron-log | latest | Persistent file logging |
| Node.js | Latest LTS | Runtime environment |
| Tool | Version | Purpose |
|---|---|---|
| Electron Forge | 7.10.2 | Build and packaging |
| Vitest | 4.1 | Unit testing framework |
| ESLint | 8.57.1 | Code linting |
| TypeScript ESLint | 8.20 | TypeScript linting rules |
- Main Process: Handles system operations, database, IPC
- Renderer Process: UI rendering and user interactions
- Preload Script: Secure IPC bridge via contextBridge
- Modular Structure: Organized into config, core, components, pages, types, utils
AssetsStore/
β
βββ π data/ # Database storage
β βββ database.sqlite # SQLite database file
β
βββ π src/ # Source code
β β
β βββ π config/ # Configuration files
β β βββ app.config.ts # App settings (window, theme, i18n, upload)
β β βββ constants.ts # Global constants (IPC channels, routes, keys)
β β
β βββ π core/ # Core application logic
β β ββ database.ts # SQLite database module (better-sqlite3)
β β ββ i18n.ts # Internationalization manager
β β ββ router.ts # Client-side page routing
β β ββ theme.ts # Theme management system
β β ββ index.ts # Core exports
β β
β ββ π components/ # Reusable UI components
β β ββ modal.ts # Modal/dialog component
β β ββ toast.ts # Toast notification component
β β ββ index.ts # Component exports
β β
β βββ π locales/ # Translation files
β β βββ pt-BR.json # Portuguese (Brazil) translations
β β βββ en-US.json # English (US) translations
β β
β βββ π pages/ # Application pages
β β βββ ListPage.ts # Asset list with search & cards
β β βββ FormPage.ts # Add/Edit asset form
β β βββ SettingsPage.ts # Theme & language settings
β β βββ index.ts # Page exports
β β
β βββ π styles/ # Stylesheets
β β βββ main.css # Main CSS with theme variables
β β
β βββ π types/ # TypeScript definitions
β β βββ asset.types.ts # Asset, AssetInput, AssetUpdate
β β βββ api.types.ts # ElectronAPI interface
β β βββ core.types.ts # Router, I18n, ThemeManager, PageConstructor
β β βββ index.ts # Type exports & global Window interface
β β
β βββ π utils/ # Utility functions
β β βββ string.utils.ts # String manipulation (escape, truncate, etc.)
β β βββ date.utils.ts # Date formatting & relative time
β β βββ validation.utils.ts # Input validation helpersβ β ββ icons.ts # Lucide icon helpersβ β βββ index.ts # Utility exports
β β
β βββ main.ts # Electron main process (IPC handlers)
β βββ preload.ts # Preload script (contextBridge)
β βββ renderer.ts # Renderer entry point
β βββ env.d.ts # Environment type declarations
β βββ vite-env.d.ts # Vite type declarations
β
βββ π node_modules/ # Dependencies
βββ π .vite/ # Vite build output
β
βββ π index.html # HTML entry point
βββ π package.json # Dependencies & scripts
βββ π tsconfig.json # TypeScript configuration
βββ π forge.config.ts # Electron Forge config
βββ π vite.main.config.ts # Vite config for main process
βββ π vite.preload.config.ts # Vite config for preload
βββ π vite.renderer.config.ts # Vite config for renderer
βββ π .eslintrc.json # ESLint configuration
βββ π .gitignore # Git ignore rules
βββ π README.md # This file
βββ π CHANGELOG.md # Version history
- Node.js (LTS version recommended)
- npm or yarn
- Clone or download the repository
cd /path/to/AssetsStore- Install dependencies
npm install- Database initialization
The database will be automatically created in the data/ directory on first run.
Start the application in development mode with hot reload:
npm run startThis will:
- Launch the Electron application
- Start Vite dev server on
http://localhost:5173/ - Enable hot module replacement
- Type
rsin terminal to restart main process
| Script | Command | Description |
|---|---|---|
| Start | npm run start |
Run in development mode |
| Package | npm run package |
Package app for current platform |
| Make | npm run make |
Create distributable installers |
| Publish | npm run publish |
Publish to distribution channels |
| Lint | npm run lint |
Run ESLint on TypeScript files |
| Test | npm run test |
Run unit tests with Vitest |
| Test Watch | npm run test:watch |
Run tests in watch mode |
| Shortcut | Action |
|---|---|
Ctrl+N |
Navigate to Add New Asset form |
Ctrl+F |
Focus the search input (on list page) |
Escape |
Cancel current form / clear search / go back to list |
Edit src/config/app.config.ts to customize:
export const APP_CONFIG = {
// Application Info
name: 'Assets Store',
version: '1.0.0',
// Window Settings
window: {
width: 1135, // Default width
height: 860, // Default height
minWidth: 800, // Minimum width
minHeight: 600, // Minimum height
},
// Database Settings
database: {
name: 'database.sqlite',
directory: 'data',
},
// Theme Settings
theme: {
default: 'default',
available: ['default', 'light', 'dark'],
storageKey: 'assetsstore-theme',
},
// Internationalization
i18n: {
defaultLocale: 'pt-BR',
availableLocales: ['pt-BR', 'en-US'],
storageKey: 'assetsstore-locale',
},
// File Upload
upload: {
allowedExtensions: ['jpg', 'jpeg', 'png', 'gif', 'svg', 'webp'],
maxFileSize: 10 * 1024 * 1024, // 10MB
},
};Edit src/config/constants.ts for IPC channels, routes, and storage keys:
export const IPC_CHANNELS = {
ASSETS_GET_ALL: 'assets:getAll',
ASSETS_GET_BY_ID: 'assets:getById',
ASSETS_CREATE: 'assets:create',
ASSETS_UPDATE: 'assets:update',
ASSETS_DELETE: 'assets:delete',
READ_IMAGE: 'readImage',
OPEN_EXTERNAL: 'openExternal',
};CREATE TABLE assets (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL, -- Asset title
image TEXT, -- Image path or base64
unity TEXT, -- Unity asset URL
unreal TEXT, -- Unreal Engine asset URL
link TEXT, -- General web link
createdAt TEXT DEFAULT (datetime('now', 'localtime'))
);interface Asset {
id: number;
title: string;
image: string;
unity: string;
unreal: string;
link: string;
createdAt: string;
}βββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ
β Renderer β β Preload β β Main β
β Process β β Script β β Process β
β (UI/Pages) β β (contextBridge) β β (Database/IPC) β
βββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ
β β β
β window.api.getAssets() β β
ββββββββββββββββββββββββββββ>β β
β β ipcRenderer.invoke() β
β ββββββββββββββββββββββββββββ>β
β β β
β β Query SQLite β
β β β
β β <βββββββββββββββββββββββββ€
β <ββββββββββββββββββββββββββ€ β
β Return data β β
β β β
- Config: Centralized settings and constants
- Core: Essential services (database, i18n, router, theme)
- Components: Reusable UI components (modal, toast)
- Types: TypeScript interfaces and type definitions
- Utils: Reusable helper functions + Lucide icon wrappers
- Pages: UI components for each route
- Locales: Translation JSON files
- Styles: CSS with theme variables, animations, and component styles
- Edit
src/core/theme.ts
private themes = {
'mytheme': {
'--primary-color': '#FF6B6B',
'--secondary-color': '#4ECDC4',
// ... more variables
}
};- Update
src/config/app.config.ts
theme: {
available: ['default', 'light', 'dark', 'mytheme'],
}- Add UI option in
SettingsPage.ts
- Create translation file
src/locales/es-ES.json
{
"app": {
"title": "Tienda de Activos"
},
// ... translations
}- Update
src/core/i18n.ts
import esES from '../locales/es-ES.json';
this.translations = {
'pt-BR': ptBR,
'en-US': enUS,
'es-ES': esES,
};- Update
src/config/app.config.ts
i18n: {
availableLocales: ['pt-BR', 'en-US', 'es-ES'],
}- Create page file
src/pages/MyPage.ts
export class MyPage {
constructor(private container: HTMLElement) {}
async render(params?: any) {
this.container.innerHTML = `<h1>My Page</h1>`;
}
}- Register in router
src/core/router.ts
import { MyPage } from '../pages/MyPage';
this.pages = new Map<string, PageConstructor>([
// ... existing pages
['mypage', MyPage as PageConstructor],
]);- Add navigation menu item in
src/renderer.ts
npm run packageOutput: out/AssetsStore-{platform}-{arch}/
npm run makeSupported makers (configured in forge.config.ts):
- Windows: Squirrel (
.exeinstaller) - macOS: ZIP (
.appbundle) - Linux: DEB (
.debpackage) and RPM (.rpmpackage)
Output: out/make/
| Platform | Output |
|---|---|
| Windows | Assets Store Setup.exe |
| macOS | Assets Store.app.zip |
| Linux (Debian) | assets-store_1.0.0_amd64.deb |
| Linux (RedHat) | assets-store-1.0.0-1.x86_64.rpm |
- One responsibility per file
- Clear naming conventions
- JSDoc comments for documentation
- Export from index files for clean imports
- TypeScript strict mode
- ESLint rules enforced
- Consistent formatting
- Type safety throughout
- Types: Define in
src/types/ - Logic: Implement in
src/core/orsrc/utils/ - UI: Create page in
src/pages/ - IPC: Add handlers in
src/main.tsand expose insrc/preload.ts - Styles: Add to
src/styles/main.css
The project uses Vitest for unit testing. Tests cover utility functions (string, date, validation).
# Run tests once
npm run test
# Run in watch mode
npm run test:watchTest files are located in the tests/ directory:
string.utils.test.tsβ escapeHtml, truncate, capitalize, toKebabCasedate.utils.test.tsβ formatDate with locale supportvalidation.utils.test.tsβ URL validation, empty checks, file extensions, file size
MIT License
Copyright (c) 2025 Assets Store
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
dedzec
- Email: [email protected]
- GitHub: @dedzec
Built with modern web technologies:
- Electron - Build cross-platform desktop apps
- TypeScript - JavaScript with syntax for types
- Vite - Next generation frontend tooling
- better-sqlite3 - Fast, synchronous SQLite3
- Lucide - Beautiful & consistent SVG icons
- Vitest - Blazing fast unit test framework
- Electron Documentation
- TypeScript Handbook
- Vite Guide
- better-sqlite3 API
- Lucide Icons
- Vitest Documentation
- Electron Forge Documentation
Made with β€οΈ and modern web technologies
β Star this project if you find it useful!