[database] host = "localhost" port = 5432 username = "lysand" password = "lysand" database = "lysand" [redis.queue] host = "localhost" port = 6379 password = "" database = 0 enabled = false [redis.cache] host = "localhost" port = 6379 password = "" database = 1 enabled = false [sonic] host = "localhost" port = 40007 password = "" enabled = false [signups] # URL of your Terms of Service tos_url = "https://example.com/tos" # Whether to enable registrations or not registration = true rules = [ "Do not harass others", "Be nice to people", "Don't spam", "Don't post illegal content", ] [oidc] # Run Lysand with this value missing to generate a new key jwt_key = "MC4CAQAwBQYDK2VwBCIEID+H5n9PY3zVKZQcq4jrnE1IiRd2EWWr8ApuHUXmuOzl;MCowBQYDK2VwAyEAzenliNkgpXYsh3gXTnAoUWzlCPjIOppmAVx2DBlLsC8=" [http] base_url = "http://0.0.0.0:8080" bind = "0.0.0.0" bind_port = 8080 # Bans IPv4 or IPv6 IPs (wildcards, networks and ranges are supported) banned_ips = [] [smtp] # SMTP server to use for sending emails server = "smtp.example.com" port = 465 username = "test@example.com" password = "password123" tls = true [media] # Can be "s3" or "local", where "local" uploads the file to the local filesystem # If you need to change this value after setting up your instance, you must move all the files # from one backend to the other manually backend = "local" # Whether to check the hash of media when uploading to avoid duplication deduplicate_media = true # If media backend is "local", this is the folder where the files will be stored local_uploads_folder = "uploads" [media.conversion] convert_images = false # Can be: "jxl", "webp", "avif", "png", "jpg", "heif" # JXL support will likely not work convert_to = "webp" # [s3] # Can be left blank if you don't use the S3 media backend # endpoint = "https://s3-us-west-2.amazonaws.com" # access_key = "" # secret_access_key = "" # region = "us-west-2" # bucket_name = "lysand" # public_url = "https://cdn.example.com" [validation] # Self explanatory max_displayname_size = 50 max_bio_size = 160 max_note_size = 5000 max_avatar_size = 5_000_000 max_header_size = 5_000_000 max_media_size = 40_000_000 max_media_attachments = 10 max_media_description_size = 1000 max_poll_options = 20 max_poll_option_size = 500 min_poll_duration = 60 max_poll_duration = 1893456000 max_username_size = 30 # An array of strings, defaults are from Akkoma username_blacklist = [ ".well-known", "~", "about", "activities", "api", "auth", "dev", "inbox", "internal", "main", "media", "nodeinfo", "notice", "oauth", "objects", "proxy", "push", "registration", "relay", "settings", "status", "tag", "users", "web", "search", "mfa", ] # Whether to blacklist known temporary email providers blacklist_tempmail = false # Additional email providers to blacklist email_blacklist = [] # Valid URL schemes, otherwise the URL is parsed as text url_scheme_whitelist = [ "http", "https", "ftp", "dat", "dweb", "gopher", "hyper", "ipfs", "ipns", "irc", "xmpp", "ircs", "magnet", "mailto", "mumble", "ssb", "gemini", ] # NOT IMPLEMENTED enforce_mime_types = false allowed_mime_types = [ "image/jpeg", "image/png", "image/gif", "image/heic", "image/heif", "image/webp", "image/avif", "video/webm", "video/mp4", "video/quicktime", "video/ogg", "audio/wave", "audio/wav", "audio/x-wav", "audio/x-pn-wave", "audio/vnd.wave", "audio/ogg", "audio/vorbis", "audio/mpeg", "audio/mp3", "audio/webm", "audio/flac", "audio/aac", "audio/m4a", "audio/x-m4a", "audio/mp4", "audio/3gpp", "video/x-ms-asf", ] [validation.challenges] # "Challenges" (aka captchas) are a way to verify that a user is human # Lysand's challenges use no external services, and are Proof of Work based # This means that they do not require any user interaction, instead # they require the user's computer to do a small amount of work enabled = true # The difficulty of the challenge, higher is harder difficulty = 50000 # Challenge expiration time in seconds expiration = 300 # 5 minutes # Leave this empty to generate a new key key = "YBpAV0KZOeM/MZ4kOb2E9moH9gCUr00Co9V7ncGRJ3wbd/a9tLDKKFdI0BtOcnlpfx0ZBh0+w3WSvsl0TsesTg==" [defaults] # Default visibility for new notes visibility = "public" # Default language for new notes language = "en" # Default avatar, must be a valid URL or "" # avatar = "" # Default header, must be a valid URL or "" # header = "" [activitypub] # Use ActivityPub Tombstones instead of deleting objects use_tombstones = true # Fetch all members of collections (followers, following, etc) when receiving them # WARNING: This can be a lot of data, and is not recommended fetch_all_collection_members = false # NOT IMPLEMENTED # The following values must be instance domain names without "https" or glob patterns # Rejects all activities from these instances (fediblocking) reject_activities = [] # Force posts from this instance to be followers only force_followers_only = [] # NOT IMPLEMENTED # Discard all reports from these instances discard_reports = [] # NOT IMPLEMENTED # Discard all deletes from these instances discard_deletes = [] # Discard all updates (edits) from these instances discard_updates = [] # Discard all banners from these instances discard_banners = [] # NOT IMPLEMENTED # Discard all avatars from these instances discard_avatars = [] # NOT IMPLEMENTED # Discard all follow requests from these instances discard_follows = [] # Force set these instances' media as sensitive force_sensitive = [] # NOT IMPLEMENTED # Remove theses instances' media remove_media = [] # NOT IMPLEMENTED # Whether to verify HTTP signatures for every request (warning: can slow down your server # significantly depending on processing power) authorized_fetch = false [instance] name = "Lysand" description = "A test instance of Lysand" # URL to your instance logo (jpg files should be renamed to jpeg) # logo = "" # URL to your instance banner (jpg files should be renamed to jpeg) # banner = "" [filters] # Drop notes with these regex filters (only applies to new activities) note_filters = [ # "(https?://)?(www\\.)?youtube\\.com/watch\\?v=[a-zA-Z0-9_-]+", # "(https?://)?(www\\.)?youtu\\.be/[a-zA-Z0-9_-]+", ] # Drop users with these regex filters (only applies to new activities) username_filters = [] # Drop users with these regex filters (only applies to new activities) displayname_filters = [] # Drop users with these regex filters (only applies to new activities) bio_filters = [] emoji_filters = [] # NOT IMPLEMENTED [logging] # Log all requests (warning: this is a lot of data) log_requests = true # Log request and their contents (warning: this is a lot of data) log_requests_verbose = false # For GDPR compliance, you can disable logging of IPs log_ip = false # Log all filtered objects log_filters = true [ratelimits] # Amount to multiply every route's duration by duration_coeff = 1.0 # Amount to multiply every route's max by max_coeff = 1.0 [custom_ratelimits] # Add in any API route in this style here "/api/v1/timelines/public" = { duration = 60, max = 200 }