Skip to main content
View all authors

Telemetry Insights โ€” Understand Your Users Better ๐Ÿ“Š

ยท 3 min read

Want to know how your users are using your application? Need insights into version adoption and platform distribution? Meet Telemetry Insights โ€” your window into user behavior and application usage!


What is Telemetry? ๐Ÿค”โ€‹

Telemetry is your application's built-in analytics system that:

  • ๐Ÿ“ˆ Tracks user engagement
  • ๐Ÿ” Monitors version distribution
  • ๐ŸŒ Analyzes platform usage
  • ๐Ÿ“Š Provides valuable insights

It helps you make data-driven decisions about your application's future!


What You Can Track ๐ŸŽฏโ€‹

1. User Analyticsโ€‹

  • ๐Ÿ‘ฅ Total unique users
  • ๐Ÿ”„ Daily active users
  • ๐Ÿ“ฑ Platform distribution
  • ๐Ÿ’ป Architecture breakdown

2. Version Insightsโ€‹

  • ๐Ÿ“ฆ Version adoption rates
  • โšก Update patterns
  • ๐ŸŽฏ Outdated version tracking
  • ๐Ÿ“ˆ Version distribution trends

3. Channel Analyticsโ€‹

  • ๐ŸŽจ Channel popularity
  • ๐Ÿ“Š User preferences
  • ๐Ÿ”„ Update frequency
  • ๐ŸŽฏ Channel-specific insights

How to Enable It? ๐Ÿ”Œโ€‹

Just add this to your .env file:

ENABLE_TELEMETRY=true

That's it! Your application will start collecting valuable insights automatically.


What Data is Collected? ๐Ÿ“โ€‹

Essential Metricsโ€‹

  1. Device Information ๐Ÿ“ฑ

    • Platform (Windows, macOS, Linux, etc.)
    • Architecture (x64, arm64, etc.)
    • Channel (stable, beta, nightly)
  2. Version Data ๐Ÿ“ฆ

    • Current version
    • Update frequency
    • Version adoption rates
  3. Usage Patterns ๐Ÿ“Š

    • Daily active users
    • Update check frequency
    • Channel preferences

Privacy First ๐Ÿ”’โ€‹

What We Don't Collectโ€‹

  • โŒ Personal information
  • โŒ IP addresses
  • โŒ Sensitive data
  • โŒ User behavior outside the app

Security Measuresโ€‹

  • ๐Ÿ” Anonymous device IDs
  • ๐Ÿ“… 30-day data retention
  • ๐Ÿ‘ฅ Admin and team access (admin can only see their own apps' stats)

How to Access Insights? ๐Ÿ“Šโ€‹

Dashboard Viewโ€‹

  1. Log in to your admin dashboard
  2. Navigate to the Telemetry section
  3. Explore your insights!

API Accessโ€‹

GET /telemetry?range=week

Available filters:

  • ๐Ÿ“… Date range
  • ๐Ÿ“ฆ Application
  • ๐ŸŽจ Channel
  • ๐Ÿ“ฑ Platform
  • ๐Ÿ’ป Architecture

Best Practices ๐Ÿ’กโ€‹

  1. Early Implementation ๐Ÿš€

    • Enable telemetry from day one
    • Track version adoption
    • Monitor user engagement
  2. Regular Analysis ๐Ÿ“Š

    • Review weekly reports
    • Track version distribution
    • Monitor platform usage
  3. Data-Driven Decisions ๐ŸŽฏ

    • Use insights for updates
    • Optimize for popular platforms
    • Focus on user preferences

Example Insights ๐Ÿ“ˆโ€‹

Here's what you might discover:

  • 75% of users are on the latest version
  • Most popular platform: Windows (40%)
  • Highest engagement: Beta channel
  • Most popular architecture: x64 (45%)
  • Top 3 versions in use:
    • v1.2.0: 35%
    • v1.1.0: 25%
    • v1.0.0: 15%
  • Client trends:
    • Growing user base
    • Latest version adoption
    • Outdated clients
  • API usage:
    • Total version check requests

How to try faynoSync?โ€‹

  1. Follow the Getting Started guide:
    ๐Ÿ‘‰ https://ku9nov.github.io/faynoSync-site/docs/category/getting-started

  2. Create your app using the REST API or web dashboard:
    ๐Ÿ“ฆ API Docs: https://ku9nov.github.io/faynoSync-site/docs/api
    ๐Ÿ–ฅ๏ธ Dashboard UI: https://github.com/ku9nov/faynoSync-dashboard

  3. Enable telemetry in your .env file

  4. Start collecting valuable insights! ๐Ÿ“Š


If you find this project helpful, please consider subscribing, leaving a comment, or giving it a star, create Issue or feature request on GitHub.
Your support keeps the project alive and growing ๐Ÿ’š


How to Setup Auto Update for Electron App

ยท 4 min read

Today, we'll explore how to create a simple Electron app and add auto-update functionality using faynoSync. Let's make your app smarter with automatic version checking and updates!


Prerequisites ๐Ÿ“‹โ€‹

Before we begin, make sure you have:

  • A running faynoSync instance
  • Published versions 0.0.1 and 0.0.2 of your app
  • Created an app in faynoSync named "myapp"
  • Created a channel in faynoSync named "nightly"
  • Created a platform in faynoSync named (darwin/linux/windows)
  • Created a architecture in faynoSync named (amd64/arm64)

Let's Get Started! ๐Ÿš€โ€‹

1. Initialize Your Projectโ€‹

First, let's create a new project with the following package.json:

{
"name": "myapp",
"version": "0.0.1",
"description": "Hello world app for testing faynoSync",
"main": "main.js",
"scripts": {
"start": "electron ."
},
"keywords": [],
"author": "Example Author",
"license": "ISC",
"dependencies": {
"node-fetch": "2.6.9"
},
"devDependencies": {
"electron": ">=23.3.13"
},
"engines": {
"npm": ">=8.19.3",
"node": ">=18.13.0"
}
}

2. Create Basic Filesโ€‹

index.htmlโ€‹

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title id="title"></title>
</head>
<body>
<h1 id="label">Hello, world!</h1>
</body>
</html>

config.jsโ€‹

const packageJson = require('./package.json');

module.exports = {
app_name: packageJson.name,
version: packageJson.version,
channel: "nightly",
owner: "example",
};

The Magic of Auto-Updates โœจโ€‹

Let's create our main.js file step by step:

1. Import Required Modulesโ€‹

const { app, BrowserWindow, dialog, shell } = require('electron');
const fetch = require('node-fetch');
const os = require('os');
const { version, app_name, channel, owner } = require('./config.js');
const fs = require('fs');

2. Platform Detectionโ€‹

function getLinuxDistributionFamily() {
let distroFamily = 'Linux';
try {
const releaseInfo = fs.readFileSync('/etc/os-release', 'utf8');
const match = releaseInfo.match(/^ID(?:_LIKE)?=(.*)$/m);
if (match) {
const idLike = match[1].trim().toLowerCase();
if (idLike.includes('rhel') || idLike.includes('fedora') || idLike.includes('centos')) {
distroFamily = 'RHEL';
} else if (idLike.includes('debian') || idLike.includes('ubuntu') || idLike.includes('kali')) {
distroFamily = 'Debian';
}
}
} catch (err) {
console.error('Error getting Linux distribution family:', err);
}
return distroFamily;
}

3. Update Choice Windowโ€‹

function createChoiceWindow(updateOptions) {
const win = new BrowserWindow({
width: 600,
height: 400,
webPreferences: {
nodeIntegration: true,
},
});

win.loadURL(`data:text/html,
<html>
<body>
<h2>Choose an update package:</h2>
<ul>
${updateOptions
.map(
(option, index) =>
`<li><a id="option-${index}" href="${option.url}">${option.name}</a></li>`
)
.join('')}
</ul>
<script>
const { shell } = require('electron');
document.addEventListener('click', (event) => {
if (event.target.tagName === 'A') {
event.preventDefault();
shell.openExternal(event.target.href);
}
});
</script>
</body>
</html>`
);

return win;
}

4. Update Check Functionโ€‹

function checkUpdates() {
let url = `http://localhost:9000/checkVersion?app_name=${app_name}&version=${version}&platform=${os.platform()}&arch=${os.arch()}&owner=${owner}`;

if (channel !== undefined) {
url += `&channel=${channel}`;
}

fetch(url, { method: 'GET' })
.then((res) => res.json())
.then((data) => {
console.log(data);
if (data.update_available) {
const message = `You have an older version. Would you like to update your app?`;
dialog.showMessageBox({
type: 'question',
title: 'Update available',
message: message,
buttons: ['Yes', 'No'],
defaultId: 0,
}).then(({ response }) => {
if (response === 0) {
const updateOptions = [];
for (const key in data) {
if (key.startsWith('update_url_')) {
updateOptions.push({ name: key.substring(11).toUpperCase(), url: data[key] });
}
}
const choiceWindow = createChoiceWindow(updateOptions);
}
});
}
})
.catch(() => {});
}

5. Main Window Creationโ€‹

function createWindow() {
let osName = os.platform();
let pcArch = os.arch();
if (osName === 'linux') {
osName = getLinuxDistributionFamily();
}
const title = `${app_name} - v${version} (${osName}-${pcArch})`;

let win = new BrowserWindow({
width: 400,
height: 300,
webPreferences: {
nodeIntegration: true,
},
});

win.setTitle(title);
win.loadFile('index.html');
win.on('closed', () => {
win = null;
});

checkUpdates();
}

app.whenReady().then(createWindow);

Running Your App ๐Ÿƒโ€โ™‚๏ธโ€‹

To start your app, simply run:

npm start

If everything is set up correctly in faynoSync and a newer version exists, you'll see something like this in your logs:

{
"critical": false,
"update_available": true,
"update_url_dmg": "http://localhost:9010/cb-faynosync-s3-public/myapp-example/nightly/darwin/arm64/myapp-0.0.2.0.dmg"
}

And in your app's UI, you'll see a notification about the available update. After agreeing to update, you can download and install the new version.


Next Steps ๐Ÿš€โ€‹

  1. Customize the update process to match your app's needs
  2. Add more sophisticated update handling
  3. Implement your own update installation logic
  4. Add progress indicators for downloads

Need Help? ๐Ÿคโ€‹

If you have any questions or need assistance:

  1. Check out our documentation
  2. Create an issue on GitHub

How to try faynoSync?โ€‹

  1. Follow the Getting Started guide:
    ๐Ÿ‘‰ https://ku9nov.github.io/faynoSync-site/docs/category/getting-started

  2. Create your app using the REST API or web dashboard:
    ๐Ÿ“ฆ API Docs: https://ku9nov.github.io/faynoSync-site/docs/api
    ๐Ÿ–ฅ๏ธ Dashboard UI: https://github.com/ku9nov/faynoSync-dashboard

  3. Upload at least two versions of your application.

  4. Check for updates with this simple request:
    ๐Ÿ“ก /info/latest


If you find this project helpful, please consider subscribing, leaving a comment, or giving it a star, create Issue or feature request on GitHub.
Your support keeps the project alive and growing ๐Ÿ’š

Performance Mode โ€” Speed Up Your API

ยท 3 min read

Is your faynoSync instance handling thousands of update checks per minute? Worried about database load? Meet Performance Mode โ€” your API's new best friend for handling high traffic efficiently!


What is Performance Mode? ๐Ÿค”โ€‹

Performance Mode is a smart caching system that:

  • ๐Ÿš€ Reduces response times
  • ๐Ÿ“‰ Lowers database load
  • ๐Ÿ’พ Optimizes resource usage

It works by caching frequently requested data in Redis, making your API responses lightning-fast!


How It Works ๐Ÿ› ๏ธโ€‹

The Magic Behind the Scenesโ€‹

  1. Request Arrives ๐Ÿ“ฅ

    • API checks if Performance Mode is enabled (PERFORMANCE_MODE=true)
    • Looks for cached data in Redis
  2. Cache Check ๐Ÿ”

    • If data exists in cache โ†’ returns it immediately
    • If not โ†’ queries the database
  3. Cache Update ๐Ÿ’พ

    • New data is stored in Redis
    • Ready for next request

What Gets Cached?โ€‹

Currently, Performance Mode is implemented for the checkVersion endpoint, which is one of the most frequently called endpoints in the system.


Why Do We Need It? ๐ŸŽฏโ€‹

1. Database Load Reductionโ€‹

  • ๐Ÿ“Š Fewer queries to MongoDB
  • ๐Ÿ’ช Less strain on your database
  • ๐ŸŽฏ Better resource utilization

2. Faster Response Timesโ€‹

  • โšก Cached responses are returned instantly
  • ๐ŸŽ๏ธ No need to wait for database queries
  • ๐ŸŽฎ Perfect for high-traffic scenarios

3. Resource Optimizationโ€‹

  • ๐ŸŒฑ Lower CPU usage
  • ๐Ÿ’ง Reduced memory consumption
  • ๐Ÿ“ˆ Better scalability

How to Enable It? ๐Ÿ”Œโ€‹

Just add this to your .env file:

PERFORMANCE_MODE=true

That's it! Your API will automatically start using Redis for caching.


Testing Performance ๐Ÿงชโ€‹

Want to see the difference? Try this test script:

start_time=$(date +%s); 
for i in {1..1000}; do
response=$(curl -s -w "Connect Time: %{time_connect}s, Start Transfer Time: %{time_starttransfer}s, Total Time: %{time_total}s\n" -o /dev/stdout --location 'http://localhost:9000/checkVersion?app_name=myapp&version=0.0.3&channel=nightly&platform=null&arch=null');
echo "$response";
done;
end_time=$(date +%s);
total_time=$((end_time - start_time));
echo "Total execution time: $total_time seconds"

Compare the results with and without Performance Mode enabled!


Important Notes ๐Ÿ“โ€‹

  1. Cache Invalidation ๐Ÿ”„

    • Cache is automatically cleared when you publish a new version
    • New data is cached on the next request
    • Ensures users always get the latest information
  2. Current Implementation ๐ŸŽฏ

    • Only implemented for checkVersion endpoint
    • Perfect for high-frequency update checks
    • More endpoints might be added in the future
  3. When to Use โšก

    • High-traffic environments
    • Systems with frequent update checks
    • Scenarios where response time is critical

Best Practices ๐Ÿ’กโ€‹

  1. Enable in Production ๐Ÿš€

    • Always use Performance Mode in production
    • Especially if you expect high traffic
  2. Monitor Performance ๐Ÿ“Š

    • Keep an eye on response times
    • Watch Redis memory usage
    • Track database load
  3. Regular Updates ๐Ÿ”„

    • Cache is automatically managed
    • No manual intervention needed
    • Just focus on your app!

How to try faynoSync?โ€‹

  1. Follow the Getting Started guide:
    ๐Ÿ‘‰ https://ku9nov.github.io/faynoSync-site/docs/category/getting-started

  2. Create your app using the REST API or web dashboard:
    ๐Ÿ“ฆ API Docs: https://ku9nov.github.io/faynoSync-site/docs/api
    ๐Ÿ–ฅ๏ธ Dashboard UI: https://github.com/ku9nov/faynoSync-dashboard

  3. Upload at least two versions of your application.

  4. Check for updates with this simple request:
    ๐Ÿ“ก /info/latest


If you find this project helpful, please consider subscribing, leaving a comment, or giving it a star, create Issue or feature request on GitHub.
Your support keeps the project alive and growing ๐Ÿ’š


Fetch Latest Version of App โ€” Smart Update Links

ยท 3 min read

Ever needed to share a download link that always points to the latest version of your app? Or wanted to set up automatic updates for your users? The Fetch latest version of app endpoint is your perfect solution! Let's explore how it works with some real-world examples.


Meet Our Example App ๐ŸŽฎโ€‹

Let's imagine we have an app called "SpaceExplorer" with the following setup:

Channels:โ€‹

  • ๐Ÿš€ stable - Production releases
  • ๐Ÿงช beta - Testing versions
  • ๐ŸŒ™ nightly - Daily builds

Platforms & Architectures:โ€‹

  • ๐Ÿ’ป Linux (amd64, arm64)
  • ๐ŸŽ macOS (amd64, arm64)
  • ๐ŸชŸ Windows (amd64)

Package Types:โ€‹

  • ๐Ÿ“ฆ .deb (Linux)
  • ๐Ÿ“ฆ .rpm (Linux)
  • ๐Ÿ“ฆ .dmg (macOS)
  • ๐Ÿ“ฆ .exe (Windows)

Let's Fetch Some Versions! ๐ŸŽฏโ€‹

Example 1: Simple Latest Versionโ€‹

GET /apps/latest?app_name=SpaceExplorer&owner=admin

This basic request returns ALL available builds:

{
"stable": {
"linux": {
"amd64": {
"deb": { "url": "..." },
"rpm": { "url": "..." }
},
"arm64": {
"deb": { "url": "..." },
"rpm": { "url": "..." }
}
},
"darwin": {
"amd64": { "dmg": { "url": "..." } },
"arm64": { "dmg": { "url": "..." } }
},
"windows": {
"amd64": { "exe": { "url": "..." } }
}
},
"beta": {
// Similar structure for beta builds
},
"nightly": {
// Similar structure for nightly builds
}
}

Example 2: Specific Channelโ€‹

GET /apps/latest?app_name=SpaceExplorer&channel=stable&owner=admin

Now we get only stable builds:

{
"stable": {
"linux": {
"amd64": {
"deb": { "url": "..." },
"rpm": { "url": "..." }
}
// ... other architectures
}
// ... other platforms
}
}

Example 3: Platform-Specificโ€‹

GET /apps/latest?app_name=SpaceExplorer&channel=stable&platform=linux&owner=admin

Only Linux builds:

{
"stable": {
"linux": {
"amd64": {
"deb": { "url": "..." },
"rpm": { "url": "..." }
},
"arm64": {
"deb": { "url": "..." },
"rpm": { "url": "..." }
}
}
}
}

Example 4: Exact Matchโ€‹

GET /apps/latest?app_name=SpaceExplorer&channel=stable&platform=linux&arch=amd64&package=deb&owner=admin

This returns a direct download URL:

https://<bucket_name>.s3.amazonaws.com/SpaceExplorer/stable/linux/amd64/SpaceExplorer-1.2.3.deb

Smart Features ๐Ÿง โ€‹

  1. Automatic Redirection ๐Ÿ”„

    • If only one build matches your criteria, you'll get redirected straight to the download
    • Perfect for landing pages and direct download links
  2. Flexible Responses ๐ŸŽฏ

    • Get all available builds
    • Filter by channel
    • Filter by platform
    • Filter by architecture
    • Filter by package type

Real-World Use Cases ๐ŸŒโ€‹

1. Landing Page Downloadsโ€‹

<!-- For Linux users -->
<a href="/apps/latest?app_name=SpaceExplorer&platform=linux&arch=amd64&package=deb&owner=admin">
Download for Linux (.deb)
</a>

<!-- For macOS users -->
<a href="/apps/latest?app_name=SpaceExplorer&platform=darwin&arch=arm64&package=dmg&owner=admin">
Download for macOS (.dmg)
</a>

2. Team Testingโ€‹

# For beta testers
GET /apps/latest?app_name=SpaceExplorer&channel=beta&platform=darwin&arch=arm64&package=dmg&owner=admin

# For nightly build enthusiasts
GET /apps/latest?app_name=SpaceExplorer&channel=nightly&platform=linux&arch=amd64&package=deb&owner=admin

What's Next? ๐Ÿš€โ€‹

In our next posts, we'll explore:

  • Performance optimization tips

Stay tuned for more faynoSync tips and tricks! ๐Ÿ’š


How to try faynoSync?โ€‹

  1. Follow the Getting Started guide:
    ๐Ÿ‘‰ https://ku9nov.github.io/faynoSync-site/docs/category/getting-started

  2. Create your app using the REST API or web dashboard:
    ๐Ÿ“ฆ API Docs: https://ku9nov.github.io/faynoSync-site/docs/api
    ๐Ÿ–ฅ๏ธ Dashboard UI: https://github.com/ku9nov/faynoSync-dashboard

  3. Upload at least two versions of your application.

  4. Check for updates with this simple request:
    ๐Ÿ“ก /info/latest


If you find this project helpful, please consider subscribing, leaving a comment, or giving it a star, create Issue or feature request on GitHub.
Your support keeps the project alive and growing ๐Ÿ’š


Local Development with faynoSync โ€” Choose Your Path

ยท 3 min read

Getting started with faynoSync development? Great! You have two main options for setting up your local environment. Whether you prefer a traditional local setup or the convenience of Docker, we've got you covered.


Option 1: Traditional Local Development ๐Ÿ–ฅ๏ธโ€‹

Perfect for developers who want full control over their environment and need to make frequent code changes.

What You'll Need:โ€‹

Setting Up:โ€‹

  1. Install all required services
  2. Create your .env file with necessary configurations
  3. Run faynoSync:
    # First run (with migrations)
    go run faynoSync.go --migration

    # Subsequent runs
    go run faynoSync.go

Benefits:โ€‹

  • โšก Fast development cycle
  • ๐Ÿ”ง Direct access to all components
  • ๐Ÿงช Easy debugging
  • ๐Ÿ”„ Quick code changes

Testing Your Setup:โ€‹

Want to make sure everything is working correctly? Just run:

go test

This will verify that all components are properly configured and your local environment is ready for development.


Option 2: Docker Development ๐Ÿณโ€‹

Ideal for quick setup and testing, or when you want to avoid installing dependencies locally.

What You'll Need:โ€‹

Two Ways to Use Docker:โ€‹

1. Full Container Setupโ€‹

docker-compose up --build

Perfect for:

  • ๐Ÿš€ Quick testing
  • ๐Ÿงช Initial setup
  • ๐Ÿ”„ Testing API functionality

2. Hybrid Approachโ€‹

docker-compose -f docker-compose.yaml -f docker-compose.development.yaml up

This starts only the dependencies (MongoDB and MinIO) while you run faynoSync locally.

Benefits:โ€‹

  • ๐Ÿš€ Quick setup
  • ๐Ÿงฉ Isolated environment
  • ๐Ÿ”„ Consistent across machines
  • ๐Ÿงช Easy testing

Testing Your Setup:โ€‹

After running docker-compose up --build, wait until the s3-service successfully creates the bucket, then run:

docker exec -it faynoSync_backend "/usr/bin/faynoSync_tests"

This will run the test suite inside the container to verify everything is working correctly.


Environment Configuration โš™๏ธโ€‹

Both approaches need proper environment configuration. Here are the key variables you'll need:

# Storage Configuration
STORAGE_DRIVER=minio
S3_ACCESS_KEY=your_access_key
S3_SECRET_KEY=your_secret_key
S3_BUCKET_NAME=your_bucket

# Database Configuration
MONGODB_URL=mongodb://root:password@127.0.0.1/faynosync_db

# API Configuration
API_URL=http://localhost:9000
PORT=9000

For a complete list of environment variables, check out our Environment Configuration Guide.


Which Option Should You Choose? ๐Ÿค”โ€‹

Choose Local Development if you:โ€‹

  • ๐Ÿ”ง Need to modify the code frequently
  • ๐Ÿ› Want to debug easily
  • โšก Need fast development cycles
  • ๐Ÿ’ป Prefer direct control over your environment

Choose Docker if you:โ€‹

  • ๐Ÿš€ Want quick setup
  • ๐Ÿงช Need to test the API
  • ๐Ÿ’ป Work on multiple machines
  • ๐Ÿงฉ Prefer isolated environments

What's Next? ๐Ÿš€โ€‹

In our next posts, we'll explore:

  • How to properly use Fetch latest version of app request
  • Performance optimization tips

Stay tuned for more faynoSync tips and tricks! ๐Ÿ’š


How to try faynoSync?โ€‹

  1. Follow the Getting Started guide:
    ๐Ÿ‘‰ https://ku9nov.github.io/faynoSync-site/docs/category/getting-started

  2. Create your app using the REST API or web dashboard:
    ๐Ÿ“ฆ API Docs: https://ku9nov.github.io/faynoSync-site/docs/api
    ๐Ÿ–ฅ๏ธ Dashboard UI: https://github.com/ku9nov/faynoSync-dashboard

  3. Upload at least two versions of your application.

  4. Check for updates with this simple request:
    ๐Ÿ“ก /info/latest


If you find this project helpful, please consider subscribing, leaving a comment, or giving it a star, create Issue or feature request on GitHub.
Your support keeps the project alive and growing ๐Ÿ’š


Team-Based Authorization in faynoSync โ€” Manage Your Team Like a Pro

ยท 4 min read

Managing a team of developers? Need to control who can do what in your faynoSync instance? Starting from version 1.4.0, faynoSync introduces a powerful Team Based Authorization Matrix that gives you complete control over your team's access and permissions.


What is Team-Based Authorization? ๐Ÿค”โ€‹

Think of it as your team's digital headquarters! The Team Based Authorization Matrix is a sophisticated system that lets you:

  • ๐Ÿ‘จโ€๐Ÿ’ผ Create and manage team users
  • ๐Ÿ” Assign specific permissions
  • ๐Ÿข Keep data isolated between different teams
  • ๐Ÿ“Š Track who can do what

Meet the Players ๐ŸŽญโ€‹

The Administrator ๐Ÿ‘‘โ€‹

  • You're the boss! Each admin is unique
  • You own your team of users
  • You can create, update, and delete your team members
  • You have full control over passwords and permissions
  • You can only access your own team's resources

The Team User ๐Ÿ‘คโ€‹

  • A unique member of your team
  • Belongs only to you (their admin)
  • Can't manage other users
  • Can only work with resources you've allowed
  • Everything they create belongs to you

What Can Your Team Do? ๐Ÿ› ๏ธโ€‹

Each team member can have different permissions for different types of resources:

Resource Types:โ€‹

  • ๐Ÿ“ฑ Applications
  • ๐Ÿ“Š Channels
  • ๐Ÿ’ป Platforms
  • ๐Ÿ—๏ธ Architectures

Available Permissions:โ€‹

  • โž• Create
  • โœ๏ธ Edit
  • ๐Ÿ—‘๏ธ Delete
  • โฌ†๏ธ Upload (for apps)
  • โฌ‡๏ธ Download (for apps)

Smart Resource Management ๐Ÿง โ€‹

  • ๐Ÿ”’ Team users can only see and use resources they've been given access to
  • ๐Ÿข Each admin's resources are completely separate
  • ๐Ÿ‘€ You (as admin) can see everything your team creates
  • ๐Ÿ“ Different teams can have resources with the same names

How to Manage Your Team? ๐ŸŽฏโ€‹

Option 1: Using the APIโ€‹

Creating a Team Userโ€‹

curl -X POST 'http://localhost:9000/user/create' \
-H 'Authorization: Bearer <jwt_token>' \
-H 'Content-Type: application/json' \
-d '{
"username": "teamuser1",
"password": "password123",
"permissions": {
"apps": {
"create": true,
"delete": false,
"edit": true,
"download": true,
"upload": false
}
// ... other permissions
}
}'

Updating Permissionsโ€‹

curl -X POST 'http://localhost:9000/user/update' \
-H 'Authorization: Bearer <jwt_token>' \
-H 'Content-Type: application/json' \
-d '{
"username": "teamuser1",
"password": "newpassword123",
"permissions": {
// ... updated permissions
}
}'

Option 2: Using the Web Dashboard ๐Ÿ–ฅ๏ธโ€‹

Prefer a more visual approach? The faynoSync dashboard makes team management a breeze!

For Administrators:โ€‹

  1. Click the Settings button in the dashboard
  2. A modal window will open where you can:
    • ๐Ÿ‘ฅ Create new team users
    • ๐Ÿ”‘ Set passwords (or auto-generate them)
    • โœ… Assign permissions with simple checkboxes
    • โœ๏ธ Update usernames and passwords
    • ๐Ÿ—‘๏ธ Remove team users

For Team Users:โ€‹

  1. Go to your Profile section
  2. View your current permissions at a glance:
    • ๐Ÿ“ฑ Which applications you can access
    • ๐Ÿ“Š What actions you can perform
    • ๐Ÿ”’ What resources are available to you

This visual interface makes it much easier to:

  • ๐ŸŽฏ Understand your permissions
  • ๐Ÿ”„ Manage team access
  • ๐Ÿ“Š Track resource availability
  • โšก Make quick changes

What's Next? ๐Ÿš€โ€‹

In our next posts, we'll explore:

  • Local development and deployment to server
  • How to properly use Fetch latest version of app request

Stay tuned for more faynoSync tips and tricks! ๐Ÿ’š


How to try faynoSync?โ€‹

  1. Follow the Getting Started guide:
    ๐Ÿ‘‰ https://ku9nov.github.io/faynoSync-site/docs/category/getting-started

  2. Create your app using the REST API or web dashboard:
    ๐Ÿ“ฆ API Docs: https://ku9nov.github.io/faynoSync-site/docs/api
    ๐Ÿ–ฅ๏ธ Dashboard UI: https://github.com/ku9nov/faynoSync-dashboard

  3. Upload at least two versions of your application.

  4. Check for updates with this simple request:
    ๐Ÿ“ก /info/latest


If you find this project helpful, please consider subscribing, leaving a comment, or giving it a star, create Issue or feature request on GitHub.
Your support keeps the project alive and growing ๐Ÿ’š


Private Apps in faynoSync โ€” Keep Your Software Secure

ยท 3 min read

When developing software, sometimes you need to keep things private. Whether it's internal tools, beta versions, or enterprise applications โ€” not everything should be publicly accessible. That's why faynoSync comes with built-in support for private applications.


What are Private Apps? ๐Ÿค”โ€‹

Private apps in faynoSync are applications that are stored in a separate, private S3 bucket. This gives you an extra layer of security and control over who can access your software.

Once an app is marked as private, it stays private forever โ€” this is a one-way decision to ensure consistency and security.


How to Create a Private App? ๐Ÿ› ๏ธโ€‹

There are two ways to create a private app:

1. Using the Web Dashboard ๐Ÿ–ฅ๏ธโ€‹

Simply check the "Private" option when creating your app through the dashboard interface. It's that simple!

2. Using the API ๐Ÿ“กโ€‹

When making a POST request to /app/create, include the private parameter:

curl --location 'http://localhost:9000/app/create' \
--header 'Authorization: Bearer <jwt_token>' \
--form 'data="{\"app\":\"appName\", \"private\": true}"'

How Private Apps Work? ๐Ÿ”โ€‹

  1. Storage: Private apps are stored in a separate S3 bucket (defined by S3_BUCKET_NAME in your environment)
  2. Access Control: You can control who can download your private apps through the ENABLE_PRIVATE_APP_DOWNLOADING setting:
    • If true: Anyone can download the app using the public API endpoints
    • If false: Only authenticated users can download the app

Security Features ๐Ÿ›ก๏ธโ€‹

Think of private apps in faynoSync as your software's VIP section! Here's what makes them special:

  • ๐Ÿ”’ Separate Storage: Your private apps live in their own secure S3 bucket, like having a private vault for your most valuable assets
  • ๐Ÿ” One-Way Privacy: Once you mark an app as private, it stays private forever. This might sound strict, but it's actually a good thing โ€” it ensures your security settings can't be accidentally changed
  • ๐Ÿ‘ฅ Smart Access Control: You're in charge! You can decide whether your private apps need authentication to download, giving you perfect control over who gets access
  • ๐Ÿšซ Download Protection: Want to make sure only your team can download the app? Just set ENABLE_PRIVATE_APP_DOWNLOADING=false, and only authenticated users will be able to access it

Best Practices ๐Ÿ’กโ€‹

  1. Use private apps for:

    • Internal tools and utilities
    • Beta versions of your software
    • Enterprise-specific applications
    • Software requiring license validation
  2. Set ENABLE_PRIVATE_APP_DOWNLOADING=false when you need strict access control

  3. Always use authentication tokens when accessing private apps in restricted mode


What's Next? ๐Ÿš€โ€‹

In our next posts, we'll explore:

  • Local development and deployment to server
  • Managing user access and permissions
  • How to properly use Fetch latest version of app request

Stay tuned for more faynoSync tips and tricks! ๐Ÿ’š


How to try faynoSync?โ€‹

  1. Follow the Getting Started guide:
    ๐Ÿ‘‰ https://ku9nov.github.io/faynoSync-site/docs/category/getting-started

  2. Create your app using the REST API or web dashboard:
    ๐Ÿ“ฆ API Docs: https://ku9nov.github.io/faynoSync-site/docs/api
    ๐Ÿ–ฅ๏ธ Dashboard UI: https://github.com/ku9nov/faynoSync-dashboard

  3. Upload at least two versions of your application.

  4. Check for updates with this simple request:
    ๐Ÿ“ก /info/latest


If you find this project helpful, please consider subscribing, leaving a comment, or giving it a star, create Issue or feature request on GitHub.
Your support keeps the project alive and growing ๐Ÿ’š


Self-Hosted API for Automatic App Updates

ยท 3 min read

In today's fast-paced world of AI and digitalization, more and more people, companies, and startups are creating their own applications. Depending on the type of app, you might publish it on platforms like Google Play, the App Store, and so on. These services not only handle publishing but also provide automatic versioned updates to end users.

But there's a small catch.

Bureaucracy. Registrations. The 9 circles of hell you have to go through before your app finally goes live on those platforms.
Just think โ€” where do you actually download apps like Discord, Brave Browser, or Docker Desktop?
Exactly. The list goes on.

That's where faynoSync comes in.


What is faynoSync?โ€‹

faynoSync is a lightweight, open-source API server that gives you full control over application updates. Whether it's desktop software, mobile apps, browser extensions, or custom binaries for metrics or monitoring โ€” faynoSync helps you deliver updates easily, securely, and reliably.

No external dependencies. Just pure control.


Why faynoSync?โ€‹

Sure, each programming language or OS has its own update tools. But they're often non-transparent, overly complicated, or just a pain to integrate.

faynoSync is a universal solution โ€” it allows you to check for updates from any language, with a centralized API and minimal setup.


What can faynoSync do?โ€‹

  • ๐Ÿ”“ Create public or private applications
  • ๐Ÿ” Support signed and unsigned builds (perfect for development environments)
  • ๐Ÿ‘ฅ Manage team users and assign fine-grained permissions
  • ๐Ÿš€ Publish, roll back, or deactivate specific releases
  • โš ๏ธ Mark applications as critical to notify users immediately
  • ๐ŸŒ Manage channels (dev, prod, nightly, stable), platforms, and architectures
  • ๐Ÿ“ Add, edit, and display changelogs so users know what's new
  • โšก Built with Go โ€” fast, simple, and open-source

And it's only the start; there will be more in the future.


How to try faynoSync?โ€‹

  1. Follow the Getting Started guide:
    ๐Ÿ‘‰ https://ku9nov.github.io/faynoSync-site/docs/category/getting-started

  2. Create your app using the REST API or web dashboard:
    ๐Ÿ“ฆ API Docs: https://ku9nov.github.io/faynoSync-site/docs/api
    ๐Ÿ–ฅ๏ธ Dashboard UI: https://github.com/ku9nov/faynoSync-dashboard

  3. Upload at least two versions of your application.

  4. Check for updates with this simple request:
    ๐Ÿ“ก /info/latest


This article is just an introduction. In the next posts, we'll explore the full functionality of faynoSync, integration examples, and development tips.

If you find this project helpful, please consider subscribing, leaving a comment, or giving it a star, create Issue or feature request on GitHub.
Your support keeps the project alive and growing ๐Ÿ’š