Compare commits

...

179 Commits

Author SHA1 Message Date
Daniel Luiz Alves
c265b8e08d v3.0.0-beta.9 (#90) 2025-06-20 16:33:04 -03:00
Daniel Luiz Alves
d0173a0bf9 refactor: optimize file icon rendering in UploadFileModal
- Consolidated file icon logic by introducing a new renderFileIcon function that utilizes the getFileIcon utility for improved clarity and maintainability.
- Removed redundant icon imports and streamlined the icon rendering process based on file names, enhancing code efficiency.
2025-06-20 16:09:13 -03:00
Daniel Luiz Alves
0d346b75cc refactor: simplify FilePreviewModal by utilizing useFilePreview hook
- Replaced complex state management and effect hooks in FilePreviewModal with a custom useFilePreview hook for improved readability and maintainability.
- Integrated FilePreviewRenderer component to handle different file types and rendering logic, enhancing the modularity of the code.
- Updated file icon mappings in file-icons.tsx to include additional file types and improve visual representation in the UI.
2025-06-20 15:37:00 -03:00
Daniel Luiz Alves
0a65917cbf refactor: update FilePreviewModal to handle text file previews
- Renamed jsonContent state to textContent for clarity and updated related logic to support various text file types.
- Implemented a new loadTextPreview function to handle text and JSON file previews, ensuring proper formatting and error handling.
- Enhanced file type detection to include a broader range of text file extensions, improving the preview functionality for users.
2025-06-20 15:14:35 -03:00
Daniel Luiz Alves
f651f50180 feat: enhance file upload and preview functionality (#89) 2025-06-20 14:44:43 -03:00
Daniel Luiz Alves
1125665bb1 feat: enhance file upload and preview functionality
- Improved the uploadSmallFile method to handle various request body types (buffer, string, object, stream) more effectively.
- Added error handling for unsupported request body types.
- Implemented JSON file preview capability in FilePreviewModal, allowing users to view formatted JSON content.
- Updated localization files to include "retry" messages in multiple languages for better user experience during upload errors.
2025-06-20 14:43:27 -03:00
Daniel Luiz Alves
b65aac3044 refactor: update authentication logic to support email or username (#88) 2025-06-20 13:46:10 -03:00
Daniel Luiz Alves
a865aabed0 refactor: update authentication logic to support email or username
- Modified the login schema to accept either an email or username for user authentication.
- Updated the AuthService to find users by email or username.
- Adjusted localization files to include new labels and placeholders for email or username input across multiple languages.
- Refactored the login form component to reflect the changes in the schema and improve user experience.
2025-06-20 13:45:37 -03:00
Daniel Luiz Alves
561e8faf33 refactor: remove outdated comment in FilePreviewModal
- Eliminated a redundant comment regarding the direct link approach in the file download logic to enhance code clarity and maintainability.
2025-06-20 10:29:08 -03:00
Daniel Luiz Alves
6445b0ce3e refactor: streamline file download logic in FilePreviewModal
- Updated the file download process to use a direct link approach, eliminating unnecessary fetch and blob creation steps.
- Improved code clarity by simplifying the download mechanism while maintaining functionality.
2025-06-20 10:28:44 -03:00
Daniel Luiz Alves
90cd3333cb Improve disk space detection (#87) 2025-06-20 10:19:15 -03:00
Daniel Luiz Alves
2ca0db70c3 localization: add loading and error messages for storage usage in multiple languages
- Enhanced localization files for various languages by adding loading states and detailed error messages related to storage information retrieval.
- Updated translations for "available" and included new keys for "loading," "retry," and various error scenarios to improve user experience during storage operations.
2025-06-20 10:18:33 -03:00
Daniel Luiz Alves
28697fa270 refactor: clean up comments and improve readability in various modules
- Removed unnecessary comments from timeout configuration, OIDC routes, reverse share routes, and other modules to enhance code clarity.
- Streamlined the code by eliminating redundant comments that do not add value to the understanding of the logic.
- Improved overall maintainability by focusing on concise and meaningful code structure.
2025-06-20 10:10:06 -03:00
Daniel Luiz Alves
d739c1b213 refactor: replace ShareFilePreviewModal with FilePreviewModal in files table component
- Updated the files table component to use FilePreviewModal for file previews.
- Removed the ShareFilePreviewModal component as it is no longer needed.
2025-06-20 09:55:03 -03:00
Daniel Luiz Alves
25a0c39135 docs: added instructions for Zitadel (#85) 2025-06-20 09:51:12 -03:00
Daniel Luiz Alves
185fa4c191 fix: change Docker build command from --push to --load
- Updated the Docker build command in build-docker.sh to use --load instead of --push, allowing for local image loading without pushing to a registry.
2025-06-20 09:48:42 -03:00
Daniel Luiz Alves
9dfb034c2e enhance: improve disk space detection and error handling in storage module
- Refactored disk space retrieval logic to support multiple commands based on the operating system.
- Added detailed error handling for disk space detection failures, including specific messages for system configuration issues.
- Updated API responses to provide clearer error messages to the frontend.
- Enhanced the dashboard UI to display loading states and error messages related to disk space retrieval, with retry functionality.
- Improved type definitions to accommodate new error handling in the dashboard components.
2025-06-20 09:48:00 -03:00
ruohki
936a2b71c7 docs: added instructions for Zitadel 2025-06-20 13:10:55 +02:00
Daniel Luiz Alves
cd14c28be1 refactor: simplify Docker environment detection for file storage paths (#77) 2025-06-19 03:02:31 -03:00
Daniel Luiz Alves
3c084a6686 refactor: simplify Docker environment detection for file storage paths
- Replaced manual Docker detection logic with a utility constant for determining if the application is running in a container.
- Updated file storage paths in both server and filesystem storage provider to use the new constant for improved readability and maintainability.
2025-06-19 02:49:47 -03:00
Daniel Luiz Alves
6a1381684b refactor: replace FilePreviewModal with ShareFilePreviewModal (#76) 2025-06-19 02:01:07 -03:00
Daniel Luiz Alves
dc20770fe6 refactor: replace FilePreviewModal with ShareFilePreviewModal in files table component
- Updated the files table component to use ShareFilePreviewModal for file previews.
- Removed the unused import of FilePreviewModal and added the new import for ShareFilePreviewModal.
2025-06-19 01:46:50 -03:00
Daniel Luiz Alves
6e526f7f88 fix: update email transport secure (#75) 2025-06-19 00:51:27 -03:00
Daniel Luiz Alves
858852c8cd refactor: remove unused import from email service 2025-06-19 00:50:09 -03:00
Daniel Luiz Alves
363dedbb2c Update service.ts (#74) 2025-06-19 00:49:27 -03:00
TerrifiedBug
cd215c79b8 Update service.ts
Fix nodemailer secure flag for STARTTLS
2025-06-18 23:45:42 +01:00
Daniel Luiz Alves
98586efbcd v3.0.0-beta.5 (#72) 2025-06-18 18:31:09 -03:00
Daniel Luiz Alves
c724e644c7 fix: update notification endpoint and include request body in API call
- Changed the API endpoint for notifying recipients to include the shareId directly in the URL.
- Added the request body to the fetch call to ensure proper data is sent with the notification request.
- Set the Content-Type header to application/json for the request.
2025-06-18 18:14:20 -03:00
Daniel Luiz Alves
555ff18a87 feat: implement Docker compatibility for file storage paths (#71) 2025-06-18 18:06:51 -03:00
Daniel Luiz Alves
5100e1591b feat: implement Docker compatibility for file storage paths
- Added checks to determine if the application is running in a Docker environment.
- Updated file storage paths to use `/app/server` in Docker and the current working directory for local development.
- Ensured consistent directory creation for uploads and temporary chunks across different environments.
2025-06-18 18:05:46 -03:00
Daniel Luiz Alves
6de29bbf07 fix: standardize environment variable imports and enhance user auth (#69) 2025-06-18 17:08:59 -03:00
Daniel Luiz Alves
39c47be940 fix: standardize environment variable imports and enhance user authentication error handling
- Updated imports for environment variables in auth and email services to ensure consistency.
- Improved error handling in user routes to provide more specific responses for unauthorized access and internal server errors.
2025-06-18 16:57:11 -03:00
Daniel Luiz Alves
76d96816bc v3.0.0-beta.3 (#68) 2025-06-18 16:19:24 -03:00
Daniel Luiz Alves
b3e7658a76 feat: enhance authentication flow and improve database setup script (#67) 2025-06-18 15:32:41 -03:00
Daniel Luiz Alves
61a579aeb3 feat: enhance authentication flow and improve database setup script
- Added a check for first user access in the authentication context to handle initial user setup.
- Updated the server start script to ensure proper ownership and permissions for database operations, enhancing compatibility with Docker environments.
- Refactored database seeding and configuration checks to run as the target user, preventing permission issues during setup.
2025-06-18 15:32:12 -03:00
Daniel Luiz Alves
cc9c375774 feat: add reverse proxy support (#66) 2025-06-18 12:44:39 -03:00
Daniel Luiz Alves
016006ba3d fix: storage calculation when running within docker (#65) 2025-06-18 12:44:20 -03:00
ruohki
cbc567c6a8 fixed logic error 2025-06-18 17:26:23 +02:00
Daniel Luiz Alves
25b4d886f7 docs: Update reverse proxy configuration to address SQLite "readonly database" error
- Added guidance for configuring proper UID/GID permissions to resolve SQLite issues with bind mounts.
- Included a note on checking host UID/GID and linked to detailed setup documentation for clarity.
2025-06-18 12:23:00 -03:00
ruohki
98953e042b check if runs within docker to pick storage loc 2025-06-18 17:16:11 +02:00
Daniel Luiz Alves
9e06a67593 docs: remove outdated Nginx configuration from reverse proxy documentation
- Eliminated the Nginx HTTP configuration section for reverse proxies without HTTPS/SSL to streamline the documentation.
- Maintained focus on the SECURE_SITE variable and Docker Compose setup for clarity in reverse proxy configurations.
2025-06-18 12:14:56 -03:00
Daniel Luiz Alves
9682f96905 docs: reverse proxy documentation to streamline Docker Compose example
- Removed outdated Docker Compose configuration for the Palmr service.
- Retained the SECURE_SITE environment variable setting for clarity.
- Updated documentation to emphasize HTTP security considerations.
2025-06-18 12:14:05 -03:00
Daniel Luiz Alves
d2c69c3b36 feat: Add SECURE_SITE configuration and reverse proxy documentation
- Introduced the SECURE_SITE environment variable to control cookie security settings based on deployment context.
- Updated Dockerfile to log SECURE_SITE status during application startup.
- Enhanced documentation with a new guide on reverse proxy configuration, detailing the use of SECURE_SITE for secure cookie handling.
- Adjusted authentication and email services to utilize SECURE_SITE for secure connections.
- Updated frontend components to set cookie security based on the current protocol.
2025-06-18 12:10:54 -03:00
Daniel Luiz Alves
9afe8292fa v3.0.0-beta.2 (#62) 2025-06-17 23:43:12 -03:00
Daniel Luiz Alves
e15f50a8a8 fix(docker): Implement bind mount compose (#61) 2025-06-17 23:31:06 -03:00
Daniel Luiz Alves
8affdc8f95 (fix) Share download (#58) 2025-06-17 23:27:38 -03:00
Daniel Luiz Alves
281eff0f14 chore: update Dockerfile and supervisord configuration for improved logging
- Modified the Dockerfile to streamline the creation of the supervisor configuration directory.
- Updated `infra/supervisord.conf` to redirect logs to stdout and stderr, enhancing log management and visibility.
- Removed specific log file paths and sizes to simplify logging setup.
2025-06-17 23:23:36 -03:00
Daniel Luiz Alves
b28f1f97c4 Refactor Dockerfile to use external supervisord configuration file
- Replaced inline supervisor configuration in Dockerfile with a separate `infra/supervisord.conf` file for better organization and maintainability.
- Ensured the new configuration retains all previous settings for the server and web programs.
2025-06-17 23:14:40 -03:00
Daniel Luiz Alves
c5660b3c6b feat: Enhance Docker setup and documentation for Palmr.
- Added a new `docker-compose-bind-mount-example.yaml` for easier bind mount configuration.
- Updated `.gitignore` to include the `data/` directory for persistent storage.
- Modified `docker-compose.yaml` to clarify volume paths and improve comments.
- Enhanced `Dockerfile` to support flexible UID/GID configuration and ensure proper directory permissions.
- Updated environment variable handling in `server-start.sh` and Prisma configuration for better database management.
- Revised documentation in `quick-start.mdx` and `uid-gid-configuration.mdx` to reflect new features and best practices for deployment.
2025-06-17 22:46:28 -03:00
Charly Gley
e64f718998 fix: change error and success messages 2025-06-17 19:59:27 +02:00
Charly Gley
f00a9dadd0 fix: make download on shares work 2025-06-17 19:55:23 +02:00
Daniel Luiz Alves
c262c164d2 v3.0.0-beta.1 (#57) 2025-06-17 11:07:39 -03:00
Daniel Luiz Alves
1d882252e3 feat: UID GID environment support (#56) 2025-06-17 10:49:57 -03:00
Daniel Luiz Alves
2ea7343e0c feat: Add flexible UID/GID configuration support in Dockerfile and documentation
- Updated Dockerfile to allow configurable user and group IDs via environment variables `PALMR_UID` and `PALMR_GID`, enhancing compatibility with host systems.
- Introduced a new documentation file `uid-gid-configuration.mdx` detailing the configuration process and troubleshooting for permission issues, particularly for NAS systems.
- Updated `meta.json` to include a reference to the new UID/GID configuration guide.
2025-06-17 10:46:36 -03:00
Daniel Luiz Alves
54bd987b9a docs: Update supported languages to include Polish
- Increased the total number of supported languages from 14 to 15, adding Polish (pl-PL) with complete translations across all application features and interfaces.
2025-06-17 10:43:02 -03:00
Daniel Luiz Alves
b900953674 fix: Updare Polish language translations for the application
- Created a new `pl-PL.json` file containing comprehensive translations for various application components, including common messages, file management, user authentication, and sharing features. This addition enhances accessibility for Polish-speaking users.
2025-06-17 10:39:37 -03:00
Daniel Luiz Alves
d07ebfd01f Create pl_PL.json (#43) 2025-06-17 10:34:14 -03:00
Daniel Luiz Alves
5b0b01eecd Update language-switcher.tsx (#44) 2025-06-17 10:25:40 -03:00
Daniel Luiz Alves
cb87505afd Remove hardcoded environment variables from supervisord.conf (#54) 2025-06-17 10:23:46 -03:00
Clay Buxton
b447204908 Remove hardcoded environment variables from supervisord.conf 2025-06-15 22:35:37 -04:00
Kamil
4049878cfe Update language-switcher.tsx
Add Polish language selector
2025-06-13 20:40:39 +02:00
Kamil
13ae0d3b8c Create pl_PL.json
Add Polish language translation
2025-06-13 20:38:58 +02:00
Daniel Luiz Alves
2990e6fefb v3.0-beta (#41) 2025-06-13 12:26:04 -03:00
Daniel Luiz Alves
65c9b755ca [New Version] - v3.0-Beta (#40) 2025-06-13 12:06:15 -03:00
Daniel Luiz Alves
893a4097b6 feat: add reverse share feature image to README
- Included a new image showcasing the reverse share functionality in the README, enhancing visual representation and user understanding of the feature.
2025-06-13 11:57:17 -03:00
Daniel Luiz Alves
d3c26b550b feat: update README and seed configuration for improved branding and clarity
- Replaced the banner image in the README to enhance visual appeal and branding.
- Updated the seed configuration to reflect a new application logo, ensuring consistency in branding.
- Expanded the README to include additional features such as simple deployment and scalable storage options, improving clarity for users.
2025-06-13 11:36:41 -03:00
Daniel Luiz Alves
348bdb0282 feat: add comprehensive documentation for new features and user contributions
- Introduced new guides for available languages, SMTP configuration, OIDC authentication, and issue reporting to enhance user experience and support.
- Added detailed instructions for contributing to the Palmr project, including GitHub sponsorship and starring the repository.
- Updated the homepage to highlight core features and improve user engagement.
- Removed outdated user management documentation to streamline content and focus on current functionalities.
- Included new images to support documentation and enhance visual understanding of features.
2025-06-13 11:23:35 -03:00
Daniel Luiz Alves
8f30883404 feat: update to v3.0-beta with new features and improvements
- Updated versioning across multiple components and documentation to v3.0-beta.
- Introduced new Docker Compose configurations for S3-compatible storage and MinIO support.
- Enhanced the documentation with new guides for API usage, architecture, and user management.
- Improved localization and user experience in the frontend with updated UI components and styles.
- Removed outdated Docker configurations and files to streamline the setup process.
- Added new utilities for key generation and improved error handling in various components.
- Updated license to reflect the new Kyantech-Permissive License.
2025-06-13 02:23:15 -03:00
Daniel Luiz Alves
458c6b40bb feat: enhance reverse share localization and functionality
- Updated localization files for multiple languages to include new strings related to reverse share features, improving user experience.
- Introduced new components for managing reverse share details, including editable fields and sections for received files.
- Enhanced existing modals with improved layouts and functionality for better user interaction during reverse share operations.
- Improved error handling and user feedback throughout the reverse share process.
2025-06-06 16:41:29 -03:00
Daniel Luiz Alves
fea4faa7ce feat: enhance reverse share modals and localization
- Updated localization files to include new strings for reverse share modals, improving user experience in multiple languages.
- Introduced new components for managing reverse share details, including editable fields and received files sections.
- Enhanced existing modals with improved layouts and functionality for better user interaction.
- Refactored hooks to streamline reverse share data handling and improve code organization.
- Added new utility functions for formatting file sizes and dates, enhancing the display of reverse share information.
- Improved error handling and user feedback during reverse share operations.
2025-06-06 14:51:39 -03:00
Daniel Luiz Alves
6a08874267 feat: enhance reverse share upload functionality with improved localization and error handling
- Updated localization files to include new strings for the reverse share upload process, enhancing user experience in multiple languages.
- Implemented a new layout for reverse share uploads, integrating file upload sections and status messages for better feedback.
- Added error handling for various upload scenarios, including password protection, link expiration, and file validation.
- Refactored components to utilize hooks for managing upload state and responses, improving code organization and maintainability.
- Introduced a new password modal for handling protected links, enhancing security during file uploads.
- Enhanced the user interface with dynamic status messages and visual feedback during the upload process.
2025-06-06 13:43:16 -03:00
Daniel Luiz Alves
b549aef45f feat: introduce reverse share functionality and password reset guide
- Added a comprehensive guide for resetting user passwords directly within the Docker container, enhancing security and usability.
- Implemented reverse share features, including new routes, controllers, and services for managing reverse shares.
- Introduced DTOs and repository patterns for reverse share operations, improving code organization and maintainability.
- Updated API endpoints to support reverse share functionalities, including file uploads and password management.
- Enhanced the dashboard with new components for managing reverse shares, improving user experience and accessibility.
- Updated localization files to include new strings related to reverse shares and password management.
2025-06-06 01:43:58 -03:00
Daniel Luiz Alves
1fb06067cd feat: update Dockerfile and add password reset functionality
- Upgraded Node.js version in Dockerfile from 18-alpine to 20-alpine for improved performance and security.
- Added API_BASE_URL environment variable to support local API calls.
- Introduced a new reset-password.sh script for interactive password resets within the Docker container.
- Created reset-password.ts script to handle password reset logic, including user validation and password hashing.
- Enhanced Dockerfile to copy the new scripts and ensure proper permissions for execution.
2025-06-03 17:49:48 -03:00
Daniel Luiz Alves
998b690659 feat: implement OIDC authentication and enhance user management features
- Introduced OIDC authentication support with new OIDCService, controller, and routes for handling OIDC login and callback processes.
- Updated user management functionalities to integrate OIDC, allowing users to authenticate via external providers.
- Enhanced localization files to include new strings related to OIDC authentication across multiple languages.
- Refactored existing components and hooks to support the new authentication flow, improving user experience during login and registration processes.
- Added new UI components for handling OIDC login and callback, ensuring a seamless integration with the existing application structure.
2025-06-03 16:15:22 -03:00
Daniel Luiz Alves
459783b152 chore: remove ONLY_DOCKER.md documentation file
- Deleted the ONLY_DOCKER.md file which provided instructions for running Palmr with Docker without docker-compose. This file is no longer needed as the documentation has been consolidated or updated elsewhere.
2025-06-02 17:14:29 -03:00
Daniel Luiz Alves
bc752b3b74 feat: enhance file selector with improved localization and functionality
- Updated localization files for multiple languages to include new strings related to file sharing and management.
- Enhanced the FileSelector component to support additional features such as file descriptions, search functionality, and improved user feedback.
- Refactored action button titles and placeholder texts to utilize localized strings for better user experience.
- Improved the display of file counts and selection statuses in the file selector interface.
2025-06-02 17:05:01 -03:00
Daniel Luiz Alves
f067e160ba feat: enhance sharing features with security and expiration settings
- Introduced ShareSecurityModal and ShareExpirationModal components to manage share security and expiration settings.
- Updated SharesModals and SharesTable components to integrate new modals for managing security and expiration.
- Enhanced ShareManager to handle updates for security and expiration settings.
- Improved localization files to include new strings related to share security and expiration across multiple languages.
- Refactored existing components to support the new functionality, improving user experience in managing shared items.
2025-06-02 16:52:46 -03:00
Daniel Luiz Alves
5f4f8acbca feat: enhance filename encoding for Content-Disposition header
- Implemented a new method to safely encode filenames for the Content-Disposition header in both FilesystemController and S3StorageProvider, improving file download handling.
- Updated the upload and presigned URL generation processes to utilize the new encoding method, ensuring proper filename formatting and security.
- Enhanced validation logic in FilesystemStorageProvider for download tokens to improve robustness.
2025-06-02 14:57:03 -03:00
Daniel Luiz Alves
1a34236208 feat: implement bulk delete functionality for shares
- Added bulk delete confirmation modal to enhance user experience when deleting multiple shares.
- Integrated bulk delete actions in the shares table, allowing users to select and delete multiple shares at once.
- Updated ShareManager to handle bulk delete operations and manage selected shares state.
- Enhanced localization files to include new strings related to bulk delete actions across multiple languages.
2025-06-02 13:40:34 -03:00
Daniel Luiz Alves
14477ff676 feat: enhance file management and audio playback features
- Added a new slider component for audio playback control, improving user interaction with audio files.
- Implemented a custom audio player to support audio file previews within the file preview modal.
- Introduced a files view manager to toggle between table and grid views for better file organization.
- Updated localization files to include new strings related to audio playback and file management across multiple languages.
- Enhanced the recent files component to utilize the new dashboard files view for improved user experience.
2025-06-02 11:58:44 -03:00
Daniel Luiz Alves
ff6e171e91 feat: enhance file sharing and management features
- Added support for file descriptions in sharing modals, allowing users to provide additional context when sharing files.
- Implemented bulk sharing functionality, enabling users to share multiple files at once with a single action.
- Enhanced file management capabilities with new modals for bulk downloads and deletions, improving user experience.
- Updated localization files to include new strings related to file sharing and management across multiple languages.
- Improved the file manager to handle bulk actions and state management more effectively.
2025-06-02 03:09:15 -03:00
Daniel Luiz Alves
d69453e4ae feat: enhance file preview and upload functionality
- Updated localization files for multiple languages to improve user experience with file previews and uploads.
- Enhanced the FilePreviewModal component to support video, audio, and PDF previews with blob loading for better performance.
- Implemented a confirmation modal for canceling ongoing uploads, providing users with clearer options during the upload process.
- Improved file upload handling with better state management and user feedback during uploads.
2025-06-02 00:04:24 -03:00
Daniel Luiz Alves
158858e426 feat: implement file sharing functionality with modal support
- Added ShareFileModal component to facilitate file sharing with customizable options.
- Integrated sharing functionality into RecentFiles and FileList components, allowing users to share files directly.
- Updated file manager to handle file sharing state and actions.
- Enhanced localization files to include new share-related strings across multiple languages.
2025-06-01 22:52:35 -03:00
Daniel Luiz Alves
b90c77966d feat: implement file renaming and description updating in file and share tables
- Added functionality to update file names and descriptions directly in the FileList and FilesTable components.
- Enhanced SharesTable to allow renaming of shares with inline editing capabilities.
- Updated ShareManager to handle name updates for shares, improving user experience in managing shared items.
- Introduced optimistic UI updates for better responsiveness during editing actions.
2025-06-01 22:23:44 -03:00
Daniel Luiz Alves
9dff734f9f feat: enhance share service and API routes for better parameter handling
- Updated ShareService to hash passwords conditionally before storing them in the database.
- Modified API route handlers to await parameters, improving the handling of dynamic route parameters in the fetch requests.
- Added .gitignore entry for Prisma database files to prevent them from being tracked.
2025-06-01 00:52:46 -03:00
Daniel Luiz Alves
d3b7fe04ed feat: implement file size input component and update settings configuration
- Added a new FileSizeInput component to handle file size configurations in a user-friendly manner.
- Updated SettingsInput to integrate the FileSizeInput for maxFileSize and maxTotalStoragePerUser settings.
- Revised environment schema to remove MAX_FILESIZE validation, ensuring flexibility in configuration.
- Adjusted localization files to remove byte references in descriptions for clarity across multiple languages.
2025-06-01 00:29:35 -03:00
Daniel Luiz Alves
122781ca3d chore: update environment example and language switcher cookie comment
- Revised the .env.example file to clarify S3 storage configuration options and removed commented-out database URL.
- Added a comment to the COOKIE_MAX_AGE constant in the language switcher for better understanding of its purpose.
2025-05-31 23:10:10 -03:00
Daniel Luiz Alves
32727bf99b feat: add Italian and Dutch options to language switcher
- Updated the language switcher component to include Italian (it-IT) and Dutch (nl-NL) as selectable languages, enhancing localization support for users.
2025-05-31 03:30:25 -03:00
Daniel Luiz Alves
9baf3588c0 feat: add Italian and Dutch localization files
- Introduced new localization files for Italian (it-IT.json) and Dutch (nl-NL.json) languages, providing complete translations for the application interface and enhancing accessibility for users in these regions.
2025-05-31 03:29:49 -03:00
Daniel Luiz Alves
3677b6e494 fix: update language switcher secure cookie setting
- Changed the secure cookie setting in the LanguageSwitcher component from production-only to false, ensuring compatibility in non-production environments.
2025-05-31 02:46:57 -03:00
Daniel Luiz Alves
7a77c0a1c1 feat: enhance password reset functionality and update environment configuration
- Removed FRONTEND_URL validation from environment schema.
- Updated AuthController to include origin in password reset requests.
- Modified RequestPasswordResetSchema to require origin.
- Adjusted AuthService and EmailService to handle origin for password reset emails.
- Updated frontend hook to pass origin when requesting password reset.
2025-05-31 02:46:34 -03:00
Daniel Luiz Alves
6c4dbb167e fix: update footer version display
- Changed the footer version display from "v{version}-beta" to "v{version}" to reflect the current version without the beta suffix.
2025-05-31 02:45:30 -03:00
Daniel Luiz Alves
d74ff76227 fix: update French and Portuguese localization files
- Added missing title for SMTP notifications in the French localization file.
- Reformatted the Portuguese localization file to improve structure and readability by aligning keys and values properly.
2025-05-31 02:45:10 -03:00
Daniel Luiz Alves
713ad709a6 fix: update localization files to use placeholder syntax
- Modified JSON files for multiple languages to replace template syntax from `{{variable}}` to `{variable}` for consistency across localization strings.
- Ensured that all relevant keys in the files for Arabic, German, Spanish, French, Hindi, Japanese, Korean, Portuguese, Russian, Turkish, and Chinese reflect this change, enhancing maintainability and readability.
2025-05-31 02:37:52 -03:00
Daniel Luiz Alves
c39d41b76c feat: migrate from PostgreSQL to SQLite
- Updated Docker Compose and Dockerfile to remove PostgreSQL dependencies and configure SQLite as the database provider.
- Adjusted environment variables and healthcheck commands to reflect the new database setup.
- Simplified server startup script by removing PostgreSQL wait logic and replacing migration commands with schema push.
- Updated Prisma schema to use SQLite and removed related migration files.
2025-05-30 22:50:40 -03:00
Daniel Luiz Alves
602780e8dd feat: update Docker Compose files for improved configuration and documentation
- Refactored environment variable definitions in docker-compose files to enhance clarity and consistency.
- Updated healthcheck commands to utilize dynamic port variables for better adaptability.
- Added a new quick-start guide to the documentation, providing users with a streamlined setup process using Docker Compose.
- Included the quick-start page in the meta.json for better navigation in the documentation.
2025-05-30 17:10:58 -03:00
Daniel Luiz Alves
2276ed5bd6 feat: update package.json for Palmr v2.1-beta release
- Updated version to "2.1-beta" for both server and frontend applications.
- Changed project names to "palmr-api" and "palmr-frontend".
- Added descriptions, author information, keywords, and license details.
- Specified package manager version as "pnpm@10.6.0" for both applications.
2025-05-30 14:09:16 -03:00
Daniel Luiz Alves
4b57a03311 feat: start update documentation for Palmr v2.1-beta release
- Renamed the project to "palmr-docs" and updated version to "2.1-beta" in package.json.
- Added new architecture and user management documentation for the 2.1-beta version.
- Updated meta.json files to include the new version and pages.
- Introduced a version warning component for deprecated documentation.
- Enhanced layout and styling for better user experience.
- Added new assets including logos and banners for the updated version.
2025-05-30 14:08:58 -03:00
Daniel Luiz Alves
fff4675aa3 feat: add docker-compose files for S3 and local filesystem storage options
Introduce three new docker-compose files: docker-compose-file-system.yaml for local filesystem storage, docker-compose-s3-minio.yaml for MinIO S3-compatible storage, and docker-compose-s3.yaml for direct S3 storage. Each configuration includes environment variables for service setup, health checks, and persistent volume management. This enhances deployment flexibility for the Palmr application.
2025-05-28 18:07:16 -03:00
Daniel Luiz Alves
8290ccaaa9 feat: enhance Docker setup for local filesystem storage
Update Dockerfile and docker-compose.yaml to support local filesystem storage for uploads and temporary files. Add necessary directories and permissions in the Dockerfile, and configure volumes in docker-compose for persistent storage. Modify .dockerignore to exclude runtime-generated storage directories, ensuring a cleaner build environment.
2025-05-28 10:46:05 -03:00
Daniel Luiz Alves
c780ea2f2a feat: enhance file storage capabilities with local filesystem support
Implement a new FilesystemStorageProvider to enable file uploads and downloads directly to a local encrypted filesystem. Update the application to support both S3 and local filesystem storage modes, allowing for flexible file handling based on environment configurations. Introduce timeout configurations for large file operations and ensure proper directory management for uploads. Update relevant routes and controllers to accommodate the new filesystem functionality.
2025-05-28 10:00:52 -03:00
Daniel Luiz Alves
615d203002 feat: implement S3-compatible storage support
Add support for S3-compatible storage by introducing a new S3StorageProvider. Update environment variables to replace MinIO configurations with S3 settings. Modify file service methods to utilize the new provider for generating presigned URLs and managing file operations. Update related documentation and API endpoints to reflect these changes, ensuring compatibility with various S3 providers.
2025-05-28 01:34:22 -03:00
Daniel Luiz Alves
9984a21b76 chore: refactor Dockerfile, docker-compose, and .dockerignore for a single image (#37) 2025-05-27 01:14:39 -03:00
Daniel Luiz Alves
431086a614 fix: update healthcheck commands in installation documentation to use wget 2025-05-27 01:11:07 -03:00
Daniel Luiz Alves
d40ef51695 chore: add Dockerfile, docker-compose, and .dockerignore for multi-service setup
Introduce a Dockerfile for building the Palmr application with multi-stage builds for both server and web components. Update docker-compose.yaml to consolidate services under a single 'palmr' service, ensuring proper health checks and environment variable configurations. Add a .dockerignore file to optimize Docker builds by excluding unnecessary files. Include a Makefile for simplified build and deployment commands.
2025-05-27 00:50:46 -03:00
Daniel Luiz Alves
8f3ad71850 v2.0.0-beta.5 (#36) 2025-05-20 12:03:31 -03:00
Daniel Luiz Alves
a9191d6b54 docs(installation): update environment variable names for consistency
Update environment variable names in the installation documentation to use consistent naming conventions. This includes changing POSTGRES_PASSWORD to POSTGRESQL_PASSWORD and similar adjustments for other variables to align with the expected naming format.
2025-05-20 12:02:14 -03:00
Daniel Luiz Alves
b8465df016 Fix healthcheck and environment variables in docker-compose.yml (#35) 2025-05-20 11:51:44 -03:00
tiltshiftfocus
5a44d79279 Fix healthcheck and environment variables in docker-compose.yml 2025-05-20 14:50:35 +08:00
Daniel Luiz Alves
63d9abfe3e v2.0.0-beta.4 (#34) 2025-05-19 18:10:13 -03:00
Daniel Luiz Alves
d3ae5ea10c build: update Node.js and dependencies in Dockerfiles and package.json
Update the base Node.js image from version 18 to 22-alpine in both web and server Dockerfiles to leverage the latest features and security patches. Additionally, update the @prisma/client dependency to version 6.4.1 in the server package.json and pnpm-lock.yaml to ensure compatibility and stability.
2025-05-19 18:08:19 -03:00
Daniel Luiz Alves
d614820aca add RepoFlow as supporter 2025-05-14 21:44:06 -03:00
Daniel Luiz Alves
3c2d92c630 feat: change download behaviour (#33) 2025-05-14 21:26:52 -03:00
Charly Gley
6ae8436f4b fix: changed download behaviour for the public share as well 2025-05-10 15:03:18 +02:00
Charly Gley
39d5980936 feat: change download behaviour - download directly from minio backend, which makes the browser display the download progress 2025-05-10 03:24:25 +02:00
Daniel Luiz Alves
27e0e7c8da docs: update docker image tags to 'latest' in installation guide (#31) 2025-05-06 11:03:06 -03:00
Daniel Luiz Alves
02bc1df0c1 docs: update docker image tags to 'latest' in installation guide
This change ensures that the installation guide uses the 'latest' tag for docker images instead of the specific 'v2.0.0-beta' version, making it easier for users to always get the most recent version without manually updating the tag.
2025-05-06 11:02:00 -03:00
Daniel Luiz Alves
c1baa3a16d v2.0.0-beta.3 (#30) 2025-05-06 10:06:52 -03:00
Daniel Luiz Alves
cfc103e056 fix: (docker images) (#29) 2025-05-06 09:41:12 -03:00
Charly Gley
1a0b565ae0 fix: (docker images)
changed check-db.mjs to output number in stdout
changed routes.ts to import prisma with relative paths
2025-05-05 21:04:14 +02:00
Daniel Luiz Alves
37a30f1bd7 v2.0.0-beta.2 (#28) 2025-05-05 11:42:17 -03:00
Daniel Luiz Alves
d7bdffe096 feat: Pre-upload validation API (#26) 2025-05-05 09:50:44 -03:00
Daniel Luiz Alves
277fa3ce28 fix(register-form) (#27) 2025-05-05 09:50:09 -03:00
Charly Gley
11b2c5d9a1 fix(register-form): change form validation password length to 8 instead of 6 (backend expects at least 8). Added translations for the error/success toast messages. 2025-05-04 04:12:19 +02:00
Charly Gley
0e1ea0f2ef feat: Pre-upload validation API
I implemented a new API Endpoint /files/check that is queried before trying to upload the file to the MinIO backend.
This prevents the current issue where files exceeding the maximum file size would be uploaded to the storage backend but then fail to get registered, resulting in "dead" data invisible in the frontend but stored in the backend.
Additionally I added new toast notifications for the following errors that can happen while checking if the file is valid:
- filesizeExceeded: Displays a toast that the file is too large and shows the current MAX_FILESIZE
- insufficientStorage: Displays a toast with the error that not enough storage is available together with the currently available storage
- unauthorized: Displays a toast saying that the token is invalid
2025-05-03 05:22:57 +02:00
Daniel Luiz Alves
a8c53afe8c [Next Release] v2.0.0-beta.1 (#21) 2025-05-02 18:03:32 -03:00
PunchEnergyFTW
5b3dab7c75 fix(shares): Allow users to set and update passwords for shares (#25) 2025-05-02 17:01:22 -03:00
Daniel Luiz Alves
57d89e5807 Feat: Initial admin creation (#24)
In this pull request, we're removing the default admin user that was previously created via seed. Instead, the initial user will now be created dynamically by whoever is installing Palmr., eliminating the need for a predefined seed. This change makes the setup process more fluid and secure.
2025-05-02 16:23:13 -03:00
PunchEnergyFTW
107a467bcc Feat: Add max filesize environment variable (#20)
Co-authored-by: Charly Gley <charly@gley.dev>
2025-04-27 23:30:18 -03:00
Daniel Luiz Alves
792183bbb3 Merge branch 'main' into next 2025-04-27 23:27:44 -03:00
Daniel Luiz Alves
a12183d4a8 Squashed commit of the following:
commit 359d0a0403
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 25 14:11:09 2025 -0300

    docs(installation): add command to generate .env file

    Add a command to generate a .env file with the `server_ip` configuration to simplify the setup process for users. This command can be executed in the server terminal at the same path as the docker-compose.yaml file.

commit c3967eca72
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 25 13:42:26 2025 -0300

    refactor(web): remove unused config fetch in layout metadata

    Simplify the metadata generation in the layout component by removing the unnecessary fetch of app configurations. This reduces complexity and improves maintainability.

commit 6898dd8d1b
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 25 01:22:53 2025 -0300

    refactor(layout): remove unused changeLayout prop from Banner component

    The changeLayout prop was not utilized in the Banner component, so it has been removed to simplify the code and improve maintainability.

    style(home): add version tag to the hero section title

    Added a small version tag "v2.0.0-beta" to the hero section title for better visibility and user awareness of the current version.

commit e80de3576c
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 25 01:11:45 2025 -0300

    build(docs): disable eslint and typescript checks during builds

    To streamline the build process and avoid unnecessary interruptions, eslint and typescript checks are now ignored during builds

commit 17dd85241c
Merge: da64d65 f7124ec
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 25 01:01:28 2025 -0300

    Upgrade to v2.0.0-beta (#16)

commit f7124ec346
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 25 00:56:04 2025 -0300

    chore: update environment and docker configurations

    Update .env.example to include SERVER_IP, add metadata to docs layout, and switch docker-compose image tags to 'latest' for consistency and clarity.

commit b443fcb010
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Thu Apr 24 23:31:40 2025 -0300

    docs: update image URLs in README.md

    Update the image URLs in the README.md file to use the new Cloudinary links for better reliability and consistency

commit d106b5346f
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Thu Apr 24 23:28:30 2025 -0300

    docs: update documentation links and README content

    Update all documentation links from 'palmr-docs.kyantech.com.br' to 'palmr.kyantech.com.br' to reflect the new URL. Additionally, update the README.md to include the latest frontend technology stack and correct the screenshot image link. Also, add a hyperlink to the core maintainer's GitHub profile.

commit 7a6df51308
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Thu Apr 24 23:14:25 2025 -0300

    refactor(home): update layout, image URLs, and documentation links

    - Remove unnecessary spaces in JSX elements for cleaner code
    - Add images configuration to next.config.mjs to support remote image sources
    - Replace old image URLs with new Cloudinary-hosted images
    - Update documentation links to include an icon for better UX

commit e40254fea6
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Thu Apr 24 20:17:04 2025 -0300

    feat(home-page): redesign home page with interactive components

    Added new interactive components like animated grids, pulsating buttons, and ripple effects to enhance the user experience. Updated the layout to include sections for features, architecture, and file sharing. Improved the overall design with modern animations and typography.

commit a3ed862ed9
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Thu Apr 24 12:12:11 2025 -0300

    docs: add new documentation pages for Palmr 2.0.0-beta

    This commit introduces several new documentation pages for the Palmr 2.0.0-beta release. The added pages cover topics such as SMTP configuration, available languages, GitHub sponsorship, starring the repository, opening issues, generating shares, and contributing to the project. These additions aim to provide comprehensive guidance for users and contributors, enhancing the overall user experience and supporting the project's growth.

commit 7904333b15
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Wed Apr 23 16:59:06 2025 -0300

    docs: add API documentation and update meta.json for 1.1.7-beta and 2.0.0-beta

    This commit introduces API documentation files for both 1.1.7-beta and 2.0.0-beta versions, including detailed guides on accessing and using Scalar and Swagger-based API documentation. Additionally, it updates the meta.json files for both versions to include the new API section and other relevant entries. The global.css file has also been updated to improve styling for code blocks and headings.

commit 57af56ff7e
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Tue Apr 22 17:46:31 2025 -0300

    feat(docs): update and enhance documentation for v2.0.0-beta

    Add new architecture, installation, and GitHub architecture documentation. Include new banner and architecture images. Refactor meta.json and index.mdx for better structure and clarity. Add sponsor and footer components to the docs layout. Update docker-compose.yaml with new environment variables and port configurations. Remove outdated files and streamline content for v2.0.0-beta release.

commit a2a5b6a88b
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Thu Apr 17 11:49:32 2025 -0300

    refactor: replace Image component with img tag for app logo

    The commit replaces the Next.js `Image` component with the standard HTML `img` tag in the app logo rendering. This change simplifies the implementation and removes unnecessary dependencies. Additionally, the `env` import was removed from the seed file, the docker-compose image tag was updated to a specific version, and remote image patterns were added to the Next.js config.

commit fccc9d559f
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Thu Apr 17 01:16:38 2025 -0300

    chore: remove docker-compose-local.yaml file

    The file was deleted as it is no longer needed for the local development setup. This change simplifies the project structure and reduces maintenance overhead.

commit c1fc52c302
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Thu Apr 17 01:15:19 2025 -0300

    feat(docs): migrate documentation to Next.js with Fumadocs

    This commit migrates the documentation site from Astro to Next.js, leveraging Fumadocs for enhanced functionality and maintainability. The migration includes:
    - New Next.js configuration and setup
    - Integration of Fumadocs for documentation rendering
    - Addition of new documentation assets and images
    - Removal of Astro-related files and configurations

    The migration aims to improve the documentation site's performance, scalability, and developer experience.

commit dca252827c
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Wed Apr 16 15:24:20 2025 -0300

    refactor: remove deprecated Makefile and generate-docker-compose.sh

    The Makefile and generate-docker-compose.sh script were removed as they are no longer needed. The docker-compose.yaml file was updated to include inline comments and use the latest image tag for the palmr-app service. This cleanup simplifies the project structure and ensures clarity in the docker-compose configuration.

commit 32bc17c373
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Wed Apr 16 14:36:16 2025 -0300

    chore: update .gitignore and docker-compose.yaml for better configuration

    - Add `.env` to .gitignore to ignore environment variables file
    - Update docker-compose.yaml to use environment variables for configuration
      and improve comments for clarity

commit efba0b75dc
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Wed Apr 16 13:53:51 2025 -0300

    refactor(web): restructure and clean up project files

    Restructured the project by moving and deleting unused files, updating configurations, and organizing code for better maintainability. This includes removing deprecated models, updating environment settings, and consolidating utility functions.

commit a119ab4d46
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Wed Apr 16 13:40:54 2025 -0300

    build(web): add Dockerfile and docker-compose.yml for production deployment

    Refactor image handling in components to use Next.js Image component
    Remove unused imports and disable ESLint during builds
    Add error logging for i18n and login functionality
    Update Next.js config for standalone output and build optimizations

commit d25f493c7a
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Wed Apr 16 11:17:48 2025 -0300

    feat(i18n): add theme translation support for multiple languages

    Add theme-related translations (toggle, light, dark, system) to JSON files for all supported languages. Update the mode-toggle component to use these translations for theme switching. Also, refactor API route files to improve code consistency and readability.

commit 78e2d05d6c
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Wed Apr 16 10:52:20 2025 -0300

    refactor(api): migrate API endpoints to use proxy routes and update axios instance

    This commit introduces proxy routes for all API endpoints and updates the axios instance to use the new proxy routes. The changes ensure that all API requests are routed through the Next.js API routes, improving security and consistency. Additionally, the axios instance is renamed to `apiInstance` to reflect its purpose more accurately. The metadata generation in layout files is also simplified by removing unnecessary API calls.

commit 564ff43843
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Tue Apr 15 10:21:30 2025 -0300

    chore: remove unused SVG files and refactor login types

    Clean up the codebase by deleting unused SVG assets and improve code readability by adding proper spacing and type definitions in the login module

commit 5aea36fd98
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Mon Apr 14 16:55:36 2025 -0300

    feat: add forgot and reset password functionality

    Implement forgot and reset password features, including form components, hooks for form handling, and layout/page components. This allows users to request a password reset and set a new password securely.

commit 7d6e484c2b
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Mon Apr 14 15:55:15 2025 -0300

    feat(shares): add share management and public share components

    This commit introduces new components and hooks for managing shares and viewing public shares. It includes the following key changes:
    - Added components for share management, such as `SharesHeader`, `SharesSearch`, and `SharesTableContainer`.
    - Implemented `useShares` hook to handle share data fetching and state management.
    - Created `PublicSharePage` and related components for viewing public shares, including `ShareDetails`, `PasswordModal`, and `ShareNotFound`.
    - Added `usePublicShare` hook to manage public share data and password handling.
    - Updated layout and types to support the new features.

commit e50abf953e
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Mon Apr 14 15:21:31 2025 -0300

    feat(shares): add shares page with search, table, and modals

    Introduce a new shares page that includes a search bar, shares table, and various modals for managing shares. The page supports creating, editing, deleting, and generating links for shares. Additionally, it includes functionality for notifying recipients and viewing share details. The layout and components are designed to be reusable and maintainable.

commit 15dce5dab1
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Mon Apr 14 11:53:43 2025 -0300

    feat(layout): add app name to page titles and implement favicon component

    Add app name to page titles by fetching it from the configs endpoint. Introduce a new `Favicon` component to handle dynamic favicon rendering based on the app logo. Remove manual favicon updates from the app info context as it is now handled by the `Favicon` component.

commit 20fee6b449
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Mon Apr 14 10:37:00 2025 -0300

    refactor(users-management): reorganize imports and clean up code for better readability

    This commit focuses on improving the readability and maintainability of the users-management module by reorganizing imports, removing unnecessary whitespace, and standardizing code formatting. No functional changes were made.

commit e03ca7e0dc
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Mon Apr 14 10:30:45 2025 -0300

    feat(users-management): add users management module

    Introduce a new users management module that includes features for creating, reading, updating, and deleting users. The module includes components for user tables, modals for user actions, and hooks for managing user state and interactions. This replaces the previous admin page with a more comprehensive and modular approach to user management.

commit ab6c634782
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 11 16:45:03 2025 -0300

    feat(profile): add profile page with form, password, and image components

    Introduce a new profile page that includes forms for updating user profile information, changing passwords, and managing profile pictures. The page is protected and integrates with the existing authentication system. Additionally, update validation messages for better clarity and consistency.

commit 6a933891c8
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 11 16:43:51 2025 -0300

    refactor(settings): reorganize imports and improve code readability

    Restructured imports across multiple files to follow a consistent order and improve readability. Also, adjusted some code formatting for better maintainability.

commit 5cd7acc158
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 11 15:47:42 2025 -0300

    feat(settings): add settings page with layout, form, and components

    Introduce a new settings page with a structured layout, form components, and hooks for managing application settings. This includes the addition of settings-specific types, constants, and UI components such as `SettingsForm`, `SettingsGroup`, and `SettingsInput`. The `useSettings` hook handles configuration loading and updates, while the `LogoInput` component manages logo uploads and removal. The `Select` component from Radix UI is also added to support dropdown functionality.

commit b4cecf9e32
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 11 15:01:32 2025 -0300

    style: reorganize imports and format code for consistency

    Refactor import statements and code formatting across multiple files to improve readability and maintain consistency. This includes reordering imports, fixing linting issues, and standardizing code style.

commit e55f090235
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 11 14:59:52 2025 -0300

    feat(files): add file management components and hooks

    Introduce new components and hooks for managing files, including file list, search bar, empty state, and modals. This includes the addition of a breadcrumb component for better navigation and the use of client-side rendering for specific components. The changes aim to improve the user experience and maintainability of the file management system.

commit 0a738430e7
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 11 14:18:11 2025 -0300

    feat: add new utility functions and UI components for file management

    This commit introduces several new utility functions and UI components to enhance file management capabilities. Key additions include:
    - `generateSafeFileName` utility for creating safe file names.
    - `customNanoid` utility for generating custom IDs.
    - New UI components: `AspectRatio`, `Loader`, `Switch`, `ScrollArea`, and various modals for file actions, share management, and file preview.
    - Updated translations and package dependencies to support new features.

commit 6c7117cc14
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Wed Apr 9 15:57:09 2025 -0300

    style: format code and fix linting issues across multiple files

    Refactor code to improve readability and consistency by applying Prettier formatting rules. This includes fixing trailing commas, sorting imports, and ensuring consistent code style. No functional changes were made.

commit 61cf88b41f
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Wed Apr 9 15:48:00 2025 -0300

    feat(dashboard): add dashboard components and utilities

    This commit introduces new components and utilities for the dashboard, including storage usage, quick access cards, recent files, and recent shares. It also adds file and share management hooks, along with new UI components like progress bars, separators, and avatars. The changes enhance the dashboard's functionality and improve user experience by providing quick access to essential features and better visual feedback.

    The commit includes:
    - New components for storage usage, quick access, recent files, and shares
    - File and share management hooks for CRUD operations
    - Utility functions for file size formatting and file icons
    - New UI components like progress bars, separators, and avatars
    - Updated translations and styles for consistency

commit b077154c22
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Tue Apr 8 15:06:17 2025 -0300

    feat(auth): add protected routes and enhance auth context

    Implement protected routes for admin and dashboard pages to restrict access based on authentication and admin status. Enhance the auth context to handle user data validation and improve error handling during authentication checks.

commit 9e35d27497
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Mon Apr 7 16:14:18 2025 -0300

    feat: add initial project setup with config, models, and assets

    This commit introduces the initial project setup including configuration files, API models, and necessary assets. The changes include:
    - Added Prettier and PostCSS configuration files
    - Included favicon and public assets like SVGs
    - Set up Next.js and theme provider configurations
    - Added TypeScript models for API endpoints and responses

commit da64d65401
Merge: ca7bdef 7b2f15d
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 4 23:40:35 2025 -0300

    feat: enable reverse proxy support and add pnpm.lock for custom builds in apps/web (#13)

commit 7b2f15dcd5
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 4 23:37:08 2025 -0300

    refactor: remove lock files from .gitignore and update vite config

    Remove unnecessary lock files from .gitignore to streamline version control. Update Vite configuration to allow all hosts in both development and preview modes for better accessibility

commit ca7bdefcdb
Merge: 92b437e 1768aa8
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 4 00:44:02 2025 -0300

    Merge branch 'main' of github.com:kyantech/Palmr

commit 92b437ee36
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 4 00:41:55 2025 -0300

    chore: bump version to 1.1.6 across all apps

commit fcaef88850
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 4 00:40:49 2025 -0300

    docs: update installation guide with security and deployment details

    Add a new section "Quick Start with Default Docker Compose" to emphasize the risks of using default credentials and provide recommendations for secure deployment. Clarify the usage of Docker Compose for different environments (local, production) and update port configuration recommendations with a warning about ReactJS limitations.

commit 68d6fd09af
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Fri Apr 4 00:12:02 2025 -0300

    chore: add docker-compose.yaml and update .gitignore

    Add docker-compose.yaml to define services for the application stack, including API, app, MinIO, and PostgreSQL. Remove docker-compose.yaml from .gitignore to track it in version control

commit 1768aa81b7
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Thu Apr 3 16:16:27 2025 -0300

    Update README.md

commit 644fc7aa30
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Thu Apr 3 16:15:34 2025 -0300

    Update README.md

commit cc6fe6d62e
Author: Daniel Luiz Alves <daniel.xcoders@gmail.com>
Date:   Thu Apr 3 16:15:06 2025 -0300

    Update README.md
2025-04-27 23:23:49 -03:00
Daniel Luiz Alves
359d0a0403 docs(installation): add command to generate .env file
Add a command to generate a .env file with the `server_ip` configuration to simplify the setup process for users. This command can be executed in the server terminal at the same path as the docker-compose.yaml file.
2025-04-25 14:11:09 -03:00
Daniel Luiz Alves
c3967eca72 refactor(web): remove unused config fetch in layout metadata
Simplify the metadata generation in the layout component by removing the unnecessary fetch of app configurations. This reduces complexity and improves maintainability.
2025-04-25 13:42:26 -03:00
Daniel Luiz Alves
6898dd8d1b refactor(layout): remove unused changeLayout prop from Banner component
The changeLayout prop was not utilized in the Banner component, so it has been removed to simplify the code and improve maintainability.

style(home): add version tag to the hero section title

Added a small version tag "v2.0.0-beta" to the hero section title for better visibility and user awareness of the current version.
2025-04-25 01:22:53 -03:00
Daniel Luiz Alves
e80de3576c build(docs): disable eslint and typescript checks during builds
To streamline the build process and avoid unnecessary interruptions, eslint and typescript checks are now ignored during builds
2025-04-25 01:11:45 -03:00
Daniel Luiz Alves
17dd85241c Upgrade to v2.0.0-beta (#16) 2025-04-25 01:01:28 -03:00
Daniel Luiz Alves
f7124ec346 chore: update environment and docker configurations
Update .env.example to include SERVER_IP, add metadata to docs layout, and switch docker-compose image tags to 'latest' for consistency and clarity.
2025-04-25 00:56:04 -03:00
Daniel Luiz Alves
b443fcb010 docs: update image URLs in README.md
Update the image URLs in the README.md file to use the new Cloudinary links for better reliability and consistency
2025-04-24 23:31:40 -03:00
Daniel Luiz Alves
d106b5346f docs: update documentation links and README content
Update all documentation links from 'palmr-docs.kyantech.com.br' to 'palmr.kyantech.com.br' to reflect the new URL. Additionally, update the README.md to include the latest frontend technology stack and correct the screenshot image link. Also, add a hyperlink to the core maintainer's GitHub profile.
2025-04-24 23:28:30 -03:00
Daniel Luiz Alves
7a6df51308 refactor(home): update layout, image URLs, and documentation links
- Remove unnecessary spaces in JSX elements for cleaner code
- Add images configuration to next.config.mjs to support remote image sources
- Replace old image URLs with new Cloudinary-hosted images
- Update documentation links to include an icon for better UX
2025-04-24 23:14:25 -03:00
Daniel Luiz Alves
e40254fea6 feat(home-page): redesign home page with interactive components
Added new interactive components like animated grids, pulsating buttons, and ripple effects to enhance the user experience. Updated the layout to include sections for features, architecture, and file sharing. Improved the overall design with modern animations and typography.
2025-04-24 20:17:04 -03:00
Daniel Luiz Alves
a3ed862ed9 docs: add new documentation pages for Palmr 2.0.0-beta
This commit introduces several new documentation pages for the Palmr 2.0.0-beta release. The added pages cover topics such as SMTP configuration, available languages, GitHub sponsorship, starring the repository, opening issues, generating shares, and contributing to the project. These additions aim to provide comprehensive guidance for users and contributors, enhancing the overall user experience and supporting the project's growth.
2025-04-24 12:12:11 -03:00
Daniel Luiz Alves
7904333b15 docs: add API documentation and update meta.json for 1.1.7-beta and 2.0.0-beta
This commit introduces API documentation files for both 1.1.7-beta and 2.0.0-beta versions, including detailed guides on accessing and using Scalar and Swagger-based API documentation. Additionally, it updates the meta.json files for both versions to include the new API section and other relevant entries. The global.css file has also been updated to improve styling for code blocks and headings.
2025-04-23 16:59:06 -03:00
Daniel Luiz Alves
57af56ff7e feat(docs): update and enhance documentation for v2.0.0-beta
Add new architecture, installation, and GitHub architecture documentation. Include new banner and architecture images. Refactor meta.json and index.mdx for better structure and clarity. Add sponsor and footer components to the docs layout. Update docker-compose.yaml with new environment variables and port configurations. Remove outdated files and streamline content for v2.0.0-beta release.
2025-04-22 17:46:31 -03:00
Daniel Luiz Alves
a2a5b6a88b refactor: replace Image component with img tag for app logo
The commit replaces the Next.js `Image` component with the standard HTML `img` tag in the app logo rendering. This change simplifies the implementation and removes unnecessary dependencies. Additionally, the `env` import was removed from the seed file, the docker-compose image tag was updated to a specific version, and remote image patterns were added to the Next.js config.
2025-04-17 11:49:32 -03:00
Daniel Luiz Alves
fccc9d559f chore: remove docker-compose-local.yaml file
The file was deleted as it is no longer needed for the local development setup. This change simplifies the project structure and reduces maintenance overhead.
2025-04-17 01:16:38 -03:00
Daniel Luiz Alves
c1fc52c302 feat(docs): migrate documentation to Next.js with Fumadocs
This commit migrates the documentation site from Astro to Next.js, leveraging Fumadocs for enhanced functionality and maintainability. The migration includes:
- New Next.js configuration and setup
- Integration of Fumadocs for documentation rendering
- Addition of new documentation assets and images
- Removal of Astro-related files and configurations

The migration aims to improve the documentation site's performance, scalability, and developer experience.
2025-04-17 01:15:19 -03:00
Daniel Luiz Alves
dca252827c refactor: remove deprecated Makefile and generate-docker-compose.sh
The Makefile and generate-docker-compose.sh script were removed as they are no longer needed. The docker-compose.yaml file was updated to include inline comments and use the latest image tag for the palmr-app service. This cleanup simplifies the project structure and ensures clarity in the docker-compose configuration.
2025-04-16 15:24:20 -03:00
Daniel Luiz Alves
32bc17c373 chore: update .gitignore and docker-compose.yaml for better configuration
- Add `.env` to .gitignore to ignore environment variables file
- Update docker-compose.yaml to use environment variables for configuration
  and improve comments for clarity
2025-04-16 14:36:16 -03:00
Daniel Luiz Alves
efba0b75dc refactor(web): restructure and clean up project files
Restructured the project by moving and deleting unused files, updating configurations, and organizing code for better maintainability. This includes removing deprecated models, updating environment settings, and consolidating utility functions.
2025-04-16 13:53:51 -03:00
Daniel Luiz Alves
a119ab4d46 build(web): add Dockerfile and docker-compose.yml for production deployment
Refactor image handling in components to use Next.js Image component
Remove unused imports and disable ESLint during builds
Add error logging for i18n and login functionality
Update Next.js config for standalone output and build optimizations
2025-04-16 13:40:54 -03:00
Daniel Luiz Alves
d25f493c7a feat(i18n): add theme translation support for multiple languages
Add theme-related translations (toggle, light, dark, system) to JSON files for all supported languages. Update the mode-toggle component to use these translations for theme switching. Also, refactor API route files to improve code consistency and readability.
2025-04-16 11:17:48 -03:00
Daniel Luiz Alves
78e2d05d6c refactor(api): migrate API endpoints to use proxy routes and update axios instance
This commit introduces proxy routes for all API endpoints and updates the axios instance to use the new proxy routes. The changes ensure that all API requests are routed through the Next.js API routes, improving security and consistency. Additionally, the axios instance is renamed to `apiInstance` to reflect its purpose more accurately. The metadata generation in layout files is also simplified by removing unnecessary API calls.
2025-04-16 10:52:20 -03:00
Daniel Luiz Alves
564ff43843 chore: remove unused SVG files and refactor login types
Clean up the codebase by deleting unused SVG assets and improve code readability by adding proper spacing and type definitions in the login module
2025-04-15 10:21:30 -03:00
Daniel Luiz Alves
5aea36fd98 feat: add forgot and reset password functionality
Implement forgot and reset password features, including form components, hooks for form handling, and layout/page components. This allows users to request a password reset and set a new password securely.
2025-04-14 16:55:36 -03:00
Daniel Luiz Alves
7d6e484c2b feat(shares): add share management and public share components
This commit introduces new components and hooks for managing shares and viewing public shares. It includes the following key changes:
- Added components for share management, such as `SharesHeader`, `SharesSearch`, and `SharesTableContainer`.
- Implemented `useShares` hook to handle share data fetching and state management.
- Created `PublicSharePage` and related components for viewing public shares, including `ShareDetails`, `PasswordModal`, and `ShareNotFound`.
- Added `usePublicShare` hook to manage public share data and password handling.
- Updated layout and types to support the new features.
2025-04-14 15:55:15 -03:00
Daniel Luiz Alves
e50abf953e feat(shares): add shares page with search, table, and modals
Introduce a new shares page that includes a search bar, shares table, and various modals for managing shares. The page supports creating, editing, deleting, and generating links for shares. Additionally, it includes functionality for notifying recipients and viewing share details. The layout and components are designed to be reusable and maintainable.
2025-04-14 15:21:31 -03:00
Daniel Luiz Alves
15dce5dab1 feat(layout): add app name to page titles and implement favicon component
Add app name to page titles by fetching it from the configs endpoint. Introduce a new `Favicon` component to handle dynamic favicon rendering based on the app logo. Remove manual favicon updates from the app info context as it is now handled by the `Favicon` component.
2025-04-14 11:53:43 -03:00
Daniel Luiz Alves
20fee6b449 refactor(users-management): reorganize imports and clean up code for better readability
This commit focuses on improving the readability and maintainability of the users-management module by reorganizing imports, removing unnecessary whitespace, and standardizing code formatting. No functional changes were made.
2025-04-14 10:37:00 -03:00
Daniel Luiz Alves
e03ca7e0dc feat(users-management): add users management module
Introduce a new users management module that includes features for creating, reading, updating, and deleting users. The module includes components for user tables, modals for user actions, and hooks for managing user state and interactions. This replaces the previous admin page with a more comprehensive and modular approach to user management.
2025-04-14 10:30:45 -03:00
Daniel Luiz Alves
ab6c634782 feat(profile): add profile page with form, password, and image components
Introduce a new profile page that includes forms for updating user profile information, changing passwords, and managing profile pictures. The page is protected and integrates with the existing authentication system. Additionally, update validation messages for better clarity and consistency.
2025-04-11 16:45:03 -03:00
Daniel Luiz Alves
6a933891c8 refactor(settings): reorganize imports and improve code readability
Restructured imports across multiple files to follow a consistent order and improve readability. Also, adjusted some code formatting for better maintainability.
2025-04-11 16:43:51 -03:00
Daniel Luiz Alves
5cd7acc158 feat(settings): add settings page with layout, form, and components
Introduce a new settings page with a structured layout, form components, and hooks for managing application settings. This includes the addition of settings-specific types, constants, and UI components such as `SettingsForm`, `SettingsGroup`, and `SettingsInput`. The `useSettings` hook handles configuration loading and updates, while the `LogoInput` component manages logo uploads and removal. The `Select` component from Radix UI is also added to support dropdown functionality.
2025-04-11 15:47:42 -03:00
Daniel Luiz Alves
b4cecf9e32 style: reorganize imports and format code for consistency
Refactor import statements and code formatting across multiple files to improve readability and maintain consistency. This includes reordering imports, fixing linting issues, and standardizing code style.
2025-04-11 15:01:32 -03:00
Daniel Luiz Alves
e55f090235 feat(files): add file management components and hooks
Introduce new components and hooks for managing files, including file list, search bar, empty state, and modals. This includes the addition of a breadcrumb component for better navigation and the use of client-side rendering for specific components. The changes aim to improve the user experience and maintainability of the file management system.
2025-04-11 14:59:52 -03:00
Daniel Luiz Alves
0a738430e7 feat: add new utility functions and UI components for file management
This commit introduces several new utility functions and UI components to enhance file management capabilities. Key additions include:
- `generateSafeFileName` utility for creating safe file names.
- `customNanoid` utility for generating custom IDs.
- New UI components: `AspectRatio`, `Loader`, `Switch`, `ScrollArea`, and various modals for file actions, share management, and file preview.
- Updated translations and package dependencies to support new features.
2025-04-11 14:18:11 -03:00
Daniel Luiz Alves
6c7117cc14 style: format code and fix linting issues across multiple files
Refactor code to improve readability and consistency by applying Prettier formatting rules. This includes fixing trailing commas, sorting imports, and ensuring consistent code style. No functional changes were made.
2025-04-09 15:57:09 -03:00
Daniel Luiz Alves
61cf88b41f feat(dashboard): add dashboard components and utilities
This commit introduces new components and utilities for the dashboard, including storage usage, quick access cards, recent files, and recent shares. It also adds file and share management hooks, along with new UI components like progress bars, separators, and avatars. The changes enhance the dashboard's functionality and improve user experience by providing quick access to essential features and better visual feedback.

The commit includes:
- New components for storage usage, quick access, recent files, and shares
- File and share management hooks for CRUD operations
- Utility functions for file size formatting and file icons
- New UI components like progress bars, separators, and avatars
- Updated translations and styles for consistency
2025-04-09 15:48:00 -03:00
Daniel Luiz Alves
b077154c22 feat(auth): add protected routes and enhance auth context
Implement protected routes for admin and dashboard pages to restrict access based on authentication and admin status. Enhance the auth context to handle user data validation and improve error handling during authentication checks.
2025-04-08 15:06:17 -03:00
Daniel Luiz Alves
9e35d27497 feat: add initial project setup with config, models, and assets
This commit introduces the initial project setup including configuration files, API models, and necessary assets. The changes include:
- Added Prettier and PostCSS configuration files
- Included favicon and public assets like SVGs
- Set up Next.js and theme provider configurations
- Added TypeScript models for API endpoints and responses
2025-04-07 16:14:18 -03:00
Daniel Luiz Alves
da64d65401 feat: enable reverse proxy support and add pnpm.lock for custom builds in apps/web (#13) 2025-04-04 23:40:35 -03:00
Daniel Luiz Alves
7b2f15dcd5 refactor: remove lock files from .gitignore and update vite config
Remove unnecessary lock files from .gitignore to streamline version control. Update Vite configuration to allow all hosts in both development and preview modes for better accessibility
2025-04-04 23:37:08 -03:00
Daniel Luiz Alves
ca7bdefcdb Merge branch 'main' of github.com:kyantech/Palmr 2025-04-04 00:44:02 -03:00
Daniel Luiz Alves
92b437ee36 chore: bump version to 1.1.6 across all apps 2025-04-04 00:41:55 -03:00
Daniel Luiz Alves
fcaef88850 docs: update installation guide with security and deployment details
Add a new section "Quick Start with Default Docker Compose" to emphasize the risks of using default credentials and provide recommendations for secure deployment. Clarify the usage of Docker Compose for different environments (local, production) and update port configuration recommendations with a warning about ReactJS limitations.
2025-04-04 00:40:49 -03:00
Daniel Luiz Alves
68d6fd09af chore: add docker-compose.yaml and update .gitignore
Add docker-compose.yaml to define services for the application stack, including API, app, MinIO, and PostgreSQL. Remove docker-compose.yaml from .gitignore to track it in version control
2025-04-04 00:12:02 -03:00
Daniel Luiz Alves
1768aa81b7 Update README.md 2025-04-03 16:16:27 -03:00
Daniel Luiz Alves
644fc7aa30 Update README.md 2025-04-03 16:15:34 -03:00
Daniel Luiz Alves
cc6fe6d62e Update README.md 2025-04-03 16:15:06 -03:00
698 changed files with 68477 additions and 16293 deletions

81
.dockerignore Normal file
View File

@@ -0,0 +1,81 @@
# Git
.git
.gitignore
# Documentation
README.md
CONTRIBUTING.md
*.md
# Node modules
node_modules
*/node_modules
**/node_modules
# Build outputs
.next
dist
build
# Development files
.env*
.vscode
.idea
# Logs
*.log
logs
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Dependency directories
jspm_packages/
# Optional npm cache directory
.npm
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
# Docker files
Dockerfile*
docker-compose*
# Storage directories (created at runtime)
uploads/
temp-chunks/
apps/server/uploads/
apps/server/temp-chunks/
# Static files
apps/server/prisma/*.db
apps/server/.env
apps/web/.env
# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

5
.gitignore vendored
View File

@@ -28,5 +28,6 @@ apps/server/node_modules
apps/server/.env
apps/server/dist/*
#COMPOSE
docker-compose.yaml
#DEFAULT
.env
data/

165
Dockerfile Normal file
View File

@@ -0,0 +1,165 @@
FROM node:20-alpine AS base
# Install system dependencies
RUN apk add --no-cache \
gcompat \
supervisor \
curl \
su-exec
# Enable pnpm
RUN corepack enable pnpm
# Set working directory
WORKDIR /app
# === SERVER BUILD STAGE ===
FROM base AS server-deps
WORKDIR /app/server
# Copy server package files
COPY apps/server/package*.json ./
COPY apps/server/pnpm-lock.yaml ./
# Install server dependencies
RUN pnpm install --frozen-lockfile
FROM base AS server-builder
WORKDIR /app/server
# Copy server dependencies
COPY --from=server-deps /app/server/node_modules ./node_modules
# Copy server source code
COPY apps/server/ ./
# Generate Prisma client
RUN npx prisma generate
# Build server
RUN pnpm build
# === WEB BUILD STAGE ===
FROM base AS web-deps
WORKDIR /app/web
# Copy web package files
COPY apps/web/package.json apps/web/pnpm-lock.yaml ./
# Install web dependencies
RUN pnpm install --frozen-lockfile
FROM base AS web-builder
WORKDIR /app/web
# Copy web dependencies
COPY --from=web-deps /app/web/node_modules ./node_modules
# Copy web source code
COPY apps/web/ ./
# Set environment variables for build
ENV NEXT_TELEMETRY_DISABLED=1
ENV NODE_ENV=production
# Build web application
RUN pnpm run build
# === PRODUCTION STAGE ===
FROM base AS runner
# Set production environment
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
ENV API_BASE_URL=http://127.0.0.1:3333
# Define build arguments for user/group configuration (defaults to current values)
ARG PALMR_UID=1001
ARG PALMR_GID=1001
# Create application user with configurable UID/GID
RUN addgroup --system --gid ${PALMR_GID} nodejs
RUN adduser --system --uid ${PALMR_UID} --ingroup nodejs palmr
# Create application directories
RUN mkdir -p /app/palmr-app /app/web /home/palmr/.npm /home/palmr/.cache
RUN chown -R palmr:nodejs /app /home/palmr
# === Copy Server Files to /app/palmr-app (separate from /app/server for bind mounts) ===
WORKDIR /app/palmr-app
# Copy server production files
COPY --from=server-builder --chown=palmr:nodejs /app/server/dist ./dist
COPY --from=server-builder --chown=palmr:nodejs /app/server/node_modules ./node_modules
COPY --from=server-builder --chown=palmr:nodejs /app/server/prisma ./prisma
COPY --from=server-builder --chown=palmr:nodejs /app/server/package.json ./
# Copy password reset script and make it executable
COPY --from=server-builder --chown=palmr:nodejs /app/server/reset-password.sh ./
COPY --from=server-builder --chown=palmr:nodejs /app/server/src/scripts/ ./src/scripts/
RUN chmod +x ./reset-password.sh
# Copy seed file to the shared location for bind mounts
RUN mkdir -p /app/server/prisma
COPY --from=server-builder --chown=palmr:nodejs /app/server/prisma/seed.js /app/server/prisma/seed.js
# === Copy Web Files ===
WORKDIR /app/web
# Copy web production files
COPY --from=web-builder --chown=palmr:nodejs /app/web/public ./public
COPY --from=web-builder --chown=palmr:nodejs /app/web/.next/standalone ./
COPY --from=web-builder --chown=palmr:nodejs /app/web/.next/static ./.next/static
# === Setup Supervisor ===
WORKDIR /app
# Create supervisor configuration
RUN mkdir -p /etc/supervisor/conf.d
# Copy server start script
COPY infra/server-start.sh /app/server-start.sh
RUN chmod +x /app/server-start.sh
RUN chown palmr:nodejs /app/server-start.sh
# Copy supervisor configuration
COPY infra/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# Create main startup script
COPY <<EOF /app/start.sh
#!/bin/sh
set -e
echo "Starting Palmr Application..."
echo "Storage Mode: \${ENABLE_S3:-false}"
echo "Secure Site: \${SECURE_SITE:-false}"
echo "Database: SQLite"
# Set global environment variables
export DATABASE_URL="file:/app/server/prisma/palmr.db"
export UPLOAD_PATH="/app/server/uploads"
export TEMP_CHUNKS_PATH="/app/server/temp-chunks"
# Ensure /app/server directory exists for bind mounts
mkdir -p /app/server/uploads /app/server/temp-chunks /app/server/uploads/logo /app/server/prisma
echo "Data directories ready for first run..."
# Start supervisor
exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
EOF
RUN chmod +x /app/start.sh
# Create volume mount points for bind mounts
VOLUME ["/app/server"]
# Expose ports
EXPOSE 3333 5487
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD curl -f http://localhost:5487 || exit 1
# Start application
CMD ["/app/start.sh"]

37
LICENSE
View File

@@ -1,22 +1,37 @@
BSD 2-Clause License
Kyantech-Permissive License (Based on BSD 2-Clause)
Copyright (c) 2025, Daniel Luiz Alves (danielalves96)
Copyright (c) 2025, Daniel Luiz Alves (danielalves96) - Kyantech Solutions
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
modification, are permitted for any purpose — private, commercial,
educational, governmental — **fully free and unrestricted**, provided
that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
1. Redistributions of source code must retain the above copyright
notice, this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions, and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. **If this software (or derivative works) is used in any public-facing
interface** — such as websites, apps, dashboards, admin panels, or
similar — a **simple credit** must appear in the footer or similar
location. The credit text should read:
> “Powered by Kyantech Solutions · https://kyantech.com.br”
This credit must be reasonably visible but **must not interfere** with
your UI, branding, or user experience. You may style it to match your
own design and choose its size, placement, or color.
---
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER

View File

@@ -1,3 +1,47 @@
gen-compose:
chmod +x ./scripts/generate-docker-compose.sh
./scripts/generate-docker-compose.sh
.PHONY: help build start clean logs stop restart
# Default target
help:
@echo "🚀 Palmr - Available Commands:"
@echo ""
@echo " make build - Build Docker image with multi-platform support"
@echo " make start - Start the application using docker-compose"
@echo " make stop - Stop all running containers"
@echo " make logs - Show application logs"
@echo " make clean - Clean up containers and images"
@echo " make shell - Access the application container shell"
@echo ""
@echo "📁 Scripts location: ./infra/"
# Build Docker image using the build script
build:
@echo "🏗️ Building Palmr Docker image..."
@chmod +x ./infra/build-docker.sh
@./infra/build-docker.sh
# Start the application
start:
@echo "🚀 Starting Palmr application..."
@docker-compose up -d
# Stop the application
stop:
@echo "🛑 Stopping Palmr application..."
@docker-compose down
# Show logs
logs:
@echo "📋 Showing Palmr logs..."
@docker-compose logs -f
# Clean up containers and images
clean:
@echo "🧹 Cleaning up Docker containers and images..."
@docker-compose down -v
@docker system prune -f
@echo "✅ Cleanup completed!"
# Access container shell
shell:
@echo "🐚 Accessing Palmr container shell..."
@docker-compose exec palmr /bin/sh

112
README.md
View File

@@ -1,52 +1,142 @@
# 🌴 Palmr. - Open-Source File Transfer
<p align="center">
<img src="https://github.com/user-attachments/assets/dc2a105a-e66b-4db5-b56c-87d872a1edf8" alt="Palmr Logo" style="width: 100%;">
<img src="https://res.cloudinary.com/technical-intelligence/image/upload/v1749825361/Group_47_1_bcx8gw.png" alt="Palmr Banner" style="width: 100%;"/>
</p>
**Palmr.** is a **flexible** and **open-source** alternative to file transfer services like **WeTransfer**, **SendGB**, **Send Anywhere**, and **Files.fm**.
🔗 **For detailed documentation visit:** [Palmr. - Documentation](https://palmr-docs.kyantech.com.br)
🔗 **For detailed documentation visit:** [Palmr. - Documentation](https://palmr.kyantech.com.br)
## 📌 Why Choose Palmr.?
- **Self-hosted** Deploy on your own server or VPS.
- **Full control** No third-party dependencies, ensuring privacy and security.
- **No artificial limits** Share files without hidden restrictions or fees.
- **Simple deployment** SQLite database and filesystem storage for easy setup.
- **Scalable storage** Optional S3-compatible object storage for enterprise needs.
## 🚀 Technologies Used
### **Palmr.** is built with a focus on **performance**, **scalability**, and **security**.
<div align="center">
<img src="https://i.ibb.co/3Y8bhm7v/Captura-de-Tela-2025-04-03-s-10-56-12.png" style="width: 100%; border-radius: 15px;" />
<img src="https://res.cloudinary.com/technical-intelligence/image/upload/v1745548231/Palmr./Captura_de_Tela_2025-04-24_a%CC%80s_23.24.26_kr4hsl.png" style="width: 100%; border-radius: 15px;" />
</div>
### **Backend & API**
- **Fastify (Node.js)** High-performance API framework with built-in schema validation.
- **PostgreSQL** Reliable, secure, and scalable database solution.
- **MinIO (Object Storage)** AWS S3-compatible storage for high availability.
- **SQLite** Lightweight, reliable database with zero-configuration setup.
- **Filesystem Storage** Direct file storage with optional S3-compatible object storage.
### **Frontend**
- **React + TypeScript + Vite** Modern, interactive, and fast web interface.
- **NextJS 15 + TypeScript + Shadcn/ui** Modern and fast web interface.
## 🛠️ How It Works
1. **Web Interface** → Built with React, TypeScript, and Vite for a seamless user experience.
2. **Backend API** → Fastify handles requests and interacts with storage.
3. **Database**PostgreSQL stores metadata and transactional data.
4. **Storage**MinIO ensures reliable file storage and retrieval.
1. **Web Interface** → Built with Next, React and TypeScript for a seamless user experience.
2. **Backend API** → Fastify handles requests and manages file operations.
3. **Database** → SQLite stores metadata and transactional data with zero configuration.
4. **Storage**Filesystem storage ensures reliable file storage with optional S3-compatible object storage for scalability.
## 📸 Screenshots
<table>
<tr>
<td align="center">
<img src="https://res.cloudinary.com/technical-intelligence/image/upload/v1749824929/Login_veq6e7.png" alt="Login Page" style="width: 100%; border-radius: 8px;" />
<br /><strong>Login Page</strong>
</td>
<td align="center">
<img src="https://res.cloudinary.com/technical-intelligence/image/upload/v1749824929/Home_lzvfzu.png" alt="Home Page" style="width: 100%; border-radius: 8px;" />
<br /><strong>Home Page</strong>
</td>
</tr>
<tr>
<td align="center">
<img src="https://res.cloudinary.com/technical-intelligence/image/upload/v1749824928/Dashboard_uycmxb.png" alt="Dashboard" style="width: 100%; border-radius: 8px;" />
<br /><strong>Dashboard</strong>
</td>
<td align="center">
<img src="https://res.cloudinary.com/technical-intelligence/image/upload/v1749824929/Profile_wvnlzw.png" alt="Profile Page" style="width: 100%; border-radius: 8px;" />
<br /><strong>Profile Page</strong>
</td>
</tr>
<tr>
<td align="center">
<img src="https://res.cloudinary.com/technical-intelligence/image/upload/v1749824928/Files_List_ztwr1e.png" alt="Files List View" style="width: 100%; border-radius: 8px;" />
<br /><strong>Files List View</strong>
</td>
<td align="center">
<img src="https://res.cloudinary.com/technical-intelligence/image/upload/v1749824928/Files_Cards_pwsh5e.png" alt="Files Card View" style="width: 100%; border-radius: 8px;" />
<br /><strong>Files Card View</strong>
</td>
</tr>
<tr>
<td align="center">
<img src="https://res.cloudinary.com/technical-intelligence/image/upload/v1749824927/Shares_cgplgw.png" alt="Shares Management" style="width: 100%; border-radius: 8px;" />
<br /><strong>Shares Management</strong>
</td>
<td align="center">
<img src="https://res.cloudinary.com/technical-intelligence/image/upload/v1749824928/Reive_Files_uhkeyc.png" alt="Receive Files" style="width: 100%; border-radius: 8px;" />
<br /><strong>Receive Files</strong>
</td>
</tr>
<tr>
<td align="center">
<img src="https://res.cloudinary.com/technical-intelligence/image/upload/v1749824927/Default_Reverse_xedmhw.png" alt="Reverse Share" style="width: 100%; border-radius: 8px;" />
<br /><strong>Reverse Share</strong>
</td>
<td align="center">
<img src="https://res.cloudinary.com/technical-intelligence/image/upload/v1749824928/Settings_oampxr.png" alt="Settings Panel" style="width: 100%; border-radius: 8px;" />
<br /><strong>Settings Panel</strong>
</td>
</tr>
<tr>
<td align="center">
<img src="https://res.cloudinary.com/technical-intelligence/image/upload/v1749824928/User_Management_xjbfhn.png" alt="User Management" style="width: 100%; border-radius: 8px;" />
<br /><strong>User Management</strong>
</td>
<td align="center">
<img src="https://res.cloudinary.com/technical-intelligence/image/upload/v1749824928/Forgot_Password_jcz9ad.png" alt="Forgot Password" style="width: 100%; border-radius: 8px;" />
<br /><strong>Forgot Password</strong>
</td>
</tr>
<tr>
<td align="center">
<img src="https://res.cloudinary.com/technical-intelligence/image/upload/v1749824928/WeTransfer_Reverse_u0g7eb.png" alt="Forgot Password" style="width: 100%; border-radius: 8px;" />
<br /><strong>Reverse Share (WeTransfer Style)</strong>
</td>
</tr>
</table>
## 👨‍💻 Core Maintainers
| **Daniel Luiz Alves** |
| [**Daniel Luiz Alves**](https://github.com/danielalves96) |
|------------------|
| <img src="https://github.com/danielalves96.png" width="150px" alt="Daniel Luiz Alves" /> |
</br>
## 🤝 Supporters
[<img src="https://i.ibb.co/nMN40STL/Repoflow.png" width="200px" alt="Daniel Luiz Alves" />](https://www.repoflow.io/)
## ⭐ Star History
<a href="https://www.star-history.com/#kyantech/Palmr&Date">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=kyantech/Palmr&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=kyantech/Palmr&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kyantech/Palmr&type=Date" />
</picture>
</a>
## 🛠️ Contributing
For contribution guidelines, please refer to the [CONTRIBUTING.md](CONTRIBUTING.md) file.

3
apps/docs/.eslintrc.json Normal file
View File

@@ -0,0 +1,3 @@
{
"extends": ["next/core-web-vitals", "next/typescript"]
}

31
apps/docs/.gitignore vendored
View File

@@ -1,3 +1,28 @@
node_modules
.astro
dist
# deps
/node_modules
# generated content
.contentlayer
.content-collections
.source
# test & build
/coverage
/.next/
/out/
/build
*.tsbuildinfo
# misc
.DS_Store
*.pem
/.pnp
.pnp.js
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# others
.env*.local
.vercel
next-env.d.ts

View File

@@ -1,55 +0,0 @@
{
"version": 1.1,
"atDirectives": [
{
"name": "@tailwind",
"description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#tailwind"
}
]
},
{
"name": "@apply",
"description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS. This is useful when you find a common utility pattern in your HTML that youd like to extract to a new component.",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#apply"
}
]
},
{
"name": "@responsive",
"description": "You can generate responsive variants of your own classes by wrapping their definitions in the `@responsive` directive:\n```css\n@responsive {\n .alert {\n background-color: #E53E3E;\n }\n}\n```\n",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#responsive"
}
]
},
{
"name": "@screen",
"description": "The `@screen` directive allows you to create media queries that reference your breakpoints by **name** instead of duplicating their values in your own CSS:\n```css\n@screen sm {\n /* ... */\n}\n```\n…gets transformed into this:\n```css\n@media (min-width: 640px) {\n /* ... */\n}\n```\n",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#screen"
}
]
},
{
"name": "@variants",
"description": "Generate `hover`, `focus`, `active` and other **variants** of your own utilities by wrapping their definitions in the `@variants` directive:\n```css\n@variants hover, focus {\n .btn-brand {\n background-color: #3182CE;\n }\n}\n```\n",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#variants"
}
]
}
]
}

View File

@@ -1,10 +0,0 @@
{
"recommendations": [
"dbaeumer.vscode-eslint",
"bradlc.vscode-tailwindcss"
],
"unwantedRecommendations": [
"esbenp.prettier-vscode"
]
}

View File

@@ -1,51 +0,0 @@
{
"eslint.workingDirectories": [
{ "pattern": "apps/*/" },
{ "pattern": "packages/*/" }
],
"tailwindCSS.experimental.configFile": {
"apps/web/tailwind.config.ts": "apps/web/**"
},
"tailwindCSS.experimental.classRegex": [
["cva\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"],
["cn\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"],
],
"tailwindCSS.classAttributes": [
"class",
"className",
"tw"
],
"css.customData": [
".vscode/css.json"
],
"[javascript]": {
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
}
},
"[typescript]": {
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
}
},
"[typescriptreact]": {
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
}
},
"eslint.validate": [
"javascript",
"typescript"
],
}

26
apps/docs/README.md Normal file
View File

@@ -0,0 +1,26 @@
# docs-v2
This is a Next.js application generated with
[Create Fumadocs](https://github.com/fuma-nama/fumadocs).
Run development server:
```bash
npm run dev
# or
pnpm dev
# or
yarn dev
```
Open http://localhost:3000 with your browser to see the result.
## Learn More
To learn more about Next.js and Fumadocs, take a look at the following
resources:
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js
features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
- [Fumadocs](https://fumadocs.vercel.app) - learn about Fumadocs

View File

@@ -1,58 +0,0 @@
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';
export default defineConfig({
integrations: [
starlight({
title: '🌴 Palmr. - Documentation',
defaultLocale: 'root',
social: {
github: 'https://github.com/kyantech/Palmr',
openCollective: 'https://github.com/sponsors/kyantech',
},
sidebar: [
{
label: 'Introduction',
items: [
{ label: 'Welcome to Palmr.', link: '/' },
{ label: 'Architecture of Palmr.', link: '/core/architecture' },
{ label: 'GitHub architecture', link: '/core/github-architecture' },
{ label: 'Installation (Docker Compose)', link: '/core/installation' },
{ label: 'Manual installation', link: '/core/manual-installation' },
{ label: 'API Endpoints', link: '/core/api-docs' },
],
},
{
label: 'How to use Palmr.',
items: [
{ label: 'First login (Admin)', link: '/main/login' },
{ label: 'Manage users', link: '/main/manage-users' },
{ label: 'Uploading files', link: '/main/upload' },
{ label: 'Creating a share', link: '/main/generate-share' },
{ label: 'Configuring SMTP', link: '/main/configuring-smtp' },
{ label: 'Available languages', link: '/main/available-languages' },
],
},
{
label: 'Developers',
items: [
{ label: 'How to contribute', link: '/developers/contribute' },
{ label: 'How to open an issue', link: '/developers/open-an-issue' },
],
},
{
label: 'Sponsor this project',
items: [
{ label: 'Star this project on Github', link: '/sponsor/gh-star' },
{ label: 'Github Sponsors', link: '/sponsor/gh-sponsor' },
],
},
],
lastUpdated: true,
pagination: false,
customCss: [
'./src/styles/custom.css',
],
}),
],
});

21
apps/docs/components.json Normal file
View File

@@ -0,0 +1,21 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "",
"css": "src/app/global.css",
"baseColor": "neutral",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
}

View File

@@ -1,9 +1,7 @@
---
title: Palmr. API Endpoints
title: API Endpoints
---
##### Overview of Palmr. API Endpoints
Palmr. provides a **highly documented and typed API** that can be accessed at:
- **In a production environment:** `{your_server_domain}/docs`
@@ -11,7 +9,7 @@ Palmr. provides a **highly documented and typed API** that can be accessed at:
The API documentation is powered by **Scalar** ([https://scalar.com](https://scalar.com)), which offers a fully interactive interface for testing all the available requests within Palmr. Below is an example screenshot of the API documentation interface:
![Palmr API Documentation](/public/api-docs/scalar.png)
![Palmr API Documentation](/assets/v1/api-docs/scalar.png)
---
@@ -31,7 +29,7 @@ We recommend using **Scalar** for querying and testing the API because the syste
If you prefer not to use Scalar or are more comfortable with an alternative tool, a **Swagger-based version** of the documentation is also available.
![Palmr API Documentation](/public/api-docs/swagger.png)
![Palmr API Documentation](/assets/v1/api-docs/swagger.png)
You can access it at:

View File

@@ -7,7 +7,7 @@ title: Architecture of Palmr.
Understanding the architecture of Palmr. is crucial for both deploying and scaling the application. Below is a diagram illustrating the main components:
![Palmr Banner](/public/general/architecture.png)
![Palmr Banner](/assets/v1/general/architecture.png)
## **Technologies Used**

View File

@@ -32,7 +32,7 @@ The project uses i18next for internationalization (i18n) support. The language d
#### 2. Manual Selection
![Palmr Profile Menu](/public/main/language/language-selector.png)
![Palmr Profile Menu](/assets/v1/main/language/language-selector.png)
- Users can manually switch languages through the language selector in the UI
- Language preference is saved in the browser's localStorage

View File

@@ -18,15 +18,15 @@ Now, let's go through the step-by-step process to configure the **SMTP Server**.
To access **Settings**, an **ADMIN** user must click on the profile picture in the **header** and select **Settings** from the dropdown menu.
![Dropdown Menu](/public/main/smtp/dropdown-menu.png)
![Dropdown Menu](/assets/v1/main/smtp/dropdown-menu.png)
Once inside the **Settings** panel, click on the **Email** card to expand the SMTP configuration options.
![Closed Settings Card](/public/main/smtp/closed-card.png)
![Closed Settings Card](/assets/v1/main/smtp/closed-card.png)
After expanding the card, the following SMTP configuration fields will appear:
![Opened Settings Card](/public/main/smtp/opened-card.png)
![Opened Settings Card](/assets/v1/main/smtp/opened-card.png)
---
@@ -34,7 +34,7 @@ After expanding the card, the following SMTP configuration fields will appear:
The first step is to **enable SMTP** by selecting "Yes" in the **SMTP Enabled** field.
![SMTP Enabled](/public/main/smtp/smtp-enabled.png)
![SMTP Enabled](/assets/v1/main/smtp/smtp-enabled.png)
Once SMTP is enabled, you can configure the other necessary fields:

View File

@@ -1,5 +1,5 @@
---
title: How to Contribute to the Palmr. Project
title: How to Contribute
---
Thank you for your interest in contributing to the **Palmr.** project! Contributions are what make the open-source community such an amazing place to learn, inspire, and create. This guide will walk you through the process of contributing to Palmr.

View File

@@ -8,11 +8,11 @@ To create a share in Palmr, the process is very intuitive and self-explanatory.
On the home page, there is a **"Recent Shares"** section. When no shares have been created yet, this section will appear as follows:
![Recent Shares Section](/public/main/shares/share-section.png)
![Recent Shares Section](/assets/v1/main/shares/share-section.png)
Since no shares exist yet, you will see a **"Create Share"** button prominently displayed.
![Create Share Button](/public/main/shares/create-first-share.png)
![Create Share Button](/assets/v1/main/shares/create-first-share.png)
> **Note:** You dont need to upload files to create a share! Yes, its entirely possible to create a share without adding any files. While this might not make sense in every scenario, some users and use cases find this feature highly valuable.
@@ -20,7 +20,7 @@ As mentioned above, shares in Palmr are created first with their settings, and t
To create a share, simply click the **"Create Share"** button in the center of the **Recent Shares** section. Doing so will open the following **Create Share** modal:
![Create Share Modal](/public/main/shares/create-share-modal.png)
![Create Share Modal](/assets/v1/main/shares/create-share-modal.png)
Fill in the required information in the modal. The fields **Expiration Date**, **Max Views**, and **Password** are optional but significantly impact how the share functions for recipients:
- **Password:** If set, the recipient must enter the correct password to access the share.
@@ -40,27 +40,27 @@ Once a share is created, the **Recent Shares** section updates to display a tabl
- **Recipients**
- **Actions**
![Shares Table](/public/main/shares/shares-table.png)
![Shares Table](/assets/v1/main/shares/shares-table.png)
To create additional shares, a **"New Share"** button appears in the upper right corner of the **Recent Shares** section.
![New Share Button](/public/main/shares/new-share-btn.png)
![New Share Button](/assets/v1/main/shares/new-share-btn.png)
Clicking this button will reopen the **Create Share** modal.
The **Recent Shares** section displays only the **last 5 shares**. To view all created shares, click the **"View All"** button.
![Shares Filled](/public/main/shares/recent-shares-filled.png)
![Shares Filled](/assets/v1/main/shares/recent-shares-filled.png)
![View All Button](/public/main/shares/view-all-button.png)
![View All Button](/assets/v1/main/shares/view-all-button.png)
Clicking this redirects you to the **Shares Management** page.
![Shares Management Page](/public/main/shares/my-shares-page.png)
![Shares Management Page](/assets/v1/main/shares/my-shares-page.png)
Another way to access the **Shares Management** page is by clicking the **"My Shares"** card on the home page.
![My Shares Card](/public/main/shares/my-shares-card.png)
![My Shares Card](/assets/v1/main/shares/my-shares-card.png)
---
@@ -70,19 +70,19 @@ The **Shares Management** page is similar to the **Uploads Management** page, bu
##### Each share has an **Actions** column with the following options:
![Actions Column](/public/main/shares/actions-column.png)
![Actions Column](/assets/v1/main/shares/actions-column.png)
## Edit Share
Clicking the **Edit** button allows you to modify the share details.
![Edit Share Modal](/public/main/shares/edit-share-modal.png)
![Edit Share Modal](/assets/v1/main/shares/edit-share-modal.png)
## Manage Files
Clicking the **Manage Files** button lets you add or remove files from the share.
![Manage Files Modal](/public/main/shares/manage-files-modal.png)
![Manage Files Modal](/assets/v1/main/shares/manage-files-modal.png)
## Manage Recipients
@@ -90,36 +90,36 @@ Clicking the **Manage Recipients** button lets you add or remove recipients for
> **Note:** Email notifications will only be sent if SMTP settings are properly configured in the system.
![Manage Recipients Modal](/public/main/shares/manage-recipients-modal.png)
![Manage Recipients Modal](/assets/v1/main/shares/manage-recipients-modal.png)
## View Share Details
Clicking **View Details** lets you see all details of a share.
![View Details Modal](/public/main/shares/share-details-modal.png)
![View Details Modal](/assets/v1/main/shares/share-details-modal.png)
## Generate Share Link
Clicking the **Generate Link** button creates a shareable link, which can be customized.
![Generate Link Modal](/public/main/shares/generate-share-link-modal.png)
![Generate Link Modal](/assets/v1/main/shares/generate-share-link-modal.png)
Once generated, you can view and copy the link.
![Copy Link Modal](/public/main/shares/copy-link-modal.png)
![Copy Link Modal](/assets/v1/main/shares/copy-link-modal.png)
The generated link can be edited or copied from a dropdown menu.
![Edit or Copy Link Dropdown](/public/main/shares/dropdown-with-copy.png)
![Edit or Copy Link Dropdown](/assets/v1/main/shares/dropdown-with-copy.png)
When the generated link is accessed, the recipient can **view and download** the shared files.
![Shared Page Preview](/public/main/shares/share-screen.png)
![Shared Page Preview](/assets/v1/main/shares/share-screen.png)
## Delete Share
Clicking the **Delete** button allows you to permanently remove a share.
![Delete Share Modal](/public/main/shares/delete-share-modal.png)
![Delete Share Modal](/assets/v1/main/shares/delete-share-modal.png)
---

View File

@@ -24,7 +24,7 @@ Alternatively, you can search for "Palmr" in the GitHub search bar and click on
On the Palmr repository page, you'll see a "Sponsor" button at the top right corner of the page. Click this button to proceed.
![Palmr Profile Menu](/public/sponsor/sponsor-btn.png)
![Palmr Profile Menu](/assets/v1/sponsor/sponsor-btn.png)
---
@@ -35,7 +35,7 @@ GitHub Sponsors allows you to sponsor the project with a **custom amount startin
2. Type in the amount you'd like to sponsor (e.g., $1, $5, $10, or any amount you choose).
3. Select the billing frequency (monthly or one-time).
![Palmr Profile Menu](/public/sponsor/sponsor-page.png)
![Palmr Profile Menu](/assets/v1/sponsor/sponsor-page.png)
---

View File

@@ -24,7 +24,7 @@ Alternatively, you can search for "Palmr" in the GitHub search bar and click on
On the Palmr. repository page, you'll see a "Star" button at the top right corner of the page. Click this button to star the repository.
![Palmr Profile Menu](/public/sponsor/star-btn.png)
![Palmr Profile Menu](/assets/v1/sponsor/star-btn.png)
---
@@ -32,7 +32,7 @@ On the Palmr. repository page, you'll see a "Star" button at the top right corne
After clicking the "Star" button, the button will change to "Unstar," indicating that the repository has been successfully starred. You can always unstar the repository by clicking the "Unstar" button.
![Palmr Profile Menu](/public/sponsor/starred-button.png)
![Palmr Profile Menu](/assets/v1/sponsor/starred-button.png)
---

View File

@@ -1,8 +1,8 @@
---
title: Introduction
title: Welcome to Palmr.
---
![Palmr Banner](/public/general/banner.png)
![Palmr Banner](/assets/v1/general/banner.png)
## 🌴 What is **Palmr.** ?
___

View File

@@ -1,13 +1,26 @@
---
title: Installation
description: Guide to install and run Palmr using Docker Compose
title: Installation (Docker Compose)
---
import { Tabs, TabItem } from '@astrojs/starlight/components';
import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
### Startup Script for Docker Compose
### Quick Start with Default Docker Compose
To simplify the execution of the project and enable it to run on any machine, a **startup script** for Docker Compose was created. This script automates the generation of secure credentials and facilitates local setup.
There is a default `docker-compose.yml` file in the project root that can be used for quick execution. While this provides a convenient way to get started, it's important to note that using the default passwords is **not secure**, especially if the application is exposed to public networks. Malicious users could potentially exploit known default credentials to attack your deployment.
This base Docker Compose configuration works perfectly for localhost development but may require modifications when deployed to a VPS or production environment for optimal performance and security. Please consult the complete documentation for proper production deployment configurations.
For a quick start using the default configuration, simply run:
```bash
docker compose up -d
```
This command will start the project using the default configuration.
> ⚠️ **Important:** We strongly recommend testing your configuration locally first, especially if you've made any modifications to the Docker Compose files. Only after confirming everything works as expected locally should you proceed with deployment to a VPS or server environment.
### Startup Script for Docker Compose
To simplify the execution of the project and enable it to run on any machine, a **startup script** for Docker Compose was created. This script automates the generation of secure credentials and facilitates local setup. While this method provides better security than using default passwords, for maximum security, we strongly recommend moving all sensitive credentials to environment variables instead.
To execute the project using this approach, you need to have **Docker** and **Docker Compose** installed on your machine. While this is the simplest way to execute the project, it is **not recommended for production environments**.
@@ -15,28 +28,29 @@ To execute the project using this approach, you need to have **Docker** and **Do
### Ways to Execute the Startup Script
First of all, clone the official repository: `https://github.com/kyantech/Palmr.git`
First of all, download the relase v1.1.7-beta:
[Release version - 1.1.7-beta](https://github.com/kyantech/Palmr/releases/tag/v1.1.7-beta)
There are two ways to execute the script:
<Tabs>
<TabItem label="1. Using a Makefile">
<Tabs items={['Using a Makefile', 'Running the Script Directly']}>
<Tab >
To use this method, you need to have the `make` command installed on your machine.
To generate the `docker-compose.yml` file using a Makefile, run the following command from the project root:
To generate the new `docker-compose.yml` file using a Makefile, run the following command from the project root:
```bash
make gen-compose
```
This command will generate a `docker-compose.yml` file in the root of the project.
This command will subcribe the `docker-compose.yml` file in the root of the project.
- The script's primary function is to generate secure passwords for **MinIO** (object storage) and **Postgres** (database).
- The generated `docker-compose.yml` file serves as a base and can be modified at any time.
- It is configured to run locally via `localhost` and is **not intended for production** or VPS environments.
After the file is generated, you can modify or adapt it for deployment in other environments.
</TabItem>
<TabItem label="2. Running the Script Directly">
</Tab>
<Tab >
To generate the `docker-compose.yml` file by running the script directly, use the following commands:
```bash
@@ -45,13 +59,13 @@ There are two ways to execute the script:
```
This will have the same effect as running `make gen-compose`.
</TabItem>
</Tab>
</Tabs>
---
### Running the Project
After generating the `docker-compose.yml` file, you can start the project by running the following command from the project root:
After generating the new `docker-compose.yml` file, you can start the project by running the following command from the project root:
```bash
docker compose up -d
@@ -64,9 +78,9 @@ To access Palmr. in a local environment, open your browser and visit:
---
### Deployment in Production
For production environments, we recommend using **Kubernetes**, **Docker Swarm**, or a similar container orchestrator.
For production environments with high scalability and availability requirements, we recommend using **Kubernetes**, **Docker Swarm**, or a similar container orchestrator.
For local execution or testing environments, you can use Docker Compose with the `docker-compose.yml` file. This file pulls the latest Palmr. images from Docker and makes them available on specific ports, as shown below:
For homelab, personal projects, or environments where high availability and scalability are not critical, Docker Compose can be used without issues. The `docker-compose.yml` file pulls the latest Palmr. images from Docker and makes them available on specific ports, as shown below:
- **Frontend:** [http://localhost:4173](http://localhost:4173)
- **Backend:** [http://localhost:3333](http://localhost:3333)
@@ -79,7 +93,7 @@ For local execution or testing environments, you can use Docker Compose with the
### Port Configuration Recommendations
In this version of `docker-compose.yml`, none of the ports for the frontend and backend should be modified. Consequently, none of the URLs should be changed because the frontend image contains a pre-built version configured to work on port **4173**.
Due to technical limitations related to **ReactJS**, environment variables executed at runtime cannot be changed. Therefore, to ensure that the system functions correctly as designed, keep the `docker-compose.yml` file unchanged.
> ⚠️ Due to technical limitations related to **ReactJS**, environment variables executed at runtime cannot be changed. Therefore, to ensure that the system functions correctly as designed, keep the `docker-compose.yml` file unchanged.
---

View File

@@ -9,7 +9,7 @@ Once you have started all the services as described in the deployment instructio
Upon accessing the frontend, you will see a screen similar to the image below:
![Palmr Landing Page](/public/general/lp.png)
![Palmr Landing Page](/assets/v1/general/lp.png)
This is the **Palmr. landing page**, which provides basic information about the application. This landing page can be hidden later when you configure your app, allowing the login page to become the default home page. However, on the first execution, it is displayed by default.
@@ -25,7 +25,7 @@ To simplify the process, Palmr. comes pre-configured with **seed data** upon the
After clicking the **Login** button, you will be redirected to the login screen, which looks like this:
![Palmr Login Page](/public/ui/login.png)
![Palmr Login Page](/assets/v1/ui/login.png)
Use the following default credentials to log in for the first time:
@@ -35,7 +35,7 @@ Use the following default credentials to log in for the first time:
If everything is set up correctly, you will be authenticated and redirected to Palmr.'s main dashboard, which looks like this:
![Palmr Dashboard](/public/ui/dashboard.png)
![Palmr Dashboard](/assets/v1/ui/dashboard.png)
At this point, you are officially logged in and ready to start using all the features of Palmr.!
@@ -51,11 +51,11 @@ Follow these steps to update the admin credentials and secure your Palmr. instan
1. Click the **user icon** located in the top right corner of the screen.
2. A dropdown menu will appear with several options:
![Palmr Profile Menu](/public/ui/menu.png)
![Palmr Profile Menu](/assets/v1/ui/menu.png)
3. Select **"Profile"** from the dropdown menu. This will redirect you to the profile settings page:
![Palmr Profile Page](/public/ui/profile.png)
![Palmr Profile Page](/assets/v1/ui/profile.png)
---
@@ -78,7 +78,7 @@ You can also update the profile picture for better personalization.
1. Click the **camera icon** next to the avatar.
2. Select an image from your local device.
![Palmr Profile Picture](/public/ui/profile_picture.png)
![Palmr Profile Picture](/assets/v1/ui/profile_picture.png)
> **Recommendation:** Use a square image to ensure proper display.

View File

@@ -2,9 +2,8 @@
title: Manage users
---
##### Manage users to **Palmr** is a straightforward process. Below is a detailed step-by-step guide explaining how to create and manage users within the application.
Manage users to **Palmr** is a straightforward process. Below is a detailed step-by-step guide explaining how to create and manage users within the application.
---
### Step 1: Accessing User Management
@@ -13,7 +12,7 @@ To begin, you need to navigate to the **User Management** section:
1. Click on the **user icon** located in the header of the app.
2. A dropdown menu will appear. From the options available, select **"User Management"**
![Palmr Profile Menu](/public/ui/menu.png)
![Palmr Profile Menu](/assets/v1/ui/menu.png)
---
@@ -25,7 +24,7 @@ After selecting **User Management**, you will be redirected to the **User Manage
- If you need to update the Admin user details, you must follow the steps outlined in the **Profile Management** section.
- User details for the logged-in Admin cannot be modified from the **User Management Dashboard**.
![Palmr Profile Menu](/public/main/users/users-management.png)
![Palmr Profile Menu](/assets/v1/main/users/users-management.png)
---
@@ -33,18 +32,18 @@ After selecting **User Management**, you will be redirected to the **User Manage
1. To add a new user, click on the **"Add User"** button located at the top right corner of the screen.
![Palmr Profile Menu](/public/main/users/add-users-btn.png)
![Palmr Profile Menu](/assets/v1/main/users/add-users-btn.png)
2. A modal form will appear, allowing you to enter the new user's details:
![Palmr Profile Menu](/public/main/users/add-user-modal.png)
![Palmr Profile Menu](/assets/v1/main/users/add-user-modal.png)
3. After filling in the user details, click on **"Create"** to confirm.
Alternatively, you can click **"Cancel"** to abort the user creation process.
4. Once the user is created successfully, it will appear in the user list.
![Palmr Profile Menu](/public/main/users/new-user-table.png)
![Palmr Profile Menu](/assets/v1/main/users/new-user-table.png)
---
@@ -52,7 +51,7 @@ After selecting **User Management**, you will be redirected to the **User Manage
In the **User List**, under the **"Actions"** column, you will find a dropdown menu for each user.
![Palmr Profile Menu](/public/main/users/add-user-actions-dropdown.png)
![Palmr Profile Menu](/assets/v1/main/users/add-user-actions-dropdown.png)
Available actions include:
@@ -61,7 +60,7 @@ Available actions include:
- Change user details including role.
- Change the user password.
![Palmr Profile Menu](/public/main/users/edit-user-modal.png)
![Palmr Profile Menu](/assets/v1/main/users/edit-user-modal.png)
- **Deactivate User** Marks the user as inactive, preventing them from logging into the system.
- **Activate User** Reactivates a deactivated user, allowing them to log in again.

View File

@@ -0,0 +1,28 @@
{
"title": "v1.1.7-beta",
"description": "(Deprecated)",
"root": true,
"icon": "Trash2",
"pages": [
"---Introduction---",
"index",
"architecture",
"github-architecture",
"installation",
"manual-installation",
"api",
"---How to use Palmr.---",
"login",
"manage-users",
"upload",
"generate-share",
"configuring-smtp",
"available-languages",
"---Developers---",
"contribute",
"open-an-issue",
"---Sponsor this project---",
"gh-star",
"gh-sponsor"
]
}

View File

@@ -24,7 +24,7 @@ Alternatively, you can search for "Palmr" in the GitHub search bar and click on
On the Palmr repository page, click on the **Issues** tab near the top of the page. This will take you to the issues section of the repository.
![Palmr Profile Menu](/public/developers/issues-tab.png)
![Palmr Profile Menu](/assets/v1/developers/issues-tab.png)
---
@@ -33,7 +33,7 @@ On the Palmr repository page, click on the **Issues** tab near the top of the pa
Once you're in the issues section, click the **New Issue** button to start creating a new issue.
![Palmr Profile Menu](/public/developers/new-issue-btn.png)
![Palmr Profile Menu](/assets/v1/developers/new-issue-btn.png)
---
@@ -47,7 +47,7 @@ Youll now see a form where you can provide details about your issue. Heres
3. **Labels (Optional)**: Add labels to categorize your issue (e.g., `bug`, `enhancement`, `question`). This helps the maintainers organize and prioritize issues.
4. **Attachments (Optional)**: You can attach screenshots, logs, or other files to help explain the issue.
![Palmr Profile Menu](/public/developers/new-issue-form.png)
![Palmr Profile Menu](/assets/v1/developers/new-issue-form.png)
---

View File

@@ -17,36 +17,36 @@ Now let's focus on the file upload process. As mentioned, it is very simple, and
On the home page, there is a **"Recent Uploads"** section. On the first initialization (when no file has been uploaded yet),
it will appear like this:
![Recent Uploads Section](/public/main/upload/recent-uploads.png)
![Recent Uploads Section](/assets/v1/main/upload/recent-uploads.png)
To upload a file, simply click on the **"Upload File"** button. This will open a modal where you can select the file you want
to upload from your device. Some file types, such as images, audio, and video, will have a preview available.
![Upload File Button](/public/main/upload/upload-file-button.png)
![Upload File Button](/assets/v1/main/upload/upload-file-button.png)
### Example with an image:
![Preview Example](/public/main/upload/preview-example.png)
![Preview Example](/assets/v1/main/upload/preview-example.png)
After selecting the file, you can either confirm the upload by clicking the **"Upload"** button or cancel the operation by clicking the **"Cancel"** button.
![Upload and Cancel Buttons](/public/main/upload/upload-cancel-buttons.png)
![Upload and Cancel Buttons](/assets/v1/main/upload/upload-cancel-buttons.png)
Once one or more files have been uploaded, the **"Recent Uploads"** section will update and look like this:
![Recent Uploads with Files](/public/main/upload/recent-uploads-filled.png)
![Recent Uploads with Files](/assets/v1/main/upload/recent-uploads-filled.png)
To upload a new file from this screen, click the **"Upload File"** button in the upper right corner of the section, and follow the same steps as before.
![New Upload Button](/public/main/upload/new-upload-button.png)
![New Upload Button](/assets/v1/main/upload/new-upload-button.png)
This list on the home page shows only the **last 5 uploads**. To view older files or upload more, you need to go to the **"My Files"** page.
You can access this by clicking on the **"View All"** button in the upper right corner of the section or by clicking on the **"My Files"** card on the home page.
![View All Button](/public/main/upload/view-all-button.png)
![View All Button](/assets/v1/main/upload/view-all-button.png)
Or:
![My Files Card](/public/main/files/my-files-card.png)
![My Files Card](/assets/v1/main/files/my-files-card.png)
---
@@ -54,7 +54,7 @@ Or:
On the **"My Files"** page, the layout will look like this:
![My Files Page](/public/main/files/my-files-page.png)
![My Files Page](/assets/v1/main/files/my-files-page.png)
Here, you have the option to **filter** your uploaded files or upload new ones by clicking the **"Upload File"** button and following the same steps explained earlier.
@@ -72,13 +72,13 @@ The table fields include:
### Actions Column
In the **"Actions"** column, you will find an icon that opens the following dropdown:
![Actions Dropdown](/public/main/files/actions-dropdown.png)
![Actions Dropdown](/assets/v1/main/files/actions-dropdown.png)
Each option is self-explanatory, but lets detail the **Edit** option:
- **Edit** Opens a modal where you can edit the file name, description, and other details.
![Edit Modal](/public/main/files/edit-modal.png)
![Edit Modal](/assets/v1/main/files/edit-modal.png)
- You can also **delete** a file directly from the dropdown by selecting the **Delete** option.

View File

@@ -0,0 +1,48 @@
---
title: 🔌 API Endpoints
tag: v2.0.0-beta
---
## 📚 Accessing the API Documentation
Palmr. provides a **comprehensive, well-documented, and fully typed API** that has been carefully designed to ensure maximum developer productivity and ease of integration.
### 🎯 Scalar-Based Documentation
This API can be accessed through dedicated documentation endpoints at:
- **In a production environment:** `{your_server_domain}/docs` or `{your_server_ip}/docs`
- **In a local environment:** http://localhost:3333/docs
The API documentation is powered by **[Scalar](https://scalar.com/)**, which provides developers with a sophisticated and fully interactive interface for exploring, testing, and validating all available requests within the Palmr. ecosystem. This modern documentation platform enables real-time testing and visualization of API responses. Below is an example screenshot of the API documentation interface:
![Palmr API Documentation](/assets/v2/api-docs/scalar.png)
We have made a deliberate decision to **not provide an online version** of the API documentation, as the endpoints and functionality may vary significantly depending on the specific version of Palmr. you have deployed in your environment. To ensure you're always working with accurate and version-specific documentation, we strongly recommend accessing the documentation only after initializing your API service. It's important to note that the API service is specifically designated as the **server** component within the official Palmr. GitHub repository.
We strongly recommend utilizing **Scalar** as your primary tool for querying and testing the API, as the entire documentation system has been carefully optimized and designed with Scalar integration in mind. Scalar provides developers with an exceptionally intuitive and feature-rich interactive environment that streamlines the process of exploring endpoints, constructing and sending requests, and analyzing responses directly within its sophisticated interface.
---
### 🔄 Swagger-Based Documentation
Understanding that developers may have different preferences or requirements, we also maintain a **Swagger-based version** of the documentation for those who prefer this widely-adopted documentation standard or require compatibility with existing tools and workflows.
![Palmr API Documentation](/assets/v2/api-docs/swagger.png)
This alternative documentation format can be accessed at the following endpoints:
- **In a production environment:** `{your_server_domain}/swagger` or `{your_server_ip}/swagger`
- **In a local environment:** http://localhost:3333/swagger
Rest assured that both the Scalar and Swagger documentation versions maintain complete parity in terms of endpoint coverage and provide equally comprehensive documentation levels, ensuring successful testing and system integration regardless of your chosen documentation platform.
These carefully curated documentation options have been implemented to ensure that developers have access to all the necessary resources, detailed information, and interactive tools required for seamless integration between Palmr. and both internal systems and third-party services.
### 🔗 Useful Links
For additional information and detailed documentation about the tools that power our API documentation, please refer to these official resources:
- [Scalar Official Website](https://scalar.com/)
- [Swagger Official Website](https://swagger.io/)

View File

@@ -0,0 +1,62 @@
---
title: 🏗 Architecture of Palmr.
---
## 🔍 Overview
Understanding the architecture of Palmr. is crucial for both deploying and scaling the application. Below is a diagram illustrating the main components:
![Palmr Banner](/assets/v2/general/architecture.png)
## 🛠 Technologies Used
Each component in the Palmr. architecture plays a vital role in ensuring reliability, performance, and scalability. The stack is built with simplicity, performance, and flexibility in mind, everything is self-hosted, developer-friendly, and designed to scale without adding unnecessary complexity.
### 💾 PostgreSQL
Palmr. uses **PostgreSQL** as the primary database solution. It's a powerful, open-source relational database thats trusted by developers around the world. PostgreSQL is fully ACID-compliant, which means it handles transactions safely and reliably. Its perfect for storing structured data like user accounts, file metadata, transfer logs, and anything else that requires consistency. With advanced features like full-text search, custom data types (like JSONB), and strong indexing capabilities, PostgreSQL gives us the tools to scale efficiently without giving up query performance or flexibility.
- Provides reliable and secure data storage, ensuring consistency and high performance for all database operations.
- Powerful indexing, query optimization, and support for complex data types.
- Ideal for handling large amounts of metadata and transactional data in a predictable and scalable way.
### 🎨 Next.js 15 + React + TypeScript
The frontend of Palmr. is built using **Next.js 15**, along with **React** and **TypeScript**, forming a modern stack thats easy to maintain and super fast for end users. Next.js 15 brings server components, server actions, and a new app router system that makes rendering dynamic content incredibly efficient. This allows us to load only whats needed, when its needed which makes the app feel snappy even under load. React provides a clean, component-based structure that makes it easy to break the UI into reusable pieces, and TypeScript helps prevent bugs before they even happen by enforcing static typing and better code navigation. Whether it's SSR, static pages, or dynamic user interactions, this trio handles it all seamlessly.
- **React** enables the creation of a dynamic and responsive user interface with a component-based architecture.
- **TypeScript** adds static typing, enhancing code quality and reducing runtime errors.
- **Next.js 15** handles routing, server-side rendering, and server components for performance at scale.
### 📦 MinIO
Palmr. uses **MinIO** for object storage. MinIO is a lightweight, high-performance, S3-compatible storage solution that makes file handling simple and scalable. Every file uploaded to Palmr. Whether it's a personal file transfer or a shared asset is stored in MinIO. Its built to handle huge amounts of data and can be deployed locally, on-premise, or in the cloud. Because it speaks the same API as Amazon S3, integrating with it is straightforward and familiar to most developers. And since its self-hosted, we have full control over performance, redundancy, and security.
- Supports high-throughput file storage and retrieval.
- Ensures data integrity and redundancy.
- Compatible with AWS S3 APIs, making integration seamless.
### ⚡ Fastify
The backend of Palmr. is powered by **Fastify**, a super-fast Node.js web framework optimized for performance and low overhead. Its designed to handle lots of concurrent requests with minimal resource usage, which is key for scalable backend services. Fastify also has a built-in schema validation system that ensures all incoming data is properly validated before reaching business logic, which helps prevent bugs and security issues. It follows a plugin-based architecture, making it easy to keep route handlers, services, and middlewares cleanly separated and easy to extend as the project grows.
- Provides fast request handling with a lightweight core.
- Built-in schema-based validation for secure and reliable API handling.
- Supports plugin-based architecture for easy extensibility.
### 🔄 How It Works
1. **Frontend** — React + TypeScript + Next.js 15 handle the user interface and user interactions.
2. **Backend** — Fastify processes requests and communicates with the database and storage layers.
3. **Database** — PostgreSQL stores metadata and transactional data.
4. **Object Storage** — MinIO stores the actual files and ensures scalable, high-performance storage.
### 📚 Useful Links
- [PostgreSQL Documentation](https://www.postgresql.org/docs/)
- [Next.js Documentation](https://nextjs.org/docs)
- [React Documentation](https://react.dev/)
- [TypeScript Handbook](https://www.typescriptlang.org/docs/)
- [MinIO Documentation](https://min.io/docs/minio/container/index.html)
- [Fastify Documentation](https://fastify.dev/docs/latest/)

View File

@@ -0,0 +1,52 @@
---
title: 🌐 Available languages
---
The project leverages next-intl, a powerful and flexible internationalization (i18n) library, to provide comprehensive language support across the entire application. This robust solution enables seamless translation management, date/time formatting, number formatting, and pluralization rules across different locales. The integration of next-intl ensures consistent internationalization throughout the application's components, pages, and features, while maintaining optimal performance through efficient bundle splitting and lazy loading of language resources. With its TypeScript support and React Server Components compatibility, next-intl serves as the foundation for delivering a truly global and accessible user experience.
## 🗣️ Available Languages in Palmr.
---
| Language | Code | Description | Translation |
|----------|------|-------------|-------------|
| 🇺🇸 English | en-US | Primary development language and default fallback option | 100% |
| 🇧🇷 Portuguese | pt-BR | Standard Brazilian Portuguese support | 100% |
| 🇫🇷 French | fr-FR | Standard French language support | 100% |
| 🇪🇸 Spanish | es-ES | Standard Spanish language support | 100% |
| 🇩🇪 German | de-DE | Standard German language support | 100% |
| 🇷🇺 Russian | ru-RU | Standard Russian language support | 100% |
| 🇮🇳 Hindi | hi-IN | Standard Hindi language support | 100% |
| 🇸🇦 Arabic | ar-SA | Standard Arabic language support with RTL | 100% |
| 🇯🇵 Japanese | ja-JP | Standard Japanese language support | 100% |
| 🇰🇷 Korean | ko-KR | Standard Korean language support | 100% |
| 🇹🇷 Turkish | tr-TR | Standard Turkish language support | 100% |
| 🇨🇳 Chinese | zh-CN | Standard Simplified Chinese support | 100% |
### 🔄 Language Selection
The application provides two convenient methods for language selection, ensuring a seamless user experience:
### 🤖 1. Automatic Detection
- The application features sophisticated automatic detection of the user's preferred browser language settings
- Intelligently utilizes the browser's preconfigured language preferences to set the initial application language
### 👆 2. Manual Selection
![](/assets/v1/main/language/language-selector.png)
- Users have complete control to manually select their preferred language through an intuitive language selector interface in the UI
- Selected language preferences are persistently stored in the browser's localStorage for a consistent experience across sessions
### ⭐ Default Language
English (en-US) serves as the system's fallback language, ensuring consistent functionality even when language detection or selection encounters issues. This means that if a user's preferred language is not available or if there are any problems with language selection, the application will automatically default to English. This fallback mechanism is crucial for maintaining a seamless user experience and preventing any potential language-related disruptions. Additionally, all new features and updates are first implemented in English before being translated into other supported languages, ensuring that the English version always remains the most up-to-date and comprehensive.
### 🔍 Language Detection
The application employs advanced detection mechanisms to automatically identify and apply the user's browser language settings as the initial language configuration. For maximum flexibility, users can easily override this selection at any time using the convenient language switcher, accessible via the globe icon prominently displayed in the navigation bar.
### ↔️ RTL Support
The application incorporates comprehensive right-to-left (RTL) text handling capabilities, with particular attention paid to Arabic (ar-SA) language requirements, ensuring proper text alignment, layout direction, and user interface elements.

View File

@@ -0,0 +1,67 @@
---
title: ✉️ Configuring SMTP
---
For Palmr to function with all its best features, we need to configure our email server. To make this easier, there is a built-in configuration panel inside **Settings** in Palmr. However, only users with an **ADMIN** profile can access and configure these settings.
## ❓ Why Configure SMTP?
The main functionalities that depend on SMTP configuration are:
- 🔑 **Password Reset** Users who forget their password and cannot access the **Settings** panel need this feature.
- 📧 **Email Notifications** Recipients will receive emails when new shares are sent to them.
Now, let's go through the step-by-step process to configure the **SMTP Server**.
---
### 🔧 Accessing SMTP Settings
To access **Settings**, an **ADMIN** user must click on the profile picture in the **header** and select **Settings** from the dropdown menu.
![Dropdown Menu](/assets/v1/main/smtp/dropdown-menu.png)
Once inside the **Settings** panel, click on the **Email** card to expand the SMTP configuration options.
![Closed Settings Card](/assets/v1/main/smtp/closed-card.png)
After expanding the card, the following SMTP configuration fields will appear:
![Opened Settings Card](/assets/v1/main/smtp/opened-card.png)
---
### ⚙️ Configuring SMTP Server
The first step is to **enable SMTP** by selecting "Yes" in the **SMTP Enabled** field.
![SMTP Enabled](/assets/v1/main/smtp/smtp-enabled.png)
Once SMTP is enabled, you can configure the other necessary fields:
- **Sender Name** This will appear as the senders name in emails. (Example: "Palmr")
- **Sender Email** The email address from which notifications will be sent. (Example: "noreply@palmr.app")
- **SMTP Server** The SMTP server address. You can use any email service provider. For Gmail, use `smtp.gmail.com` (this is the recommended option and set as default).
- **SMTP Port** The server port. For Gmail, the standard port is **587**.
- **SMTP Username** The username for the SMTP server. For Gmail, enter your email address.
- **SMTP Password** The SMTP password. (Generate an App Password for Gmail)
> **Important:** If using **Gmail**, you need to generate an **App Password** instead of using your standard email password.
> For other email services, consult the official documentation of the service provider you are using. We recommend using Gmail for simplicity and limits the number of emails sent.
---
### 🔐 Generating a Gmail App Password
To generate an App Password for Gmail:
1. Go to [Google My Account](https://myaccount.google.com/).
2. Select **Security**.
3. Scroll down to **App Passwords**.
4. Generate a new password specifically for Palmr.
For a complete guide, refer to: **[How to set up SMTP credentials with Gmail](https://medium.com/rails-to-rescue/how-to-set-up-smtp-credentials-with-gmail-for-your-app-send-email-cf236d11087d)**.
---
### ✅ Finalizing SMTP Configuration
After entering the correct information, save the settings. Palmr is now ready to send emails for password resets and share notifications!

View File

@@ -0,0 +1,217 @@
---
title: 🤝 How to Contribute
---
## 👋 Introduction
Thank you for your interest in contributing to the **Palmr.** project! Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Whether you're fixing bugs, adding new features, improving documentation, or sharing ideas, every contribution helps make Palmr better for everyone. We welcome contributors of all experience levels - from beginners to seasoned developers. This comprehensive guide will walk you through the process of contributing to Palmr, from setting up your development environment to submitting your first pull request. We're excited to have you join our community of contributors!
---
### 🔑 GitHub Login
Before you can contribute, you need to be logged into your GitHub account. If you don't have an account yet, you can sign up for free at **[GitHub](https://github.com/)**. Having a GitHub account is essential as it allows you to fork repositories, submit pull requests, and interact with other contributors. Make sure to use a professional email address when creating your account, and consider enabling two-factor authentication for enhanced security. Once your account is set up, you can customize your profile and start exploring the vast open-source community on GitHub.
---
### 🔍 Access the Repository
Once you're logged in, go to the Palmr repository by clicking on this link: **[https://github.com/kyantech/Palmr](https://github.com/kyantech/Palmr)**. The repository contains all the source code, documentation, and resources for the Palmr project. Take a moment to explore the repository structure, including the README file, which provides an overview of the project.
Alternatively, you can search for "Palmr" in the GitHub search bar and click on the repository owned by **kyantech**. When searching, make sure you're looking at the official repository by checking the owner and repository name. The repository should have a description that matches the Palmr project and show recent activity from the maintainers. You can also check the number of stars, forks, and watchers to verify you're accessing the correct repository.
---
### 🍴 Fork the Repository
To contribute to the project, you'll need to create your own copy of the repository. This is called a **fork**. Here's how to do it:
1. Click the **Fork** button at the top right of the repository page.
2. Select where you want to fork the repository (your personal account or an organization).
3. Wait a few moments while GitHub creates your fork.
4. This will create a copy of the repository under your GitHub account.
5. You'll be automatically redirected to your forked repository once it's ready.
The fork will maintain a connection to the original repository, allowing you to:
- Keep your fork synchronized with the original repository
- Submit pull requests from your fork to the original repository
- Work independently on your own copy without affecting the original
---
### 📥 Clone the Fork
Next, youll need to clone your forked repository to your local machine. Heres how:
1. On your forked repository page, click the **Code** button.
2. Copy the repository URL (HTTPS or SSH).
3. Open your terminal or command prompt and run the following command to clone the repository:
```bash
git clone <repository-url>
```
4. Navigate into the cloned directory:
```bash
cd Palmr
```
---
### 🔄 Set up Base Branch
Before making changes, ensure your local repository is set up to track the `next` branch from the original Palmr repository. Heres how:
1. Add the original Palmr repository as a remote:
```bash
git remote add upstream https://github.com/kyantech/Palmr.git
```
2. Fetch the latest changes from the `next` branch:
```bash
git fetch upstream next
```
3. Create a new branch for your contribution based on `upstream/next`:
```bash
git checkout -b your-branch-name upstream/next
```
---
### ✏️ Make Local Changes
Now you're ready to make your contributions! This could include:
- Fixing a bug
- Adding a new feature
- Improving documentation
- Writing tests
- Enhancing performance
- Adding translations
- Improving accessibility
- Refactoring code
- Adding examples
- Reporting issues
Make your changes in your local repository using your preferred code editor. Here are some tips for making changes:
1. **Follow the Style Guide**: Make sure your code follows the project's coding standards and style guidelines
2. **Test Your Changes**: Run tests locally to ensure your changes don't break existing functionality
3. **Keep Changes Focused**: Make small, focused changes that address a single issue or feature
4. **Document Your Changes**: Add or update documentation as needed to explain your changes
5. **Review Your Work**: Double-check your changes before committing to ensure quality
Remember to regularly save your work and test your changes incrementally to catch any issues early in the development process.
---
### 📝 Use Conventional Commits
Once youve made your changes, commit them to your branch using **Conventional Commits**. Conventional Commits help maintain a clean and consistent commit history. Heres how to format your commit messages:
**Commit Message Format:**
`<type>(<scope>): <description>`
**Examples:**
- `feat: add user authentication`
- `fix(api): resolve null pointer exception`
- `docs: update README file`
- `chore: update dependencies`
**Steps to Commit:**
1. Stage your changes:
```bash
git add .
```
2. Commit your changes with a properly formatted message:
```bash
git commit -m "feat: add new feature for user profiles"
```
---
### 📤 Push Changes
After committing your changes, you'll need to push them to your forked repository on GitHub. This step synchronizes your local changes with your remote repository. Here's how to do it:
1. First, ensure your branch is up-to-date with any remote changes:
```bash
git pull origin your-branch-name
```
2. Then push your commits to your forked repository:
```bash
git push origin your-branch-name
```
If this is the first time pushing this branch, you might need to set the upstream branch:
```bash
git push -u origin your-branch-name
```
If you encounter any errors while pushing:
- Make sure you have the correct permissions on your fork
- Verify your remote URL is correct using `git remote -v`
- Check if you need to authenticate with GitHub
---
### 🔀 Create Pull Request
Now that your changes are on GitHub, you can open a **Pull Request (PR)** to propose your changes to the `next` branch of the Palmr repository. Heres how:
1. Go to your forked repository on GitHub.
2. Click the **Pull Request** button.
3. On the PR creation page:
- Set the **base repository** to `kyantech/Palmr`.
- Set the **base branch** to `next`.
- Set the **head repository** to your forked repository.
- Set the **compare branch** to your branch (`your-branch-name`).
4. Fill out the PR form with a clear title and description of your changes.
5. Click **Create Pull Request**.
---
### ⏳ Await Review
Once your PR is submitted, the maintainers will review your changes. They may provide feedback or request additional changes. During this process:
- **Monitor Your PR**: Keep an eye on GitHub notifications for any comments or requests
- **Be Responsive**: Try to address feedback promptly and professionally
- **Make Updates**: If changes are requested, update your branch and push the new commits
- **Ask Questions**: Don't hesitate to ask for clarification if needed
- **Be Patient**: The review process may take some time depending on maintainer availability
Remember that code review is a collaborative process aimed at ensuring code quality. Stay engaged and maintain open communication with the maintainers throughout the review process.
---
## 💡 Contribution Tips
To ensure your contribution is accepted, follow these tips:
- **Use Conventional Commits**: Write clear and consistent commit messages using the Conventional Commits format.
- **Keep Your PRs Small**: Focus on one issue or feature per PR to make it easier to review.
- **Be Patient**: Maintainers are often volunteers and may take some time to review your PR.
- **Write Tests**: Include tests for any new features or bug fixes you implement.
- **Follow Code Style**: Adhere to the project's coding standards and style guidelines.
- **Update Documentation**: Keep documentation in sync with code changes.
- **Engage in Discussion**: Participate in PR discussions and be open to feedback.
- **Review Others' PRs**: Help the community by reviewing other contributors' pull requests.
- **Stay Updated**: Keep your fork synchronized with the main repository.
---
## ⭐ Why Contribute?
Contributing to open-source projects like Palmr has many benefits:
1. **Improves the Project**: Your contributions help make the project better for everyone.
2. **Builds Your Skills**: Youll gain experience working with Git, GitHub, and collaborative coding.
3. **Supports the Community**: Open-source thrives on community contributions. Your work helps sustain the project.
---
## 🎉 Final Words
That's it! You've successfully contributed to the **🌴 Palmr.** project on GitHub. Thank you for your time and effort in making Palmr better for everyone. We appreciate your contribution!

View File

@@ -0,0 +1,152 @@
---
title: 🔗 Managing shares
---
## 📤 Creating a share
Creating a share in Palmr is designed to be a straightforward and user-friendly experience that anyone can master quickly. While the platform offers several methods for share creation, we recommend beginning with the most accessible approach: utilizing the **Home Page**, particularly through the well-organized **Recent Shares** section.
___
### Home Page
When you visit the home page, you'll immediately notice the **"Recent Shares"** section, which serves as your central hub for file sharing. For new users who haven't created any shares yet, this section presents a clean, welcoming interface as follows:
![](/assets/v1/main/shares/share-section.png)
For first-time users, the interface features a prominently positioned **"Create Share"** button that stands out against the clean background, making it impossible to miss.
![](/assets/v1/main/shares/create-first-share.png)
> Note: One of Palmr's unique features is its flexibility - you don't need to upload files to create a share! This might seem counterintuitive at first, but it's a deliberately designed feature that many users find invaluable for their specific workflows and use cases. This approach allows you to set up the sharing framework first and add content later.
>
This design philosophy reflects Palmr's user-centric approach: you can establish your share's parameters and settings first, then populate it with files at your convenience. Furthermore, all aspects of your share remain fully editable at any time, providing maximum flexibility.
To initiate the share creation process, locate and click the **"Create Share"** button positioned centrally within the **Recent Shares** section. This action will trigger the appearance of a comprehensive **Create Share** modal window:
![](/assets/v1/main/shares/create-share-modal.png)
Within the modal, you'll find various fields to customize your share. While some fields are optional, they each serve important functions in controlling how your share behaves. Pay particular attention to these three powerful security options - **Expiration Date**, **Max Views**, and **Password** - as they significantly enhance your control over how recipients interact with your shared content:
- **Password:** Adding this extra layer of security ensures that only recipients with the correct password can gain access to your shared content, providing an additional verification step.
- **Max Views:** This feature allows you to set a specific limit on the number of times your share can be accessed. Once this threshold is reached, the share becomes inaccessible unless you, as the creator, choose to adjust or remove the viewing limit.
- **Expiration Date:** By setting this parameter, you can determine precisely how long your share remains accessible. After the specified date passes, the share automatically deactivates, though you retain the ability to extend this deadline if needed.
While the **name** field isn't mandatory, we strongly encourage users to assign meaningful names to their shares for easier management and organization of multiple shares over time.
After successfully creating a share, the **Recent Shares** section transforms into an informative table display, presenting comprehensive details through the following columns:
- **Name**
- **Created At**
- **Expires At**
- **Status**
- **Security**
- **Files**
- **Recipients**
- **Actions**
![](/assets/v1/main/shares/shares-table.png)
For your convenience, once you've created your first share, a **"New Share"** button appears in the upper right corner of the **Recent Shares** section, making it easy to create additional shares.
![](/assets/v1/main/shares/new-share-btn.png)
This conveniently positioned button provides quick access to the **Create Share** modal whenever you need to create another share.
To maintain a clean and manageable interface, the **Recent Shares** section displays your **last 5 shares** by default. When you need to access your complete sharing history, simply click the **"View All"** button to see your entire collection of shares.
![](/assets/v1/main/shares/recent-shares-filled.png)
![](/assets/v1/main/shares/view-all-button.png)
Upon clicking this button, you'll be seamlessly redirected to the comprehensive **Shares Management** page.
![](/assets/v1/main/shares/my-shares-page.png)
For quick access to your complete share collection, you can also reach the **Shares Management** page by clicking the conveniently placed **"My Shares"** card on the home page.
![](/assets/v1/main/shares/my-shares-card.png)
---
### 📊 Shares Management Page
The **Shares Management** page functions similarly to the **Uploads Management** page but offers expanded capabilities. Here, you'll find a complete overview where you can **add, remove, edit, and view all created shares** without being restricted to the five-share limit of the Recent Shares section.
Each share has an **Actions** column with the following options:
![](/assets/v1/main/shares/actions-column.png)
___
## ✏️ Edit Share
The **Edit** button provides access to a comprehensive interface where you can modify and update all share details as needed.
![](/assets/v1/main/shares/edit-share-modal.png)
## 📁 Manage Files
___
Through the **Manage Files** button, you gain complete control over the content of your share, with the ability to both add new files and remove existing ones.
![](/assets/v1/main/shares/manage-files-modal.png)
___
## 👥 Manage Recipients
The **Manage Recipients** button opens an interface where you can maintain your recipient list, adding or removing access as needed.
> Note: For email notifications to function properly, please ensure that your system's SMTP settings are correctly configured and active.
>
![](/assets/v1/main/shares/manage-recipients-modal.png)
___
## 👀 View Share Details
The **View Details** option provides a comprehensive overview of all aspects and settings associated with your share.
![](/assets/v1/main/shares/share-details-modal.png)
___
## 🔗 Generate Share Link
The **Generate Link** feature allows you to create a customizable sharing link for easy distribution of your content.
![](/assets/v1/main/shares/generate-share-link-modal.png)
After generation, the system presents you with the link for immediate viewing and copying.
![](/assets/v1/main/shares/copy-link-modal.png)
A convenient dropdown menu provides options to either edit the generated link's settings or copy it to your clipboard.
![](/assets/v1/main/shares/dropdown-with-copy.png)
When recipients access your generated link, they'll be able to both **view and download** the shared files according to the permissions you've set.
![](/assets/v1/main/shares/share-screen.png)
___
## Delete Share
Clicking the
**Delete**
button allows you to permanently remove any share that's no longer needed.
![](/assets/v1/main/shares/delete-share-modal.png)
---
### 📝 Summary
Palmr's share creation system exemplifies intuitive design and flexible functionality. The platform offers comprehensive features including file-free share creation, customizable share settings, recipient management, and secure link generation. The dedicated **Shares Management** page serves as your command center, providing complete oversight and control of your entire sharing ecosystem.

View File

@@ -0,0 +1,110 @@
---
title: 💝 Github Sponsors
---
## 👋 Introduction
Sponsoring a project on GitHub is a powerful way to support its development and ensure its long-term sustainability. This tutorial will guide you through the process of sponsoring the **Palmr.** project on GitHub using GitHub Sponsors.
By becoming a sponsor, you'll not only help maintain and improve the project, but you'll also:
- Support continuous development and bug fixes
- Enable new feature implementations
- Help cover hosting and infrastructure costs
- Show appreciation for the developers' hard work
- Join a community of supporters who value open source
---
### 🔑 GitHub Login
Before you can sponsor a project, you need to be logged into your GitHub account. If you don't have an account yet, you can sign up for free at [GitHub](https://github.com/). Having an account also allows you to:
- Follow project updates
- Report issues
- Contribute to discussions
- Access sponsor-only content (if available)
---
### 🔍 Access the Repository
Once you're logged in, go to the Palmr. repository by clicking on this link: [https://github.com/kyantech/Palmr](https://github.com/kyantech/Palmr).
Alternatively, you can search for "Palmr" in the GitHub search bar and click on the repository owned by **Kyantech**.
You can also:
- Star the repository to show your support
- Watch it for updates
- Fork it if you want to contribute
---
### 💖 Click the Sponsor Button
On the Palmr repository page, you'll see a **Sponsor** button at the top right corner of the page. Click this button to proceed. The button is typically highlighted in a distinct color to make it easily visible.
![Palmr Sponsor Button](/assets/v1/sponsor/sponsor-btn.png)
Pro tip: You can also access the sponsorship page directly through your GitHub dashboard under "Sponsoring" if you've sponsored us before.
---
### 💰 Choose a Custom Sponsorship
GitHub Sponsors allows you to sponsor the project with a **custom amount starting at $1**:
1. On the sponsorship page, look for the option to **enter a custom amount**.
2. Type in the amount you'd like to sponsor (e.g., $1, $5, $10, or any amount you choose).
3. Select the billing frequency (**monthly** or **one-time**).
4. Consider setting up automatic annual sponsorship for a simplified experience.
5. Look for any special tier benefits that might be available at different sponsorship levels.
![Sponsor Page Example](/assets/v1/sponsor/sponsor-page.png)
---
### ✅ Complete Your Sponsorship
After entering your custom amount and selecting the billing frequency, you'll be prompted to enter your payment details. Follow the instructions to complete the sponsorship process.
Once done, you'll officially be a **Palmr sponsor**! 🙌
---
### ⭐ Why Sponsoring Matters
- 🧱 Supports Sustainability
Your sponsorship helps keep the project alive and maintained long-term.
- 🚀 Encourages Innovation
Financial support gives developers the freedom to try new ideas and push boundaries.
- 🫶 Shows Deep Appreciation
Sponsoring is a meaningful, tangible way to thank developers for their work.
- 🏆 Earns You Recognition
Many projects publicly thank their sponsors — you might appear in the README or on the site!
- 🌱 Helps Open Source Thrive
Open-source projects rely on community support. Sponsoring helps the ecosystem grow.
---
## 🎁 What Happens After Sponsoring
Once you become a sponsor:
1. You'll receive a confirmation email from GitHub
2. Your name will appear in our sponsors list
3. You'll get access to sponsor-only updates and content
4. You'll be invited to our private Discord channel
5. You'll receive early access to new features
---
## 🌟 Final Words
That's it! You've successfully sponsored the **Palmr.** project on GitHub.
Your support will help ensure this open-source project continues to evolve and thrive.
**We appreciate you and welcome you to our community!** 🎉

View File

@@ -0,0 +1,127 @@
---
title: ⭐ Star on Github
---
## 👋 Introduction
Starring a project on GitHub is a great way to show appreciation for a repository and to bookmark it for easy access later. This tutorial will guide you through the process of starring the **Palmr** project on GitHub. By starring our repository, you help increase its visibility and support the ongoing development of the project.
---
### 🔑 GitHub Login
Before you can star a project, you need to be logged into your GitHub account. If you don't have an account yet, you can sign up for free at [GitHub](https://github.com/). Here's how to get started:
1. Visit [GitHub's signup page](https://github.com/signup)
2. Enter your email address
3. Create a strong password
4. Choose a username
5. Complete the verification process
6. Select your preferences and complete the setup
Once your account is created, make sure to verify your email address to access all GitHub features.
---
### 🔍 Access the Repository
There are several ways to find and access the Palmr repository:
1. **Direct Link**: Go to the Palmr repository by clicking on this link: [https://github.com/kyantech/Palmr](https://github.com/kyantech/Palmr)
2. **Search Method**:
- Go to GitHub's main page
- Click the search bar at the top
- Type "Palmr"
- Look for the repository owned by **Kyantech**
- Click on the repository name to access it
3. **Through Profile**:
- Visit Kyantech's GitHub profile
- Navigate to the "Repositories" tab
- Find and click on "Palmr"
---
### 🌟 Find the Star Button
Once you're on the Palmr repository page, you'll find the "Star" button in the top-right section of the page. Here's what to look for:
1. Look at the top navigation bar of the repository
2. Find the row of action buttons (Watch, Fork, Star)
3. The Star button will be prominently displayed with a star icon ⭐
4. You may see the current star count next to the button
![Palmr Profile Menu](/assets/v1/sponsor/star-btn.png)
---
### ✅ Confirm the Star
After clicking the "Star" button, several things will happen:
1. The button will change from "Star" to "Unstar"
2. The star count will increase by one
3. The button will fill with color to indicate it's active
4. The repository will be added to your starred repositories list
You can access your starred repositories anytime by:
- Clicking your profile picture
- Selecting "Your stars" from the dropdown menu
- Or visiting: https://github.com/[your-username]?tab=stars
To remove your star, simply click the "Unstar" button at any time.
![Palmr Profile Menu](/assets/v1/sponsor/starred-button.png)
---
### 💫 Why Starring Matters
Starring a repository on GitHub is more than just a bookmarking tool—its a way to support the project and its developers. Heres why starring is so important:
- 🙌 Shows Appreciation
Starring a repository is a simple way to show your appreciation for the hard work and effort that goes into maintaining and developing a project.
- 📈 Increases Visibility
The more stars a repository has, the more visible it becomes on GitHub.
- 💪 Encourages Developers
Seeing stars motivates developers to continue improving the project.
- 🔍 Helps with Discovery
GitHub prioritizes repositories with more stars in trending and recommendations.
- 📚 Tracks Your Interests
Starred repositories are saved to your list for easy access later.
- 🌍 Supports Open Source
Your stars help sustain the open-source community and the Palmr project.
---
## 💝 Small Action / Big Impact
Starring a repository takes just a second, but it can have a huge impact on the project's growth and development. Here's what your star means to us:
- Helps drive project momentum
- Encourages more community participation
- Provides valuable feedback on project value
- Helps us set and achieve development goals
- Supports sustainable open-source development
Your star is more than just a number - it's a vote of confidence in our vision and helps shape the future of Palmr.
---
## 🎉 Final Words
That's it! You've successfully starred the **Palmr** project on GitHub. Thank you for supporting Palmr and becoming part of our growing community! Your support helps us continue improving and expanding the project for everyone.
Feel free to explore our other ways to contribute, like:
- Sharing Palmr with others
- Reporting issues
- Contributing code
- Joining discussions
Every interaction helps make Palmr. better!

View File

@@ -0,0 +1,145 @@
---
title: </> Github Architecture
---
import { File, Folder, Files } from "fumadocs-ui/components/files";
## Project Structure
<Files>
<Folder name="apps" defaultOpen>
<Folder name="docs" >
<File name="all documentation files" />
</Folder>
<Folder name="server" >
<File name="all backend files" />
</Folder>
<Folder name="web" >
<File name="all frontend files" />
</Folder>
</Folder>
<File name="other project files" />
</Files>
## Core Components
### 🖥️ Frontend Application (apps/web)
**Technology Stack:**
- Next.js 15 (App Router)
- React 18
- TypeScript
- TailwindCSS
- shadcn/ui components
- next-intl for internationalization
Palmr.'s frontend is built with **Next.js 15**, using the App Router and Server Components for performance, scalability, and flexibility. The structure is modular and feature-based, keeping things easy to evolve as the product grows. UI logic runs on **React 18**, and **TypeScript** adds type safety that prevents a lot of silent bugs. Styles are handled with **TailwindCSS**, letting us build clean, responsive interfaces quickly. For components, we rely on **shadcn/ui**, a headless component library built with Radix UI and Tailwind, its fast, accessible, and fully customizable.
Internationalization is handled by **next-intl**, which integrates perfectly with Next.js routing. It supports locale-aware routes, per-page translation loading, and plural rules, all without any extra client-side bloat. Its flexible, lightweight, and great for apps with multilingual audiences.
The frontend is organized with:
- A **components-based architecture** for modular UI
- **Custom hooks** to isolate logic and side effects
- A **route protection system** using session cookies and middleware
- A **file management interface** integrated with the backend
- A **reusable modal system** used for file actions, confirmations, and more
- **Dynamic, locale-aware routing** using next-intl
---
### ⚙️ Backend Service (apps/server)
**Technology Stack:**
- Fastify
- PostgreSQL
- MinIO (S3-compatible)
- Prisma ORM
The backend is built on **Fastify**, a blazing-fast web framework for Node.js. Its lightweight, modular, and optimized for high performance. Every route is validated using JSON schema, which helps keep the API consistent and secure. Auth flows are built using JWTs stored in HTTP-only cookies, and everything from file uploads to token-based sharing goes through this layer.
Data is stored in **PostgreSQL**, which handles user info, file metadata, session tokens, and more. For actual file storage, we use **MinIO**, a fast, S3-compatible object store thats self-hosted and super scalable. Its perfect for keeping user files isolated and safe. We use **Prisma** as our ORM to simplify database access, it gives us type-safe queries and easy-to-read code.
Key features include:
- **Authentication/authorization** with JWT + cookie sessions
- **File management logic** including uploads, deletes, and renames
- **Storage operations** to handle bucket creation, usage tracking, and cleanup
- A **share system** that generates tokenized public file links
- Schema-based request validation for all endpoints
- Prisma models that keep the database logic predictable and type-safe
---
### 📚 Documentation (apps/docs)
**Technology Stack:**
- Fumadocs
- MDX (Markdown + JSX)
- React-based components
The docs are built using **Fumadocs**, a modern documentation system built on top of Next.js. It uses **MDX**, so you can mix Markdown with interactive React components, perfect for developer tools and open-source projects. Pages are fast, versionable, and easy to customize. The goal is to keep the documentation as close to the codebase as possible, using shared components where needed and reusing UI patterns directly from the app.
It supports sidebar navigation, keyboard shortcuts, dark mode, and even interactive demos or UI previews. The file tree you see above, for example, is powered by a real React component from the docs.
- Built with **Fumadocs**, powered by Next.js
- Supports **MDX** and full React component embedding
- Ideal for technical docs and live code samples
- Styled using the same Tailwind setup from the main app
---
### 🏗️ Infrastructure
Palmr. is fully containerized using **Docker**, which means every service: frontend, backend, database, storage, runs in its own isolated environment. With `docker-compose`, the whole stack spins up locally with a single command. Its also easy to deploy to services like Fly.io, Render, or your own VPS.
Volumes are used to persist data locally, and containers are networked together so that all services can talk to each other securely.
- **Docker-first architecture** with all services containerized
- Configurable through `.env` and compose overrides
- Local volumes and named networks
- Easy to deploy and scale on any container-compatible infra
---
## Key Features
### 📂 File Management
Files are at the heart of Palmr. Users can upload files via the frontend, and theyre streamed directly to MinIO. The backend handles metadata (name, size, type, ownership), and also handles deletion, renaming, and public sharing. Every file operation is tracked, and all actions can be scoped per user.
- Upload/download with instant feedback
- File previews, type validation, and size limits
- Token-based sharing system
- Disk usage tracking by user
### 👤 User System
Authentication is done through secure JWTs, stored in HTTP-only cookies for safety. Signup and login flows are simple and fast, and user info is kept in sync across the frontend and backend.
- Cookie-based session management
- Role support and future admin access
- Profile updates and password reset flows
- Logged-in user state handled via custom hooks
### 💾 Storage System
MinIO is used for all file storage. Its fast, lightweight, and fully S3-compatible which means it can scale easily and integrates with tons of other tools. The backend tracks usage, handles cleanup of orphaned files, and ensures that every file on disk has a matching database record.
- S3-compatible object storage via MinIO
- Upload validation and automatic cleanup
- Usage tracking and quotas (per user or global)
- Secure access to stored files with signed URLs
### 🌐 Internationalization
Palmr. supports multiple languages using **next-intl**, which is deeply integrated into the routing system. It loads only the necessary translations per route, supports nested namespaces, and makes it easy to keep things organized even at scale.
- Per-locale localstorage (`en-US`, `pt-BR`, etc.)
- Translation loading by namespace/page
- Full pluralization and formatting support
- Easy translation management via JSON files

View File

@@ -0,0 +1,52 @@
---
title: 🌴 Welcome to Palmr.
---
![Palmr Banner](/assets/v2/general/banner.png)
**Palmr.** is a powerful and **flexible open-source alternative** to popular file transfer services like **WeTransfer**, **SendGB**, **Send Anywhere** and **Files.fm**. The key advantage of Palmr. is that you can **host it on your own infrastructure**, such as a **dedicated server** or **VPS**, giving you full control over your files and data security without relying on third-party services or worrying about artificial limits or high fees.
## **Why Choose Palmr.?**
### 🚫 **No Artificial Limits**
Unlike traditional file transfer services that impose arbitrary restrictions, Palmr. takes a fundamentally different approach by removing all artificial constraints on file sizes and quantities. The only practical limitation you'll encounter is the **available storage** space on your server or VPS infrastructure. This means that as long as you have adequate storage capacity in your hosting environment, you have complete freedom to transfer files of any size and in any quantity. There are no premium tiers to unlock additional features, no intrusive advertisements to navigate around, and absolutely no hidden charges or unexpected fees that might surprise you later. This unrestricted approach ensures that your file transfer capabilities are determined solely by your infrastructure choices rather than arbitrary service limitations.
### 🌟 **Open Source and Free**
Palmr. is completely **open source** and free to use, which means there are no licensing fees, subscription costs, or hidden charges associated with implementing and maintaining the software. This commitment to open source principles ensures complete transparency and freedom in how you utilize the platform. You can:
- Deploy it on any infrastructure of your choice (VPS, dedicated server, Docker, cloud platforms, or other hosting environments), giving you complete flexibility in your hosting decisions.
- Review and audit the entire codebase to ensure security and integrity, allowing you to verify that the software meets your organization's security standards and compliance requirements.
- Contribute improvements or custom features to enhance the platform's functionality, participating in the collaborative development process that makes open source software so powerful.
- Adapt it for different use cases as needed, whether you're using it for personal file sharing, business operations, or specialized applications that require custom modifications.
### 🔒 **Security and Privacy Under Your Control**
When you host Palmr. on your infrastructure, you maintain **full control over your data** through end-to-end management of the storage and transfer process. By keeping files within your own hosting environment, you eliminate security vulnerabilities that could arise from third-party handling. Your files never get stored or processed by external services, ensuring complete **privacy** and **confidentiality** of transferred information. This allows you to implement security protocols and compliance measures that match your specific requirements.
By eliminating third-party involvement, you gain peace of mind knowing that the files are never handled by external providers. This guarantees that you retain full control over data handling and processing, reinforcing the confidentiality of sensitive information throughout its lifecycle.
With Palmr., your security and privacy are entirely in your hands, making it a powerful and reliable solution for organizations that require full control over their data, whether for internal use or for compliance with regulations.
### 🎨 **Highly Customizable**
Palmr. offers extensive customization options that allow you to tailor every aspect of the platform to perfectly align with your brand identity and create an optimal user experience that matches your specific requirements:
- Add your own **logo** to maintain consistent branding across your file-sharing platform and establish a professional, unified presence.
- Set a **custom app name** that reflects your organization's identity and helps users instantly recognize your branded file-sharing solution.
- Configure an **SMTP server** for email notifications, enabling seamless communication with users about file transfers, updates, and system alerts.
- Customize text throughout the interface to create a unique user experience that resonates with your audience and maintains your brand voice.
### 👥 **Complete User and Admin Management**
Palmr. provides a comprehensive and sophisticated user and admin management system that puts you in complete control of your file-sharing environment:
- Create and manage multiple **administrators** with different permission levels to ensure proper oversight and delegation of responsibilities.
- Add unlimited **users** to accommodate teams of any size, from small workgroups to large enterprises.
- Control who can view, upload, and manage files with granular permission settings that allow you to implement precise access controls.
- Easily monitor storage usage through detailed analytics and reporting tools that help you optimize resource allocation.
### ⚡ **Fast, Lightweight, and Scalable**
Palmr. demonstrates exceptional technical capabilities through its streamlined and expandable architecture, engineered to deliver optimal operational efficiency. The system effectively processes substantial file transfers and manages high-volume user activity while consistently maintaining superior transfer rates. The platform's contemporary infrastructure automatically adjusts to accommodate increased utilization, facilitating uninterrupted functionality as operational requirements expand. Through advanced resource allocation and refined programming, the system delivers a highly responsive user experience that accommodates organizational growth while maintaining consistent performance standards and operational stability.

View File

@@ -0,0 +1,255 @@
---
title: 🐳 Installation (Docker Compose)
---
Installation via Docker Compose is the simplest way to run the project across different environments. For it to run correctly, we need two main tools installed in our environment:
- Docker ([https://docs.docker.com](https://docs.docker.com/))
- Docker Compose ([https://docs.docker.com/compose](https://docs.docker.com/compose/))
> *It's worth emphasizing that Palmr. was fully developed in a MacOS environment and extensively tested on Linux servers. Therefore, we can guarantee the best system performance in these environments. Windows and other environments have not been tested yet, and potential bugs may occur during execution. However, remember that we are still in a beta version of Palmr., and errors or bugs can occur in any operating system. If you identify any issues, we appreciate your help in notifying us through our GitHub [issues page](https://github.com/kyantech/Palmr/issues).*
---
## ⚡ Quick Start
Having installed [Docker](https://docs.docker.com/) and [Docker Compose](https://docs.docker.com/compose/) in our environment, we can proceed with the simple installation using these tools.
In the root folder of our project, we can find our `docker-compose.yaml` file, which is the only file needed to run the project via Docker and Docker Compose. This is because the pre-built images are already in our [DockerHub](https://hub.docker.com/repositories/kyantech) and are only referenced in the `docker-compose.yaml`
Any changes needed for execution can be made directly in our `docker-compose.yaml` or via environment variables, which we will show later in this tutorial.
Next, let's look at the content of our `docker-compose.yaml`.
---
## 🐳 Docker Compose Content
Below is the complete content of our `docker-compose.yaml` that can be copied directly from here or from our official repository ([Docker Compose](https://github.com/kyantech/Palmr/blob/main/docker-compose.yaml)).
```yaml
services:
palmr:
image: kyantech/palmr:latest # Make sure to use the correct version (latest) of the image
container_name: palmr
depends_on:
postgres:
condition: "service_healthy"
minio:
condition: "service_healthy"
environment:
# Server environment variables
- PORT=${API_INTERNAL_PORT:-3333} # Port for the backend service
- DATABASE_URL=postgresql://postgres:${POSTGRESQL_PASSWORD:-postgresRootPassword}@postgres:5432/palmr_db?schema=public # Database URL with configurable password through POSTGRESQL_PASSWORD env var
- MINIO_ENDPOINT=${MINIO_ENDPOINT:-minio} # This can change if your MinIO is at a different address
- MINIO_PORT=${MINIO_INTERNAL_API_PORT:-6421} # Default MinIO port (Change if yours is not the default)
- MINIO_USE_SSL=false # MinIO uses SSL by default, but you can change it to true if needed
- MINIO_ROOT_USER=${MINIO_ROOT_USER:-minio_root_user} # MinIO credentials can be configured through MINIO_ROOT_USER env vars
- MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD:-minioRootPassword} # MinIO credentials can be configured through MINIO_ROOT_PASSWORD env vars
- MINIO_REGION=sa-east-1 # MinIO region - This is needed for MinIO to work properly
- MINIO_BUCKET_NAME=files # MinIO bucket name - This is needed for MinIO to work properly, dont change it if you don't know what you are doing
- FRONTEND_URL=${APP_URL:-http://${SERVER_IP:-localhost}:${APP_EXTERNAL_PORT:-5487}} # Frontend URL - Make sure to use the correct frontend URL, depends on where the frontend is running, its prepared for localhost, but you can change it to your frontend URL if needed
- SERVER_IP=${SERVER_IP:-localhost} # Server IP - Make sure to use the correct server IP if you running on a cloud provider or a virtual machine. This prepared for localhost, but you can change it to your server IP if needed
- MAX_FILESIZE=${MAX_FILESIZE:-1073741824} # Max Filesize for upload - Declared in Bytes. Default is 1GiB
# Web environment variables
- NODE_ENV=production
- NEXT_TELEMETRY_DISABLED=1
- API_BASE_URL=http://palmr:${API_INTERNAL_PORT:-3333} # Using Docker service name for internal communication
ports:
- "${API_EXTERNAL_PORT:-3333}:3333" # Server port
- "${APP_EXTERNAL_PORT:-5487}:5487" # Web port
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "--no-verbose", "http://palmr:${API_INTERNAL_PORT:-3333}/health", "&&", "wget", "--no-verbose", "http://palmr:${APP_INTERNAL_PORT:-5487}"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
minio:
image: minio/minio:RELEASE.2025-03-12T18-04-18Z # Use only version RELEASE.2025-03-12T18-04-18Z to avoid compatibility issues with the backend
container_name: minio
environment:
# MinIO credentials - same as above, configurable through environment variables
- MINIO_ROOT_USER=${MINIO_ROOT_USER:-minio_root_user}
- MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD:-minioRootPassword}
- MINIO_SITE_REGION=sa-east-1
command: server /data --address ":${MINIO_INTERNAL_API_PORT:-6421}" --console-address ":${MINIO_INTERNAL_CONSOLE_PORT:-6422}"
volumes:
- minio_data:/data
ports:
- "${MINIO_EXTERNAL_API_PORT:-6421}:${MINIO_INTERNAL_API_PORT:-6421}"
- "${MINIO_EXTERNAL_CONSOLE_PORT:-6422}:${MINIO_INTERNAL_CONSOLE_PORT:-6422}"
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:${MINIO_INTERNAL_API_PORT:-6421}/minio/health/ready"]
interval: 10s
timeout: 5s
retries: 5
minio-init:
image: minio/mc:RELEASE.2025-03-12T17-29-24Z # Use only version RELEASE.2025-03-12T17-29-24Z to avoid compatibility issues with the backend and MinIO
container_name: minio-init
depends_on:
minio:
condition: "service_healthy"
restart: "no"
# The entrypoint script will create a bucket called "files" and set it to be publicly readable using the MinIO client (mc).
entrypoint: >
sh -c "
sleep 5 &&
mc alias set myminio http://minio:${MINIO_INTERNAL_API_PORT:-6421} ${MINIO_ROOT_USER:-minio_root_user} ${MINIO_ROOT_PASSWORD:-minioRootPassword} &&
mc mb myminio/files --ignore-existing &&
mc anonymous set download myminio/files
"
postgres:
image: bitnami/postgresql:17.2.0 # You can use any postgres version you prefer, but remember that some versions might not be compatible
container_name: palmr-postgres
environment:
# PostgreSQL credentials configurable through environment variables
# POSTGRESQL_USERNAME, POSTGRESQL_PASSWORD, and POSTGRES_DB can be set to override defaults
- POSTGRESQL_USERNAME=${POSTGRESQL_USERNAME:-postgres}
- POSTGRESQL_PASSWORD=${POSTGRESQL_PASSWORD:-postgresRootPassword}
- POSTGRESQL_DATABASE=${POSTGRES_DATABASE:-palmr_db}
volumes:
- postgres_data:/bitnami/postgresql
ports:
- "5432:5432"
restart: unless-stopped
healthcheck:
test: ["CMD", "pg_isready", "-U", "palmr"]
interval: 10s
timeout: 5s
retries: 5
volumes:
minio_data:
postgres_data:
```
Notice that the `docker-compose.yaml` has several comments that help you configure your own compose to meet your environment's needs. Let's give an overview of some changes we can make.
---
### ⚙️ Services Overview
Palmr. consists of four main services, each with specific responsibilities. Below, we present a detailed view of each component:
| **Service** | **Image** | **Exposed Ports** | **Main Features** |
| --- | --- | --- | --- |
| palmr | [kyantech/palmr:latest](https://hub.docker.com/repository/docker/kyantech/palmr/general) | **3333** (API)<br/>**5487** (Web) | • Combined backend API and frontend service<br/>• Depends on services: postgres and minio<br/>• Has healthcheck to ensure availability |
| minio (Storage) | [minio/minio:RELEASE.2025-03-12T18-04-18Z](https://hub.docker.com/layers/minio/minio/RELEASE.2025-03-12T18-04-18Z/images/sha256-85f3e4cd1ca92a2711553ab79f222bcd8b75aa2c77a1a0b0ccf80d38e8ab2fe5) | **6421**(API)<br/>**6422**(Console) | • File storage service<br/>• Persistent volume for data |
| minio-init (Config) | [minio/mc:RELEASE.2025-03-12T17-29-24Z](https://hub.docker.com/layers/minio/mc/RELEASE.2025-03-12T17-29-24Z/images/sha256-68d8c80f43908b02daa285e55547131870a1d36b3ffe272c26d7d8f4d52d1e5c) | N/A | • Initially configures the "files" bucket<br/>• Runs only once during initialization |
| postgres (Database) | [bitnami/postgresql:17.2.0](https://hub.docker.com/layers/bitnami/postgresql/17.2.0/images/sha256-29c614afad4f514b12b5c0f4d006f38c98fa4b18c3582732ff93b3fe9a79d875) | **5432** | • PostgreSQL database<br/>• Persistent volume for data |
---
### 🛠️ Available Environment Variables
The table below shows all environment variables that can be set
| **Variable** | **Default Value** | **Description** |
| --- | --- | --- |
| API_INTERNAL_PORT | 3333 | Internal API port in container |
| API_EXTERNAL_PORT | 3333 | Exposed port on host for API |
| POSTGRES_PASSWORD | postgresRootPassword | PostgreSQL database password |
| APP_EXTERNAL_PORT | 5487 | Exposed port on host for frontend |
| APP_URL | http://localhost:5487 | Complete frontend URL |
| SERVER_IP | localhost | IP of the server where the application is running |
| MINIO_ROOT_USER | minio_root_user | MinIO admin user |
| MINIO_ROOT_PASSWORD | minioRootPassword | MinIO admin password |
| MINIO_INTERNAL_API_PORT | 6421 | Internal MinIO API port |
| MINIO_INTERNAL_CONSOLE_PORT | 6422 | Internal MinIO console port |
| MINIO_EXTERNAL_API_PORT | 6421 | Exposed port on host for MinIO API |
| MINIO_EXTERNAL_CONSOLE_PORT | 6422 | Exposed port on host for MinIO console |
| POSTGRESQL_USERNAME | postgres | PostgreSQL user |
| POSTGRESQL_DATABASE | palmr_db | Database name |
| MAX_FILESIZE | 1073741824 | Max Uploadsize per file. Unit in Bytes |
> *All these variables can be configured through a .env file in the project root or defined directly in the environment where docker-compose will be executed. The best way to do this is up to you. But be careful to replace correctly if doing directly in the compose instead of providing an environment var.*
>
#### 🗂️ Persistent Volumes
- minio_data: Stores MinIO files
- postgres_data: Stores PostgreSQL data
---
### 💻 Local Execution
In a localhost environment, there's no mystery. If you don't want to change any service exposure ports, you can simply run:
```bash
docker compose pull && docker compose up -d
```
This will execute all necessary services and give you access to the following URLs (if you haven't changed any ports):
- **Frontend:** [http://localhost:5487](http://localhost:5487)
- **Backend:** [http://localhost:3333](http://localhost:3333/)
- **MinIO API:** [http://localhost:6421](http://localhost:6421)
- **MinIO Console:** [http://localhost:6422](http://localhost:6422)
- **Postgres Database:** [http://localhost:5432](http://localhost:5432/) (Connection only)
> *If you have changed any port, simply access the URL with the port you configured.*
>
---
### 🌐 Production (VPS or other)
For production environments, whether it's your VPS, Homelab Server, or other, the execution is very similar to the localhost environment, except for some particularities that may occur in some cases.
We mainly need to pay attention to the following points:
- Correctly set the `SERVER_IP` env var with our server's IP, otherwise some redirects and queries will fail during App execution.
- Set the `APP_URL` - regardless of whether the frontend is on the same server and with the same IP, it's extremely important to set this environment variable, otherwise sharing links will be generated incorrectly.
- For all environment variables that are `PASSWORD`, it's highly recommended to generate secure passwords and replace them as env vars.
- Lastly, make sure no docker service will conflict with any existing ones in your environment. If there is a conflict, simply change the execution ports via environment var or in the docker compose.
To generate a .env file with just the `server_ip` configuration, you can run this command:
```bash
curl -fsSL https://gist.githubusercontent.com/danielalves96/5a68913d70e5e31b68b7331dc17dfa9c/raw | bash
```
> execute this command in your server terminal, at same path of docker-compose.yaml.
Basically, by paying attention to these points, you can quickly execute the project with the same command we used for localhost:
```bash
docker compose pull && docker compose up -d
```
⚠️ This makes sure you're always running the latest beta version of the image, otherwise, Docker might reuse an outdated one from cache.
At this stage, if you encounter any errors, it's worth reviewing your `docker-compose.yaml` and trying again, paying close attention to the points mentioned above.
> *First test without using reverse proxies like Caddy, Traefik, etc... if you plan to use them. Access the services via `server_ip:port` after confirming they work, then make the necessary routing configurations as desired.*
>
If you haven't changed the execution ports, you'll have access on your server at:
- **Frontend:** `[server_ip]:5487`
- **Backend:** `[server_ip]:3333`
- **MinIO API:** `[server_ip]:6421`
- **MinIO Console:** `[server_ip]:6422`
- **Postgres Database:** `[server_ip]:5432` (Connection only)
> *If you've changed any port, simply access the URL with the port you configured.*
>
It's worth noting that this is just a quick start and we're not going into details about any of the developed services, but it's recommended for execution in any environment. However, if your focus is on using Palmr. with high availability in mind, it's recommended to use a container orchestrator prepared for this, such as Kubernetes or similar, but we don't cover this type of configuration in our documentation.
---
## 📚 Additional Resources
- [Docker Documentation](https://docs.docker.com/)
- [Docker Compose Documentation](https://docs.docker.com/compose/)
- [MinIO Documentation](https://min.io/docs/minio/container/index.html)
- [PostgreSQL Documentation](https://www.postgresql.org/docs/)

View File

@@ -0,0 +1,81 @@
---
title: 👥 Users Management
---
Managing users in **Palmr.** is a straightforward and intuitive process that ensures proper access control and organization within your system. This comprehensive step-by-step guide will walk you through the essential processes of creating, modifying, and managing user accounts within the application.
## 🔐 Accessing User Management
To initiate the user management process, you'll need to navigate to the dedicated **User Management** section. This centralized hub provides all the tools necessary for effective user administration:
1. Locate and click on the **user icon** prominently displayed in the application's header area, where all primary navigation controls are situated.
2. Upon clicking, a comprehensive dropdown menu will appear, presenting various options. From these choices, locate and select **"User Management"** to proceed
![Menu](/assets/v1/ui/menu.png)
---
### 📊 User Management Dashboard
Upon selecting **User Management**, the system will automatically direct you to the comprehensive **User Management Dashboard**, your central control panel for all user-related operations.
- During your initial access to the system, you'll notice that the user list contains only the **default Admin** user account, which serves as the primary administrative account.
- Should you find it necessary to modify the Admin user's information or credentials, please note that these changes must be implemented through the dedicated **Profile Management** section, which provides specialized tools for administrator profile maintenance.
- For security purposes and to maintain system integrity, it's important to understand that the currently logged-in Admin user's details cannot be altered directly from within the **User Management Dashboard**.
![Users Management Page](/assets/v1/main/users/users-management.png)
---
### 👤 Adding a New User
1. To initiate the process of adding a new user to the system, locate and click the **"Add User"** button, which is conveniently positioned in the top right corner of your screen for easy access.
![Add Users Button](/assets/v1/main/users/add-users-btn.png)
1. Upon clicking, an interactive modal form will be displayed, presenting you with all the necessary fields to input the new user's comprehensive details and access permissions:
![Add Users Modal](/assets/v1/main/users/add-user-modal.png)
1. After carefully entering all the required user information and reviewing for accuracy, click the **"Create"** button to finalize the process. ✨ If you need to start over or decide not to proceed, simply click the **"Cancel"** button to terminate the user creation process without saving any changes.
2. Following successful user creation, the new account will be immediately visible in the user list, confirming the completion of the process. 🎉
![New Users Table](/assets/v1/main/users/new-user-table.png)
---
### ⚙️ Managing User Actions
Within the **User List** interface, you'll find a comprehensive **"Actions"** column containing a dropdown menu for each user account, providing access to all available management functions.
![Add User Actions Dropdown](/assets/v1/main/users/add-user-actions-dropdown.png)
The following administrative actions are available for your convenience:
- 📝 **Edit User** Provides access to a detailed modal form for comprehensive user information updates:
- Modify various user details including their assigned role and permissions within the system.
- Implement security measures such as password changes and access control modifications.
![Edit User Modal](/assets/v1/main/users/edit-user-modal.png)
- 🔒 **Deactivate User** Temporarily suspends user access by marking the account as inactive, effectively preventing any system login attempts while maintaining their account information.
- 🔓 **Activate User** Restores full system access for previously deactivated users, enabling them to resume normal account activities and authentication.
- ❌ **Delete User** Executes a permanent removal of the user account from the system, including all associated data and permissions.
---
## ⚠️ Troubleshooting
In the event of any challenges or issues during the user management process, please refer to the following troubleshooting guidelines:
### 🚫 User Creation Fails
- Carefully verify that all required fields (including name, email address, and role assignments) have been completed with accurate information.
- Perform a thorough check to ensure the email address isn't already associated with an existing account in the system.
- Confirm that your system maintains a stable and active connection to the backend services necessary for user management.
### 🔑 User Cannot Log In
- First, verify that the user's account status is set to **Active** in the system.
- Double-check that the user is attempting to authenticate with their correct email address and current password combination.
- If authentication issues persist, initiate a password reset procedure to establish new credentials.

View File

@@ -0,0 +1,212 @@
---
title: 📦 Manual Installation
---
Manual installation requires more detailed attention and hands-on configuration compared to the streamlined process offered by Docker Compose. While this approach demands additional effort and technical understanding, following our comprehensive step-by-step guide will ensure a clean and successful project execution with full control over each component.
An important consideration in this manual setup process is that while we'll be handling the frontend and backend deployments directly, we still require Docker or an equivalent third-party service to manage our Postgres database and MinIO object storage infrastructure. For the purposes of this tutorial, we've chosen to utilize Docker with Docker Compose to establish and configure both MinIO and Postgres, as this provides a reliable and well-tested environment.
To facilitate this setup, we've included a pre-configured Docker Compose file within the `apps/server` directory that handles the initialization and configuration of both MinIO and Postgres - two essential components for the application's core functionality. While this is our recommended approach, you maintain the flexibility to implement alternative solutions that better suit your specific needs or infrastructure requirements. Our decision to leverage Docker Compose for these particular services stems from its ability to significantly streamline the configuration process, especially when dealing with complex third-party services like Postgres and MinIO.
Should you be interested in exploring alternative deployment methods for hosting MinIO and Postgres without utilizing Docker and Docker Compose, comprehensive information is available through their respective official channels and documentation:
- MinIO GitHub: [Visit MinIO GitHub](https://github.com/minio/minio)
- Postgres Github: [Visit Postgres GitHub](https://github.com/postgres/postgres)
- MinIO documentation: [View MinIO docs](https://min.io/docs/minio/linux/index.html)
- Postgres documentation: [View Postgres docs](https://www.postgresql.org/docs/)
With these foundational concepts established, we can now proceed with our detailed, step-by-step installation guide.
---
## ✅ Prerequisites
Before proceeding with the installation, it's essential to ensure that your development environment is properly configured with all the necessary tools and dependencies. Please verify that you have the following software components installed and properly configured on your system:
- <span style={{ color: "#16a34a" }}>Docker</span> *(Required only if you plan to use Docker + Docker Compose)*
- <span style={{ color: "#16a34a" }}>Docker Compose</span> *(Required only if you plan to use Docker + Docker Compose)*
- <span style={{ color: "#16a34a" }}>Node.js</span> *(Essential for running JavaScript/TypeScript applications)*
- <span style={{ color: "#16a34a" }}>pnpm</span> *(Our preferred package manager)*
- <span style={{ color: "#16a34a" }}>Git</span> *(For version control and repository management)*
⚠️ <strong>A critical note regarding package management:</strong> This repository has been specifically developed and thoroughly tested using the pnpm package manager. While technically possible to use alternative package managers such as `npm`, `yarn`, or `bun`, we strongly advise against this approach.
---
## Running the Application
### 📥 Clone the Repository
To begin the installation process, you'll need to obtain a local copy of the codebase. Start by cloning the official repository using the following Git command:
```bash
git clone https://github.com/kyantech/Palmr.git
```
Upon successful cloning, you'll find yourself with a new directory containing the project structure. Within this directory, there's a crucial folder named 'apps' that houses three essential components: docs, server, and web. For the purposes of this installation guide, we'll focus primarily on the server and web directories, which contain our robust backend infrastructure (built with Fastify) and our responsive frontend application (developed using React + Vite), respectively.
---
### ⚙️ Set Up Backend Services
The next phase involves setting up our backend services. First, navigate to the backend directory where you'll find the Docker Compose configuration file for our essential services - MinIO and Postgres:
```bash
cd ./apps/server
```
Once you're in the correct directory, initiate the services by executing the following command:
```bash
docker compose up -d
```
This command initializes both Postgres and MinIO services in detached mode, allowing them to run seamlessly in the background. While the configuration file at `apps/server/docker-compose.yaml` can be customized to suit specific needs, we strongly recommend maintaining the default configuration for your initial setup. This approach ensures a smooth installation process, and you can always refine the settings once you have a working implementation.
Now that our essential services are operational through Docker Compose, we can proceed with the core backend setup. During this phase, we'll be preparing the application for production deployment rather than development mode. This process requires careful attention to both the backend and frontend components.
Since our current working directory is already set to the server folder, let's begin with the backend configuration.
#### 🔑 Set Up Environment Variables
A crucial preliminary step is configuring the environment variables that Palmr requires for proper operation. We've provided a template file named `.env.example` in the repository to streamline this process.
Execute this straightforward command to create your environment configuration:
```bash
cp .env.example .env
```
This operation creates a new `.env` file in the root directory, populated with all the necessary environmental configurations.
#### 📦 Install Dependencies
The next crucial step involves initializing our database connection through Prisma, our chosen Object-Relational Mapping (ORM) tool. However, before we can utilize Prisma effectively, we need to ensure all backend dependencies are properly installed. With your Node.js environment and pnpm package manager ready, execute:
```bash
pnpm install
```
#### ⚡ Generate Prisma Client
After successfully installing all dependencies, proceed with generating the Prisma client by running:
```bash
pnpm dlx prisma generate
```
This essential command generates the Prisma client specifically tailored for our project, establishing the necessary interface for seamless database interactions and operations.
#### 🔄 Deploy Prisma Migrations
With the client generation complete, deploy the database schema using:
```bash
pnpm dlx prisma migrate deploy
```
This command ensures all your database migrations are properly implemented, establishing the required database structure.
#### 🌱 Seed the Database
Following the successful migration deployment, we'll populate the database with initial data using our seeding script. Execute:
```bash
pnpm db:seed
```
This process will populate your database with the necessary initial data, preparing it for application use.
#### 🏗️ Build and Run the Backend
With all preparatory steps completed, we can now build the backend application:
```bash
pnpm run build
```
Once the build process successfully concludes, start the backend service:
```bash
pnpm start
```
To verify that your backend is functioning correctly, you can access the comprehensive API documentation at:
```bash
http://localhost:3333/docs
```
This documentation interface provides detailed information about all available API endpoints and their usage.
---
### 🎨 Set Up Frontend
The frontend configuration process follows a similar pattern to the backend setup, though it's somewhat simplified as it doesn't require Docker container management - we'll only need to configure and run the service itself.
#### 📂 Navigate to the Frontend Directory
If your current location is the server directory, use:
```bash
cd ../web
```
Alternatively, if you're starting from the repository root, navigate with:
```bash
cd apps/web
```
#### ⚙️ Set Up Environment Variables
After reaching the web directory, begin by creating your frontend environment configuration:
```bash
cp .env.example .env
```
This step mirrors our backend environment setup, ensuring all necessary variables are properly configured.
#### 📦 Install Dependencies
Proceed with installing all required frontend dependencies:
```bash
pnpm install
```
#### 💻 Build and Run the Frontend
The final stage of our frontend setup is straightforward. First, create a production build:
```bash
pnpm run build
```
After the build completes successfully, launch the frontend service:
```bash
pnpm serve
```
Once the service initialization is complete, you can access the full application through your web browser at:
```bash
http://localhost:3000
```
---
## 🎉 Conclusion
Congratulations! You've successfully completed the comprehensive setup process for deploying a production-ready instance of Palmr. This detailed guide has walked you through each crucial step, from initial repository cloning to final application deployment.
## 🔗 Useful Links
- [Docker Documentation](https://docs.docker.com/)
- [Node.js Documentation](https://nodejs.org/en/docs/)
- [pnpm Documentation](https://pnpm.io/)
- [Prisma Documentation](https://www.prisma.io/docs/)

View File

@@ -0,0 +1,29 @@
{
"title": "v2.0.0-beta",
"description": "(Deprecated)",
"root": true,
"icon": "Trash2",
"pages": [
"---Introduction---",
"index",
"architecture",
"github-architecture",
"installation",
"manual-installation",
"api",
"s3-providers",
"---How to use Palmr.---",
"manage-users",
"uploading-files",
"generate-share",
"configuring-smtp",
"available-languages",
"---Developers---",
"contribute",
"open-an-issue",
"---Sponsor this project---",
"gh-star",
"gh-sponsor",
"..."
]
}

View File

@@ -0,0 +1,137 @@
---
title: 🎫 How to open an issue
---
## 👋 Introduction
Opening an issue on GitHub is a great way to report bugs, request features, or ask questions about a project. This tutorial will guide you through the process of opening an issue for the **Palmr.** project on GitHub.
Issues are an essential communication tool in open source development that help track bugs, feature requests, and general questions. They create a transparent record of project discussions and improvements. Whether you've found a bug that needs fixing, have an idea for a new feature, or just need clarification about how something works, creating an issue is the first step to getting your voice heard.
---
### 🔑 GitHub Login
Before you can open an issue, you need to be logged into your GitHub account. If you don't have an account yet, you can sign up for free at [GitHub](https://github.com/). Having a GitHub account allows you to:
- Create and manage issues
- Comment on existing issues
- Receive notifications about updates
- Collaborate with other developers
Once you have an account, make sure you're logged in before proceeding to the next steps.
---
### 🔍 Access the Repository
There are several ways to access the Palmr repository:
1. **Direct Link**:
Go to the Palmr repository by clicking this link: [https://github.com/kyantech/Palmr](https://github.com/kyantech/Palmr)
2. **GitHub Search**:
- Click the search bar at the top of GitHub
- Type "Palmr" or "kyantech/Palmr"
- Look for the repository owned by **Kyantech**
- Click on the repository name to access it
3. **Through Organization**:
- Visit [Kyantech's GitHub profile](https://github.com/kyantech)
- Navigate to the "Repositories" tab
- Find and click on "Palmr" in the repository list
---
### 📋 Open the Issues Tab
To access the issues section:
1. Look at the navigation bar near the top of the repository page
2. Find the **Issues** tab - it's usually between "Code" and "Pull requests"
3. Click on the **Issues** tab to open the issues section
4. You'll see a list of all existing issues, both open and closed
The issues tab shows important information like:
- Number of open issues
- Issue labels and categories
- Issue status (open/closed)
- Recent activity
- Assigned contributors
![Palmr Profile Menu](/assets/v1/developers/issues-tab.png)
---
### Create New Issue
To start creating a new issue:
1. Look for the green **New Issue** button on the right side of the issues page
2. Click the button to open the issue creation form
3. If there are multiple issue templates available, choose the most appropriate one for your needs
4. Take time to read through the template requirements carefully
5. Make sure you have all necessary information ready before starting
Pro Tips:
- Before creating a new issue, search existing issues to avoid duplicates
- Review any contribution guidelines or issue templates
- Consider adding relevant labels when creating your issue
- Include system information if reporting a bug
- Reference related issues or pull requests if applicable
- Use markdown formatting to make your issue more readable
![Palmr Profile Menu](/assets/v1/developers/new-issue-btn.png)
---
### 📝 Fill Out the Form
Youll now see a form where you can provide details about your issue. Heres how to fill it out:
1. **Title**: Write a clear and concise title that summarizes the issue.
2. **Description**: Provide a detailed description of the issue. Include steps to reproduce the problem (if its a bug), expected behavior, and actual behavior. If youre requesting a feature, explain why it would be useful.
3. **Labels (Optional)**: Add labels to categorize your issue (e.g., `bug`, `enhancement`, `question`). This helps the maintainers organize and prioritize issues.
4. **Attachments (Optional)**: You can attach screenshots, logs, or other files to help explain the issue.
![Palmr Profile Menu](/assets/v1/developers/new-issue-form.png)
---
### ✅ Submit the Issue
Once you've filled out the form, click the **Create** button at the bottom of the page. Your issue will now be visible to the project maintainers and other contributors. You can track the status of your issue and receive notifications when there are updates or responses. Feel free to participate in any follow-up discussions in the comments section of your issue.
---
### 💡 Tips for Issues
To ensure your issue is addressed quickly and effectively, follow these tips:
- **Be Clear and Specific**: Provide as much detail as possible.
- **Use a Descriptive Title**: A good title helps maintainers understand the issue at a glance.
- **Include Steps to Reproduce**: If its a bug, explain how to reproduce it.
- **Be Polite and Respectful**: Remember that maintainers and contributors are volunteering their time.
---
### ⭐ Why Issues Matter
Opening issues is a key part of contributing to open-source projects. Heres why it matters:
1. **Improves the Project**: Your feedback helps identify bugs and suggest new features.
2. **Helps Maintainers**: Clear and detailed issues make it easier for maintainers to address problems.
3. **Encourages Collaboration**: Issues can spark discussions and attract contributors to help solve problems.
---
### 🎉 Final Words
Congratulations on creating your first issue for the **Palmr** project! Your contribution is valuable and helps make the project better for everyone. Remember:
- Stay engaged with your issue's progress
- Help others when you can
- Share your knowledge and experiences
- Consider contributing code if possible
- Star the repository to show support
- Spread the word about Palmr
Thank you for being part of our open-source community. Your participation helps make Palmr better for everyone!

View File

@@ -0,0 +1,91 @@
---
title: 📤 Uploading Files
---
To upload a file in Palmr, the process has been designed to be straightforward and user-friendly. The platform offers two convenient locations where users can upload their files, ensuring flexibility and ease of access. Each location has been optimized to provide a seamless upload experience.
Before we delve into the specifics of file uploading, it's essential to understand that file sharing stands at the heart of Palmr's functionality. This core feature enables users to collaborate and distribute content efficiently. To initiate this collaborative process, you'll need to first upload one or more files to your account. Once your files are uploaded, you can proceed to create a sharing session, which serves as a container that can encompass either a single file or multiple files, depending on your specific needs.
Now let's explore the file upload process in detail. As previously mentioned, the procedure has been streamlined for maximum efficiency, and you can initiate file uploads from two distinct locations: **the Home Page** or **the My Files Page**. We will thoroughly examine both options in the following sections, though it's worth noting that the underlying upload mechanism remains consistent regardless of which location you choose.
---
## 🏠 Home Page
On the home page, you'll find a dedicated "Recent Uploads" section. When you're using Palmr for the first time and haven't uploaded any files yet, this section will appear in its initial state:
![Recent Uploads Section](/assets/v1/main/upload/recent-uploads.png)
To begin the upload process, locate and click the "Upload File" button. This action will trigger a modal window where you can browse and select the desired file from your device. For enhanced user experience, certain file formats including images, audio files, and video content will automatically generate a preview within the modal.
![Upload File Button](/assets/v1/main/upload/upload-file-button.png)
**Example with an image:**
![Preview Example](/assets/v1/main/upload/preview-example.png)
Upon selecting your file, you'll be presented with two options: confirm the upload by clicking the "Upload" button, or if you need to make changes, you can abort the process by selecting the "Cancel" button.
![Upload and Cancel Buttons](/assets/v1/main/upload/upload-cancel-buttons.png)
After successfully uploading one or more files, the "Recent Uploads" section will automatically refresh to display your newly added content:
![Recent Uploads with Files](/assets/v1/main/upload/recent-uploads-filled.png)
Should you wish to upload additional files from this view, simply click the "Upload File" button positioned in the upper right corner of the section, then follow the same straightforward procedure outlined above.
![New Upload Button](/assets/v1/main/upload/new-upload-button.png)
It's important to note that the home page list displays only your last 5 uploads for quick access. For a comprehensive view of your uploaded files or to upload additional content, you'll need to navigate to the "My Files" page. This can be accomplished in two ways: either click the "View All" button located in the upper right corner of the section, or select the "My Files" card directly from the home page.
![View All Button](/assets/v1/main/upload/view-all-button.png)
Or:
![My Files Card](/assets/v1/main/files/my-files-card.png)
---
## 📂 My Files Page
Upon accessing the **"My Files"** page, you'll be presented with this comprehensive layout:
This interface provides enhanced functionality, allowing you to **filter** through your uploaded files for better organization. You can also continue uploading new files by clicking the **"Upload File"** button and following the previously described upload procedure.
For clarity, it's worth mentioning that the tables found in both the **"Recent Files"** section and the **"My Files"** page share the same structure and organization — the primary distinction lies in the quantity of files displayed. While the **"Recent Files"** section provides quick access to your five most recent uploads, the **"My Files"** table presents a comprehensive view of your entire upload history.
The table provides detailed information through the following fields:
- **Name**
- **Description**
- **Size**
- **Created At**
- **Updated At**
- **Actions**
---
### ⚙️ Actions Column
Within the **"Actions"** column, you'll discover an interactive icon that reveals the following dropdown menu:
![Actions Dropdown](/assets/v1/main/files/actions-dropdown.png)
While most options are self-explanatory, let's examine the Edit functionality in detail:
- Edit Opens a modal where you can modify various file attributes including the file name, description, and other relevant details.
![Edit Modal](/assets/v1/main/files/edit-modal.png)
- The platform also provides the ability to **delete** files directly through the dropdown menu by selecting the **Delete** option.
For enhanced user experience, the preview functionality is available for common media formats including images, audio files, PDFs, and videos. For all other file types, you can easily access the content through the **Download** option in the dropdown menu.
---
## 📝 Notes and Recommendations
- To ensure optimal performance and user experience, we strongly recommend uploading files that have been properly optimized.
- For troubleshooting purposes, all upload errors and related issues are systematically logged and can be accessed through the administrative panel.
- System administrators have full control over file access permissions and can manage them as needed.

View File

@@ -0,0 +1,232 @@
---
title: API Endpoints
icon: Plug
---
Palmr. provides a comprehensive, well-documented, and fully typed REST API designed for maximum developer productivity and seamless integration. Whether you're building custom applications, automating workflows, or integrating with third-party services, our API offers the flexibility and reliability you need.
> **Overview:** The API is built with Fastify + Zod + TypeScript, ensuring type safety, schema validation, and excellent performance for all operations.
## Prerequisites
### Exposing the API port
To access the API endpoints, you need to expose port **3333** in your Docker configuration. This port is where the Palmr. API server runs.
**Using Docker Compose:**
```yaml
services:
palmr:
image: kyantech/palmr:latest
ports:
- "5487:5487" # Web interface
- "3333:3333" # API port (required for API access)
# ... other configuration
```
**Using Docker run command:**
```bash
docker run -d \
--name palmr \
-e ENABLE_S3=false \
-e ENCRYPTION_KEY=change-this-key-in-production-min-32-chars \
-p 5487:5487 \
-p 3333:3333 \
-v palmr_data:/app/server \
--restart unless-stopped \
kyantech/palmr:latest
```
> **Note:** Port 3333 exposure is optional if you only need the web interface. However, it's required for direct API access, custom integrations, and accessing the interactive documentation.
## Accessing the API documentation
The API documentation is available through interactive interfaces that allow you to explore, test, and validate all available endpoints directly in your browser.
### Documentation endpoints
**Local development:**
- Scalar documentation: `http://localhost:3333/docs`
- Swagger documentation: `http://localhost:3333/swagger`
**Production environment:**
- Scalar documentation: `{your_domain}:3333/docs`
- Swagger documentation: `{your_domain}:3333/swagger`
> **Important:** We don't provide an online version of the API documentation because endpoints and functionality may vary between different versions of Palmr. Always access the documentation from your specific deployment to ensure accuracy.
## Interactive documentation with Scalar
Our primary API documentation is powered by **Scalar**, a modern documentation platform that provides an exceptional developer experience.
![Palmr API Documentation](/assets/v2/api-docs/scalar.png)
### Why Scalar?
- **Interactive testing** - Test endpoints directly in the documentation
- **Real-time validation** - Immediate feedback on request/response formats
- **Modern interface** - Clean, intuitive design optimized for developer productivity
- **Type-safe integration** - Full TypeScript support with automatic type inference
- **Schema visualization** - Clear representation of request and response structures
### Key features
- **Comprehensive endpoint coverage** - All API endpoints documented with examples
- **Authentication testing** - Built-in support for JWT token authentication
- **Request builders** - Interactive forms for constructing API requests
- **Response visualization** - Formatted display of API responses with syntax highlighting
- **Code generation** - Generate client code in multiple programming languages
## Alternative Swagger documentation
For developers who prefer Swagger or need compatibility with existing tools, we also provide a Swagger-based documentation interface.
![Palmr API Documentation](/assets/v2/api-docs/swagger.png)
### When to use Swagger
- **Legacy tool compatibility** - Integration with existing Swagger-based workflows
- **Team preferences** - When your team is more familiar with Swagger interface
- **OpenAPI specification** - Direct access to OpenAPI spec for code generation
- **Third-party integrations** - Tools that specifically require Swagger format
Both documentation formats provide identical endpoint coverage and functionality, ensuring you can choose the interface that best fits your development workflow.
## API capabilities
The Palmr. API provides comprehensive access to all platform features:
### File operations
- **Upload files** - Single and batch file uploads with progress tracking
- **Download files** - Secure file retrieval with access control
- **File management** - Rename, delete, and organize files
- **Metadata access** - Retrieve file information and properties
### Share management
- **Create shares** - Generate public links for file sharing
- **Configure access** - Set passwords, expiration dates, and view limits
- **Track usage** - Monitor share views and download statistics
- **Manage recipients** - Add and remove share recipients
### User operations
- **Authentication** - Login, logout, and session management
- **Profile management** - Update user information and preferences
- **User administration** - Create and manage user accounts (admin only)
### System integration
- **Health checks** - Monitor system status and availability
- **Configuration** - Access and modify system settings
- **Storage operations** - Manage filesystem and S3 storage options
## Authentication
The API uses **HTTP-only cookies** for secure authentication. After logging in through the web interface or API, authentication is automatically handled via secure cookies:
```bash
# Login to establish authenticated session
POST /auth/login
{
"email": "user@example.com",
"password": "your-password"
}
# Subsequent requests automatically include authentication cookies
# No Authorization header needed - cookies are sent automatically
GET /api/files
```
### How authentication works
1. **Login** - Use the `/auth/login` endpoint with your credentials
2. **Cookie storage** - The server sets HTTP-only cookies containing JWT tokens
3. **Automatic authentication** - All subsequent API requests include these cookies automatically
4. **Session management** - Cookies handle session persistence and expiration
### Security features
- **HTTP-only cookies** - Tokens stored securely in HTTP-only cookies, preventing XSS attacks
- **Secure transmission** - Cookies marked as secure and same-site for enhanced protection
- **Token expiration** - Automatic session timeout for security
- **Role-based access** - Different permissions for users and administrators
- **Request validation** - All inputs validated using Zod schemas
## Getting started with the API
### 1. Expose the API port
Ensure port 3333 is exposed in your Docker configuration to access the API endpoints.
### 2. Access the documentation
Visit your Palmr. instance at `:3333/docs` to explore the interactive API documentation.
### 3. Authenticate
Use the login endpoint to establish an authenticated session. Authentication cookies will be automatically set and included in subsequent requests.
### 4. Test endpoints
Use the interactive documentation to test API endpoints and understand request/response formats.
### 5. Build your integration
Implement your custom application using the API endpoints that match your requirements.
## Integration examples
The API enables powerful integrations and automation:
**Workflow automation:**
- Automatically upload files from CI/CD pipelines
- Create shares for build artifacts and reports
- Integrate with project management tools
**Custom applications:**
- Build mobile apps with native file management
- Create specialized interfaces for specific use cases
- Develop backup and sync solutions
**Business integrations:**
- Connect with existing document management systems
- Automate file sharing workflows
- Integrate with CRM and ERP systems
## Best practices
### Performance optimization
- **Use appropriate HTTP methods** - GET for retrieval, POST for creation, etc.
- **Implement pagination** - Handle large datasets efficiently
- **Cache responses** - Store frequently accessed data locally
- **Batch operations** - Group multiple operations when possible
### Error handling
- **Check status codes** - Handle different HTTP response codes appropriately
- **Parse error messages** - Use detailed error information for debugging
- **Implement retries** - Handle temporary failures gracefully
- **Log API interactions** - Maintain audit trails for troubleshooting
### Security considerations
- **Use HTTPS** - Always encrypt API communications to protect authentication cookies
- **Secure cookies** - Authentication handled automatically via HTTP-only cookies
- **Validate inputs** - Sanitize data before sending to API
- **Monitor usage** - Track API calls for unusual activity
## Useful links
- [Scalar Official Website](https://scalar.com/) - Learn more about our primary documentation platform
- [Swagger Official Website](https://swagger.io/) - Information about the alternative documentation format
- [JWT.io](https://jwt.io/) - Understanding JSON Web Tokens for authentication

View File

@@ -0,0 +1,136 @@
---
title: Architecture of Palmr.
icon: ServerCog
---
import { ZoomableImage } from "@/components/ui/zoomable-image";
## Overview
Understanding the architecture of Palmr. is crucial for both deploying and scaling the application. The platform is designed with simplicity and flexibility in mind, offering a streamlined setup that can grow with your needs.
<ZoomableImage
src="/assets/v3/architecture/architecture.png"
alt="Palmr. Architecture"
/>
## Technologies used
Each component in the Palmr. architecture plays a vital role in ensuring reliability, performance, and scalability. The stack is built with simplicity, performance, and flexibility in mind - everything is self-hosted, developer-friendly, and designed to scale without adding unnecessary complexity.
### SQLite + Prisma ORM
Palmr. uses **SQLite** as the primary database solution combined with **Prisma ORM** for type-safe database operations. SQLite is a lightweight, serverless database that's perfect for getting started quickly while still being powerful enough for production use. SQLite is fully ACID-compliant, which means it handles transactions safely and reliably. Prisma provides a modern database toolkit that generates a type-safe client, handles migrations, and offers an intuitive query API. Together, they create a powerful combination that eliminates database administration complexity while providing excellent developer experience.
- Provides reliable and secure data storage with zero configuration required
- **Prisma ORM** offers type-safe queries and automatic TypeScript integration
- Lightweight and fast, perfect for both development and production environments
- Fully ACID-compliant with excellent performance for metadata and transactional data
- Self-contained with no external dependencies or server processes needed
- Easy database migrations and schema management through Prisma
### Next.js 15 + React + TypeScript
The frontend of Palmr. is built using **Next.js 15**, along with **React** and **TypeScript**, forming a modern stack that's easy to maintain and super fast for end users. Next.js 15 brings server components, server actions, and a new app router system that makes rendering dynamic content incredibly efficient. This allows us to load only what's needed, when it's needed - which makes the app feel snappy even under load. React provides a clean, component-based structure that makes it easy to break the UI into reusable pieces, and TypeScript helps prevent bugs before they even happen by enforcing static typing and better code navigation.
- **React** enables the creation of a dynamic and responsive user interface with a component-based architecture
- **TypeScript** adds static typing, enhancing code quality and reducing runtime errors
- **Next.js 15** handles routing, server-side rendering, and server components for performance at scale
### Filesystem storage
Palmr. uses **filesystem storage** as the default storage solution, keeping things simple and efficient. Files are organized in a structured directory layout on the local filesystem, making it easy to understand, backup, and manage. This approach eliminates external dependencies and provides excellent performance for most use cases. The system also supports **S3-compatible object storage** as an optional alternative for users who need cloud storage or additional scalability features.
- Simple and reliable file storage with organized directory structure
- No external dependencies required for basic operation
- Excellent performance for local file operations
- Optional S3-compatible storage support for cloud deployments and scalability
### Fastify + Zod + TypeScript
The backend of Palmr. is powered by **Fastify**, **Zod**, and **TypeScript**, creating a robust and type-safe API layer. Fastify is a super-fast Node.js web framework optimized for performance and low overhead, designed to handle lots of concurrent requests with minimal resource usage. Zod provides runtime type validation and schema definition, ensuring all incoming data is properly validated before reaching business logic. TypeScript adds compile-time type safety throughout the entire backend codebase. This combination creates a highly reliable and maintainable backend that prevents bugs and security issues while maintaining excellent performance.
- **Fastify** provides fast request handling with a lightweight core
- **Zod** enables runtime schema validation and type inference
- **TypeScript** ensures type safety across the entire backend codebase
- Built-in schema-based validation for secure and reliable API handling
- Supports plugin-based architecture for easy extensibility
- Optimized for high performance with minimal resource usage
## How it works
The Palmr. architecture follows a clean separation of concerns, making it easy to understand and maintain:
1. **Frontend** — React + TypeScript + Next.js 15 handle the user interface and user interactions
2. **Backend** — Fastify + Zod + TypeScript process requests with full type safety and validation
3. **Database** — SQLite + Prisma ORM store and manage data with type-safe operations
4. **File Storage** — Filesystem storage handles file operations with optional S3-compatible support
## API integration and extensibility
One of Palmr.'s key strengths is its **open API architecture**, designed to integrate seamlessly with existing workflows and third-party services. The API can be exposed publicly, allowing for powerful integrations and custom development opportunities.
### Open API endpoints
Palmr. provides comprehensive REST API endpoints that can be integrated with various services and platforms:
**Popular integration possibilities:**
- **Zapier** - Automate file sharing workflows and connect with 5,000+ apps
- **Microsoft Power Automate** - Create automated workflows within Microsoft ecosystem
- **IFTTT** - Simple automation for personal and business use cases
- **n8n** - Self-hosted workflow automation for advanced users
- **GitHub Actions** - Integrate file sharing into CI/CD pipelines
- **Slack/Discord Bots** - Share files directly from chat platforms
- **Mobile Apps** - Build custom mobile applications using the API
- **Desktop Applications** - Create native desktop clients for specific use cases
### Custom development opportunities
The open API architecture enables developers to:
- **Build custom clients** - Create specialized interfaces for specific industries or use cases
- **Develop integrations** - Connect Palmr. with existing business systems and workflows
- **Create automation scripts** - Automate repetitive file management tasks
- **Build mobile apps** - Develop native iOS/Android applications
- **Integrate with CMS** - Connect content management systems for seamless file handling
- **Create backup solutions** - Build automated backup and sync tools
### API benefits
- **RESTful design** - Standard HTTP methods and status codes for easy integration
- **Comprehensive documentation** - Complete API reference with examples and use cases
- **Authentication support** - Secure API access with JWT token-based authentication
- **Schema validation** - Built-in request/response validation using Zod schemas
- **Type safety** - Full TypeScript support for reliable integrations
- **Bulk operations** - Efficient handling of multiple files and batch operations
This open architecture makes Palmr. not just a file-sharing platform, but a **file management ecosystem** that can adapt to any workflow or business requirement. Whether you're a developer looking to integrate file sharing into your application or a business wanting to automate file workflows, Palmr.'s API provides the flexibility and power you need.
## Storage flexibility
Palmr. is designed to be flexible in how you handle file storage:
**Default setup (Filesystem):**
- Files stored directly on the local filesystem
- Simple directory structure for easy management
- Perfect for single-server deployments and development
- No additional configuration required
**Optional S3-compatible storage:**
- Enable S3 storage by setting `ENABLE_S3=true`, look at [S3 Providers](/docs/3.0-beta/s3-providers) for more information.
- Compatible with AWS S3, MinIO, and other S3-compatible services
- Ideal for cloud deployments and distributed setups
- Provides additional scalability and redundancy options
## Useful links
- [SQLite Documentation](https://www.sqlite.org/docs.html)
- [Prisma Documentation](https://www.prisma.io/docs)
- [Next.js Documentation](https://nextjs.org/docs)
- [React Documentation](https://react.dev/)
- [TypeScript Handbook](https://www.typescriptlang.org/docs/)
- [Fastify Documentation](https://fastify.dev/docs/latest/)
- [Zod Documentation](https://zod.dev/)

View File

@@ -0,0 +1,66 @@
---
title: Available Languages
icon: Globe
---
The project leverages next-intl, a powerful and flexible internationalization (i18n) library, to provide comprehensive language support across the entire application. This robust solution enables seamless translation management, date/time formatting, number formatting, and pluralization rules across different locales.
The integration of next-intl ensures consistent internationalization throughout the application's components, pages, and features, while maintaining optimal performance through efficient bundle splitting and lazy loading of language resources. With its TypeScript support and React Server Components compatibility, next-intl serves as the foundation for delivering a truly global and accessible user experience.
## Supported languages
Palmr currently supports 15 languages with complete translations across all application features and interfaces.
---
| Language | Code | Description | Translation |
| -------------------- | ----- | -------------------------------------------------------- | ----------- |
| English | en-US | Primary development language and default fallback option | 100% |
| Portuguese | pt-BR | Standard Brazilian Portuguese support | 100% |
| French | fr-FR | Standard French language support | 100% |
| Spanish | es-ES | Standard Spanish language support | 100% |
| German | de-DE | Standard German language support | 100% |
| Russian | ru-RU | Standard Russian language support | 100% |
| Hindi | hi-IN | Standard Hindi language support | 100% |
| Arabic | ar-SA | Standard Arabic language support with RTL | 100% |
| Japanese | ja-JP | Standard Japanese language support | 100% |
| Korean | ko-KR | Standard Korean language support | 100% |
| Turkish | tr-TR | Standard Turkish language support | 100% |
| Chinese (Simplified) | zh-CN | Standard Simplified Chinese support | 100% |
| Italian | it-IT | Standard Italian language support | 100% |
| Dutch | nl-NL | Standard Dutch language support | 100% |
| Polish | pl-PL | Standard Polish language support | 100% |
## Language selection
The application provides two convenient methods for language selection, ensuring a seamless user experience across different user preferences and scenarios.
### Automatic detection
The application features sophisticated automatic detection of the user's preferred browser language settings. It intelligently utilizes the browser's preconfigured language preferences to set the initial application language, providing an immediate localized experience without requiring user intervention.
### Manual selection
![Language Selector](/assets/v3/languages/languages.png)
Users have complete control to manually select their preferred language through an intuitive language selector interface in the UI. The language selector is easily accessible and provides immediate language switching capabilities.
Selected language preferences are persistently stored in the browser's localStorage, ensuring a consistent experience across sessions and eliminating the need to reselect languages on subsequent visits.
## Default language
English (en-US) serves as the system's fallback language, ensuring consistent functionality even when language detection or selection encounters issues. This means that if a user's preferred language is not available or if there are any problems with language selection, the application will automatically default to English.
This fallback mechanism is crucial for maintaining a seamless user experience and preventing any potential language-related disruptions. Additionally, all new features and updates are first implemented in English before being translated into other supported languages, ensuring that the English version always remains the most up-to-date and comprehensive.
## Language detection
The application employs advanced detection mechanisms to automatically identify and apply the user's browser language settings as the initial language configuration. This process analyzes the browser's language preferences and matches them against available translations.
For maximum flexibility, users can easily override this automatic selection at any time using the convenient language switcher, accessible via the globe icon prominently displayed in the navigation bar.
## RTL support
The application incorporates comprehensive right-to-left (RTL) text handling capabilities, with particular attention paid to Arabic (ar-SA) language requirements. This includes proper text alignment, layout direction, and user interface elements that adapt to RTL reading patterns.
RTL support ensures that Arabic-speaking users receive a native and intuitive experience, with all interface elements properly oriented and text flowing in the correct direction for optimal readability and usability.

View File

@@ -0,0 +1,148 @@
---
title: Configuring SMTP
icon: Mail
---
For Palmr to function with all its best features, you need to configure an email server. To make this process easier, there's a built-in configuration panel inside **Settings** in Palmr. However, only users with an **ADMIN** profile can access and configure these settings.
This guide walks you through the complete process of setting up SMTP for your Palmr installation, ensuring that email-dependent features work seamlessly.
## Why configure SMTP?
Configuring SMTP is essential for enabling key email functionalities that enhance the user experience and ensure proper system operation.
The main functionalities that depend on SMTP configuration are:
- **Password Reset** Users who forget their password and cannot access the **Settings** panel need this feature to regain access to their accounts.
- **Email Notifications** Recipients will receive email notifications when new shares are sent to them, keeping them informed about shared content.
Without proper SMTP configuration, these features will not work, potentially leaving users unable to recover their accounts or stay informed about shared files.
Now, let's go through the step-by-step process to configure the **SMTP Server**.
---
## Accessing SMTP settings
To configure SMTP settings, you'll need administrative access to the Palmr settings panel.
### Prerequisites
Before beginning the configuration process:
- Ensure you have **ADMIN** user privileges in Palmr
- Have your SMTP server credentials ready
- For Gmail users, prepare to generate an App Password
### Navigating to settings
To access **Settings**, an **ADMIN** user must click on the profile picture in the **header** and select **Settings** from the dropdown menu.
![Dropdown Menu](/assets/v3/smtp/dropdown-menu.png)
Once inside the **Settings** panel, click on the **Email** card to expand the SMTP configuration options.
![Closed Settings Card](/assets/v3/smtp/closed-card.png)
After expanding the card, the following SMTP configuration fields will appear:
![Opened Settings Card](/assets/v3/smtp/opened-card.png)
---
## Configuring SMTP server
The SMTP configuration process involves enabling the service and configuring the necessary connection details.
### Enabling SMTP
The first step is to **enable SMTP** by selecting "Yes" in the **SMTP Enabled** field.
![SMTP Enabled](/assets/v3/smtp/smtp-enabled.png)
### Configuration fields
Once SMTP is enabled, you can configure the other necessary fields:
**Sender Name** This will appear as the sender's name in all outgoing emails. Use a recognizable name like "Palmr" or your organization name.
**Sender Email** The email address from which notifications will be sent. Use a professional address like "noreply@palmr.app" or "notifications@yourdomain.com".
**SMTP Server** The SMTP server address provided by your email service. For Gmail, use `smtp.gmail.com` (this is the recommended option and set as default).
**SMTP Port** The server port used for connections. For Gmail, the standard port is **587** (TLS encryption).
**SMTP Username** The username for authenticating with your SMTP server. For Gmail, enter your complete email address.
**SMTP Password** The password for SMTP authentication. For Gmail, you must use an **App Password** (not your regular email password).
### Important security note
**Important:** If using **Gmail**, you need to generate an **App Password** instead of using your standard email password. This provides better security and is required for applications like Palmr.
For other email services, consult the official documentation of the service provider you are using. We recommend using Gmail for its simplicity, reliability, and reasonable email sending limits.
---
## Generating a Gmail App Password
Gmail requires App Passwords for third-party applications to ensure account security while maintaining functionality.
### Step-by-step process
To generate an App Password for Gmail:
1. **Access Your Account**: Go to [Google My Account](https://myaccount.google.com/)
2. **Navigate to Security**: Select the **Security** section from the menu
3. **Find App Passwords**: Scroll down to locate **App Passwords** (you may need to enable 2-factor authentication first)
4. **Generate Password**: Create a new password specifically for Palmr
5. **Save Securely**: Copy and store the generated password safely
### Additional resources
For a complete guide with screenshots and detailed instructions, refer to: **[How to set up SMTP credentials with Gmail](https://medium.com/rails-to-rescue/how-to-set-up-smtp-credentials-with-gmail-for-your-app-send-email-cf236d11087d)**.
### Gmail configuration summary
When using Gmail, your final settings should be:
- **SMTP Server**: `smtp.gmail.com`
- **SMTP Port**: `587`
- **SMTP Username**: Your Gmail address
- **SMTP Password**: Generated App Password (16 characters)
---
## Testing your configuration
After completing the configuration, it's important to verify that everything works correctly.
### Validation steps
1. **Save Settings**: Apply your SMTP configuration in the Palmr interface
2. **Test Password Reset**: Try the password reset feature with a test account to ensure emails are sent
3. **Test Notifications**: Create a test share to verify that notification emails are delivered
4. **Check Email Delivery**: Confirm that emails arrive in the recipient's inbox (not spam folder)
### Troubleshooting common issues
If emails are not being sent:
- Verify that all fields are filled correctly
- For Gmail, ensure you're using the App Password, not your regular password
- Check that your email provider allows SMTP connections
- Confirm that port 587 is not blocked by your firewall
---
## Finalizing SMTP configuration
After entering the correct information and testing the functionality, save the settings.
Your Palmr installation is now ready to:
- Send password reset emails to users who need account recovery
- Deliver share notifications to recipients automatically
- Provide a complete user experience with reliable email communication
With SMTP properly configured, users can take full advantage of Palmr's email-dependent features, ensuring a smooth and professional experience when sharing files and managing their accounts.

View File

@@ -0,0 +1,442 @@
---
title: How to Contribute
icon: Users
---
## Introduction
Thank you for your interest in contributing to the **Palmr** project! Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Whether you're fixing bugs, adding new features, improving documentation, or sharing ideas, every contribution helps make Palmr better for everyone.
We welcome contributors of all experience levels - from beginners to seasoned developers. This comprehensive guide will walk you through the process of contributing to Palmr, from setting up your development environment to submitting your first pull request.
We're excited to have you join our community of contributors and look forward to seeing what you'll bring to the project.
---
## GitHub account requirements
Before you can contribute, you'll need to be logged into your GitHub account. If you don't have an account yet, creating one is free and opens up the entire world of open-source collaboration.
### Account setup benefits
Having a GitHub account is essential as it allows you to:
- Fork repositories and create your own copies
- Submit pull requests to propose changes
- Interact with other contributors and maintainers
- Track issues and participate in discussions
- Build your open-source portfolio
### Security recommendations
When creating your account:
- Use a professional email address for your GitHub account
- Enable two-factor authentication for enhanced security
- Customize your profile to showcase your interests and skills
- Explore the GitHub community to discover other projects
If you need to create an account, visit [GitHub's signup page](https://github.com/signup) and follow the registration process.
---
## Accessing the repository
Once you're logged into your GitHub account, you'll need to navigate to the Palmr repository to begin your contribution journey.
### Direct access
Visit the Palmr repository directly: [https://github.com/kyantech/Palmr](https://github.com/kyantech/Palmr)
The repository contains all the source code, documentation, and resources for the Palmr project. Take time to explore the repository structure, including the README file, which provides an overview of the project.
### Alternative access methods
You can also find the repository by:
- Searching for "Palmr" in the GitHub search bar
- Looking for the repository owned by **kyantech**
- Accessing it through Kyantech's organization page
### Repository verification
When searching, ensure you're accessing the official repository by:
- Checking the owner and repository name match exactly
- Verifying the description matches the Palmr project
- Confirming recent activity from the maintainers
- Reviewing the number of stars, forks, and watchers
---
## Forking the repository
To contribute to the project, you'll need to create your own copy of the repository. This process is called **forking** and is fundamental to the GitHub collaboration workflow.
### Creating your fork
Here's how to fork the repository:
1. **Locate the Fork Button**: Click the **Fork** button at the top right of the repository page
2. **Select Destination**: Choose where you want to fork the repository (your personal account or an organization)
3. **Wait for Creation**: Allow a few moments while GitHub creates your fork
4. **Automatic Redirect**: You'll be redirected to your forked repository once it's ready
### Fork benefits
Your fork will maintain a connection to the original repository, allowing you to:
- Keep your fork synchronized with the original repository
- Submit pull requests from your fork to the original repository
- Work independently on your own copy without affecting the original
- Experiment with changes before proposing them
---
## Cloning your fork
After forking the repository, you'll need to clone it to your local machine to begin making changes.
### Clone process
Follow these steps to clone your forked repository:
1. **Access Clone Options**: On your forked repository page, click the **Code** button
2. **Copy Repository URL**: Copy the repository URL (HTTPS or SSH, depending on your preference)
3. **Open Terminal**: Open your terminal or command prompt
4. **Execute Clone Command**: Run the following command to clone the repository:
```bash
git clone <repository-url>
```
5. **Navigate to Directory**: Move into the cloned directory:
```bash
cd Palmr
```
### Clone verification
After cloning, verify your setup by:
- Confirming all files are present in your local directory
- Checking that you can access the project files
- Testing that Git is properly configured for the repository
---
## Setting up the base branch
Before making changes, ensure your local repository is properly configured to track the correct branch from the original Palmr repository.
### Remote configuration
Set up your repository to track the upstream repository:
1. **Add Upstream Remote**: Add the original Palmr repository as a remote:
```bash
git remote add upstream https://github.com/kyantech/Palmr.git
```
2. **Fetch Latest Changes**: Retrieve the latest changes from the `next` branch:
```bash
git fetch upstream next
```
3. **Create Feature Branch**: Create a new branch for your contribution based on `upstream/next`:
```bash
git checkout -b your-branch-name upstream/next
```
### Branch naming conventions
When creating your branch, use descriptive names that indicate the purpose of your changes:
- `feature/user-authentication` for new features
- `fix/login-bug` for bug fixes
- `docs/api-documentation` for documentation updates
- `refactor/database-queries` for code improvements
---
## Making your changes
Now you're ready to implement your contributions! This is where your creativity and technical skills come into play.
### Types of contributions
Your contributions could include:
- **Bug Fixes**: Resolving issues and improving stability
- **New Features**: Adding functionality that enhances the project
- **Documentation**: Improving guides, API docs, and examples
- **Testing**: Writing or improving test coverage
- **Performance**: Optimizing code for better efficiency
- **Accessibility**: Making the project more inclusive
- **Translations**: Adding support for different languages
- **Code Quality**: Refactoring and improving code structure
### Development best practices
When making changes, follow these guidelines:
1. **Follow Style Guidelines**: Ensure your code adheres to the project's coding standards
2. **Test Incrementally**: Run tests locally to catch issues early
3. **Keep Changes Focused**: Address a single issue or feature per contribution
4. **Document Changes**: Update or add documentation as needed
5. **Review Your Work**: Double-check changes before committing
### Development workflow
Maintain a productive workflow by:
- Regularly saving your work and committing small, logical changes
- Testing your changes incrementally to identify issues quickly
- Keeping your branch updated with the latest upstream changes
- Seeking feedback early if you're unsure about your approach
---
## Using conventional commits
Once you've made your changes, commit them using **Conventional Commits** format. This standard helps maintain a clean and consistent commit history that's easy to understand and automate.
### Commit message format
Structure your commit messages as follows:
`<type>(<scope>): <description>`
### Commit types and examples
**Common commit types:**
- `feat: add user authentication system`
- `fix(api): resolve null pointer exception in user service`
- `docs: update installation instructions in README`
- `test: add unit tests for user validation`
- `refactor: simplify database connection logic`
- `style: fix code formatting in auth module`
- `chore: update project dependencies`
### Committing your changes
Follow these steps to commit your work:
1. **Stage Changes**: Add your changes to the staging area:
```bash
git add .
```
2. **Commit with Message**: Create a commit with a properly formatted message:
```bash
git commit -m "feat: add new feature for user profiles"
```
### Commit best practices
- Write clear, concise commit messages
- Use the imperative mood ("add" not "added")
- Keep the first line under 50 characters
- Include additional details in the body if necessary
---
## Pushing your changes
After committing your changes locally, you need to push them to your forked repository on GitHub to make them available for review.
### Push process
Synchronize your local changes with your remote repository:
1. **Check for Updates**: Ensure your branch is current with any remote changes:
```bash
git pull origin your-branch-name
```
2. **Push Commits**: Upload your commits to your forked repository:
```bash
git push origin your-branch-name
```
3. **Set Upstream** (first push only): If this is your first push for this branch:
```bash
git push -u origin your-branch-name
```
### Troubleshooting push issues
If you encounter errors while pushing:
- Verify you have the correct permissions on your fork
- Check your remote URL configuration using `git remote -v`
- Ensure you're authenticated with GitHub properly
- Confirm your branch name matches what you're trying to push
---
## Creating a pull request
With your changes pushed to GitHub, you can now create a **Pull Request (PR)** to propose your changes to the main Palmr repository.
### Pull request setup
Create your pull request by following these steps:
1. **Navigate to Your Fork**: Go to your forked repository on GitHub
2. **Initiate PR**: Click the **Pull Request** button or **Compare & pull request** if available
3. **Configure PR Settings**: On the PR creation page, set:
- **Base repository**: `kyantech/Palmr`
- **Base branch**: `next`
- **Head repository**: Your forked repository
- **Compare branch**: Your feature branch (`your-branch-name`)
### Pull request content
Fill out the PR form with comprehensive information:
- **Clear Title**: Write a descriptive title that summarizes your changes
- **Detailed Description**: Explain what your changes do and why they're needed
- **Related Issues**: Reference any issues your PR addresses
- **Testing Information**: Describe how you tested your changes
- **Screenshots**: Include visual evidence if your changes affect the UI
### PR checklist
Before submitting, ensure your PR:
- Has a clear, descriptive title
- Includes a comprehensive description
- References related issues
- Follows the project's contribution guidelines
- Includes appropriate tests
- Updates documentation if necessary
---
## Awaiting review
Once your PR is submitted, the project maintainers will review your changes. This collaborative process ensures code quality and project consistency.
### Review process expectations
During the review process:
- **Monitor Notifications**: Keep an eye on GitHub notifications for comments or requests
- **Respond Promptly**: Address feedback in a timely and professional manner
- **Make Updates**: If changes are requested, update your branch and push new commits
- **Ask Questions**: Don't hesitate to seek clarification if feedback is unclear
- **Stay Patient**: Review times vary depending on maintainer availability and PR complexity
### Handling feedback
When receiving feedback:
- Approach it as a learning opportunity
- Ask questions if you don't understand suggestions
- Make requested changes promptly
- Thank reviewers for their time and input
- Stay engaged throughout the process
### Review timeline
Remember that:
- Maintainers are often volunteers with limited time
- Complex changes may require multiple review rounds
- The review process helps ensure high-quality contributions
- Your patience and cooperation are appreciated
---
## Contribution best practices
To maximize the chances of your contribution being accepted, follow these proven practices:
### Code quality standards
- **Use Conventional Commits**: Maintain consistent commit message formatting
- **Keep PRs Focused**: Address one issue or feature per pull request
- **Write Comprehensive Tests**: Include tests for new features and bug fixes
- **Follow Code Style**: Adhere to the project's coding standards and guidelines
- **Update Documentation**: Keep documentation synchronized with code changes
### Collaboration guidelines
- **Engage Constructively**: Participate in PR discussions with a positive attitude
- **Review Others' Work**: Help the community by reviewing other contributors' pull requests
- **Stay Updated**: Keep your fork synchronized with the main repository
- **Be Patient**: Understand that maintainers balance multiple responsibilities
- **Communicate Clearly**: Express your ideas and questions clearly and respectfully
### Continuous improvement
- **Learn from Feedback**: Use review comments as opportunities to improve your skills
- **Study the Codebase**: Understand the project structure and patterns before contributing
- **Start Small**: Begin with minor contributions to familiarize yourself with the process
- **Build Relationships**: Engage with the community to build lasting connections
---
## Why contribute to open source?
Contributing to open-source projects like Palmr offers numerous personal and professional benefits that extend far beyond the immediate code changes.
### Personal development
**Skill Building**: You'll gain hands-on experience with Git, GitHub, collaborative coding, and industry-standard development practices.
**Portfolio Enhancement**: Open-source contributions demonstrate your skills to potential employers and showcase your commitment to continuous learning.
**Problem-Solving**: Working on real-world projects helps you develop critical thinking and problem-solving abilities.
### Community impact
**Project Improvement**: Your contributions directly help make the project better for all users and contributors.
**Knowledge Sharing**: By contributing, you share your expertise and learn from others in the community.
**Ecosystem Support**: Open-source projects thrive on community contributions, and your work helps sustain the entire ecosystem.
### Professional benefits
**Networking**: Connect with developers, maintainers, and other contributors from around the world.
**Recognition**: Build your reputation in the developer community through quality contributions.
**Career Opportunities**: Many career opportunities arise from open-source involvement and community connections.
---
## Next steps
Congratulations! You now have all the knowledge needed to contribute effectively to the **Palmr** project. Your contributions, whether large or small, make a meaningful difference to the project and its community.
### Getting started
Ready to make your first contribution? Consider starting with:
- **Documentation improvements**: Fix typos, clarify instructions, or add examples
- **Bug fixes**: Address issues reported by other users
- **Feature enhancements**: Implement small improvements to existing functionality
- **Test coverage**: Add tests to improve project reliability
### Staying engaged
Continue your involvement by:
- Following the project's progress and updates
- Participating in community discussions
- Helping other new contributors get started
- Sharing your experience with the broader developer community
Thank you for your interest in contributing to Palmr. We look forward to seeing your contributions and welcoming you to our community of developers working together to make Palmr better for everyone.

View File

@@ -0,0 +1,179 @@
---
title: GitHub Sponsors
icon: Heart
---
## Introduction
Sponsoring a project on GitHub is a powerful way to support its development and ensure its long-term sustainability. This guide walks you through the process of sponsoring the **Palmr** project using GitHub Sponsors.
By becoming a sponsor, you directly contribute to the project's growth and help maintain its quality. Your sponsorship enables:
- Continuous development and timely bug fixes
- Implementation of new features and improvements
- Coverage of hosting and infrastructure costs
- Recognition of the developers' dedication and hard work
- Building a community of supporters who value open source development
---
## GitHub account requirements
Before you can sponsor a project, you'll need to be logged into your GitHub account. If you don't have an account yet, creating one is free and provides additional benefits beyond sponsorship.
### Account benefits
Having a GitHub account allows you to:
- Follow project updates and releases
- Report issues and suggest improvements
- Contribute to project discussions
- Access sponsor-exclusive content when available
- Participate in the broader GitHub community
If you need to create an account, visit [GitHub's signup page](https://github.com/signup) and follow the registration process.
---
## Accessing the repository
Once you're logged into your GitHub account, navigate to the Palmr repository to begin the sponsorship process.
### Direct access
Visit the Palmr repository directly: [https://github.com/kyantech/Palmr](https://github.com/kyantech/Palmr)
### Alternative methods
You can also find the repository by:
- Searching for "Palmr" in the GitHub search bar
- Looking for the repository owned by **Kyantech**
- Accessing it through Kyantech's profile page
### Additional repository actions
While you're on the repository page, consider:
- **Starring** the repository to show your support
- **Watching** it to receive notifications about updates
- **Forking** it if you're interested in contributing code
---
## Initiating sponsorship
The sponsorship process begins with locating and clicking the sponsor button on the repository page.
### Finding the sponsor button
On the Palmr repository page, you'll find a **Sponsor** button prominently displayed in the top section of the page. This button is typically highlighted in a distinct color to ensure visibility.
![Palmr Sponsor Button](/assets/v1/sponsor/sponsor-btn.png)
### Quick access
**Pro Tip**: If you've previously sponsored projects, you can access your sponsorship dashboard directly through your GitHub profile under the "Sponsoring" section.
---
## Selecting your sponsorship level
GitHub Sponsors offers flexible sponsorship options to accommodate different budgets and preferences.
### Custom sponsorship options
GitHub Sponsors allows you to sponsor the project with a **custom amount starting at $1**:
1. **Enter Custom Amount**: Look for the option to enter a custom sponsorship amount
2. **Choose Your Amount**: Select any amount you're comfortable with (e.g., $1, $5, $10, or higher)
3. **Select Billing Frequency**: Choose between **monthly** recurring sponsorship or **one-time** payment
4. **Consider Annual Options**: Some projects offer simplified annual sponsorship plans
5. **Review Tier Benefits**: Check for any special benefits available at different sponsorship levels
![Sponsor Page Example](/assets/v1/sponsor/sponsor-page.png)
### Sponsorship recommendations
- **Monthly Sponsorship**: Provides consistent support for ongoing development
- **One-time Sponsorship**: Perfect for showing appreciation for specific features or releases
- **Higher Tiers**: May include additional benefits like early access or direct communication
---
## Completing your sponsorship
After selecting your sponsorship amount and billing preferences, you'll proceed to the payment process.
### Payment process
1. **Review Your Selection**: Confirm your sponsorship amount and billing frequency
2. **Enter Payment Details**: Provide your payment information as prompted
3. **Complete Transaction**: Follow GitHub's secure payment process
4. **Confirmation**: Receive confirmation of your successful sponsorship
Once the process is complete, you'll officially become a **Palmr sponsor** and join our community of supporters.
---
## The impact of your sponsorship
Understanding why sponsorship matters helps illustrate the value of your contribution to the open source ecosystem.
### Project sustainability
**Long-term Maintenance**: Your sponsorship helps ensure the project remains actively maintained and supported over time.
**Innovation Support**: Financial backing gives developers the freedom to experiment with new ideas and implement innovative features.
**Meaningful Recognition**: Sponsoring represents a tangible way to express appreciation for the developers' dedication and hard work.
**Community Recognition**: Many projects publicly acknowledge their sponsors, potentially featuring you in project documentation or websites.
**Open Source Growth**: Your support contributes to the broader open source ecosystem, helping valuable projects thrive and grow.
---
## Post-sponsorship experience
After becoming a sponsor, you'll gain access to additional benefits and recognition within the Palmr community.
### What to expect
Once your sponsorship is confirmed:
1. **Email Confirmation**: You'll receive a confirmation email from GitHub detailing your sponsorship
2. **Sponsor Recognition**: Your name will be added to our sponsors list and acknowledgments
3. **Exclusive Content**: Access to sponsor-only updates, insights, and project information
4. **Community Access**: Invitation to join our private Discord channel for sponsors
5. **Early Access**: Priority access to new features and beta releases when available
### Ongoing benefits
As a sponsor, you become part of an exclusive community that:
- Receives regular updates on project development
- Has opportunities to provide input on project direction
- Gets recognition for supporting open source development
- Enjoys priority support when available
---
## Next steps
Congratulations! You've successfully sponsored the **Palmr** project on GitHub. Your support plays a crucial role in ensuring this open source project continues to evolve and serve the community effectively.
### Welcome to the community
Your sponsorship means more than financial support—it represents a vote of confidence in the project's vision and future. We appreciate your contribution and welcome you to our growing community of supporters.
### Staying connected
Consider following the project's progress through:
- Regular updates in sponsor communications
- Participation in community discussions
- Engagement with new features and releases
- Sharing your experience with others who might benefit from Palmr
Thank you for supporting open source development and helping make Palmr better for everyone.

View File

@@ -0,0 +1,144 @@
---
title: Star on GitHub
icon: Star
---
## Introduction
Starring a project on GitHub is a simple yet powerful way to show appreciation for a repository and bookmark it for future reference. This guide walks you through starring the **Palmr** project on GitHub.
When you star our repository, you help increase its visibility and support the ongoing development of the project. It's a quick action that makes a meaningful difference to the project's growth.
---
## GitHub account setup
Before you can star a project, you'll need to be logged into your GitHub account. If you don't have an account yet, creating one is free and straightforward.
### Creating a New Account
1. Visit [GitHub's signup page](https://github.com/signup)
2. Enter your email address
3. Create a strong password
4. Choose a unique username
5. Complete the verification process
6. Select your preferences and finish the setup
**Important**: Make sure to verify your email address after creating your account to access all GitHub features.
---
## Accessing the repository
There are several ways to find and access the Palmr repository on GitHub:
### Direct Access
The quickest method is to visit the repository directly: [https://github.com/kyantech/Palmr](https://github.com/kyantech/Palmr)
### Using GitHub Search
1. Navigate to GitHub's main page
2. Click the search bar at the top of the page
3. Type "Palmr" in the search field
4. Look for the repository owned by **Kyantech**
5. Click on the repository name to access it
### Through the Organization Profile
1. Visit Kyantech's GitHub profile
2. Navigate to the "Repositories" tab
3. Find and click on "Palmr"
---
## Locating the star button
Once you're on the Palmr repository page, you'll find the star functionality in the repository's action bar.
### Finding the Button
1. Look at the top section of the repository page
2. Find the row of action buttons (Watch, Fork, Star)
3. The Star button is prominently displayed with a star icon
4. You'll see the current star count displayed next to the button
![Palmr Profile Menu](/assets/v1/sponsor/star-btn.png)
---
## Starring the repository
Clicking the star button is straightforward, and you'll receive immediate visual confirmation of your action.
### What happens when you star
After clicking the "Star" button, you'll notice several changes:
1. The button text changes from "Star" to "Unstar"
2. The star count increases by one
3. The button becomes highlighted to indicate it's active
4. The repository is automatically added to your starred repositories list
### Accessing your starred repositories
You can view all your starred repositories anytime by:
- Clicking your profile picture in the top-right corner
- Selecting "Your stars" from the dropdown menu
- Or visiting directly: `https://github.com/[your-username]?tab=stars`
**Note**: To remove your star later, simply click the "Unstar" button at any time.
![Palmr Profile Menu](/assets/v1/sponsor/starred-button.png)
---
## Why your star matters
Starring a repository goes beyond simple bookmarking—it's a meaningful way to support the project and its development team.
### Impact on the Project
**Shows Appreciation**: Starring demonstrates your appreciation for the hard work and effort invested in maintaining and developing the project.
**Increases Visibility**: Repositories with more stars gain higher visibility on GitHub, appearing more prominently in search results and recommendations.
**Motivates Developers**: Seeing stars encourages the development team to continue improving and expanding the project.
**Improves Discoverability**: GitHub's algorithm prioritizes repositories with higher star counts in trending sections and discovery features.
**Personal Benefits**: Starred repositories are saved to your personal list for easy access whenever you need them.
**Supports Open Source**: Your participation helps sustain the open-source ecosystem and the continued development of Palmr.
---
## The bigger picture
While starring takes only a moment, its impact on project growth and development is significant. Here's what your star represents:
- **Project Momentum**: Each star contributes to building momentum and community interest
- **Community Growth**: Stars encourage more developers to discover and participate in the project
- **Valuable Feedback**: Star counts provide insight into the project's value and community reception
- **Development Goals**: Higher star counts help the team set ambitious goals and secure resources
- **Sustainable Development**: Community support through stars helps maintain long-term project sustainability
Your star represents more than a number—it's a vote of confidence in our vision and directly influences Palmr's future development.
---
## Next steps
Congratulations! You've successfully starred the **Palmr** project on GitHub. Thank you for joining our community and supporting the project's growth.
### Additional Ways to Contribute
Consider exploring other ways to engage with the Palmr community:
- **Share the Project**: Tell others about Palmr and help expand our community
- **Report Issues**: Help improve the project by reporting bugs or suggesting enhancements
- **Contribute Code**: Submit pull requests to directly contribute to development
- **Join Discussions**: Participate in community discussions and provide feedback
Every form of engagement helps make Palmr better for everyone in the community.

View File

@@ -0,0 +1,142 @@
---
title: GitHub Architecture
icon: Github
---
import { File, Folder, Files } from "fumadocs-ui/components/files";
This guide provides a comprehensive overview of Palmr.'s GitHub repository structure, explaining how the different components are organized in the codebase. Understanding this architecture will help you navigate the repository, contribute effectively, and understand how the project is structured.
> **Overview:** Palmr. uses a monorepo architecture with clear separation between frontend, backend, and documentation components.
## Project structure
<Files>
<Folder name="apps" defaultOpen>
<Folder name="docs">
<File name="all documentation files" />
</Folder>
<Folder name="server">
<File name="all backend files" />
</Folder>
<Folder name="web">
<File name="all frontend files" />
</Folder>
</Folder>
<File name="other project files" />
</Files>
## Core components
### Frontend application (apps/web)
**Technology stack:**
- Next.js 15 (App Router)
- React 18
- TypeScript
- TailwindCSS
- shadcn/ui components
- next-intl for internationalization
Palmr.'s frontend is built with **Next.js 15**, using the App Router and Server Components for performance, scalability, and flexibility. The structure is modular and feature-based, keeping things easy to evolve as the product grows. UI logic runs on **React 18**, and **TypeScript** adds type safety that prevents a lot of silent bugs. Styles are handled with **TailwindCSS**, letting us build clean, responsive interfaces quickly. For components, we rely on **shadcn/ui**, a headless component library built with Radix UI and Tailwind, it's fast, accessible, and fully customizable.
Internationalization is handled by **next-intl**, which integrates perfectly with Next.js routing. It supports locale-aware routes, per-page translation loading, and plural rules, all without any extra client-side bloat. It's flexible, lightweight, and great for apps with multilingual audiences.
The frontend is organized with:
- A **components-based architecture** for modular UI
- **Custom hooks** to isolate logic and side effects
- A **route protection system** using session cookies and middleware
- A **file management interface** integrated with the backend
- A **reusable modal system** used for file actions, confirmations, and more
- **Dynamic, locale-aware routing** using next-intl
### Backend service (apps/server)
**Technology stack:**
- Fastify
- SQLite
- Filesystem storage (with S3-compatible object storage support)
- Prisma ORM
The backend is built on **Fastify**, a blazing-fast web framework for Node.js. It's lightweight, modular, and optimized for high performance. Every route is validated using JSON schema, which helps keep the API consistent and secure. Auth flows are built using JWTs stored in HTTP-only cookies, and everything from file uploads to token-based sharing goes through this layer.
Data is stored in **SQLite**, which handles user info, file metadata, session tokens, and more. For file storage, the system uses **filesystem storage** by default, keeping files organized in the local file system. The architecture also supports **S3-compatible object storage** as an alternative storage option for scalability. We use **Prisma** as our ORM to simplify database access, it gives us type-safe queries and easy-to-read code.
Key features include:
- **Authentication/authorization** with JWT + cookie sessions
- **File management logic** including uploads, deletes, and renames
- **Storage operations** to handle file organization, usage tracking, and cleanup
- A **share system** that generates tokenized public file links
- Schema-based request validation for all endpoints
- Prisma models that keep the database logic predictable and type-safe
### Documentation (apps/docs)
**Technology stack:**
- Fumadocs
- MDX (Markdown + JSX)
- React-based components
The docs are built using **Fumadocs**, a modern documentation system built on top of Next.js. It uses **MDX**, so you can mix Markdown with interactive React components, perfect for developer tools and open-source projects. Pages are fast, versionable, and easy to customize. The goal is to keep the documentation as close to the codebase as possible, using shared components where needed and reusing UI patterns directly from the app.
It supports sidebar navigation, keyboard shortcuts, dark mode, and even interactive demos or UI previews. The file tree you see above, for example, is powered by a real React component from the docs.
- Built with **Fumadocs**, powered by Next.js
- Supports **MDX** and full React component embedding
- Ideal for technical docs and live code samples
- Styled using the same Tailwind setup from the main app
### Infrastructure
Palmr. is fully containerized using **Docker**, which means every service: frontend, backend, database, storage, runs in its own isolated environment. With `docker-compose`, the whole stack spins up locally with a single command. It's also easy to deploy to services like Fly.io, Render, or your own VPS.
Volumes are used to persist data locally, and containers are networked together so that all services can talk to each other securely.
- **Docker-first architecture** with all services containerized
- Configurable through `.env` and compose overrides
- Local volumes and named networks
- Easy to deploy and scale on any container-compatible infra
## Key features
### File management
Files are at the heart of Palmr. Users can upload files via the frontend, and they're stored directly in the filesystem. The backend handles metadata (name, size, type, ownership), and also handles deletion, renaming, and public sharing. Every file operation is tracked, and all actions can be scoped per user.
- Upload/download with instant feedback
- File previews, type validation, and size limits
- Token-based sharing system
- Disk usage tracking by user
### User system
Authentication is done through secure JWTs, stored in HTTP-only cookies for safety. Signup and login flows are simple and fast, and user info is kept in sync across the frontend and backend.
- Cookie-based session management
- Role support and future admin access
- Profile updates and password reset flows
- Logged-in user state handled via custom hooks
### Storage system
The system uses **filesystem storage** for all file operations by default. It's simple, fast, and reliable for most use cases. The architecture also supports **S3-compatible object storage** as an alternative for users who need cloud storage or additional scalability. The backend tracks usage, handles cleanup of orphaned files, and ensures that every file on disk has a matching database record.
- Filesystem-based storage with organized directory structure
- Optional S3-compatible object storage support
- Upload validation and automatic cleanup
- Usage tracking and quotas (per user or global)
- Secure access to stored files with proper permissions
### Internationalization
Palmr. supports multiple languages using **next-intl**, which is deeply integrated into the routing system. It loads only the necessary translations per route, supports nested namespaces, and makes it easy to keep things organized even at scale.
- Per-locale localstorage (`en-US`, `pt-BR`, etc.)
- Translation loading by namespace/page
- Full pluralization and formatting support
- Easy translation management via JSON files

View File

@@ -0,0 +1,50 @@
---
title: Welcome to Palmr.
icon: TreePalm
---
import { Ban, Star, Shield, Palette, Users, Zap } from "lucide-react";
![Palmr Banner](/assets/v2.1/general/banner.png)
**Palmr.** is your go-to **open-source alternative** for file sharing, standing tall against services like **WeTransfer**, **SendGB**, **Send Anywhere**, and **Files.fm**. What sets Palmr. apart? You get to **host it on your own infrastructure** be it a **dedicated server** or **VPS** putting you in the drivers seat for data security and file control. No more third-party dependencies or worrying about pesky limits and steep fees!
## Why Palmr. Rocks?
### No limits, seriously
Forget about arbitrary caps on file sizes or numbers. With Palmr., the only limit is your **servers storage space**. Got the capacity? Then transfer files of any size or quantity without a hitch. No premium plans to unlock, no annoying ads to dodge, and definitely no hidden fees sneaking up on you. Your file sharing freedom is tied to your infrastructure, not artificial restrictions.
### Open source & totally free
Palmr. is 100% **open source** and free no licenses, subscriptions, or surprise costs. This transparency means youve got full control over how you use it. Heres what that looks like:
- Deploy anywhere **VPS**, **dedicated server**, **Docker**, or any cloud platform you fancy.
- Peek under the hood by reviewing the **codebase** to ensure its secure and meets your standards.
- Pitch in with **improvements** or custom features to make Palmr. even better.
- Tweak it for any use case, from personal sharing to business needs or niche applications.
### Your data, your rules
Host Palmr. on your own setup and keep **full control over your data**. By managing storage and transfers yourself, you cut out third-party risks. Your files stay in your environment no external services touching or storing them ensuring top-notch **privacy** and **confidentiality**. Set up security measures that fit your needs, and rest easy knowing no one else is in the loop. Palmr. hands you the reins for ultimate peace of mind, perfect for organizations needing strict data control or regulatory compliance.
### Make it yours
Palmr. is a canvas for customization, letting you shape every detail to match your **brand** and **user experience**:
- Slap on your **logo** for consistent branding across the platform.
- Pick a **custom app name** that screams your identity.
- Hook up an **SMTP server** for seamless email notifications about transfers or updates.
- Rewrite **interface text** to vibe with your audience and keep your brands voice.
### Manage users like a pro
Take charge of your file-sharing world with Palmr.s robust **user and admin management** system:
- Set up multiple **admins** to share the load and keep things running smoothly.
- Add as many **users** as you need, from small crews to huge teams.
- Keep tabs on **storage usage** with handy analytics for smarter resource planning.
### Lightning fast & feather light
Palmr. is built for speed with a sleek, scalable design that handles big file transfers and busy user loads without breaking a sweat. It keeps transfer speeds high and adapts to growing demands effortlessly. Thanks to smart resource use and polished code, you get a snappy experience that scales with your needs while staying rock-solid and stable.

View File

@@ -0,0 +1,251 @@
---
title: Manual Installation
icon: Cog
---
Hey there! Looking to run **Palmr.** your way, with complete control over every piece of the stack? This manual installation guide is for you. No Docker, no pre-built containers just the raw source code to tweak, customize, and deploy as you see fit.
> **Prefer a quicker setup?** If this hands-on approach feels like overkill, check out our [**Quick Start (Docker)**](/docs/3.0-beta/quick-start) guide for a fast, containerized deployment. This manual path is tailored for developers who want to dive deep, modify the codebase, or integrate custom services.
Here's what you'll do at a glance:
1. **Clone** the repository to get the code.
2. **Configure** `.env` files for backend and frontend.
3. **Install** JavaScript dependencies using `pnpm`.
4. **Generate** the Prisma client and run database migrations.
5. **Seed** the database with initial Palmr. data.
6. **Build & start** the backend (Fastify API).
7. **Build & serve** the frontend (Next.js app).
We've broken down each step below feel free to jump to the section you're working on!
## Before you start
Let's make sure your environment is ready to roll. Check that you've got these tools installed and set up on your system:
- <span style={{ color: "#16a34a" }}>Node.js</span> *(Powers our JavaScript/TypeScript
apps)*
- <span style={{ color: "#16a34a" }}>pnpm</span> *(Our go-to package manager)*
- <span style={{ color: "#16a34a" }}>Git</span> *(For cloning and managing the repo)*
⚠️ **Heads Up on Package Managers**: Palmr. was built and tested with `pnpm`. While you _could_ try `npm`, `yarn`, or `bun`, we strongly recommend sticking with `pnpm` to avoid compatibility headaches.
---
### System requirements
- **Operating System**: MacOS or Linux (recommended for best results)
- Windows works but hasn't been thoroughly tested.
- **Memory**: At least 4GB RAM is suggested.
- **Storage**: Depends on how much file storage you'll need.
- **CPU**: 2+ cores for smooth performance.
---
## Let's Get Palmr. Running
### Step 1: Clone the repository
First things first, grab a local copy of the Palmr. codebase. Run this command to clone the official repo:
```bash
git clone https://github.com/kyantech/Palmr.git
```
Once it's done, you'll have a new directory with the project structure. Inside, the `apps` folder holds the key pieces: `docs`, `server`, and `web`. For this guide, we're focusing on `server` (our Fastify backend) and `web` (our Next.js frontend).
---
### Step 2: Set up the backend
Let's get the backend up and running. Start by navigating to the server directory:
```bash
cd ./apps/server
```
#### Configure environment variables
Before anything else, we need to set up the environment variables Palmr. relies on. We've included a handy template file called `.env.example` to get you started. Create your own `.env` file with this command:
```bash
cp .env.example .env
```
This copies the template into a new `.env` file with all the necessary settings. Open it up if you need to tweak anything specific to your setup.
#### Install dependencies
Next, let's install the backend dependencies. With Node.js and `pnpm` ready, run:
```bash
pnpm install
```
This pulls in everything needed for the backend, including Prisma, our database ORM.
#### Generate Prisma client
Now, generate the Prisma client tailored for Palmr. with:
```bash
pnpm dlx prisma generate
```
This sets up the interface for smooth database interactions.
#### Deploy Prisma migrations
With the client ready, apply the database schema using:
```bash
pnpm dlx prisma migrate deploy
```
This ensures your database structure is set up with all the required migrations.
#### Seed the database
Let's populate the database with some initial data. Run the seeding script:
```bash
pnpm db:seed
```
This adds the baseline data Palmr. needs to function properly.
#### Build and run the backend
Finally, build the backend app:
```bash
pnpm run build
```
Once the build is complete, start the service:
```bash
pnpm start
```
To confirm everything's working, check out the API documentation at:
```bash
http://localhost:3333/docs
```
This page lists all available API endpoints and how to use them.
---
### Step 3: Set up the frontend
With the backend humming, let's tackle the frontend setup.
#### Navigate to the Frontend Directory
If you're in the `server` folder, move to `web` with:
```bash
cd ../web
```
Or, from the repo root, use:
```bash
cd apps/web
```
#### Configure environment variables
Just like the backend, set up the frontend environment variables:
```bash
cp .env.example .env
```
This creates a `.env` file with the necessary configurations for the frontend.
#### Install dependencies
Install all the frontend dependencies:
```bash
pnpm install
```
#### Build and run the frontend
Build the production version of the frontend:
```bash
pnpm run build
```
Once that's done, serve it up:
```bash
pnpm serve
```
Now, open your browser and head to:
```bash
http://localhost:3000
```
You should see the full Palmr. application ready to go!
---
## Quick notes
This guide sets up Palmr. using the local file system for storage. Want to use an S3-compatible object storage instead? You can configure that in the `.env` file. Check the Palmr. documentation for details on setting up S3 storage just update the environment variables, then build and run as shown here.
---
## Command cheat sheet
Here's a quick reference for all the commands we've covered perfect for copy-pasting once you're familiar with the steps:
```bash
# --- Backend (Fastify API) ---
cd apps/server
pnpm install
pnpm dlx prisma generate
pnpm dlx prisma migrate deploy
pnpm db:seed
pnpm run build
pnpm start
# --- Frontend (Next.js) ---
cd apps/web
pnpm install
pnpm run build
pnpm serve
```
> **Tip**: Keep this handy in your clipboard for your first setup run.
---
## What's next?
Palmr. is now up and running locally . Here are some suggested next steps:
- **Manage Users**: Dive into the [Users Management](/docs/3.0-beta/manage-users) guide.
- **Switch to Object Storage**: Update `.env` variables to use an S3-compatible bucket (see Quick Notes above).
- **Secure Your Instance**: Put Palmr. behind a reverse proxy like **Nginx** or **Caddy** and enable HTTPS.
- **Learn the Internals**: Explore how everything connects in the [Architecture](/docs/3.0-beta/architecture) overview.
Jump into whichever area fits your needs our docs are designed for exploration in any order.
## Wrapping up
Congrats! You've successfully set up a production-ready instance of Palmr. through this detailed manual process. From cloning the repo to deploying the app, you've tackled every step like a pro.
## Helpful resources
- [Node.js Documentation](https://nodejs.org/en/docs/)
- [pnpm Documentation](https://pnpm.io/)
- [Prisma Documentation](https://www.prisma.io/docs/)

View File

@@ -0,0 +1,31 @@
{
"title": "v3.0-beta",
"description": "Latest version",
"root": true,
"icon": "Sparkles",
"pages": [
"---Introduction---",
"index",
"quick-start",
"installation",
"manual-installation",
"screenshots",
"s3-providers",
"---Configuration---",
"configuring-smtp",
"available-languages",
"uid-gid-configuration",
"reverse-proxy-configuration",
"password-reset-without-smtp",
"oidc-authentication",
"---Developers---",
"architecture",
"github-architecture",
"api",
"contribute",
"open-an-issue",
"---Sponsor this project---",
"gh-star",
"gh-sponsor"
]
}

View File

@@ -0,0 +1,315 @@
---
title: OIDC Authentication
icon: Key
---
Palmr supports OpenID Connect (OIDC) authentication, allowing users to sign in using external identity providers such as Google, Microsoft Azure AD, Keycloak, Auth0, and other OIDC-compliant services. This feature provides seamless single sign-on (SSO) capabilities and centralized user management.
OIDC authentication in Palmr is built using the industry-standard OpenID Connect protocol with PKCE (Proof Key for Code Exchange) for enhanced security. The implementation supports automatic user provisioning, role mapping, and flexible configuration options.
## Why use OIDC authentication?
OIDC authentication provides several advantages for organizations and users:
**Centralized Authentication**: Users can authenticate using their existing organizational credentials without creating separate accounts for Palmr.
**Enhanced Security**: OIDC provides robust security features including token-based authentication, PKCE flow, and standardized protocols.
**Single Sign-On**: Users can access Palmr seamlessly if they're already authenticated with their identity provider.
**User Management**: Administrators can manage user access centrally through their existing identity provider.
**Compliance**: OIDC helps meet organizational security and compliance requirements by leveraging existing identity infrastructure.
---
## Prerequisites
Before configuring OIDC authentication, ensure you have:
- **Administrative Access**: ADMIN privileges in Palmr to configure OIDC settings
- **Identity Provider**: An OIDC-compliant identity provider (Google, Azure AD, Keycloak, etc.)
- **Application Registration**: Your Palmr application registered with your identity provider
- **OIDC Credentials**: Client ID, Client Secret, and Issuer URL from your identity provider
### Supported identity providers
Palmr's OIDC implementation is compatible with any OpenID Connect 1.0 compliant provider, including:
- **Google Workspace / Google Cloud Identity**
- **Microsoft Azure Active Directory / Entra ID**
- **Keycloak**
- **Auth0**
- **Okta**
- **AWS Cognito**
- **Custom OIDC providers**
---
## Configuring OIDC settings
OIDC configuration is managed through Palmr's administrative settings panel, accessible only to users with ADMIN privileges.
### Accessing OIDC configuration
To configure OIDC authentication:
1. **Access Settings**: Click on your profile picture in the header and select **Settings**
2. **Navigate to Authentication**: Find the **Authentication** or **OIDC** configuration section
3. **Enable OIDC**: Toggle the OIDC authentication option to enable it
![OIDC Settings Panel](/assets/v3/oidc/provider-setup.png)
### Required configuration fields
Configure the following essential fields for OIDC authentication:
**OIDC Enabled**: Enable or disable OIDC authentication for your Palmr instance.
**Issuer URL**: The base URL of your OIDC identity provider. This is typically the discovery endpoint URL without the `/.well-known/openid-configuration` suffix.
- Example: `https://accounts.google.com`
- Example: `https://login.microsoftonline.com/{tenant-id}/v2.0`
**Client ID**: The unique identifier for your Palmr application as registered with your identity provider.
**Client Secret**: The secret key provided by your identity provider for your Palmr application. Store this securely and never share it.
**Redirect URI**: The callback URL where users will be redirected after authentication. This is typically auto-detected but can be manually configured if needed.
- Format: `https://your-palmr-domain.com/api/auth/oidc/callback`
**Scope**: The OpenID Connect scopes to request from the identity provider. Default is `openid profile email`.
![OIDC Configuration Fields](/assets/v3/oidc/provider setup.png)
### Advanced configuration options
**Auto-Registration**: Configure whether new users can be automatically created when they authenticate via OIDC for the first time.
**Admin Email Domains**: Specify email domains that should automatically receive admin privileges when registering via OIDC.
**User Attribute Mapping**: Configure how user attributes from the OIDC provider map to Palmr user fields.
---
## Setting up identity providers
The setup process varies depending on your chosen identity provider. Here are examples for common providers:
### Google Workspace / Google Cloud
1. **Create Project**: Go to the [Google Cloud Console](https://console.cloud.google.com/) and create a new project
2. **Enable APIs**: Enable the Google+ API and OpenID Connect API
3. **Create Credentials**: Create OAuth 2.0 credentials for a web application
4. **Configure Redirect URI**: Add your Palmr callback URL to authorized redirect URIs
5. **Note Credentials**: Copy the Client ID and Client Secret for Palmr configuration
**Configuration values:**
- **Issuer URL**: `https://accounts.google.com`
- **Scope**: `openid profile email`
### Microsoft Azure AD / Entra ID
1. **Register Application**: Go to Azure Portal > Azure Active Directory > App registrations
2. **Create Registration**: Register a new application with web platform
3. **Configure Authentication**: Add your Palmr callback URL to redirect URIs
4. **Create Secret**: Generate a client secret in Certificates & secrets
5. **Note Configuration**: Copy Application (client) ID and Directory (tenant) ID
**Configuration values:**
- **Issuer URL**: `https://login.microsoftonline.com/{tenant-id}/v2.0`
- **Scope**: `openid profile email`
### Keycloak
1. **Create Client**: In your Keycloak realm, create a new OpenID Connect client
2. **Configure Client**: Set access type to confidential and enable standard flow
3. **Set Redirect URI**: Add your Palmr callback URL to valid redirect URIs
4. **Generate Secret**: Note the client secret from the Credentials tab
**Configuration values:**
- **Issuer URL**: `https://your-keycloak-domain.com/realms/{realm-name}`
- **Scope**: `openid profile email`
![Identity Provider Setup](/assets/v3/oidc/provider-setup.png)
### Zitadel
1. **Create New ProjectApp**: In your desired Zitadel project, create a new application
2. **Name and Type**: Give your application a name and choose **WEB** as the application type
3. **Authentication Method**: Choose Code
4. **Set Redirect URI**: Add your Palmr callback URL to valid redirect URIs
5. **Finish**: After reviewing the configuration create the application
6. **Copy the client ID and client Secrat**: Copy the client id paste it into the **Client ID** of your Palmr OIDC condiguration Form, repeat for the client secret and paste it into the **Client Secret** field
7. **Obtain your Provider URL**: In your Zitadel application go to **URLs** and copy the **Authorization Endpoint (remove the /authorize from that url)** e.g. https://auth.example.com/oauth/v2
**Configuration values:**
- **Issuer URL**: Depends on your Zitadel installation and project. Example: `https://auth.example.com/oauth/v2`
- **Scope**: `openid profile email`
![Zitadel Identity Provider Setup](/assets/v3/oidc/zitadel-provider-setup.png)
---
## Testing OIDC configuration
After configuring OIDC settings, it's important to test the authentication flow to ensure everything works correctly.
### Validation steps
1. **Save Configuration**: Apply your OIDC settings in the Palmr admin panel
2. **Check Status**: Verify that OIDC is enabled and properly configured
3. **Test Login Flow**: Attempt to log in using the OIDC provider
4. **Verify User Creation**: Confirm that user accounts are created or updated correctly
### Testing the authentication flow
1. **Access Login Page**: Navigate to your Palmr login page
2. **OIDC Login Option**: Look for the OIDC/SSO login button or option
3. **Provider Redirect**: Click the OIDC login option to redirect to your identity provider
4. **Authenticate**: Complete authentication with your identity provider
5. **Return to Palmr**: Verify successful redirect back to Palmr with authentication
![OIDC Login Flow](/assets/v3/oidc/login-flow.png)
### Troubleshooting common issues
**Configuration Errors**:
- Verify that all required fields are filled correctly
- Check that the Issuer URL is accessible and returns valid OIDC metadata
- Ensure Client ID and Client Secret match your identity provider configuration
**Redirect URI Mismatches**:
- Confirm that the redirect URI in Palmr matches what's configured in your identity provider
- Check for protocol mismatches (HTTP vs HTTPS)
- Verify that the domain and path are exactly correct
**Authentication Failures**:
- Check that the user exists in your identity provider
- Verify that required scopes are granted
- Ensure the user has necessary permissions in the identity provider
**User Creation Issues**:
- Confirm that auto-registration is enabled if you want new users to be created automatically
- Check that email addresses are provided by the identity provider
- Verify admin domain configuration if users should receive admin privileges
---
## User experience
Once OIDC is properly configured, users will have a seamless authentication experience integrated into Palmr's login flow.
### Login process
1. **Access Palmr**: Users navigate to the Palmr login page
2. **Choose OIDC**: Users select the OIDC/SSO login option
3. **Provider Authentication**: Users are redirected to authenticate with their identity provider
4. **Automatic Return**: After successful authentication, users are automatically redirected back to Palmr
5. **Dashboard Access**: Users gain immediate access to their Palmr dashboard
### User account management
**Automatic Provisioning**: New users are automatically created when they first authenticate via OIDC (if auto-registration is enabled).
**Profile Synchronization**: User profile information (name, email) is synchronized from the identity provider during each login.
**Role Assignment**: User roles and permissions can be automatically assigned based on identity provider attributes or configured rules.
### Account unification
**Email-Based Matching**: If a user authenticates via OIDC using the same email address as an existing credential-based account, both authentication methods will be linked to the same user account.
**Dual Authentication Options**: Users who have both credential-based and OIDC authentication set up can choose either method to log in:
- Traditional email/password authentication
- OIDC/SSO authentication through their identity provider
**Seamless Experience**: Regardless of which authentication method is used, users will access the same account with all their files, shares, and settings preserved.
**Account Consolidation**: This feature ensures that users don't accidentally create duplicate accounts and can transition smoothly between authentication methods as organizational requirements change.
![User Dashboard After OIDC Login](/assets/v3/oidc/user-dashboard.png)
---
## Security considerations
OIDC authentication in Palmr implements several security best practices to ensure safe and secure authentication.
### Security features
**PKCE Flow**: Palmr uses Proof Key for Code Exchange (PKCE) to prevent authorization code interception attacks.
**State Parameter**: Random state parameters are used to prevent CSRF attacks during the authentication flow.
**Token Validation**: All tokens are properly validated according to OIDC specifications.
**Secure Storage**: Sensitive configuration data is securely stored and never exposed to client-side code.
### Best practices
**Use HTTPS**: Always configure Palmr and your identity provider to use HTTPS in production environments.
**Rotate Secrets**: Regularly rotate client secrets and update them in both your identity provider and Palmr configuration.
**Monitor Access**: Regularly review user access and authentication logs to detect any suspicious activity.
**Limit Scopes**: Only request the minimum necessary scopes from your identity provider.
**Validate Domains**: Configure admin email domains carefully to prevent unauthorized privilege escalation.
---
## API endpoints
Palmr provides several API endpoints for OIDC authentication that can be used for integration or troubleshooting.
### Available endpoints
**GET /api/auth/oidc/config**: Retrieve OIDC configuration and status information.
**GET /api/auth/oidc/authorize**: Initiate the OIDC authorization flow.
**GET /api/auth/oidc/callback**: Handle the callback from the identity provider after authentication.
## Finalizing OIDC configuration
After completing the configuration and testing process, your Palmr installation will be ready to handle OIDC authentication seamlessly.
### Configuration completion
Once OIDC is properly configured:
1. **Verify Settings**: Confirm all configuration fields are correct and saved
2. **Test Authentication**: Perform end-to-end testing of the authentication flow
3. **Document Configuration**: Keep a record of your OIDC settings for future reference
4. **Inform Users**: Notify users about the new OIDC authentication option
### Ongoing maintenance
To maintain reliable OIDC authentication:
- **Monitor Authentication**: Regularly check that OIDC authentication is working correctly
- **Update Credentials**: Rotate client secrets periodically for security
- **Review User Access**: Audit user accounts and permissions regularly
- **Stay Updated**: Keep informed about changes to your identity provider's configuration
### Next steps
With OIDC properly configured, your Palmr installation now provides:
- Seamless single sign-on authentication for users
- Centralized user management through your identity provider
- Enhanced security through industry-standard protocols
- Improved user experience with reduced password management
Users can now authenticate using their existing organizational credentials, providing a more streamlined and secure access experience to Palmr's file sharing capabilities.

View File

@@ -0,0 +1,333 @@
---
title: How to Open an Issue
icon: Ticket
---
## Introduction
Opening an issue on GitHub is an essential way to report bugs, request features, or ask questions about a project. This guide walks you through the process of creating an issue for the **Palmr** project on GitHub.
Issues serve as a vital communication tool in open source development, helping track bugs, feature requests, and general questions. They create a transparent record of project discussions and improvements, fostering collaboration between users and maintainers.
Whether you've discovered a bug that needs fixing, have an idea for a new feature, or need clarification about functionality, creating an issue is the first step to getting your voice heard and contributing to the project's improvement.
---
## GitHub account requirements
Before you can open an issue, you'll need to be logged into your GitHub account. If you don't have an account yet, creating one is free and provides access to the entire GitHub ecosystem.
### Account benefits
Having a GitHub account allows you to:
- Create and manage issues across all repositories
- Comment on existing issues and participate in discussions
- Receive notifications about updates and responses
- Collaborate with developers and maintainers
- Track your contributions and engagement history
### Getting started
If you need to create an account:
1. Visit [GitHub's signup page](https://github.com/signup)
2. Complete the registration process
3. Verify your email address
4. Log in to your new account
Make sure you're logged in before proceeding to the next steps.
---
## Accessing the repository
There are several convenient ways to access the Palmr repository and begin the issue creation process.
### Direct access
The quickest method is to visit the repository directly: [https://github.com/kyantech/Palmr](https://github.com/kyantech/Palmr)
### Alternative access methods
You can also find the repository through:
**GitHub Search**:
- Click the search bar at the top of any GitHub page
- Type "Palmr" or "kyantech/Palmr" for more specific results
- Look for the repository owned by **Kyantech**
- Click on the repository name to access it
**Organization Profile**:
- Visit [Kyantech's GitHub profile](https://github.com/kyantech)
- Navigate to the "Repositories" tab
- Find and click on "Palmr" in the repository list
### Repository verification
When accessing the repository, verify you're in the correct location by checking:
- The repository owner is **kyantech**
- The repository name is **Palmr**
- The description matches the project you're looking for
- Recent activity indicates an active project
---
## Navigating to issues
Once you're on the repository page, you'll need to access the issues section to create your new issue.
### Finding the issues tab
To access the issues section:
1. **Locate Navigation Bar**: Look at the navigation bar near the top of the repository page
2. **Find Issues Tab**: The **Issues** tab is typically located between "Code" and "Pull requests"
3. **Click Issues**: Click on the **Issues** tab to open the issues section
4. **Review Existing Issues**: You'll see a list of all existing issues, both open and closed
### Understanding the issues interface
The issues tab displays important information including:
- **Issue Count**: Number of open and closed issues
- **Labels and Categories**: Color-coded labels for organization
- **Issue Status**: Visual indicators for open/closed status
- **Recent Activity**: Timeline of recent issue updates
- **Assigned Contributors**: Who's working on specific issues
- **Search and Filter Options**: Tools to find specific issues
![Palmr Profile Menu](/assets/v1/developers/issues-tab.png)
---
## Creating a new issue
With the issues section open, you can now create your new issue to report a bug, request a feature, or ask a question.
### Initiating issue creation
To start creating your issue:
1. **Locate New Issue Button**: Look for the green **New Issue** button, typically on the right side of the issues page
2. **Click to Create**: Click the button to open the issue creation interface
3. **Select Template**: If multiple issue templates are available, choose the most appropriate one for your needs
4. **Review Requirements**: Take time to read through any template requirements or guidelines
### Pre-creation checklist
Before creating your issue, consider these important steps:
- **Search Existing Issues**: Check if your issue has already been reported to avoid duplicates
- **Review Guidelines**: Read any contribution guidelines or issue templates provided
- **Gather Information**: Collect all necessary details, screenshots, or error messages
- **Consider Labels**: Think about which labels might be appropriate for your issue
- **Reference Related Items**: Note any related issues or pull requests that might be relevant
### Best practices for issue creation
- **Use Clear Language**: Write in a way that's easy for others to understand
- **Be Specific**: Provide concrete details rather than vague descriptions
- **Include Context**: Explain the circumstances surrounding your issue
- **Add Visual Evidence**: Screenshots or recordings can be very helpful
- **Format Properly**: Use markdown formatting to improve readability
![Palmr Profile Menu](/assets/v1/developers/new-issue-btn.png)
---
## Completing the issue form
The issue creation form is your opportunity to provide comprehensive information about your bug report, feature request, or question.
### Essential form fields
You'll encounter several key fields that need your attention:
**Issue Title**:
- Write a clear, concise title that summarizes the issue
- Use descriptive language that helps others understand the problem at a glance
- Avoid vague titles like "Bug" or "Problem"
- Include key terms that others might search for
**Issue Description**:
- Provide a detailed explanation of your issue
- For bugs: Include steps to reproduce, expected behavior, and actual behavior
- For features: Explain the functionality you'd like and why it would be valuable
- For questions: Be specific about what you need clarification on
### Additional form options
**Labels (Optional)**:
- Add relevant labels to categorize your issue (e.g., `bug`, `enhancement`, `question`)
- Labels help maintainers organize and prioritize issues effectively
- Choose labels that accurately represent your issue type and priority
**Attachments (Optional)**:
- Include screenshots to illustrate visual problems or desired features
- Attach log files or error messages for technical issues
- Add mockups or diagrams for feature requests
- Include any relevant documentation or examples
### Writing effective descriptions
For **Bug Reports**, include:
- Clear steps to reproduce the issue
- Expected vs. actual behavior
- System information (OS, browser, version)
- Error messages or console output
- Screenshots or screen recordings
For **Feature Requests**, include:
- Detailed description of the desired functionality
- Use cases and benefits
- Potential implementation suggestions
- Examples from other projects (if applicable)
For **Questions**, include:
- Specific area of confusion
- What you've already tried
- Relevant code snippets or configurations
- Context about your use case
![Palmr Profile Menu](/assets/v1/developers/new-issue-form.png)
---
## Submitting your issue
After carefully completing the issue form, you're ready to submit your contribution to the project.
### Final review
Before submitting, take a moment to:
- **Review Content**: Read through your title and description for clarity
- **Check Formatting**: Ensure proper markdown formatting and readability
- **Verify Attachments**: Confirm all screenshots and files are properly attached
- **Validate Information**: Double-check that all details are accurate and complete
### Submission process
1. **Click Submit**: Click the **Create** button at the bottom of the form
2. **Confirmation**: Your issue will be created and assigned a unique number
3. **Visibility**: The issue becomes immediately visible to maintainers and contributors
4. **Notifications**: You'll receive notifications for any updates or responses
### Post-submission expectations
After submitting your issue:
- **Track Progress**: Monitor your issue for responses and updates
- **Stay Engaged**: Participate in any follow-up discussions
- **Provide Clarification**: Be ready to answer questions or provide additional information
- **Be Patient**: Remember that maintainers may need time to review and respond
---
## Issue management best practices
To ensure your issue receives appropriate attention and contributes effectively to the project, follow these proven practices.
### Communication guidelines
**Be Clear and Specific**: Provide comprehensive details that help others understand your issue without ambiguity.
**Use Descriptive Titles**: Craft titles that immediately convey the nature and scope of your issue.
**Include Reproduction Steps**: For bugs, provide step-by-step instructions that others can follow to reproduce the problem.
**Maintain Professional Tone**: Remember that maintainers and contributors are often volunteers dedicating their time to help.
### Technical best practices
**Provide System Information**: Include relevant details about your environment, versions, and configuration.
**Format Code Properly**: Use markdown code blocks for any code snippets, error messages, or configuration files.
**Update Regularly**: Keep your issue current with new information or changes in status.
**Reference Related Issues**: Link to related issues or pull requests when relevant.
### Community engagement
**Respond Promptly**: When maintainers ask questions or request clarification, respond in a timely manner.
**Help Others**: If you see similar issues, share your experience or solutions.
**Follow Up**: Update the issue if you find a solution or workaround independently.
**Express Gratitude**: Thank contributors and maintainers for their time and assistance.
---
## The importance of quality issues
Understanding why well-crafted issues matter helps you contribute more effectively to the open source ecosystem.
### Project improvement
**Bug Identification**: Your detailed bug reports help identify and fix problems that affect all users.
**Feature Development**: Thoughtful feature requests guide project development and prioritization.
**Documentation Enhancement**: Questions about unclear functionality often lead to improved documentation.
### Maintainer support
**Efficient Triage**: Clear, detailed issues help maintainers quickly understand and categorize problems.
**Reduced Back-and-forth**: Comprehensive initial reports minimize the need for follow-up questions.
**Priority Assessment**: Well-documented issues help maintainers assess impact and urgency.
### Community collaboration
**Knowledge Sharing**: Issues create a searchable knowledge base for future users with similar problems.
**Contributor Attraction**: Interesting issues often attract new contributors who want to help solve problems.
**Discussion Platform**: Issues provide a space for community members to collaborate on solutions.
---
## Next steps
Congratulations on creating your issue for the **Palmr** project! Your contribution is valuable and helps make the project better for the entire community.
### Staying engaged
After creating your issue, consider these ways to remain involved:
- **Monitor Progress**: Keep track of responses and updates to your issue
- **Participate Actively**: Engage in discussions and provide additional information when requested
- **Help Others**: Assist other community members with similar issues when possible
- **Share Knowledge**: Document any solutions or workarounds you discover
### Expanding your contribution
Beyond issue creation, you can contribute to the project in other ways:
- **Code Contributions**: Consider submitting pull requests to fix bugs or implement features
- **Documentation**: Help improve project documentation based on your experience
- **Community Support**: Answer questions and help other users in issues and discussions
- **Project Promotion**: Share Palmr with others who might benefit from the project
### Building relationships
- **Follow the Project**: Star the repository to show support and stay updated
- **Connect with Contributors**: Engage respectfully with maintainers and other contributors
- **Join Discussions**: Participate in broader project discussions and planning
- **Spread Awareness**: Help others discover and benefit from the Palmr project
Thank you for being part of the open source community and contributing to making Palmr better for everyone. Your participation, whether through issues, code, or community engagement, helps drive the project forward and benefits users worldwide.

View File

@@ -0,0 +1,181 @@
---
title: Password Reset Without SMTP
icon: Lock
---
This guide provides detailed instructions on how to reset a user password directly inside the Docker container for Palmr, without requiring SMTP configuration. This method is particularly useful for administrators who do not have email services set up or need to regain access to accounts in emergency situations.
## When and why to use this method
Resetting a password without SMTP is an alternative approach for specific scenarios where the standard email-based reset is not feasible. Consider using this method if:
- An admin user is locked out and cannot access their email for a password reset.
- SMTP services are not configured or are experiencing issues.
- You need to perform emergency system recovery and restore access quickly.
- You are setting up an initial environment and need to configure accounts.
- You are conducting controlled testing in a development setup.
> **Warning:** This process bypasses the normal email-based password reset mechanism, which could pose a security risk if not handled properly. Use this method only when necessary, ensure it is performed by trusted administrators, and always document the reason for the reset.
## How the password reset works
Palmr provides a CLI script that allows administrators to reset passwords directly within the Docker container. This script is designed to maintain security by enforcing interactive confirmation at every step, validating input data, and securely encrypting the new password using bcrypt with 10 salt rounds (consistent with the system's security standards). The script does not send email notifications, log invalid login attempts, or alter other user settings—it focuses solely on password reset.
## Step-by-step instructions
Follow these steps to reset a user password using the provided script. Ensure you have access to the Docker container before proceeding.
### 1. List Docker containers and identify the correct one
Before accessing the Palmr container, you need to identify its name or ID. Open a terminal on your host machine and list all running Docker containers by running the following command:
```bash
docker ps
```
This command will display a list of active containers, including their names, IDs, images, and other details. Look for the container running the Palmr application. If you used a specific name when setting up the container (e.g., `palmr-app`), it will appear under the `NAMES` column. If no name was specified, note the `CONTAINER ID` (a short string of characters) for the container associated with the Palmr image (likely something like `palmr` or a custom image name).
> **Note:** If you don't see the Palmr container, ensure it is running. You can start it using `docker start <container_name_or_id>` if it's stopped. If you're unsure about the setup, refer to the Palmr installation guide.
### 2. Access the Docker container
Once you've identified the correct container, access it by running the following command:
```bash
docker exec -it <container_name_or_id> /bin/sh
```
Replace `<container_name_or_id>` with the name or ID of your Palmr container. This command opens an interactive shell session inside the container, allowing you to execute commands directly.
### 3. Navigate to the server directory
Once inside the container, navigate to the server directory where the reset script is located:
```bash
cd /app/server
```
This directory contains the necessary scripts and configurations for managing Palmr's backend operations.
### 4. Run the password reset script
Execute the password reset script to start the interactive process:
```bash
./reset-password.sh
```
The script will prompt you to enter the email address of the user whose password you wish to reset. It will then display the user's information for verification, ask for confirmation to proceed, and request a new password (minimum 8 characters) which must be entered twice to ensure accuracy. Each step requires explicit confirmation to prevent accidental changes.
> **Note:** If you need to see a list of all users in the system before proceeding, you can run `./reset-password.sh --list`. For additional help, use `./reset-password.sh --help`.
### Example session
Below is an example of how the interactive session might look when running the script:
```
$ ./reset-password.sh
Palmr Password Reset Tool
===============================
This script allows you to reset a user's password directly from the Docker terminal.
WARNING: This bypasses normal security checks. Use only when necessary!
Enter user email: user@example.com
User found:
Name: John Smith
Username: john.smith
Email: user@example.com
Status: Active
Admin: No
Do you want to reset the password for this user? (y/n): y
Enter new password requirements:
- Minimum 8 characters
Enter new password: ********
Confirm new password: ********
Hashing password...
Updating password in database...
Cleaning up existing password reset tokens...
Password reset successful!
User: John Smith (user@example.com)
The user can now login with the new password.
Security Note: The password has been encrypted using bcrypt with 10 salt rounds.
```
## Troubleshooting common issues
If you encounter issues while running the script, refer to the following solutions to resolve common problems:
- **Error: "tsx is not available"**
This error indicates missing dependencies. The script will attempt to install them automatically, but if it fails, manually install them by running:
```bash
pnpm install
# or
npm install
```
- **Error: "Prisma client not found"**
This error occurs if the Prisma client is not generated. The script should handle this automatically, but if it fails, generate it manually with:
```bash
npx prisma generate
```
- **Error: "Database connection failed"**
If the script cannot connect to the database, check the following:
- Ensure the database service is running within the container.
- Confirm that the `prisma/palmr.db` file exists and has the correct permissions.
- Verify that the container has access to the database volume.
- **Error: "Script must be run from server directory"**
This error appears if you are not in the correct directory. Navigate to the server directory with:
```bash
cd /app/server
```
- **Error: "User not found"**
If the email provided does not match any user, double-check the email address. You can list all users to find the correct one by running:
```bash
./reset-password.sh --list
```
Ensure the user exists in the system before attempting the reset.
- **Error: "Password does not meet requirements"**
The new password must be at least 8 characters long. Ensure it meets this requirement and re-enter it carefully, confirming it matches the second entry.
- **Error: "Confirmation does not match"**
If the two password entries do not match, the script will prompt you to try again. Ensure both entries are identical.
- **General Script Failure or Unexpected Behavior**
If the script fails for an unknown reason, check the error message for details. Ensure your Palmr installation is up to date, and consider restarting the container if there are transient issues. If problems persist, consult the Palmr documentation or community for additional support.
## Security and best practices
To maintain the integrity and security of your Palmr instance while using this password reset method, adhere to the following guidelines:
- **Interactive Confirmation:** The script enforces interactive mode, requiring explicit confirmation at each step to prevent unauthorized or accidental resets. There are no shortcuts or automated options.
- **Access Restriction:** Only administrators with direct access to the Docker container can use this script, ensuring that unauthorized users cannot reset passwords.
- **Password Encryption:** New passwords are encrypted using bcrypt with 10 salt rounds, matching Palmr's standard security practices.
- **Documentation and Notification:** Always document the date, time, and reason for performing a password reset. Notify the affected user through alternative means (if possible) to inform them of the change.
- **Backup Recommendation:** Before using this script in a production environment, consider backing up your database to prevent data loss in case of an error.
- **Post-Reset Actions:** After resetting a password, verify that the user can log in successfully and check system logs for any unusual activity related to the reset.
- **Limit Usage:** Use this method sparingly and only in situations where SMTP-based reset is not an option. It is not intended for routine password management.
- **Secure Environment:** Ensure that access to the Docker container and host machine is secured with strong passwords, restricted permissions, and, if possible, two-factor authentication to prevent unauthorized access to administrative tools.
> **Tip:** Treat this method as a last resort. Whenever possible, configure SMTP to enable the standard email-based password reset process, which provides an additional layer of security and user verification.
## Security philosophy
This script is built with a strong focus on security, prioritizing mandatory interactivity, multiple confirmations, and strict input validation. There are no "quick modes" or bypass options—every password reset requires careful and deliberate action from the administrator to ensure accountability and minimize risks.

View File

@@ -0,0 +1,258 @@
---
title: Quick Start (Docker)
icon: "Rocket"
---
Welcome to the fastest way to deploy <span className="font-bold">Palmr.</span> - your secure, self-hosted file sharing solution. This guide will have you up and running in minutes, whether you're new to self-hosting or an experienced developer.
Palmr. offers flexible deployment options to match your infrastructure needs. This guide focuses on Docker deployment with our recommended filesystem storage, perfect for most use cases.
## Prerequisites
Ensure you have the following installed on your system:
- **Docker** - Container runtime ([installation guide](https://docs.docker.com/get-docker/))
- **Docker Compose** - Multi-container orchestration ([installation guide](https://docs.docker.com/compose/install/))
> **Platform Support**: Palmr. is developed on macOS and extensively tested on Linux servers. While we haven't formally tested other platforms, Docker's cross-platform nature should ensure compatibility. Report any issues on our [GitHub repository](https://github.com/kyantech/Palmr/issues).
## Storage Options
Palmr. supports two storage approaches for persistent data:
### Named Volumes (Recommended)
**Best for**: Production environments, automated deployments
- ✅ **Managed by Docker**: No permission issues or manual path management
- ✅ **Optimized Performance**: Docker-native storage optimization
- ✅ **Cross-platform**: Consistent behavior across operating systems
- ✅ **Simplified Backups**: Docker volume commands for backup/restore
### Bind Mounts
**Best for**: Development, direct file access requirements
- ✅ **Direct Access**: Files stored in local directory you specify
- ✅ **Transparent Storage**: Direct filesystem access from host
- ✅ **Custom Backup**: Use existing file system backup solutions
- ⚠️ **Permission Considerations**: May require user/group configuration
---
## Option 1: Named Volumes (Recommended)
Named volumes provide the best performance and are managed entirely by Docker.
### Configuration
Use the provided `docker-compose.yaml` for named volumes:
```yaml
services:
palmr:
image: kyantech/palmr:latest
container_name: palmr
environment:
- ENABLE_S3=false
- ENCRYPTION_KEY=change-this-key-in-production-min-32-chars # CHANGE THIS KEY FOR SECURITY
# - SECURE_SITE=false # Set to true if you are using a reverse proxy
ports:
- "5487:5487" # Web interface
- "3333:3333" # API port (OPTIONAL EXPOSED - ONLY IF YOU WANT TO ACCESS THE API DIRECTLY)
volumes:
- palmr_data:/app/server # Named volume for the application data
restart: unless-stopped # Restart the container unless it is stopped
volumes:
palmr_data:
```
### Deployment
```bash
docker-compose up -d
```
---
## Option 2: Bind Mounts
Bind mounts store data in a local directory, providing direct file system access.
### Configuration
To use bind mounts, **replace the content** of your `docker-compose.yaml` with the following configuration (you can also reference `docker-compose-bind-mount-example.yaml` as a template):
```yaml
services:
palmr:
image: kyantech/palmr:latest
container_name: palmr
environment:
- ENABLE_S3=false
- ENCRYPTION_KEY=change-this-key-in-production-min-32-chars # CHANGE THIS KEY FOR SECURITY
# - SECURE_SITE=false # Set to true if you are using a reverse proxy
# Optional: Set custom UID/GID for file permissions
# - PALMR_UID=1000
# - PALMR_GID=1000
ports:
- "5487:5487" # Web port
- "3333:3333" # API port (OPTIONAL EXPOSED - ONLY IF YOU WANT TO ACCESS THE API DIRECTLY)
volumes:
# Bind mount for persistent data (uploads, database, temp files)
- ./data:/app/server # Local directory for the application data
restart: unless-stopped # Restart the container unless it is stopped
```
### Deployment
```bash
docker-compose up -d
```
> **Permission Configuration**: If you encounter permission issues with bind mounts (common on NAS systems), see our [UID/GID Configuration](/docs/3.0-beta/uid-gid-configuration) guide for automatic permission handling.
---
## Environment Variables
Configure Palmr. behavior through environment variables:
| Variable | Default | Description |
| ---------------- | ------- | ------------------------------------------------------- |
| `ENABLE_S3` | `false` | Enable S3-compatible storage |
| `ENCRYPTION_KEY` | - | **Required**: Minimum 32 characters for file encryption |
| `SECURE_SITE` | `false` | Enable secure cookies for HTTPS/reverse proxy setups |
> **⚠️ Security Warning**: Always change the `ENCRYPTION_KEY` in production. This key encrypts your files - losing it makes files permanently inaccessible.
> **🔗 Reverse Proxy**: If deploying behind a reverse proxy (Traefik, Nginx, etc.), set `SECURE_SITE=true` and review our [Reverse Proxy Configuration](/docs/3.0-beta/reverse-proxy-configuration) guide for proper setup.
### Generate Secure Encryption Keys
Need a strong key for `ENCRYPTION_KEY`? Use our built-in generator to create cryptographically secure keys:
<KeyGenerator />
---
## Accessing Palmr.
Once deployed, access Palmr. through your web browser:
- **Local**: `http://localhost:5487`
- **Server**: `http://YOUR_SERVER_IP:5487`
### API Access (Optional)
If you exposed port 3333 in your configuration, you can also access:
- **API Documentation**: `http://localhost:3333/docs` (local) or `http://YOUR_SERVER_IP:3333/docs` (server)
- **API Endpoints**: Available at `http://localhost:3333` (local) or `http://YOUR_SERVER_IP:3333` (server)
> **📚 Learn More**: For complete API documentation, authentication, and integration examples, see our [API Reference](/docs/3.0-beta/api) guide.
> **💡 Production Tip**: For production deployments, configure HTTPS with a valid SSL certificate for enhanced security.
---
## Docker CLI Alternative
Prefer using Docker directly? Both storage options are supported:
**Named Volume:**
```bash
docker run -d \
--name palmr \
-e ENABLE_S3=false \
-e ENCRYPTION_KEY=your-secure-key-min-32-chars \
-p 5487:5487 \
-p 3333:3333 \
-v palmr_data:/app/server \
--restart unless-stopped \
kyantech/palmr:latest
```
**Bind Mount:**
```bash
docker run -d \
--name palmr \
-e ENABLE_S3=false \
-e ENCRYPTION_KEY=your-secure-key-min-32-chars \
-p 5487:5487 \
-p 3333:3333 \
-v $(pwd)/data:/app/server \
--restart unless-stopped \
kyantech/palmr:latest
```
---
## Maintenance
### Updates
Keep Palmr. current with the latest features and security fixes:
```bash
docker-compose pull
docker-compose up -d
```
### Backup & Restore
The backup method depends on which storage option you're using:
**Named Volume Backup:**
```bash
docker run --rm \
-v palmr_data:/data \
-v $(pwd):/backup \
alpine tar czf /backup/palmr-backup.tar.gz -C /data .
```
**Named Volume Restore:**
```bash
docker run --rm \
-v palmr_data:/data \
-v $(pwd):/backup \
alpine tar xzf /backup/palmr-backup.tar.gz -C /data
```
**Bind Mount Backup:**
```bash
tar czf palmr-backup.tar.gz ./data
```
**Bind Mount Restore:**
```bash
tar xzf palmr-backup.tar.gz
```
---
## Next Steps
Your Palmr. instance is now ready! Explore additional configuration options:
### Advanced Configuration
- **[UID/GID Configuration](/docs/3.0-beta/uid-gid-configuration)** - Configure user permissions for NAS systems and custom environments
- **[S3 Storage](/docs/3.0-beta/s3-configuration)** - Scale with Amazon S3 or compatible storage providers
- **[Manual Installation](/docs/3.0-beta/manual-installation)** - Manual installation and custom configurations
### Integration & Development
- **[API Reference](/docs/3.0-beta/api)** - Integrate Palmr. with your applications
- **[Architecture Guide](/docs/3.0-beta/architecture)** - Understanding Palmr. components and design
---
Need help? Visit our [GitHub Issues](https://github.com/kyantech/Palmr/issues) or community discussions.

View File

@@ -0,0 +1,199 @@
---
title: Reverse Proxy Configuration
icon: "Shield"
---
When deploying **Palmr.** behind a reverse proxy (like Traefik, Nginx, or Cloudflare), you need to configure secure cookie settings to ensure proper authentication. This guide covers the `SECURE_SITE` environment variable and related proxy configurations.
## Overview
Reverse proxies terminate SSL/TLS connections and forward requests to Palmr., which can cause authentication issues if cookies aren't configured properly for HTTPS environments. The `SECURE_SITE` environment variable controls cookie security settings to handle these scenarios.
## The SECURE_SITE Environment Variable
The `SECURE_SITE` variable configures how Palmr. handles authentication cookies based on your deployment environment:
### Configuration Options
| Value | Cookie Settings | Use Case |
| ------- | ------------------------------------- | ----------------------------------- |
| `true` | `secure: true`, `sameSite: "lax"` | HTTPS/Production with reverse proxy |
| `false` | `secure: false`, `sameSite: "strict"` | HTTP/Development (default) |
### When to Use SECURE_SITE=true
Set `SECURE_SITE=true` in the following scenarios:
- ✅ **Reverse Proxy with HTTPS**: Traefik, Nginx, HAProxy with SSL termination
- ✅ **Cloud Providers**: Cloudflare, AWS ALB, Azure Application Gateway
- ✅ **CDN with HTTPS**: Any CDN that terminates SSL
- ✅ **Production Deployments**: When users access via HTTPS
### When to Use SECURE_SITE=false
Keep `SECURE_SITE=false` (default) for:
- ✅ **Local Development**: Running on `http://localhost`
- ✅ **Direct HTTP Access**: No reverse proxy involved
- ✅ **Testing Environments**: When using HTTP
- ✅ **HTTP Reverse Proxy**: Nginx, Apache, etc. without SSL termination
---
## HTTP Reverse Proxy Setup
**Docker Compose for HTTP Nginx:**
```yaml
environment:
- SECURE_SITE=false # HTTP = false
```
> **⚠️ HTTP Security**: Remember that HTTP transmits data in plain text. Consider using HTTPS in production environments.
---
## Troubleshooting Authentication Issues
### Common Symptoms
If you experience authentication issues behind a reverse proxy:
- ❌ Login appears successful but redirects to login page
- ❌ "No Authorization was found in request.cookies" errors
- ❌ API requests return 401 Unauthorized
- ❌ User registration fails silently
### Diagnostic Steps
1. **Check Browser Developer Tools**:
- Look for cookies in Application/Storage tab
- Verify cookie has `Secure` flag when using HTTPS
- Check if `SameSite` attribute is appropriate
2. **Verify Environment Variables**:
```bash
docker exec -it palmr env | grep SECURE_SITE
```
3. **Test Cookie Settings**:
- With `SECURE_SITE=false`: Should work on HTTP
- With `SECURE_SITE=true`: Should work on HTTPS
### Common Fixes
**Problem**: Authentication fails with reverse proxy
**Solution**: Set `SECURE_SITE=true` and ensure proper headers:
```yaml
environment:
- SECURE_SITE=true
```
**Problem**: Mixed content errors
**Solution**: Ensure proxy passes correct headers:
```yaml
# Traefik
- "traefik.http.middlewares.palmr-headers.headers.customrequestheaders.X-Forwarded-Proto=https"
# Nginx
proxy_set_header X-Forwarded-Proto $scheme;
```
**Problem**: Authentication fails with HTTP reverse proxy
**Solution**: Use `SECURE_SITE=false` and ensure proper cookie headers:
```yaml
environment:
- SECURE_SITE=false # For HTTP proxy
```
```nginx
# Nginx - Add these headers for cookie handling
proxy_set_header Cookie $http_cookie;
proxy_pass_header Set-Cookie;
```
**Problem**: SQLite "readonly database" error with bind mounts
**Solution**: Configure proper UID/GID permissions:
```yaml
environment:
- PALMR_UID=1000 # Your host UID (check with: id)
- PALMR_GID=1000 # Your host GID
- ENCRYPTION_KEY=your-key-here
```
> **💡 Note**: Check your host UID/GID with `id` command and use those values. See [UID/GID Configuration](/docs/3.0-beta/uid-gid-configuration) for detailed setup.
---
## Security Considerations
> **⚠️ Important**: Always use HTTPS in production environments. The `SECURE_SITE=true` setting ensures cookies are only sent over encrypted connections.
---
## Advanced Configuration
### Multiple Domains
If serving Palmr. on multiple domains, ensure consistent cookie settings:
```yaml
environment:
- SECURE_SITE=true # Use for all HTTPS domains
```
### Development vs Production
Use environment-specific configurations:
**Development (HTTP):**
```yaml
environment:
- SECURE_SITE=false
```
**Production (HTTPS):**
```yaml
environment:
- SECURE_SITE=true
```
### Health Checks
Add health checks to ensure proper proxy configuration:
```yaml
services:
palmr:
# ... other config
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5487/api/health"]
interval: 30s
timeout: 10s
retries: 3
```
---
## Need Help?
If you're still experiencing issues after following this guide:
1. **Check the Logs**: `docker logs palmr`
2. **Verify Headers**: Use browser dev tools or `curl -I`
3. **Test Direct Access**: Try accessing Palmr. directly (bypassing proxy)
4. **Open an Issue**: [Report bugs on GitHub](https://github.com/kyantech/Palmr/issues)
> **💡 Pro Tip**: When reporting issues, include your reverse proxy configuration and any relevant error messages from both Palmr. and your proxy logs.

View File

@@ -0,0 +1,247 @@
---
title: S3 Providers
icon: Package
---
This guide provides comprehensive configuration instructions for integrating Palmr. with various S3-compatible storage providers. Whether you're using cloud services like AWS S3 or self-hosted solutions like MinIO, this guide will help you set up reliable object storage for your files.
> **Overview:** Palmr. supports any S3-compatible storage provider, giving you flexibility to choose the solution that best fits your needs and budget.
## When to use S3-compatible storage
Consider using S3-compatible storage when you need:
- **Cloud storage** for distributed deployments
- **Scalability** beyond local filesystem limitations
- **Redundancy** and backup capabilities
- **CDN integration** for faster file delivery
- **Multi-region** file distribution
## Environment variables
To enable S3-compatible storage, set `ENABLE_S3=true` and configure the following environment variables:
| Variable | Description | Required | Default |
| --------------------- | ----------------------------- | -------- | ----------------- |
| `S3_ENDPOINT` | S3 provider endpoint URL | Yes | - |
| `S3_PORT` | Connection port | No | Based on protocol |
| `S3_USE_SSL` | Enable SSL/TLS encryption | Yes | `true` |
| `S3_ACCESS_KEY` | Access key for authentication | Yes | - |
| `S3_SECRET_KEY` | Secret key for authentication | Yes | - |
| `S3_REGION` | Storage region | Yes | - |
| `S3_BUCKET_NAME` | Bucket/container name | Yes | - |
| `S3_FORCE_PATH_STYLE` | Use path-style URLs | No | `false` |
## Provider configurations
Below are tested configurations for popular S3-compatible providers. Replace the example values with your actual credentials and settings.
> **Security Note:** Never commit real credentials to version control. Use environment files or secure secret management systems.
### AWS S3
Amazon S3 is the original S3 service, offering global availability and extensive features.
```bash
ENABLE_S3=true
S3_ENDPOINT=s3.amazonaws.com
S3_USE_SSL=true
S3_ACCESS_KEY=your-access-key-id
S3_SECRET_KEY=your-secret-access-key
S3_REGION=us-east-1
S3_BUCKET_NAME=your-bucket-name
S3_FORCE_PATH_STYLE=false
```
**Getting credentials:**
1. Go to AWS IAM Console
2. Create a new user with S3 permissions
3. Generate access keys for programmatic access
### MinIO (Self-hosted)
MinIO is perfect for self-hosted deployments and development environments.
```bash
ENABLE_S3=true
S3_ENDPOINT=localhost
S3_PORT=9000
S3_USE_SSL=false
S3_ACCESS_KEY=your-minio-access-key
S3_SECRET_KEY=your-minio-secret-key
S3_REGION=us-east-1
S3_BUCKET_NAME=your-bucket-name
S3_FORCE_PATH_STYLE=true
```
**Setup notes:**
- Use `S3_FORCE_PATH_STYLE=true` for MinIO
- Default MinIO port is 9000
- SSL can be disabled for local development
### Google Cloud Storage
Google Cloud Storage offers competitive pricing and global infrastructure.
```bash
ENABLE_S3=true
S3_ENDPOINT=storage.googleapis.com
S3_USE_SSL=true
S3_ACCESS_KEY=your-hmac-access-id
S3_SECRET_KEY=your-hmac-secret
S3_REGION=us-central1
S3_BUCKET_NAME=your-bucket-name
S3_FORCE_PATH_STYLE=false
```
**Getting credentials:**
1. Enable Cloud Storage API in Google Cloud Console
2. Create HMAC keys for S3 compatibility
3. Use the generated access ID and secret
### DigitalOcean Spaces
DigitalOcean Spaces provides simple, scalable object storage.
```bash
ENABLE_S3=true
S3_ENDPOINT=nyc3.digitaloceanspaces.com
S3_USE_SSL=true
S3_ACCESS_KEY=your-spaces-access-key
S3_SECRET_KEY=your-spaces-secret-key
S3_REGION=nyc3
S3_BUCKET_NAME=your-space-name
S3_FORCE_PATH_STYLE=false
```
**Available regions:**
- `nyc3` (New York)
- `ams3` (Amsterdam)
- `sgp1` (Singapore)
- `fra1` (Frankfurt)
### Backblaze B2
Backblaze B2 offers cost-effective storage with S3-compatible API.
```bash
ENABLE_S3=true
S3_ENDPOINT=s3.us-west-002.backblazeb2.com
S3_USE_SSL=true
S3_ACCESS_KEY=your-key-id
S3_SECRET_KEY=your-application-key
S3_REGION=us-west-002
S3_BUCKET_NAME=your-bucket-name
S3_FORCE_PATH_STYLE=false
```
**Cost advantage:**
- Significantly lower storage costs
- Free egress to Cloudflare CDN
- Pay-as-you-go pricing model
### Wasabi
Wasabi provides hot cloud storage with predictable pricing.
```bash
ENABLE_S3=true
S3_ENDPOINT=s3.wasabisys.com
S3_USE_SSL=true
S3_ACCESS_KEY=your-access-key
S3_SECRET_KEY=your-secret-key
S3_REGION=us-east-1
S3_BUCKET_NAME=your-bucket-name
S3_FORCE_PATH_STYLE=false
```
**Benefits:**
- No egress fees
- Fast performance
- Simple pricing structure
### Azure Blob Storage
Azure Blob Storage with S3-compatible API for Microsoft ecosystem integration.
```bash
ENABLE_S3=true
S3_ENDPOINT=your-account.blob.core.windows.net
S3_USE_SSL=true
S3_ACCESS_KEY=your-access-key
S3_SECRET_KEY=your-secret-key
S3_REGION=eastus
S3_BUCKET_NAME=your-container-name
S3_FORCE_PATH_STYLE=false
```
**Setup requirements:**
- Enable S3-compatible API in Azure
- Use container name as bucket name
- Configure appropriate access policies
## Configuration best practices
### Security considerations
- **Use IAM policies** to limit access to specific buckets and operations
- **Enable encryption** at rest and in transit
- **Rotate credentials** regularly
- **Monitor access logs** for unusual activity
- **Use HTTPS** for all connections (`S3_USE_SSL=true`)
### Performance optimization
- **Choose regions** close to your users or server location
- **Configure CDN** for faster file delivery
- **Use appropriate bucket policies** for public file access
- **Monitor bandwidth** usage and costs
### Troubleshooting common issues
**Connection errors:**
- Verify endpoint URL and port settings
- Check firewall and network connectivity
- Ensure SSL/TLS settings match provider requirements
**Authentication failures:**
- Confirm access key and secret key are correct
- Verify IAM permissions for bucket operations
- Check if credentials have expired
**Bucket access issues:**
- Ensure bucket exists and is accessible
- Verify region settings match bucket location
- Check bucket policies and ACL settings
## Testing your configuration
After configuring your S3 provider, test the connection by:
1. **Upload a test file** through the Palmr. interface
2. **Verify file appears** in your S3 bucket
3. **Download the file** to confirm retrieval works
4. **Check file permissions** and access controls
> **Tip:** Start with a development bucket to test your configuration before using production storage.
## Switching between providers
To switch from filesystem to S3 storage or between S3 providers:
1. **Backup existing files** if switching from filesystem storage
2. **Update environment variables** with new provider settings
3. **Restart the Palmr. container** to apply changes
4. **Test file operations** to ensure everything works correctly
Remember that existing files won't be automatically migrated when switching storage providers.

View File

@@ -0,0 +1,141 @@
---
title: Screenshots
icon: Image
---
import { ZoomableImage } from "@/components/ui/zoomable-image";
## Screenshots
Here you can find a collection of screenshots showcasing various features and interfaces of the Palmr. web application. These images provide a visual overview of the user experience, highlighting key functionalities such as file sharing, user management, and settings configuration. Explore the screenshots below to get a better understanding of how Palmr works and what to expect from the platform.
> **Note:** All screenshots shown are taken in dark mode, but Palmr. also offers a light mode theme for users who prefer brighter interfaces.
### Authentication & Access
#### Home page
The main landing page where users can access the platform and learn about Palmr.'s features.
<ZoomableImage
src="/assets/v3/screenshots/home.png"
alt="Home Page - Main landing page of Palmr"
/>
#### Login page
Secure authentication interface where users enter their credentials to access their Palmr account.
<ZoomableImage
src="/assets/v3/screenshots/login.png"
alt="Login Page - User authentication interface"
/>
#### Forgot password
Password recovery interface that allows users to reset their passwords when they can't access their accounts.
<ZoomableImage
src="/assets/v3/screenshots/forgot-password.png"
alt="Forgot Password - Password recovery interface"
/>
### Main Application Interface
#### Dashboard
The central hub after login, providing an overview of recent activity, quick actions, and system status.
<ZoomableImage
src="/assets/v3/screenshots/dashboard.png"
alt="Dashboard - Main application hub with overview and quick actions"
/>
### File Management
#### Files list view
Comprehensive file browser displaying all uploaded files in a detailed list format with metadata, actions, and sorting options.
<ZoomableImage
src="/assets/v3/screenshots/files-list.png"
alt="Files List View - Detailed file browser with metadata and actions"
/>
#### Files card view
Alternative file browser layout showing files as visual cards, perfect for quick browsing and visual file identification.
<ZoomableImage
src="/assets/v3/screenshots/files-card.png"
alt="Files Card View - Visual card-based file browser layout"
/>
#### Receive files
File upload interface where users can drag and drop or select files to upload to their Palmr storage.
<ZoomableImage
src="/assets/v3/screenshots/receive-files.png"
alt="Receive Files - File upload interface with drag and drop functionality"
/>
### Sharing & Collaboration
#### Shares page
Management interface for all shared files and folders, showing share status, permissions, and access controls.
<ZoomableImage
src="/assets/v3/screenshots/shares.png"
alt="Shares Page - Share management with permissions and access controls"
/>
### User & System Management
#### User management
Administrative interface for managing user accounts, permissions, roles, and system access controls.
<ZoomableImage
src="/assets/v3/screenshots/user-management.png"
alt="User Management - Administrative interface for user accounts and permissions"
/>
#### Profile settings
Personal account management where users can update their profile information, preferences, and account settings.
<ZoomableImage
src="/assets/v3/screenshots/profile.png"
alt="Profile Settings - Personal account management and preferences"
/>
#### System settings
Comprehensive system configuration interface for administrators to manage platform settings, integrations, and system behavior.
<ZoomableImage
src="/assets/v3/screenshots/settings.png"
alt="System Settings - Administrative configuration interface"
/>
### Reverse share page themes
#### WeTransfer theme
Special sharing interface with WeTransfer-inspired design, providing a familiar experience for file sharing with custom theming.
<ZoomableImage
src="/assets/v3/screenshots/wetransfer.png"
alt="WeTransfer Theme - WeTransfer-inspired sharing interface with custom theming"
/>
#### Default reverse theme
Alternative dark theme interface showing Palmr's theming capabilities and customization options for different user preferences.
<ZoomableImage
src="/assets/v3/screenshots/default-reverse.png"
alt="Default Reverse Theme - Dark theme interface showcasing customization options"
/>

View File

@@ -0,0 +1,222 @@
---
title: UID/GID Configuration
icon: "Users"
---
Configure user and group permissions for seamless bind mount compatibility across different host systems, particularly NAS environments.
## Overview
Palmr. supports runtime UID/GID configuration to resolve permission conflicts when using bind mounts. This eliminates the need for manual permission management on your host system.
**Default Configuration**: UID 1001, GID 1001
## When to Configure
UID/GID configuration is recommended when:
- Using bind mounts with different host user permissions
- Deploying on NAS systems (Synology, QNAP, etc.)
- Encountering "permission denied" errors
- Host system uses different default UID/GID values
## Environment Variables
Configure permissions using these optional environment variables:
| Variable | Description | Default | Example |
| ----------- | -------------------------------- | ------- | ------- |
| `PALMR_UID` | User ID for container processes | `1001` | `1000` |
| `PALMR_GID` | Group ID for container processes | `1001` | `1000` |
---
## Finding Host UID/GID
Determine your host system's user and group IDs:
```bash
# Check current user
id
# Output example
uid=1000(user) gid=1000(group) groups=1000(group),27(sudo)
```
Use the `uid` and `gid` values for your configuration.
---
## Configuration Examples
### Standard Linux System
```yaml
services:
palmr:
image: kyantech/palmr:latest
container_name: palmr
environment:
- ENABLE_S3=false
- ENCRYPTION_KEY=your-secure-key-min-32-chars
- PALMR_UID=1000
- PALMR_GID=1000
ports:
- "5487:5487"
volumes:
- ./data:/app/server
restart: unless-stopped
```
### Synology NAS
```yaml
services:
palmr:
image: kyantech/palmr:latest
container_name: palmr
environment:
- ENABLE_S3=false
- ENCRYPTION_KEY=your-secure-key-min-32-chars
- PALMR_UID=1026
- PALMR_GID=100
ports:
- "5487:5487"
volumes:
- /volume1/docker/palmr:/app/server
restart: unless-stopped
```
### QNAP NAS
```yaml
services:
palmr:
image: kyantech/palmr:latest
container_name: palmr
environment:
- ENABLE_S3=false
- ENCRYPTION_KEY=your-secure-key-min-32-chars
- PALMR_UID=1000
- PALMR_GID=100
ports:
- "5487:5487"
volumes:
- /share/Container/palmr:/app/server
restart: unless-stopped
```
---
## Migration Guide
### Existing Installations
To add UID/GID configuration to running installations:
1. **Stop the container**
```bash
docker-compose down
```
2. **Backup your data**
```bash
cp -r ./data ./data-backup
```
3. **Update configuration**
Add UID/GID variables to your `docker-compose.yaml`
4. **Restart with new configuration**
```bash
docker-compose up -d
```
---
## Verification
### Check Configuration
Verify UID/GID settings are applied correctly:
```bash
# View startup logs
docker-compose logs palmr | head -20
# Check file ownership
docker exec palmr ls -la /app/server/
# Verify process UID/GID
docker exec palmr ps aux | grep node
```
### Troubleshooting
**Permission issues persist:**
```bash
# Check environment variables
docker exec palmr env | grep PALMR
# Verify file ownership
docker exec palmr stat /app/server/prisma/palmr.db
# Review configuration logs
docker-compose logs palmr | grep -E "🔧|🔐|🔽"
```
**NAS-specific debugging:**
```bash
# Synology - Check mount point ownership
ls -la /volume1/docker/palmr/
# QNAP - Check mount point ownership
ls -la /share/Container/palmr/
# Check NAS user configuration
cat /etc/passwd | grep -v nobody
```
---
## Implementation Details
The UID/GID configuration process:
1. **Detection** - Environment variables are read during container startup
2. **Ownership Update** - File permissions are adjusted to match target UID/GID
3. **Privilege Drop** - Application runs with specified user permissions via `su-exec`
4. **Logging** - Configuration changes are logged for verification
This approach provides automatic permission management without user creation or system modification.
---
## Build-Time Configuration
For custom base images with different default values:
```bash
docker build \
--build-arg PALMR_UID=2000 \
--build-arg PALMR_GID=2000 \
-t palmr:custom .
```
Runtime environment variables override build-time defaults.
---
## Benefits
- **Zero Configuration** - Works automatically when environment variables are set
- **Universal Compatibility** - Supports any valid UID/GID combination
- **NAS Optimized** - Tested with major NAS platforms
- **Backward Compatible** - Existing deployments continue without modification
- **Performance Optimized** - Lightweight implementation using `su-exec`
For permission issues with bind mounts, add the appropriate `PALMR_UID` and `PALMR_GID` environment variables to resolve conflicts automatically.

View File

@@ -0,0 +1,7 @@
{
"pages": [
"3.0-beta",
"2.0.0-beta",
"1.1.7-beta"
]
}

29
apps/docs/next.config.mjs Normal file
View File

@@ -0,0 +1,29 @@
import { createMDX } from 'fumadocs-mdx/next';
const withMDX = createMDX();
/** @type {import('next').NextConfig} */
const config = {
reactStrictMode: true,
eslint: {
ignoreDuringBuilds: true,
},
typescript: {
ignoreBuildErrors: true,
},
images: {
qualities: [100],
remotePatterns: [
{
protocol: 'https',
hostname: '**'
},
{
protocol: 'http',
hostname: '**'
}
]
}
};
export default withMDX(config);

View File

@@ -1,17 +1,50 @@
{
"name": "palmr-docs",
"type": "module",
"version": "0.0.1",
"version": "v3.0-beta",
"description": "Docs for Palmr",
"private": true,
"author": "Daniel Luiz Alves <daniel@kyantech.com.br>",
"keywords": [
"palmr",
"docs",
"documentation",
"mdx",
"nextjs",
"react",
"typescript"
],
"license": "BSD-2-Clause",
"packageManager": "pnpm@10.6.0",
"scripts": {
"dev": "astro dev",
"start": "astro preview",
"build": "astro build && cp -r public dist/",
"preview": "astro preview",
"astro": "astro"
"build": "next build",
"dev": "next dev --turbo",
"start": "next start",
"postinstall": "fumadocs-mdx"
},
"dependencies": {
"@astrojs/starlight": "^0.32.2",
"astro": "^5.1.5",
"sharp": "^0.32.5"
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"fumadocs-core": "15.2.7",
"fumadocs-mdx": "11.6.0",
"fumadocs-ui": "15.2.7",
"lucide-react": "^0.488.0",
"motion": "^12.9.1",
"next": "15.3.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"tailwind-merge": "^3.2.0"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.1.3",
"@types/mdx": "^2.0.13",
"@types/node": "22.14.0",
"@types/react": "^19.1.0",
"@types/react-dom": "^19.1.2",
"eslint": "^8",
"eslint-config-next": "15.3.0",
"postcss": "^8.5.3",
"tailwindcss": "^4.1.3",
"tw-animate-css": "^1.2.8",
"typescript": "^5.8.3"
}
}

6541
apps/docs/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,5 @@
export default {
plugins: {
'@tailwindcss/postcss': {},
},
};

View File

Before

Width:  |  Height:  |  Size: 222 KiB

After

Width:  |  Height:  |  Size: 222 KiB

View File

Before

Width:  |  Height:  |  Size: 182 KiB

After

Width:  |  Height:  |  Size: 182 KiB

View File

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 120 KiB

View File

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 134 KiB

View File

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

View File

Before

Width:  |  Height:  |  Size: 526 KiB

After

Width:  |  Height:  |  Size: 526 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 94 KiB

View File

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

View File

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 156 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 108 KiB

View File

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 85 KiB

View File

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Some files were not shown because too many files have changed in this diff Show More