decentralized and customizable links page on top of atproto ligo.at
atproto link-in-bio python uv
9
fork

Configure Feed

Select the types of activity you want to include in your feed.

update meta tags

+52 -49
+1
src/main.py
··· 103 103 athref = f"at://{did}/at.ligo.actor.links/self" 104 104 return render_template( 105 105 "profile.html", 106 + did=did, 106 107 profile=profile, 107 108 sections=link_sections, 108 109 athref=athref,
+8 -8
src/templates/editor.html
··· 1 1 <!doctype html> 2 2 <html> 3 3 <head> 4 - <meta charset="utf-8" /> 4 + <meta charset="utf-8"> 5 5 <title>edit your profile &mdash; ligo.at</title> 6 - <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" /> 7 - <link rel="stylesheet" href="{{ url_for('static', filename='worksans.css') }}" /> 8 - <link rel="stylesheet" href="{{ url_for('static', filename='profile/default.css') }}" /> 9 - <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}" /> 10 - <link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='favicon-16.png') }}" /> 11 - <link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='favicon-32.png') }}" /> 12 - <link rel="icon" type="image/png" sizes="48x48" href="{{ url_for('static', filename='favicon-48.png') }}" /> 6 + <meta name=viewport content="width=device-width, initial-scale=1, maximum-scale=1"> 7 + <link rel=stylesheet href="{{ url_for('static', filename='worksans.css') }}"> 8 + <link rel=stylesheet href="{{ url_for('static', filename='profile/default.css') }}"> 9 + <link rel=stylesheet href="{{ url_for('static', filename='style.css') }}"> 10 + <link rel=icon type=image/png sizes=16x16 href="{{ url_for('static', filename='favicon-16.png') }}"> 11 + <link rel=icon type=image/png sizes=32x32 href="{{ url_for('static', filename='favicon-32.png') }}"> 12 + <link rel=icon type=image/png sizes=48x48 href="{{ url_for('static', filename='favicon-48.png') }}"> 13 13 <script src="{{ url_for('static', filename='htmx.2.0.7.min.js') }}"></script> 14 14 <script defer src="{{ url_for('static', filename='alpine.sort.3.15.0.min.js') }}"></script> 15 15 <script defer src="{{ url_for('static', filename='alpine.3.15.0.min.js') }}"></script>
+8 -8
src/templates/index.html
··· 1 1 <!doctype html> 2 2 <html> 3 3 <head> 4 - <meta charset="utf-8" /> 4 + <meta charset="utf-8"> 5 5 <title>ligo.at: decentralized links page</title> 6 - <meta name="viewport" content="width=device-width, initial-scale=1" /> 7 - <link rel="stylesheet" href="{{ url_for('static', filename='worksans.css') }}" /> 8 - <link rel="stylesheet" href="{{ url_for('static', filename='profile/default.css') }}" /> 9 - <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}" /> 10 - <link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='favicon-16.png') }}" /> 11 - <link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='favicon-32.png') }}" /> 12 - <link rel="icon" type="image/png" sizes="48x48" href="{{ url_for('static', filename='favicon-48.png') }}" /> 6 + <meta name=viewport content="width=device-width, initial-scale=1"> 7 + <link rel=stylesheet href="{{ url_for('static', filename='worksans.css') }}"> 8 + <link rel=stylesheet href="{{ url_for('static', filename='profile/default.css') }}"> 9 + <link rel=stylesheet href="{{ url_for('static', filename='style.css') }}"> 10 + <link rel=icon type=image/png sizes=16x16 href="{{ url_for('static', filename='favicon-16.png') }}"> 11 + <link rel=icon type=image/png sizes=32x32 href="{{ url_for('static', filename='favicon-32.png') }}"> 12 + <link rel=icon type=image/png sizes=48x48 href="{{ url_for('static', filename='favicon-48.png') }}"> 13 13 </head> 14 14 <body> 15 15 <div class="wrapper home">
+8 -8
src/templates/login.html
··· 1 1 <!doctype html> 2 2 <html> 3 3 <head> 4 - <meta charset="utf-8" /> 4 + <meta charset="utf-8"> 5 5 <title>login &mdash; ligo.at</title> 6 - <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" /> 7 - <link rel="stylesheet" href="{{ url_for('static', filename='worksans.css') }}" /> 8 - <link rel="stylesheet" href="{{ url_for('static', filename='profile/default.css') }}" /> 9 - <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}" /> 10 - <link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='favicon-16.png') }}" /> 11 - <link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='favicon-32.png') }}" /> 12 - <link rel="icon" type="image/png" sizes="48x48" href="{{ url_for('static', filename='favicon-48.png') }}" /> 6 + <meta name=viewport content="width=device-width, initial-scale=1, maximum-scale=1"> 7 + <link rel=stylesheet href="{{ url_for('static', filename='worksans.css') }}"> 8 + <link rel=stylesheet href="{{ url_for('static', filename='profile/default.css') }}"> 9 + <link rel=stylesheet href="{{ url_for('static', filename='style.css') }}"> 10 + <link rel=icon type=image/png sizes=16x16 href="{{ url_for('static', filename='favicon-16.png') }}"> 11 + <link rel=icon type=image/png sizes=32x32 href="{{ url_for('static', filename='favicon-32.png') }}"> 12 + <link rel=icon type=image/png sizes=48x48 href="{{ url_for('static', filename='favicon-48.png') }}"> 13 13 <script async type="module" src="{{ url_for('static', filename='actor-typeahead.js') }}"></script> 14 14 </head> 15 15 <body>
+19 -17
src/templates/profile.html
··· 1 1 <!doctype html> 2 2 <html> 3 3 <head> 4 - <meta charset="utf-8" /> 4 + <meta charset="utf-8"> 5 5 <!-- metadata and open graph --> 6 - <meta property="og:type" content="profile" /> 6 + <meta property=og:type content=profile> 7 7 <title>Links for {{ profile.displayName }}</title> 8 - <meta property="og:title" content="{{ profile.displayName }}" /> 8 + <meta property=og:title content="{{ profile.displayName }}"> 9 9 {% if profile.description %} 10 - <meta name="description" content="{{ profile.description }}" /> 11 - <meta property="og:description" content="{{ profile.description }}" /> 10 + <meta name=description content="{{ profile.description }}"> 11 + <meta property=og:description content="{{ profile.description }}"> 12 12 {% endif %} 13 - <meta property="og:image" content="https://{{ request.host }}{{ url_for('static', filename='favicon-48.png') }}" /> 13 + <meta property=og:image content="https://{{ request.host }}{{ url_for('static', filename='favicon-48.png') }}"> 14 + <link rel=canonical href="https://{{ request.host }}/{{ did }}"> 14 15 {% if profile.handle %} 15 - <link rel="canonical" href="https://{{ request.url }}/@{{ profile.handle }}" /> 16 - <meta property="og:url" content="https://{{ request.url }}/@{{ profile.handle }}" /> 17 - <meta property="profile:username" content="{{ profile.handle }}" /> 16 + <meta property=og:url content="https://{{ request.host }}/@{{ profile.handle }}"> 17 + <meta property=profile:username content="{{ profile.handle }}"> 18 + {% else %} 19 + <meta property=og:url content="https://{{ request.host }}/{{ did }}"> 18 20 {% endif %} 19 - {% if athref %}<link rel="alternate" href="{{ athref }}" />{% endif %} 20 - <base target="_blank" /> 21 + {% if athref %}<link rel=alternate href="{{ athref }}">{% endif %} 22 + <base target=_blank> 21 23 <!-- styles and favicons --> 22 - <meta name="viewport" content="width=device-width, initial-scale=1" /> 23 - <link rel="stylesheet" href="{{ url_for('static', filename='worksans.css') }}" /> 24 - <link rel="stylesheet" href="{{ url_for('static', filename='profile/default.css') }}" /> 25 - <link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='favicon-16.png') }}" /> 26 - <link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='favicon-32.png') }}" /> 27 - <link rel="icon" type="image/png" sizes="48x48" href="{{ url_for('static', filename='favicon-48.png') }}" /> 24 + <meta name=viewport content="width=device-width, initial-scale=1"> 25 + <link rel=stylesheet href="{{ url_for('static', filename='worksans.css') }}"> 26 + <link rel=stylesheet href="{{ url_for('static', filename='profile/default.css') }}"> 27 + <link rel=icon type=image/png sizes=16x16 href="{{ url_for('static', filename='favicon-16.png') }}"> 28 + <link rel=icon type=image/png sizes=32x32 href="{{ url_for('static', filename='favicon-32.png') }}"> 29 + <link rel=icon type=image/png sizes=48x48 href="{{ url_for('static', filename='favicon-48.png') }}"> 28 30 </head> 29 31 <body> 30 32 <div class="wrapper profile">
+8 -8
src/templates/terms.html
··· 1 1 <!doctype html> 2 2 <html> 3 3 <head> 4 - <meta charset="utf-8" /> 4 + <meta charset="utf-8"> 5 5 <title>terms of service &mdash; ligo.at</title> 6 - <meta name="viewport" content="width=device-width, initial-scale=1" /> 7 - <link rel="stylesheet" href="{{ url_for('static', filename='worksans.css') }}" /> 8 - <link rel="stylesheet" href="{{ url_for('static', filename='profile/default.css') }}" /> 9 - <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}" /> 10 - <link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='favicon-16.png') }}" /> 11 - <link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='favicon-32.png') }}" /> 12 - <link rel="icon" type="image/png" sizes="48x48" href="{{ url_for('static', filename='favicon-48.png') }}" /> 6 + <meta name=viewport content="width=device-width, initial-scale=1"> 7 + <link rel=stylesheet href="{{ url_for('static', filename='worksans.css') }}"> 8 + <link rel=stylesheet href="{{ url_for('static', filename='profile/default.css') }}"> 9 + <link rel=stylesheet href="{{ url_for('static', filename='style.css') }}"> 10 + <link rel=icon type=image/png sizes=16x16 href="{{ url_for('static', filename='favicon-16.png') }}"> 11 + <link rel=icon type=image/png sizes=32x32 href="{{ url_for('static', filename='favicon-32.png') }}"> 12 + <link rel=icon type=image/png sizes=48x48 href="{{ url_for('static', filename='favicon-48.png') }}"> 13 13 </head> 14 14 <body> 15 15 <div class="wrapper">