{"id":15564309,"url":"https://github.com/ku9nov/faynosync","last_synced_at":"2026-03-16T13:11:34.978Z","repository":{"id":142923625,"uuid":"588595239","full_name":"ku9nov/faynoSync","owner":"ku9nov","description":"Self-hosted API server for desktop app updates (Windows/macOS/Linux)","archived":false,"fork":false,"pushed_at":"2025-08-05T07:51:29.000Z","size":1191,"stargazers_count":33,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-05T09:31:40.123Z","etag":null,"topics":["api","auto-update","cross-platform","desktop-app","electron","go","self-hosted","software-updates","update-server"],"latest_commit_sha":null,"homepage":"https://ku9nov.github.io/faynoSync-site/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ku9nov.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-01-13T14:07:12.000Z","updated_at":"2025-08-05T07:51:33.000Z","dependencies_parsed_at":null,"dependency_job_id":"f39affff-10d3-4b40-8f71-3c80f838580c","html_url":"https://github.com/ku9nov/faynoSync","commit_stats":null,"previous_names":["ku9nov/faynosync"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/ku9nov/faynoSync","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ku9nov%2FfaynoSync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ku9nov%2FfaynoSync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ku9nov%2FfaynoSync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ku9nov%2FfaynoSync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ku9nov","download_url":"https://codeload.github.com/ku9nov/faynoSync/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ku9nov%2FfaynoSync/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269409788,"owners_count":24412142,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-08T02:00:09.200Z","response_time":72,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","auto-update","cross-platform","desktop-app","electron","go","self-hosted","software-updates","update-server"],"created_at":"2024-10-02T16:40:31.616Z","updated_at":"2026-03-16T13:11:34.971Z","avatar_url":"https://github.com/ku9nov.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FaynoSync\n\n![a-github-banner-for-faynosync-featuring](https://github.com/user-attachments/assets/219a2028-3cd2-4a8e-9e55-16b1c40c55ca)\n\n\u003cdiv align=\"center\"\u003e\n  \n  [![Documentation](https://img.shields.io/badge/Documentation-available-brightgreen)](https://ku9nov.github.io/faynoSync-site/docs/intro)\n  ![Docker Pulls](https://img.shields.io/docker/pulls/ku9nov/faynosync)\n  ![GitHub Release](https://img.shields.io/github/v/release/ku9nov/faynoSync)\n  ![Docker Compose Test](https://github.com/ku9nov/faynoSync/actions/workflows/tests.yml/badge.svg)\n\n\u003c/div\u003e\n\n---\n\n## 📖 Overview\n\nfaynoSync is a self-hosted, open-source API server for managing and updating cross-platform desktop applications (Windows, macOS, Linux).\nIt enables automatic and on-demand updates for client software, making it easy to deliver new versions to users through a customizable update workflow.\n\nThe server allows developers to upload application builds to S3, set version metadata, and expose a simple REST API for clients to check for updates.\nWhen a client queries the API, it receives version information and a download URL if an update is available.\n\nfaynoSync supports both background updates and manual update prompts, depending on how the client integrates with the API. This gives developers full control over how and when updates are delivered to end-users.\n\nIt’s ideal for managing updates in Electron apps, native desktop applications, or any cross-platform software where you want full control over versioning, distribution, and update channels (e.g. stable, beta, nightly).\n\n---\n\n## 🛠️ Supported Technologies\n\n| Category | Technology | Description |\n|----------|------------|-------------|\n| **API Framework** | Go (Golang) | Main application server built with Go |\n| **Database** | MongoDB | Primary database for storing application metadata, users, and configurations |\n| **Cache \u0026 Performance** | Redis | Used for performance mode and statistics caching |\n| **Storage** | S3-Compatible | Supports multiple cloud storage providers: |\n| | AWS S3 | Amazon Web Services Simple Storage Service |\n| | MinIO | Self-hosted S3-compatible object storage |\n| | Google Cloud Storage | Google Cloud Platform storage service |\n| | DigitalOcean Spaces | DigitalOcean's S3-compatible object storage |\n\n---\n\n### 📖 Documentation Links\n- **Repository**: [faynoSync-site](https://github.com/ku9nov/faynoSync-site) - Source code for documentation\n- **Live Documentation**: [faynoSync Documentation](https://ku9nov.github.io/faynoSync-site/docs/intro) - Online documentation\n\n---\n\n### 🖥️ Frontend Links\n- **Dashboard Repository**: [faynoSync-dashboard](https://github.com/ku9nov/faynoSync-dashboard) - Web-based management interface\n\n---\n\n## 📱 Client Application Examples\n\nYou can find examples of client applications [here](https://github.com/ku9nov/faynoSync/tree/main/examples).\n\n### 🔗 Example Links\n- **Examples Directory**: [Client Application Examples](https://github.com/ku9nov/faynoSync/tree/main/examples) - Various client implementations\n\n### 📋 API Usage Template\n\n- **Postman Collection**: [faynoSync.postman_collection.json](https://github.com/ku9nov/faynoSync/blob/main/examples/faynoSync.postman_collection.json) - Ready-to-use API requests\n- **API Documentation**: [API.md](https://github.com/ku9nov/faynoSync/blob/main/API.md) - Complete API reference\n\n---\n\n## 🚀 Installation\n\nTo use this application, you will need to have Golang installed on your machine. You can install it from the official [website](https://golang.org/doc/install).\n\n### 📥 Installation Steps\n\n1. **Install Go**: Download and install from [golang.org](https://golang.org/doc/install)\n\n2. **Clone Repository**: Once you have installed Golang, clone this repository to your local machine:\n\n```bash\ngit clone https://github.com/ku9nov/faynoSync.git\n```\n\n---\n\n## ⚙️ Configuration\n\nTo configure the `faynoSync`, you will need to set the following environment variables:\n\n### 🔧 Required Environment Variables\n\n```bash\n# Storage Configuration\nSTORAGE_DRIVER (`minio`, `aws`, `gcp` or `digitalocean`)\nS3_ACCESS_KEY (Your AWS or Minio access key ID.)\nS3_SECRET_KEY (Your AWS or Minio secret access key.)\nS3_REGION (The AWS region in which your S3 bucket is located. For Minio this value should be empty.)\nMINIO_SECURE (Set to `true` to use HTTPS with Minio endpoint or `false` to use HTTP. Default: `false`)\nS3_BUCKET_NAME_PRIVATE (The name of your private S3 bucket.)\nS3_ENDPOINT_PRIVATE (s3 endpoint, check documentation of your cloud provider)\nS3_BUCKET_NAME (The name of your public S3 bucket. Artifacts will be uploaded here by default.)\nS3_ENDPOINT (The public bucket endpoint for S3. Check the documentation of your cloud provider. Artifacts will be uploaded here by default.)\n\n# Server Configuration\nALLOWED_CORS (urls to allow CORS configuration)\nPORT (The port on which the auto updater service will listen. Default: 9000)\n\n# Database Configuration\nMONGODB_URL=mongodb://root:MheCk6sSKB1m4xKNw5I@127.0.0.1/cb_faynosync_db?authSource=admin (see docker-compose file)\nMONGODB_URL_TESTS (MongoDB connection string used for tests that require a MongoDB instance. Optional.)\n\n# Security Configuration\nAPI_KEY (generated by 'openssl rand -base64 16') Used for SignUp\nAPI_URL=(public URL to this API)\nJWT_SECRET (Secret used to sign and validate JWT tokens. Generate with 'openssl rand -base64 32' or similar.)\n\n# Performance Configuration\nPERFORMANCE_MODE (Set to `true` to enable performance mode)\n\n# Redis Configuration\nREDIS_HOST (The hostname for the Redis server, default: `localhost`)\nREDIS_PORT (The port for the Redis server, default: `6379`)\nREDIS_PASSWORD (Password for Redis, leave empty if not set)\nREDIS_DB (The Redis database number to use, default: `0`)\n\n# Slack Configuration\nSLACK_ENABLE (Set to `true` to enable Slack notifications, `false` to disable.)\nSLACK_BOT_TOKEN (Slack bot token used to send notifications. Required when Slack is enabled.)\nSLACK_CHANNEL (Slack channel identifier where notifications will be sent.)\nSLACK_NOTIFICATION_TTL (How long Slack notifications are considered valid, for example `24h`.)\n\n# Feature Flags\nENABLE_PRIVATE_APP_DOWNLOADING=false (if enabled, then apps located in private S3 can be downloaded using the public API; if disabled, then download links require authentication)\nENABLE_TELEMETRY (Set to `true` to enable telemetry)\n\n# TUF Configuration\nTUF_ENABLED=true (Set to `true` to enable TUF (The Update Framework) functionality. This enables secure software update management with metadata signing, artifact publishing, and root key rotation capabilities)\nONLINE_KEY_DIR=/private_keys (Directory path where online signing keys are stored. These keys are used for online metadata signing operations in TUF)\n```\n\n### 📝 Environment File Setup\n\nYou can set these environment variables in a `.env` file in the root directory of the application. You can use the `.env.local` file, which contains all filled variables.\n\n---\n\n## 🐳 Docker Configuration\n\nTo build and run the API with all dependencies, you can use the following command:\n\n```bash\ndocker compose up --build\n```\n\n### 🧪 Running Tests\n\nYou can now run tests using this command (please wait until the `s3-service` successfully creates the bucket):\n\n```bash\ndocker exec -it faynoSync_backend \"/usr/bin/faynoSync_tests\"\n```\n\n### 🔧 Development Setup\n\nIf you only want to run dependency services (for local development without Docker), use this command:\n\n```bash\ndocker compose -f docker-compose.yaml -f docker-compose.development.yaml up\n```\n\n---\n\n## 💻 Usage\n\nTo use the auto updater service, follow these steps:\n\n### 🔨 Build the Application\n\n```bash\ngo build -o faynoSync faynoSync.go\n```\n\n### 🚀 Start the Service\n\n1. **Start with Migrations**:\n```bash\n./faynoSync --migration\n```\n\n2. **Rollback Migrations** (if needed):\n```bash\n./faynoSync --migration --rollback\n```\n\n### 📤 Upload Your Application\n\n3. Upload your application to S3 and set the version number in [faynoSync-dashboard](https://github.com/ku9nov/faynoSync-dashboard) or using API.\n\n### 🔍 Check for Updates\n\n4. In your client application, make a GET request to the auto updater service API, passing the current version number as a query parameter:\n\n```\nhttp://localhost:9000/checkVersion?app_name=myapp\u0026version=0.0.1\u0026owner=admin\n```\n\n### 📋 API Response\n\nThe auto updater service will return a JSON response with the following structure:\n\n```json\n{\n    \"update_available\": false,\n    \"update_url_deb\": \"http://localhost:9000/download?key=secondapp/myapp-0.0.1.deb\",\n    \"update_url_rpm\": \"http://localhost:9000/download?key=secondapp/myapp-0.0.1.rpm\"\n}\n```\n\nIf an update is available, the `update_available` field will be `true`, and the `update_url` field will contain a link to the updated application.\n\n### 🔔 User Notification\n\n5. In your client application, show an alert to the user indicating that an update is available and provide a link to download the updated application.\n\n---\n\n## 🧪 Testing\n\n### 🚀 Run End-to-End Tests\n\n```bash\ngo test\n```\n\n### 🔨 Build Test Binary\n\n```bash\ngo test -c -o faynoSync_tests\n```\n\n### 🧪 Run Unit Tests (TUF functionality)\n\n```bash\n# Optional: set MONGODB_URL_TESTS for tests that require a MongoDB connection\n# export MONGODB_URL_TESTS=mongodb://root:MheCk6sSKB1m4xKNw5I@localhost/cb_faynosync_db_tests?authSource=admin\ngo test ./server/tuf/...\n```\n\n### 📋 Test Requirements\n\n**Test Descriptions**\n\nTo successfully run the tests and have them pass, you need to populate the `.env` file.\n\nThe tests verify the implemented API using a test database and an existing S3 bucket.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e📋 Complete List of Tests\u003c/strong\u003e\u003c/summary\u003e\n\n\u003cbr\u003e\n\n  \u003cli\u003eTestHealthCheck\u003c/li\u003e\n  \u003cli\u003eTestLogin\u003c/li\u003e\n  \u003cli\u003eTestFailedLogin (expected result from API \"401\")\u003c/li\u003e\n  \u003cli\u003eTestListApps\u003c/li\u003e\n  \u003cli\u003eTestListAppsWithInvalidToken (expected result from API \"401\")\u003c/li\u003e\n  \u003cli\u003eTestAppCreate\u003c/li\u003e\n  \u003cli\u003eTestSecondaryAppCreate (expected result from API \"failed\")\u003c/li\u003e\n  \u003cli\u003eTestUploadApp\u003c/li\u003e\n  \u003cli\u003eTestUploadDuplicateApp (expected result from API \"failed\")\u003c/li\u003e\n  \u003cli\u003eTestDeleteApp\u003c/li\u003e\n  \u003cli\u003eTestChannelCreateNightly\u003c/li\u003e\n  \u003cli\u003eTestChannelCreateStable\u003c/li\u003e\n  \u003cli\u003eTestUploadAppWithoutChannel (expected result from API \"failed\")\u003c/li\u003e\n  \u003cli\u003eTestMultipleUploadWithChannels\u003c/li\u003e\n  \u003cli\u003eTestSearchApp\u003c/li\u003e\n  \u003cli\u003eTestCheckVersionLatestVersion\u003c/li\u003e\n  \u003cli\u003eTestFetchkLatestVersionOfApp\u003c/li\u003e\n  \u003cli\u003eTestMultipleDelete\u003c/li\u003e\n  \u003cli\u003eTestDeleteNightlyChannel\u003c/li\u003e\n  \u003cli\u003eTestDeleteStableChannel\u003c/li\u003e\n  \u003cli\u003eTestPlatformCreate\u003c/li\u003e\n  \u003cli\u003eTestUploadAppWithoutPlatform\u003c/li\u003e\n  \u003cli\u003eTestArchCreate\u003c/li\u003e\n  \u003cli\u003eTestUploadAppWithoutArch\u003c/li\u003e\n  \u003cli\u003eTestDeletePlatform\u003c/li\u003e\n  \u003cli\u003eTestDeleteArch\u003c/li\u003e\n  \u003cli\u003eTestListArchs\u003c/li\u003e\n  \u003cli\u003eTestListPlatforms\u003c/li\u003e\n  \u003cli\u003eTestListChannels\u003c/li\u003e\n  \u003cli\u003eTestListArchsWhenExist\u003c/li\u003e\n  \u003cli\u003eTestListPlatformsWhenExist\u003c/li\u003e\n  \u003cli\u003eTestListChannelsWhenExist\u003c/li\u003e\n  \u003cli\u003eTestSignUp\u003c/li\u003e\n  \u003cli\u003eTestFailedSignUp (expected result from API \"401\")\u003c/li\u003e\n  \u003cli\u003eTestUpdateSpecificApp\u003c/li\u003e\n  \u003cli\u003eTestListAppsWhenExist\u003c/li\u003e\n  \u003cli\u003eTestDeleteAppMeta\u003c/li\u003e\n  \u003cli\u003eTestUpdateChannel\u003c/li\u003e\n  \u003cli\u003eTestUpdateApp\u003c/li\u003e\n  \u003cli\u003eTestUpdatePlatform\u003c/li\u003e\n  \u003cli\u003eTestUpdateArch\u003c/li\u003e\n  \u003cli\u003eTestFailedUpdatePlatform (expected result from API \"400\")\u003c/li\u003e\n  \u003cli\u003eTestChannelCreateWithWrongName (expected result from API \"400\")\u003c/li\u003e\n  \u003cli\u003eTestCreateSecondPlatform\u003c/li\u003e\n  \u003cli\u003eTestCreateSecondArch\u003c/li\u003e\n  \u003cli\u003eTestMultipleUploadWithSameExtension\u003c/li\u003e\n  \u003cli\u003eTestCheckVersionWithSameExtensionArtifactsAndDiffPlatformsArchs\u003c/li\u003e\n  \u003cli\u003eTestMultipleDeleteWithSameExtensionArtifactsAndDiffPlatformsArchs\u003c/li\u003e\n  \u003cli\u003eTestDeleteSecondPlatform\u003c/li\u003e\n  \u003cli\u003eTestDeleteSecondArch\u003c/li\u003e\n  \u003cli\u003eTestCreatePublicApp\u003c/li\u003e\n  \u003cli\u003eTestDeletePublicAppMeta\u003c/li\u003e\n  \u003cli\u003eTestUpdateSpecificAppWithSecondUser (expected result from API \"500\")\u003c/li\u003e\n  \u003cli\u003eTestListAppsWithSecondUser\u003c/li\u003e\n  \u003cli\u003eTestListChannelsWithSecondUser\u003c/li\u003e\n  \u003cli\u003eTestListPlatformsWithSecondUser\u003c/li\u003e\n  \u003cli\u003eTestListArchsWithSecondUser\u003c/li\u003e\n  \u003cli\u003eTestUpdateAppWithSecondUser (expected result from API \"500\")\u003c/li\u003e\n  \u003cli\u003eTestUpdateChannelWithSecondUser (expected result from API \"500\")\u003c/li\u003e\n  \u003cli\u003eTestUpdatePlatformWithSecondUser (expected result from API \"500\")\u003c/li\u003e\n  \u003cli\u003eTestUpdateArchWithSecondUser (expected result from API \"500\")\u003c/li\u003e\n  \u003cli\u003eTestMultipleDeleteWithSameExtensionArtifactsAndDiffPlatformsArchsWithSecondUser (expected result from API \"500\")\u003c/li\u003e\n  \u003cli\u003eTestDeleteNightlyChannelWithSecondUser (expected result from API \"500\")\u003c/li\u003e\n  \u003cli\u003eTestDeletePlatformWithSecondUser (expected result from API \"500\")\u003c/li\u003e\n  \u003cli\u003eTestDeleteArchWithSecondUser (expected result from API \"500\")\u003c/li\u003e\n  \u003cli\u003eTestDeleteAppMetaWithSecondUser (expected result from API \"500\")\u003c/li\u003e\n  \u003cli\u003eTestCreateTeamUser\u003c/li\u003e\n  \u003cli\u003eTestTeamUserLogin\u003c/li\u003e\n  \u003cli\u003eTestFailedUploadAppUsingTeamUser (expected result from API \"403\")\u003c/li\u003e\n  \u003cli\u003eTestFailedUpdateAppUsingTeamUser (expected result from API \"403\")\u003c/li\u003e\n  \u003cli\u003eTestFailedUpdateChannelUsingTeamUser (expected result from API \"403\")\u003c/li\u003e\n  \u003cli\u003eTestFailedUpdatePlatformUsingTeamUser (expected result from API \"403\")\u003c/li\u003e\n  \u003cli\u003eTestFailedUpdateArchUsingTeamUser (expected result from API \"403\")\u003c/li\u003e\n  \u003cli\u003eTestListAppsUsingTeamUserBeforeCreate\u003c/li\u003e\n  \u003cli\u003eTestListChannelsUsingTeamUserBeforeCreate\u003c/li\u003e\n  \u003cli\u003eTestListPlatformsUsingTeamUserBeforeCreate\u003c/li\u003e\n  \u003cli\u003eTestListArchsUsingTeamUserBeforeCreate\u003c/li\u003e\n  \u003cli\u003eTestAppCreateTeamUser\u003c/li\u003e\n  \u003cli\u003eTestListAppsUsingTeamUser\u003c/li\u003e\n  \u003cli\u003eTestFailedDeleteTeamUserApp (expected result from API \"403\")\u003c/li\u003e\n  \u003cli\u003eTestChannelCreateTeamUser\u003c/li\u003e\n  \u003cli\u003eTestListChannelsUsingTeamUser\u003c/li\u003e\n  \u003cli\u003eTestFailedDeleteTeamUserChannel (expected result from API \"403\")\u003c/li\u003e\n  \u003cli\u003eTestPlatformCreateTeamUser\u003c/li\u003e\n  \u003cli\u003eTestListPlatformsUsingTeamUser\u003c/li\u003e\n  \u003cli\u003eTestFailedDeleteTeamUserPlatform (expected result from API \"403\")\u003c/li\u003e\n  \u003cli\u003eTestArchCreateTeamUser\u003c/li\u003e\n  \u003cli\u003eTestListArchsUsingTeamUser\u003c/li\u003e\n  \u003cli\u003eTestFailedDeleteTeamUserArch (expected result from API \"403\")\u003c/li\u003e\n  \u003cli\u003eTestFailedUpdateTeamUser (expected result from API \"403\")\u003c/li\u003e\n  \u003cli\u003eTestUpdateTeamUser\u003c/li\u003e\n  \u003cli\u003eTestUpdateAppUsingTeamUser\u003c/li\u003e\n  \u003cli\u003eTestUpdateChannelUsingTeamUser\u003c/li\u003e\n  \u003cli\u003eTestUpdatePlatformUsingTeamUser\u003c/li\u003e\n  \u003cli\u003eTestUpdateArchUsingTeamUser\u003c/li\u003e\n  \u003cli\u003eTestFailedAppCreateTeamUser (expected result from API \"403\")\u003c/li\u003e\n  \u003cli\u003eTestDeleteTeamUserApp\u003c/li\u003e\n  \u003cli\u003eTestDeleteTeamUserChannel\u003c/li\u003e\n  \u003cli\u003eTestDeleteTeamUserPlatform\u003c/li\u003e\n  \u003cli\u003eTestDeleteTeamUserArch\u003c/li\u003e\n  \u003cli\u003eTestListTeamUsers\u003c/li\u003e\n  \u003cli\u003eTestDeleteTeamUser\u003c/li\u003e\n  \u003cli\u003eTestWhoAmIAdmin\u003c/li\u003e\n  \u003cli\u003eTestWhoAmITeamUser\u003c/li\u003e\n  \u003cli\u003eTestFailedUpdateAdminUser\u003c/li\u003e\n  \u003cli\u003eTestUpdateAdminUser\u003c/li\u003e\n  \u003cli\u003eTestFailedLoginWithOldPassword\u003c/li\u003e\n  \u003cli\u003eTestSuccessfulLoginWithNewPassword\u003c/li\u003e\n  \u003cli\u003eTestFailedUpdateAdminUserUsingTeamUser\u003c/li\u003e\n  \u003cli\u003eTestFilterSearchWithChannel\u003c/li\u003e\n  \u003cli\u003eTestFilterSearchWithChannelAndPublished\u003c/li\u003e\n  \u003cli\u003eTestFilterSearchWithChannelAndPublishedAndCritical\u003c/li\u003e\n  \u003cli\u003eTestFilterSearchWithChannelAndPublishedAndCriticalAndPlatform\u003c/li\u003e\n  \u003cli\u003eTestFilterSearchWithChannelAndPublishedAndCriticalAndPlatformAndArch\u003c/li\u003e\n  \u003cli\u003eTestSearchOnlyPublished\u003c/li\u003e\n  \u003cli\u003eTestSearchOnlyCritical\u003c/li\u003e\n  \u003cli\u003eTestSearchOnlyUniversalPlatform\u003c/li\u003e\n  \u003cli\u003eTestMultipleUploadWithIntermediate\u003c/li\u003e\n  \u003cli\u003eTestUpdateSpecificAppWithIntermediate\u003c/li\u003e\n  \u003cli\u003eTestCheckVersionWithIntermediate\u003c/li\u003e\n  \u003cli\u003eTestMultipleDeleteWithIntermediate\u003c/li\u003e\n  \u003cli\u003eTestTelemetryWithVariousParams\u003c/li\u003e\n  \u003cli\u003eTestCreateAppWithUpdaters\u003c/li\u003e\n  \u003cli\u003eTestPlatformCreateWindows\u003c/li\u003e\n  \u003cli\u003eTestUpdatePlatformWindows\u003c/li\u003e\n  \u003cli\u003eTestPlatformCreateMacos\u003c/li\u003e\n  \u003cli\u003eTestUpdatePlatformMacos\u003c/li\u003e\n  \u003cli\u003eTestPlatformCreateMacosSquirrel\u003c/li\u003e\n  \u003cli\u003eTestUpdatePlatformMacosSquirrel\u003c/li\u003e\n  \u003cli\u003eTestMultipleUploadWithUpdaters\u003c/li\u003e\n  \u003cli\u003eTestCheckVersionWithUpdaters\u003c/li\u003e\n  \u003cli\u003eTestSquirrelReleases (Not implemented yet)\u003c/li\u003e\n  \u003cli\u003eTestDeletePlatformWindows\u003c/li\u003e\n  \u003cli\u003eTestDeletePlatformMacos\u003c/li\u003e\n  \u003cli\u003eTestDeletePlatformMacosSquirrel\u003c/li\u003e\n  \u003cli\u003eTestDeleteAppMetaUpdaters\u003c/li\u003e\n  \u003cli\u003eTestPlatformCreateMacosTauri\u003c/li\u003e\n  \u003cli\u003eTestDeletePlatformMacosTauri\u003c/li\u003e\n  \u003cli\u003etuf/utils (Unit)\u003c/li\u003e\n  \u003cli\u003etuf/tasks (Unit)\u003c/li\u003e\n  \u003cli\u003etuf/storage (Unit)\u003c/li\u003e\n  \u003cli\u003etuf/signing (Unit)\u003c/li\u003e\n  \u003cli\u003etuf/config (Unit)\u003c/li\u003e\n  \u003cli\u003etuf/delegations (Unit)\u003c/li\u003e\n  \u003cli\u003etuf/metadata (Unit)\u003c/li\u003e\n  \u003cli\u003etuf/bootstrap (Unit)\u003c/li\u003e\n  \u003cli\u003etuf/artifacts (Unit)\u003c/li\u003e\n  \u003cli\u003eTestTokenFlow01Create\u003c/li\u003e\n  \u003cli\u003eTestTokenCreateWithPastExpirationDate\u003c/li\u003e\n  \u003cli\u003eTestTokenExpiresImmediatelyAndReturnsUnauthorized\u003c/li\u003e\n  \u003cli\u003eTestTokenMiddlewareFlowForBothTokens\u003c/li\u003e\n  \u003cli\u003eTestTokenFlow02List\u003c/li\u003e\n  \u003cli\u003eTestTokenFlow03Delete\u003c/li\u003e\n\n\n\u003c/details\u003e\n\n---\n\n## 🔄 Database Migrations\n\n### 📦 Install Migration Tool\n\nInstall migrate tool [here](https://github.com/golang-migrate/migrate/blob/master/cmd/migrate/README.md).\n\n### 🆕 Create New Migrations\n\n```bash\ncd mongod/migrations\nmigrate create -ext json name_of_migration\n```\n\nThen run the migrations again.\n\n### 🔗 Migration Tool Link\n- **Migration Tool**: [golang-migrate](https://github.com/golang-migrate/migrate/blob/master/cmd/migrate/README.md) - Database migration utility\n\n---\n\n## 📄 License\n\nThis application is licensed under the Apache license. See the LICENSE file for more details.\n\n### 🔗 License Link\n- **License File**: [LICENSE](LICENSE) - Apache License 2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fku9nov%2Ffaynosync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fku9nov%2Ffaynosync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fku9nov%2Ffaynosync/lists"}