Learn from links. #7 featured product on ProductHunt. free & opensource!
python -m pip install -r requirements.txt
Create .env with the following (or add the following environment variables) or add those to instance/config.py
SQLALCHEMY_DATABASE_URI = "sqlite:///linkversity.db"
SALT = "some-salt"
RECAPTCHA_PUBLIC_KEY = ''
RECAPTCHA_PRIVATE_KEY= ''
SECRET_KEY = 'secret-secret'Optional
APP_NAME = ''
ACTIVE_FRONT_THEME = ''
ACTIVE_BACK_THEME = ''
If using gunicorn locally, use this
import os
from dotenv import load_dotenv
for env_file in ('.env', '.flaskenv'):
env = os.path.join(os.getcwd(), env_file)
if os.path.exists(env):
load_dotenv(env)Add config.json file in root dir with content
{
"admin_user": {
"username": "appinv",
"email": "admin@domain.com",
"password": "pass"
},
"settings": {
"APP_NAME": "Demo",
"ACTIVE_FRONT_THEME": "blogus",
"ACTIVE_BACK_THEME": "boogle",
"CURRENCY": "MUR"
}
}Run
shopyo initialise --no-clear-migration
flask run --debug
Frontend files located at /static/themes/front/linkolearn_theme
Linkversity offers an enterprise plan (subscription_plan=2) with advanced features for teams and organizations:
- URL Encryption: Enterprise links can be encrypted at rest in the database using per-organization encryption keys
- Dedicated Database: Optional isolated database per enterprise for complete tenant data separation
- Audit Logging: Full action logging for compliance (who did what and when)
- Click Analytics: Built-in analytics tracking with referrer, device type, and geographic data
- Team Management: Add team members with roles (admin, member, viewer)
- Custom Domains: Connect your own domain to your enterprise workspace
- White Label: Custom branding options for enterprise deployments
| Model | Description |
|---|---|
EnterpriseTeam |
Team/organization entity owned by a user |
EnterpriseSettings |
Encryption keys, domain config, feature flags |
EnterpriseAuditLog |
Compliance audit trail |
EnterpriseAnalytics |
Click/event tracking data |
EnterpriseTeamMember |
Team member associations |
EnterpriseCustomDomain |
Custom domain mappings |
from modules.box__default.auth.models import User
from modules.box__linkolearn.linkolearn.encryption import encrypt_url, decrypt_url
# Create enterprise team
team = current_user.create_enterprise_team("My Company")
# Get enterprise settings
settings = current_user.get_enterprise_settings()
# Encrypt a link
link.set_encrypted_url(settings.encryption_key)
# Decrypt when needed
url = link.decrypt_url(settings.encryption_key)For strict data isolation, enterprises can use dedicated SQLite databases:
from modules.box__linkolearn.linkolearn.enterprise_db import EnterpriseDatabaseManager
# Create dedicated database
db_manager = EnterpriseDatabaseManager()
db_manager.create_enterprise_database("company_name")
# Query isolated data
with enterprise_db_session("company_name") as session:
paths = session.query(Path).all()