2026-03-18 10:36:51 -04:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "UTF-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< title > Lotus Guild Matrix</ title >
< style >
* { margin : 0 ; padding : 0 ; box-sizing : border-box ; }
body {
background : #0a0a0a ;
color : #e0e0e0 ;
font-family : 'Segoe UI' , system-ui , - apple-system , sans-serif ;
min-height : 100 vh ;
display : flex ;
align-items : center ;
justify-content : center ;
2026-03-19 22:57:55 -04:00
padding : 20 px 16 px 40 px ;
2026-03-18 10:36:51 -04:00
}
body :: before {
content : '' ;
position : fixed ;
top : 50 % ;
left : 50 % ;
width : 900 px ;
height : 900 px ;
transform : translate ( -50 % , -50 % );
background : radial-gradient ( circle , rgba ( 152 , 0 , 0 , 0.07 ) 0 % , transparent 65 % );
pointer-events : none ;
z-index : 0 ;
}
. container {
position : relative ;
z-index : 1 ;
text-align : center ;
width : 100 % ;
2026-03-19 22:57:55 -04:00
max-width : 900 px ;
2026-03-18 10:36:51 -04:00
}
. logo {
width : 140 px ;
height : 140 px ;
margin : 0 auto 28 px ;
border-radius : 50 % ;
filter : drop-shadow ( 0 0 24 px rgba ( 152 , 0 , 0 , 0.35 ));
animation : float 6 s ease-in-out infinite ;
}
@ keyframes float {
0 %, 100 % { transform : translateY ( 0 ); }
50 % { transform : translateY ( -8 px ); }
}
h1 {
font-size : 2 rem ;
font-weight : 300 ;
letter-spacing : 0.15 em ;
text-transform : uppercase ;
color : #fff ;
margin-bottom : 4 px ;
}
2026-03-19 22:57:55 -04:00
h1 span { color : #980000 ; font-weight : 600 ; }
2026-03-18 10:36:51 -04:00
. subtitle {
font-size : 0.85 rem ;
color : #555 ;
letter-spacing : 0.3 em ;
text-transform : uppercase ;
margin-bottom : 36 px ;
}
2026-03-19 22:57:55 -04:00
/* ─── Cards / Panels ─── */
2026-03-18 10:36:51 -04:00
. card {
2026-03-19 22:57:55 -04:00
background : linear-gradient ( 145 deg , rgba ( 22 , 22 , 22 , 0.95 ), rgba ( 14 , 14 , 14 , 0.98 ));
border : 1 px solid rgba ( 152 , 0 , 0 , 0.2 );
2026-03-18 10:36:51 -04:00
border-radius : 16 px ;
padding : 32 px ;
2026-03-19 22:57:55 -04:00
max-width : 560 px ;
margin : 0 auto ;
2026-03-18 10:36:51 -04:00
}
. card h2 {
font-size : 0.9 rem ;
font-weight : 500 ;
color : #980000 ;
text-transform : uppercase ;
letter-spacing : 0.15 em ;
margin-bottom : 20 px ;
}
2026-03-19 22:57:55 -04:00
/* ─── Steps ─── */
. steps { list-style : none ; text-align : left ; margin-bottom : 28 px ; }
2026-03-18 10:36:51 -04:00
. steps li {
display : flex ;
align-items : flex-start ;
gap : 14 px ;
padding : 12 px 0 ;
2026-03-19 22:57:55 -04:00
border-bottom : 1 px solid rgba ( 255 , 255 , 255 , 0.04 );
2026-03-18 10:36:51 -04:00
}
. steps li : last-child { border-bottom : none ; }
. step-num {
flex-shrink : 0 ;
2026-03-19 22:57:55 -04:00
width : 28 px ; height : 28 px ;
background : rgba ( 152 , 0 , 0 , 0.12 );
border : 1 px solid rgba ( 152 , 0 , 0 , 0.35 );
2026-03-18 10:36:51 -04:00
border-radius : 50 % ;
2026-03-19 22:57:55 -04:00
display : flex ; align-items : center ; justify-content : center ;
font-size : 0.8 rem ; font-weight : 600 ; color : #c44 ;
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:57:55 -04:00
. step-text { padding-top : 3 px ; font-size : 0.95 rem ; line-height : 1.5 ; color : #bbb ; }
2026-03-18 10:36:51 -04:00
. step-text strong { color : #e0e0e0 ; }
. homeserver {
display : inline-block ;
2026-03-19 22:57:55 -04:00
background : rgba ( 152 , 0 , 0 , 0.1 );
border : 1 px solid rgba ( 152 , 0 , 0 , 0.25 );
2026-03-18 10:36:51 -04:00
color : #e88 ;
font-family : 'SF Mono' , 'Fira Code' , 'Consolas' , monospace ;
font-size : 0.85 rem ;
padding : 3 px 10 px ;
border-radius : 6 px ;
}
2026-03-19 22:57:55 -04:00
a { color : #c44 ; text-decoration : none ; }
. step-text a , . option-block a {
border-bottom : 1 px solid rgba ( 204 , 68 , 68 , 0.3 );
2026-03-18 10:36:51 -04:00
transition : border-color 0.2 s ;
}
2026-03-19 22:57:55 -04:00
. step-text a : hover , . option-block a : hover { border-bottom-color : #c44 ; }
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
/* ─── Or divider ─── */
2026-03-18 10:36:51 -04:00
. or-divider {
2026-03-19 22:57:55 -04:00
display : flex ; align-items : center ; gap : 10 px ;
2026-03-18 10:36:51 -04:00
margin : 4 px 0 10 px 42 px ;
2026-03-19 22:57:55 -04:00
color : #444 ; font-size : 0.78 rem ; letter-spacing : 0.1 em ; text-transform : uppercase ;
2026-03-18 10:36:51 -04:00
}
. or-divider :: before , . or-divider :: after {
2026-03-19 22:57:55 -04:00
content : '' ; flex : 1 ; height : 1 px ; background : rgba ( 255 , 255 , 255 , 0.06 );
2026-03-18 10:36:51 -04:00
}
. option-block {
margin-left : 42 px ;
padding : 12 px 14 px ;
background : rgba ( 255 , 255 , 255 , 0.03 );
border : 1 px solid rgba ( 255 , 255 , 255 , 0.06 );
border-radius : 8 px ;
2026-03-19 22:57:55 -04:00
text-align : left ; font-size : 0.88 rem ; color : #888 ; line-height : 1.5 ;
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:57:55 -04:00
. divider { height : 1 px ; background : rgba ( 152 , 0 , 0 , 0.15 ); margin : 24 px 0 ; }
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
/* ─── Tags ─── */
. tag {
font-size : 0.65 rem ;
background : rgba ( 255 , 255 , 255 , 0.08 );
border : 1 px solid rgba ( 255 , 255 , 255 , 0.1 );
padding : 2 px 8 px ; border-radius : 4 px ;
text-transform : uppercase ; letter-spacing : 0.05 em ; color : #bbb ;
white-space : nowrap ;
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:57:55 -04:00
. tag . voice { background : rgba ( 0 , 180 , 120 , 0.2 ); border-color : rgba ( 0 , 180 , 120 , 0.4 ); color : #5effc4 ; }
. tag . beta { background : rgba ( 255 , 180 , 0 , 0.15 ); border-color : rgba ( 255 , 180 , 0 , 0.3 ); color : #ffcc55 ; }
. tag . dev { background : rgba ( 160 , 80 , 255 , 0.15 ); border-color : rgba ( 160 , 80 , 255 , 0.3 ); color : #cc88ff ; }
. tag . rust { background : rgba ( 80 , 140 , 255 , 0.15 ); border-color : rgba ( 80 , 140 , 255 , 0.3 ); color : #88aaff ; }
. tag . warn { background : rgba ( 255 , 140 , 0 , 0.15 ); border-color : rgba ( 255 , 140 , 0 , 0.3 ); color : #ffaa44 ; }
. tag . dim { background : rgba ( 255 , 255 , 255 , 0.04 ); border-color : rgba ( 255 , 255 , 255 , 0.08 ); color : #666 ; }
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
/* ─── Featured client ─── */
. client-featured { margin-bottom : 16 px ; }
2026-03-18 10:36:51 -04:00
. client-featured a {
2026-03-19 22:57:55 -04:00
display : flex ; flex-direction : column ; align-items : center ; gap : 6 px ;
background : linear-gradient ( 135 deg , rgba ( 152 , 0 , 0 , 0.25 ), rgba ( 120 , 0 , 0 , 0.15 ));
border : 1 px solid rgba ( 152 , 0 , 0 , 0.55 );
color : #fff ; text-decoration : none ;
padding : 18 px 24 px ; border-radius : 12 px ;
2026-03-18 10:36:51 -04:00
transition : all 0.25 s ease ;
2026-03-19 22:57:55 -04:00
box-shadow : 0 0 20 px rgba ( 152 , 0 , 0 , 0.1 );
2026-03-18 10:36:51 -04:00
}
. client-featured a : hover {
2026-03-19 22:57:55 -04:00
background : linear-gradient ( 135 deg , rgba ( 152 , 0 , 0 , 0.38 ), rgba ( 120 , 0 , 0 , 0.25 ));
border-color : rgba ( 152 , 0 , 0 , 0.8 );
box-shadow : 0 0 32 px rgba ( 152 , 0 , 0 , 0.25 );
2026-03-18 10:36:51 -04:00
transform : translateY ( -2 px );
}
2026-03-19 22:57:55 -04:00
. client-name { font-size : 1.15 rem ; font-weight : 600 ; letter-spacing : 0.05 em ; }
. client-desc { font-size : 0.82 rem ; color : #ccc ; }
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
. tag-row { display : flex ; gap : 6 px ; flex-wrap : wrap ; justify-content : center ; margin-top : 2 px ; }
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
/* Also-available note */
. also-available {
font-size : 0.78 rem ; color : #555 ; margin-top : 8 px ; line-height : 1.6 ;
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:57:55 -04:00
. also-available a { color : #666 ; border-bottom : 1 px solid rgba ( 102 , 102 , 102 , 0.3 ); transition : color 0.2 s ; }
. also-available a : hover { color : #999 ; }
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
/* ─── Space join ─── */
. space-join {
margin-top : 20 px ; padding : 16 px 20 px ;
background : rgba ( 152 , 0 , 0 , 0.06 );
border : 1 px solid rgba ( 152 , 0 , 0 , 0.2 ); border-radius : 10 px ;
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:57:55 -04:00
. space-join p { font-size : 0.82 rem ; color : #666 ; margin-bottom : 10 px ; }
. space-join a {
display : inline-block ;
background : rgba ( 152 , 0 , 0 , 0.15 );
border : 1 px solid rgba ( 152 , 0 , 0 , 0.35 );
color : #c44 ; text-decoration : none ;
padding : 8 px 20 px ; border-radius : 8 px ; font-size : 0.88 rem ;
transition : all 0.25 s ease ;
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:57:55 -04:00
. space-join a : hover { background : rgba ( 152 , 0 , 0 , 0.25 ); color : #fff ; }
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
/* ─── Secondary client cards ─── */
. clients-section h3 {
font-size : 0.8 rem ; font-weight : 500 ; color : #666 ;
text-transform : uppercase ; letter-spacing : 0.12 em ; margin-bottom : 14 px ;
2026-03-19 22:51:07 -04:00
}
2026-03-19 22:57:55 -04:00
. client-group { margin-bottom : 18 px ; }
2026-03-19 22:51:07 -04:00
2026-03-19 22:57:55 -04:00
. client-group-label {
font-size : 0.75 rem ; color : #555 ;
text-transform : uppercase ; letter-spacing : 0.1 em ;
margin-bottom : 8 px ;
2026-03-19 22:51:07 -04:00
}
2026-03-19 22:57:55 -04:00
. client-cards { display : flex ; flex-direction : column ; gap : 8 px ; }
2026-03-18 10:36:51 -04:00
2026-03-19 22:51:07 -04:00
. client-card {
2026-03-19 22:57:55 -04:00
display : flex ; flex-direction : column ; gap : 6 px ;
2026-03-19 22:51:07 -04:00
background : rgba ( 255 , 255 , 255 , 0.025 );
border : 1 px solid rgba ( 255 , 255 , 255 , 0.06 );
2026-03-19 22:57:55 -04:00
border-radius : 10 px ; padding : 12 px 14 px ; text-align : left ;
2026-03-19 22:51:07 -04:00
transition : border-color 0.2 s ;
}
. client-card : hover { border-color : rgba ( 152 , 0 , 0 , 0.3 ); }
. client-card-top {
2026-03-19 22:57:55 -04:00
display : flex ; align-items : center ;
justify-content : space-between ; gap : 10 px ; flex-wrap : wrap ;
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:51:07 -04:00
. client-card-name {
2026-03-19 22:57:55 -04:00
font-size : 0.95 rem ; font-weight : 600 ; color : #e0e0e0 ;
2026-03-18 10:36:51 -04:00
text-decoration : none ;
2026-03-19 22:57:55 -04:00
border-bottom : 1 px solid rgba ( 204 , 68 , 68 , 0.2 );
2026-03-19 22:51:07 -04:00
transition : color 0.2 s , border-color 0.2 s ;
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:57:55 -04:00
. client-card-name : hover { color : #c44 ; border-bottom-color : #c44 ; }
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
. client-card-tags { display : flex ; gap : 5 px ; flex-wrap : wrap ; }
. client-card-desc { font-size : 0.8 rem ; color : #666 ; line-height : 1.45 ; }
2026-03-19 22:51:07 -04:00
2026-03-19 22:57:55 -04:00
/* ─── Comparison table ─── */
. comparison-section {
margin-top : 32 px ;
background : linear-gradient ( 145 deg , rgba ( 22 , 22 , 22 , 0.95 ), rgba ( 14 , 14 , 14 , 0.98 ));
border : 1 px solid rgba ( 152 , 0 , 0 , 0.2 );
border-radius : 16 px ;
overflow : hidden ;
2026-03-19 22:51:07 -04:00
}
2026-03-19 22:57:55 -04:00
. comparison-title {
font-size : 0.78 rem ; font-weight : 500 ; color : #980000 ;
text-transform : uppercase ; letter-spacing : 0.15 em ;
padding : 16 px 20 px 12 px ;
border-bottom : 1 px solid rgba ( 152 , 0 , 0 , 0.1 );
2026-03-19 22:51:07 -04:00
}
2026-03-19 22:57:55 -04:00
. table-wrap { overflow-x : auto ; -webkit- overflow-scrolling : touch ; }
2026-03-19 22:51:07 -04:00
2026-03-19 22:57:55 -04:00
table {
width : 100 % ; border-collapse : collapse ;
font-size : 0.78 rem ; min-width : 640 px ;
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:57:55 -04:00
thead tr { border-bottom : 1 px solid rgba ( 152 , 0 , 0 , 0.15 ); }
th {
padding : 10 px 8 px ; text-align : center ;
font-size : 0.7 rem ; font-weight : 600 ;
color : #888 ; text-transform : uppercase ; letter-spacing : 0.08 em ;
background : rgba ( 255 , 255 , 255 , 0.02 );
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:57:55 -04:00
th : first-child { text-align : left ; padding-left : 16 px ; min-width : 140 px ; }
th . ours { color : #c66 ; }
th small { display : block ; font-size : 0.6 rem ; font-weight : 400 ; color : #555 ; margin-top : 2 px ; text-transform : none ; letter-spacing : 0 ; }
tr { border-bottom : 1 px solid rgba ( 255 , 255 , 255 , 0.03 ); }
tr : last-child { border-bottom : none ; }
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
tr . section-header td {
background : rgba ( 152 , 0 , 0 , 0.06 );
color : #770000 ; font-weight : 600 ;
font-size : 0.65 rem ; text-transform : uppercase ; letter-spacing : 0.12 em ;
padding : 6 px 8 px 5 px 16 px ; text-align : left ;
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:57:55 -04:00
td {
padding : 8 px 8 px ; text-align : center ; vertical-align : middle ;
color : #888 ; line-height : 1.3 ;
}
td : first-child {
text-align : left ; padding-left : 16 px ;
color : #aaa ; font-size : 0.78 rem ;
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:57:55 -04:00
td small { display : block ; font-size : 0.68 rem ; color : #555 ; margin-top : 1 px ; }
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
. yes { color : #5effc4 ; font-size : 1 rem ; }
. part { color : #ffcc55 ; font-size : 0.9 rem ; }
. no { color : #444 ; font-size : 1 rem ; }
/* highlight our hosted client column */
th . ours , td . ours { background : rgba ( 152 , 0 , 0 , 0.04 ); }
/* ─── Legend ─── */
. legend {
display : flex ; gap : 18 px ; justify-content : center ; flex-wrap : wrap ;
padding : 10 px 16 px 14 px ;
border-top : 1 px solid rgba ( 255 , 255 , 255 , 0.04 );
font-size : 0.72 rem ; color : #555 ;
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:57:55 -04:00
. legend span { display : flex ; align-items : center ; gap : 5 px ; }
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
/* ─── Security note ─── */
2026-03-19 22:51:07 -04:00
. security-note {
2026-03-19 22:57:55 -04:00
margin : 0 20 px 16 px ;
2026-03-19 22:51:07 -04:00
padding : 10 px 14 px ;
2026-03-19 22:57:55 -04:00
background : rgba ( 80 , 140 , 255 , 0.04 );
border : 1 px solid rgba ( 80 , 140 , 255 , 0.12 );
2026-03-19 22:51:07 -04:00
border-radius : 8 px ;
2026-03-19 22:57:55 -04:00
font-size : 0.76 rem ; color : #556 ; line-height : 1.55 ; text-align : left ;
2026-03-19 22:51:07 -04:00
}
. security-note strong { color : #88aaff ; }
2026-03-19 22:57:55 -04:00
. all-clients { margin-top : 14 px ; }
2026-03-18 10:36:51 -04:00
. all-clients a {
2026-03-19 22:57:55 -04:00
font-size : 0.78 rem ; color : #555 ;
border-bottom : 1 px solid rgba ( 85 , 85 , 85 , 0.3 );
2026-03-18 10:36:51 -04:00
transition : color 0.2 s , border-color 0.2 s ;
}
2026-03-19 22:57:55 -04:00
. all-clients a : hover { color : #888 ; border-bottom-color : #888 ; }
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
/* ─── Server info ─── */
2026-03-18 10:36:51 -04:00
. server-info {
margin-top : 24 px ;
2026-03-19 22:57:55 -04:00
background : linear-gradient ( 145 deg , rgba ( 22 , 22 , 22 , 0.95 ), rgba ( 14 , 14 , 14 , 0.98 ));
border : 1 px solid rgba ( 152 , 0 , 0 , 0.2 );
border-radius : 12 px ; overflow : hidden ;
2026-03-18 10:36:51 -04:00
}
. server-info-title {
2026-03-19 22:57:55 -04:00
font-size : 0.78 rem ; font-weight : 500 ; color : #980000 ;
text-transform : uppercase ; letter-spacing : 0.15 em ;
2026-03-18 10:36:51 -04:00
padding : 14 px 20 px 10 px ;
2026-03-19 22:57:55 -04:00
border-bottom : 1 px solid rgba ( 152 , 0 , 0 , 0.1 );
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:57:55 -04:00
. info-grid { display : grid ; grid-template-columns : 1 fr 1 fr ; }
2026-03-18 10:36:51 -04:00
. info-item {
padding : 12 px 18 px ;
border-bottom : 1 px solid rgba ( 255 , 255 , 255 , 0.03 );
border-right : 1 px solid rgba ( 255 , 255 , 255 , 0.03 );
text-align : left ;
}
. info-item : nth-child ( even ) { border-right : none ; }
. info-item : nth-last-child ( -n + 2 ) { border-bottom : none ; }
2026-03-19 22:57:55 -04:00
. info-label { font-size : 0.7 rem ; color : #555 ; text-transform : uppercase ; letter-spacing : 0.1 em ; margin-bottom : 3 px ; }
. info-value { font-size : 0.88 rem ; color : #ccc ; }
2026-03-18 10:36:51 -04:00
. privacy-strip {
padding : 10 px 18 px ;
2026-03-19 22:57:55 -04:00
border-top : 1 px solid rgba ( 152 , 0 , 0 , 0.1 );
display : flex ; gap : 18 px ; justify-content : center ; flex-wrap : wrap ;
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:57:55 -04:00
. privacy-badge { font-size : 0.75 rem ; color : #5effc4 ; display : flex ; align-items : center ; gap : 5 px ; }
. privacy-badge :: before { content : '✓' ; font-weight : 700 ; }
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
/* ─── Legal / contact / footer ─── */
2026-03-18 10:36:51 -04:00
. legal-note {
2026-03-19 22:57:55 -04:00
margin-top : 24 px ; padding : 12 px 18 px ;
2026-03-18 10:36:51 -04:00
background : rgba ( 255 , 255 , 255 , 0.02 );
border : 1 px solid rgba ( 255 , 255 , 255 , 0.05 );
2026-03-19 22:57:55 -04:00
border-radius : 8 px ; font-size : 0.75 rem ; color : #444 ;
line-height : 1.6 ; text-align : left ;
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:57:55 -04:00
. legal-note a { color : #555 ; border-bottom : 1 px solid rgba ( 85 , 85 , 85 , 0.3 ); }
. legal-note a : hover { color : #888 ; }
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
. contact {
margin-top : 24 px ; padding : 16 px ;
background : linear-gradient ( 145 deg , rgba ( 22 , 22 , 22 , 0.95 ), rgba ( 14 , 14 , 14 , 0.98 ));
border : 1 px solid rgba ( 152 , 0 , 0 , 0.2 );
border-radius : 12 px ; text-align : center ;
2026-03-18 10:36:51 -04:00
}
2026-03-19 22:57:55 -04:00
. footer {
margin-top : 20 px ; font-size : 0.72 rem ; color : #383838 ;
letter-spacing : 0.04 em ;
display : flex ; justify-content : center ; gap : 14 px ; flex-wrap : wrap ;
}
. footer a { color : #444 ; transition : color 0.2 s ; }
. footer a : hover { color : #777 ; }
2026-03-18 10:36:51 -04:00
2026-03-19 23:06:00 -04:00
/* ─── Sticky first table column (all screen sizes) ─── */
td : first-child {
position : sticky ;
left : 0 ;
z-index : 1 ;
background : #0d0d0d ;
}
th : first-child {
position : sticky ;
left : 0 ;
z-index : 2 ;
background : #111 ;
}
tr . section-header td {
/* section headers span full width — override sticky bg */
position : static ;
background : rgba ( 152 , 0 , 0 , 0.06 );
}
/* Scroll hint — visible only on mobile via JS class */
. scroll-hint {
display : none ;
font-size : 0.72 rem ;
color : #3a3a3a ;
padding : 0 16 px 10 px ;
letter-spacing : 0.05 em ;
}
/* ─── Tablet (≤ 700px) ─── */
@ media ( max-width : 700px ) {
body { align-items : flex-start ; }
}
/* ─── Mobile (≤ 540px) ─── */
@ media ( max-width : 540px ) {
body { padding : 20 px 12 px 40 px ; }
. logo { width : 100 px ; height : 100 px ; margin-bottom : 20 px ; }
h1 { font-size : 1.5 rem ; letter-spacing : 0.1 em ; }
. subtitle { font-size : 0.78 rem ; letter-spacing : 0.18 em ; margin-bottom : 26 px ; }
. card { padding : 22 px 16 px ; }
. step-text { font-size : 0.88 rem ; }
. homeserver { font-size : 0.75 rem ; word-break : break-all ; }
2026-03-18 10:36:51 -04:00
. or-divider , . option-block { margin-left : 0 ; }
2026-03-19 23:06:00 -04:00
. client-card-top { flex-direction : column ; align-items : flex-start ; gap : 6 px ; }
. client-card-desc { font-size : 0.79 rem ; }
. client-card-tags { gap : 4 px ; }
. also-available { font-size : 0.75 rem ; }
/* Table */
. scroll-hint { display : block ; }
table { font-size : 0.71 rem ; min-width : 520 px ; }
th { padding : 8 px 5 px ; font-size : 0.6 rem ; }
th : first-child { min-width : 100 px ; padding-left : 10 px ; }
td { padding : 7 px 5 px ; }
td : first-child { font-size : 0.71 rem ; padding-left : 10 px ; }
td small , th small { font-size : 0.58 rem ; }
. yes { font-size : 0.88 rem ; }
. part { font-size : 0.82 rem ; }
. no { font-size : 0.88 rem ; }
. comparison-title { font-size : 0.7 rem ; padding : 12 px 14 px 8 px ; letter-spacing : 0.1 em ; }
. security-note { margin : 10 px 12 px 4 px ; font-size : 0.71 rem ; }
. legend { padding : 8 px 12 px 12 px ; gap : 12 px ; font-size : 0.68 rem ; }
/* Server info */
. server-info-title { font-size : 0.7 rem ; padding : 12 px 14 px 8 px ; }
. info-item { padding : 10 px 14 px ; }
. info-label { font-size : 0.65 rem ; }
. info-value { font-size : 0.82 rem ; }
. privacy-strip { flex-direction : column ; align-items : center ; gap : 8 px ; padding : 10 px 14 px ; }
. privacy-badge { font-size : 0.71 rem ; }
/* Legal / footer */
. legal-note { font-size : 0.72 rem ; padding : 11 px 14 px ; }
. contact { padding : 14 px ; }
. footer { gap : 8 px ; font-size : 0.68 rem ; }
}
/* ─── Very small (≤ 380px) ─── */
@ media ( max-width : 380px ) {
h1 { font-size : 1.3 rem ; }
. logo { width : 84 px ; height : 84 px ; }
. card { padding : 18 px 12 px ; }
table { font-size : 0.66 rem ; min-width : 480 px ; }
th { font-size : 0.55 rem ; padding : 7 px 4 px ; }
td { padding : 6 px 4 px ; }
td : first-child { font-size : 0.66 rem ; min-width : 90 px ; }
2026-03-18 10:36:51 -04:00
}
</ style >
</ head >
< body >
2026-03-19 22:57:55 -04:00
< div class = "container" >
< img class = "logo" src = "https://photos.lotusguild.org/api/assets/3c4eb2da-0d06-407f-bdb7-c9e4cf795f0a/thumbnail?key=4aoZxX5-FHE3m_Ywwz1uGo3iNW53kmFztxfUw91PdOgphPNxayLFicNuxPvit1OYTpY&size=preview&c=jUqDBQAWF9iId3J%2FyAeIcIAICEd4d3BzSA%3D%3D" alt = "Lotus Guild" >
< h1 >< span > Lotus</ span > Guild</ h1 >
< p class = "subtitle" > Private Communications</ p >
<!-- ── How to Join ── -->
< div class = "card" >
< h2 > How to Join</ h2 >
< ol class = "steps" >
< li >
< span class = "step-num" > 1</ span >
< span class = "step-text" > Open < a href = "https://chat.lotusguild.org" target = "_blank" rel = "noopener" > chat.lotusguild.org</ a > — your homeserver is pre-configured</ span >
</ li >
< li >
< span class = "step-num" > 2</ span >
< span class = "step-text" > Register with a < strong > token from Jared</ strong > — < code class = "homeserver" > @jared:matrix.lotusguild.org</ code ></ span >
</ li >
< li >
< span class = "step-num" > 3</ span >
< span class = "step-text" > Join the < a href = "https://matrix.to/#/!-1ZBnAH-JiCOV8MGSKN77zDGTuI3pgSdy8Unu_DrDyc?via=matrix.lotusguild.org&via=matrix.org" target = "_blank" rel = "noopener" > Lotus Guild Space</ a > to access all rooms</ span >
</ li >
</ ol >
< div class = "or-divider" > or join from another server</ div >
< div class = "option-block" >
Already have a Matrix account? Sign up free at < a href = "https://app.element.io/#/register?hs_url=https://mozilla.modular.im" target = "_blank" rel = "noopener" > mozilla.org</ a > or < a href = "https://app.element.io/#/register" target = "_blank" rel = "noopener" > matrix.org</ a > , then < a href = "https://matrix.to/#/!-1ZBnAH-JiCOV8MGSKN77zDGTuI3pgSdy8Unu_DrDyc?via=matrix.lotusguild.org&via=matrix.org" target = "_blank" rel = "noopener" > join our space</ a > .
</ div >
< div class = "divider" ></ div >
<!-- ── Recommended client ── -->
< div class = "clients-section" >
< h3 > Recommended Client</ h3 >
< div class = "client-featured" >
< a href = "https://chat.lotusguild.org" target = "_blank" rel = "noopener" >
< span class = "client-name" > Lotus Guild Chat</ span >
< span class = "client-desc" > Hosted Cinny — homeserver pre-configured, no setup</ span >
< span class = "tag-row" >
< span class = "tag dim" > Desktop & Web</ span >
< span class = "tag dev" > Dev Branch</ span >
< span class = "tag voice" > Voice & Video Rooms</ span >
< span class = "tag" > Discord-like UI</ span >
</ span >
</ a >
</ div >
< p class = "also-available" >
Runs the Cinny < strong > dev branch</ strong > — latest beta features, updated nightly.
Prefer stable? Use < a href = "https://cinny.in" target = "_blank" rel = "noopener" > cinny.in</ a > and set homeserver to < code style = "font-size:0.8em;color:#e88;" > matrix.lotusguild.org</ code > .
</ p >
< div class = "space-join" >
< p > Already signed in? Jump straight into the community:</ p >
< a href = "https://matrix.to/#/!-1ZBnAH-JiCOV8MGSKN77zDGTuI3pgSdy8Unu_DrDyc?via=matrix.lotusguild.org&via=matrix.org" target = "_blank" rel = "noopener" > Join Lotus Guild Space → </ a >
2026-03-18 10:36:51 -04:00
</ div >
< div class = "divider" ></ div >
2026-03-19 22:57:55 -04:00
<!-- ── Other clients ── -->
2026-03-18 10:36:51 -04:00
< div class = "clients-section" >
2026-03-19 22:57:55 -04:00
< h3 > Other Clients</ h3 >
< div class = "client-group" >
< p class = "client-group-label" > Mobile — iOS & Android</ p >
< div class = "client-cards" >
< div class = "client-card" >
< div class = "client-card-top" >
< a href = "https://element.io/element-x" target = "_blank" rel = "noopener" class = "client-card-name" > Element X</ a >
< div class = "client-card-tags" >
< span class = "tag dim" > iOS</ span >
< span class = "tag dim" > Android</ span >
< span class = "tag rust" > Rust SDK</ span >
< span class = "tag voice" > Voice, Video & Screenshare</ span >
2026-03-19 22:51:07 -04:00
</ div >
</ div >
2026-03-19 22:57:55 -04:00
< p class = "client-card-desc" > Fastest Matrix client — instant load via Sliding Sync. Native MatrixRTC calls and screenshare. Rust encryption (Vodozemac). Spaces viewing works; creating/managing spaces still in progress.</ p >
</ div >
< div class = "client-card" >
< div class = "client-card-top" >
< a href = "https://fluffychat.im/" target = "_blank" rel = "noopener" class = "client-card-name" > FluffyChat</ a >
< div class = "client-card-tags" >
< span class = "tag dim" > iOS</ span >
< span class = "tag dim" > Android</ span >
< span class = "tag dim" > Desktop</ span >
< span class = "tag dim" > Web</ span >
< span class = "tag rust" > Rust SDK</ span >
< span class = "tag warn" > Calls Experimental</ span >
2026-03-19 22:51:07 -04:00
</ div >
</ div >
2026-03-19 22:57:55 -04:00
< p class = "client-card-desc" > Simple, beginner-friendly, fully cross-platform. Rust encryption (Vodozemac). Unique: supports image captions (text + image as one event). Voice/video calls are experimental — reliability varies by homeserver and platform.</ p >
2026-03-19 22:51:07 -04:00
</ div >
</ div >
2026-03-19 22:57:55 -04:00
</ div >
2026-03-19 22:51:07 -04:00
2026-03-19 22:57:55 -04:00
< div class = "client-group" >
< p class = "client-group-label" > Discord-like — Android, Windows & Linux</ p >
< div class = "client-cards" >
< div class = "client-card" >
< div class = "client-card-top" >
< a href = "https://commet.chat/" target = "_blank" rel = "noopener" class = "client-card-name" > Commet</ a >
< div class = "client-card-tags" >
< span class = "tag dim" > Android</ span >
< span class = "tag dim" > Windows</ span >
< span class = "tag dim" > Linux</ span >
< span class = "tag beta" > Beta</ span >
< span class = "tag voice" > Voice & Video</ span >
2026-03-19 22:51:07 -04:00
</ div >
</ div >
2026-03-19 22:57:55 -04:00
< p class = "client-card-desc" > Most Discord-like client overall. Multi-account support, built-in GIF search (via privacy-respecting proxy — GIFs upload to your homeserver, not tracked by Tenor). Shared calendars and photo albums. No iOS or macOS yet. Active early-stage development.</ p >
2026-03-18 10:36:51 -04:00
</ div >
</ div >
2026-03-19 22:57:55 -04:00
</ div >
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
< div class = "client-group" >
< p class = "client-group-label" > Desktop — Windows, macOS & Linux</ p >
< div class = "client-cards" >
< div class = "client-card" >
< div class = "client-card-top" >
< a href = "https://element.io/download" target = "_blank" rel = "noopener" class = "client-card-name" > Element</ a >
< div class = "client-card-tags" >
< span class = "tag dim" > Windows</ span >
< span class = "tag dim" > macOS</ span >
< span class = "tag dim" > Linux</ span >
< span class = "tag dim" > Web</ span >
< span class = "tag voice" > Voice, Video & Screenshare</ span >
2026-03-19 22:51:07 -04:00
</ div >
</ div >
2026-03-19 22:57:55 -04:00
< p class = "client-card-desc" > Most feature-complete Matrix client — every spec feature including polls, widgets, threads, screenshare. Heavier on resources. Encrypted message search on desktop only (not web).</ p >
</ div >
< div class = "client-card" >
< div class = "client-card-top" >
< a href = "https://nheko-reborn.github.io/" target = "_blank" rel = "noopener" class = "client-card-name" > Nheko</ a >
< div class = "client-card-tags" >
< span class = "tag dim" > Windows</ span >
< span class = "tag dim" > macOS</ span >
< span class = "tag dim" > Linux</ span >
< span class = "tag voice" > Voice & Video</ span >
2026-03-19 22:51:07 -04:00
</ div >
</ div >
2026-03-19 22:57:55 -04:00
< p class = "client-card-desc" > Native C++/Qt client — lightest desktop option, no Electron. Deep KDE/Plasma integration. No threads, no mobile or web. Best for Linux power users who want minimal resource usage.</ p >
2026-03-18 10:36:51 -04:00
</ div >
</ div >
</ div >
2026-03-19 22:57:55 -04:00
< p class = "all-clients" >< a href = "https://matrix.org/ecosystem/clients/" target = "_blank" rel = "noopener" > View all Matrix clients → </ a ></ p >
2026-03-18 10:36:51 -04:00
</ div >
</ div >
2026-03-19 22:57:55 -04:00
</ div > <!-- end .card -->
<!-- ── Feature Comparison Table ── -->
< div class = "comparison-section" >
< p class = "comparison-title" > Client Feature Comparison — March 2026</ p >
2026-03-19 23:06:00 -04:00
< p class = "scroll-hint" id = "scrollHint" > ← swipe to compare →</ p >
2026-03-19 22:57:55 -04:00
< div class = "table-wrap" >
< table >
< thead >
< tr >
< th ></ th >
< th class = "ours" > Cinny< small > chat.lotusguild.org< br > dev branch</ small ></ th >
< th > Element X< small > iOS & Android</ small ></ th >
< th > FluffyChat< small > All platforms</ small ></ th >
< th > Commet< small > Android / Win / Linux</ small ></ th >
< th > Element< small > Web & Desktop</ small ></ th >
< th > Nheko< small > Desktop only</ small ></ th >
</ tr >
</ thead >
< tbody >
<!-- Platform -->
< tr class = "section-header" >< td colspan = "7" > Platform</ td ></ tr >
< tr >
< td > iOS</ td >
< td class = "ours" >< span class = "no" > ✗</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
</ tr >
< tr >
< td > Android</ td >
< td class = "ours" >< span class = "no" > ✗</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
</ tr >
< tr >
< td > Desktop app</ td >
< td class = "ours" >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span >< small > Win & Linux</ small ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
</ tr >
< tr >
< td > Web browser</ td >
< td class = "ours" >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
</ tr >
< tr >
< td > Performance</ td >
< td class = "ours" > Light</ td >
< td > Very fast< small > Sliding Sync</ small ></ td >
< td > Moderate</ td >
< td > Moderate</ td >
< td > Heavy< small > Electron / JS</ small ></ td >
< td > Light< small > Native C++</ small ></ td >
</ tr >
<!-- Security -->
< tr class = "section-header" >< td colspan = "7" > Security & Encryption</ td ></ tr >
< tr >
< td > E2EE</ td >
< td class = "ours" >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
</ tr >
< tr >
< td > Rust SDK (Vodozemac)< small > stronger crypto track record</ small ></ td >
< td class = "ours" >< span class = "no" > ✗</ span >< small > js-sdk</ small ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "no" > ✗</ span >< small > js-sdk, migrating</ small ></ td >
< td >< span class = "no" > ✗</ span ></ td >
</ tr >
< tr >
< td > Device verification</ td >
< td class = "ours" >< span class = "part" > ~</ span >< small > requests may show as< br > "Unsupported message"</ small ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
</ tr >
<!-- Calling -->
< tr class = "section-header" >< td colspan = "7" > Voice & Video</ td ></ tr >
< tr >
< td > Voice & video calls</ td >
< td class = "ours" >< span class = "part" > ~</ span >< small > dedicated space rooms only,< br > not DMs</ small ></ td >
< td >< span class = "yes" > ✓</ span >< small > MatrixRTC</ small ></ td >
< td >< span class = "part" > ~</ span >< small > experimental, varies< br > by homeserver</ small ></ td >
2026-03-19 23:02:08 -04:00
< td >< span class = "part" > ~</ span >< small > 1:1 + group,< br > no E2EE voice rooms</ small ></ td >
2026-03-19 22:57:55 -04:00
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
</ tr >
< tr >
< td > Screenshare</ td >
< td class = "ours" >< span class = "no" > ✗</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "part" > ~</ span >< small > partial</ small ></ td >
</ tr >
< tr >
< td > Group calls</ td >
< td class = "ours" >< span class = "part" > ~</ span >< small > space rooms only</ small ></ td >
< td >< span class = "yes" > ✓</ span >< small > MatrixRTC</ small ></ td >
< td >< span class = "no" > ✗</ span ></ td >
2026-03-19 23:02:08 -04:00
< td >< span class = "part" > ~</ span >< small > no E2EE voice rooms</ small ></ td >
2026-03-19 22:57:55 -04:00
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "part" > ~</ span >< small > partial</ small ></ td >
</ tr >
<!-- Core features -->
< tr class = "section-header" >< td colspan = "7" > Core Features</ td ></ tr >
< tr >
< td > Spaces</ td >
< td class = "ours" >< span class = "yes" > ✓</ span >< small > best-in-class sub-space nav</ small ></ td >
< td >< span class = "part" > ~</ span >< small > viewing works;< br > management in progress</ small ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span >< small > Discord-like categories</ small ></ td >
< td >< span class = "yes" > ✓</ span >< small > sub-spaces clunky</ small ></ td >
< td >< span class = "part" > ~</ span >< small > limited</ small ></ td >
</ tr >
< tr >
< td > Threads</ td >
< td class = "ours" >< span class = "part" > ~</ span >< small > basic, no dedicated view</ small ></ td >
< td >< span class = "part" > ~</ span >< small > Labs flag</ small ></ td >
< td >< span class = "no" > ✗</ span >< small > shows as regular messages</ small ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
</ tr >
< tr >
< td > Polls</ td >
< td class = "ours" >< span class = "no" > ✗</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "part" > ~</ span >< small > recently added</ small ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
</ tr >
< tr >
< td > Custom emoji & stickers</ td >
< td class = "ours" >< span class = "yes" > ✓</ span >< small > best-in-class</ small ></ td >
< td >< span class = "part" > ~</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span >< small > bulk upload, Signal packs</ small ></ td >
< td >< span class = "part" > ~</ span >< small > sometimes shows mxc:// URLs</ small ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
</ tr >
< tr >
< td > GIF search / picker</ td >
< td class = "ours" >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "yes" > ✓</ span >< small > privacy proxy,< br > uploads to homeserver</ small ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
</ tr >
< tr >
< td > Message search (encrypted)</ td >
< td class = "ours" >< span class = "part" > ~</ span >< small > partial, some rooms broken</ small ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "part" > ~</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "part" > ~</ span >< small > desktop only, not web</ small ></ td >
< td >< span class = "part" > ~</ span ></ td >
</ tr >
< tr >
< td > Widgets</ td >
< td class = "ours" >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
</ tr >
<!-- UX / extras -->
< tr class = "section-header" >< td colspan = "7" > UX & Extras</ td ></ tr >
< tr >
< td > Multi-account</ td >
< td class = "ours" >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "part" > ~</ span >< small > supported but clunky</ small ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span >< small > CLI profiles only</ small ></ td >
</ tr >
< tr >
< td > Image captions< small > (text + image as one event)</ small ></ td >
< td class = "ours" >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "yes" > ✓</ span >< small > unique feature</ small ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "part" > ~</ span ></ td >
</ tr >
< tr >
< td > Discord-like UI</ td >
< td class = "ours" >< span class = "yes" > ✓</ span >< small > best-in-class for web</ small ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span >< small > WhatsApp/Telegram style</ small ></ td >
< td >< span class = "yes" > ✓</ span >< small > most Discord-like overall</ small ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
</ tr >
< tr >
< td > Shared calendars & albums</ td >
< td class = "ours" >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "yes" > ✓</ span >< small > unique to Commet</ small ></ td >
< td >< span class = "no" > ✗</ span ></ td >
< td >< span class = "no" > ✗</ span ></ td >
</ tr >
2026-03-19 23:02:08 -04:00
< tr >
< td > Deleted message visibility< small > (redacted events)</ small ></ td >
< td class = "ours" >< span class = "no" > ✗</ span >< small > hides deleted messages< br > entirely — no trace</ small ></ td >
< td >< span class = "yes" > ✓</ span >< small > "Message deleted"< br > placeholder shown</ small ></ td >
< td >< span class = "yes" > ✓</ span >< small > shows redaction notice</ small ></ td >
< td >< span class = "yes" > ✓</ span >< small > shows redaction notice</ small ></ td >
< td >< span class = "yes" > ✓</ span >< small > "Message deleted"< br > placeholder shown</ small ></ td >
< td >< span class = "yes" > ✓</ span >< small > shows redaction notice</ small ></ td >
</ tr >
2026-03-19 22:57:55 -04:00
< tr >
< td > Push notifications</ td >
< td class = "ours" >< span class = "part" > ~</ span >< small > web push only</ small ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
< td >< span class = "yes" > ✓</ span >< small > desktop</ small ></ td >
< td >< span class = "yes" > ✓</ span ></ td >
</ tr >
</ tbody >
</ table >
</ div > <!-- table-wrap -->
< div class = "security-note" style = "margin:14px 16px 6px;" >
< strong > Encryption architecture:</ strong > Element X, FluffyChat, and Commet use < strong > Vodozemac</ strong > — the Rust implementation of Matrix encryption — which has a stronger security track record than the older JavaScript SDK. Cinny and Element Web/Desktop currently use < strong > matrix-js-sdk</ strong > ; Element is actively migrating to the Rust SDK via WebAssembly. Rust-based clients were not affected by historical js-sdk implementation vulnerabilities.
</ div >
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
< div class = "legend" >
< span >< span class = "yes" > ✓</ span > Full support</ span >
< span >< span class = "part" > ~</ span > Partial / experimental</ span >
< span >< span class = "no" > ✗</ span > Not supported</ span >
</ div >
</ div > <!-- comparison-section -->
<!-- ── Server Details ── -->
< div class = "server-info" >
< p class = "server-info-title" > Server Details</ p >
< div class = "info-grid" >
< div class = "info-item" >
< div class = "info-label" > Access</ div >
< div class = "info-value" > Invite-only</ div >
</ div >
< div class = "info-item" >
< div class = "info-label" > Max Upload</ div >
< div class = "info-value" > 200 MB / file</ div >
</ div >
< div class = "info-item" >
< div class = "info-label" > Message History</ div >
< div class = "info-value" > Kept indefinitely</ div >
</ div >
< div class = "info-item" >
< div class = "info-label" > Media Retention</ div >
< div class = "info-value" > 3 yr local · 1 yr remote</ div >
</ div >
< div class = "info-item" >
< div class = "info-label" > Federation</ div >
< div class = "info-value" > Fully federated</ div >
2026-03-18 10:36:51 -04:00
</ div >
2026-03-19 22:57:55 -04:00
< div class = "info-item" >
< div class = "info-label" > Minimum Age</ div >
< div class = "info-value" > 13+ (COPPA)</ div >
2026-03-18 10:36:51 -04:00
</ div >
</ div >
2026-03-19 22:57:55 -04:00
< div class = "privacy-strip" >
< span class = "privacy-badge" > No ads or tracking</ span >
< span class = "privacy-badge" > No data sold</ span >
< span class = "privacy-badge" > E2EE — server cannot read encrypted rooms</ span >
2026-03-18 10:36:51 -04:00
</ div >
2026-03-19 22:57:55 -04:00
</ div >
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
< div class = "legal-note" >
This service is provided "as-is" with no uptime guarantee. Not for emergency use — do not use to contact emergency services (e.g. 911). Use is governed by our < a href = "https://wiki.lotusguild.org/en/Legal/terms-of-service" target = "_blank" rel = "noopener" > Terms of Service</ a > and < a href = "https://wiki.lotusguild.org/en/Legal/privacy-policy" target = "_blank" rel = "noopener" > Privacy Policy</ a > . Governing law: State of Ohio, United States.
</ div >
2026-03-18 10:36:51 -04:00
2026-03-19 22:57:55 -04:00
< div class = "contact" >
< p style = "font-size:0.85rem;color:#777;margin-bottom:4px;" > Questions or need a registration token?</ p >
< p > Reach out to < code class = "homeserver" > @jared:matrix.lotusguild.org</ code ></ p >
2026-03-18 10:36:51 -04:00
</ div >
2026-03-19 22:57:55 -04:00
< p class = "footer" >
< a href = "https://wiki.lotusguild.org/en/Services/service-matrix" target = "_blank" rel = "noopener" > Wiki & Setup Guide</ a >
< span > · </ span >
< a href = "https://wiki.lotusguild.org/en/Legal/privacy-policy" target = "_blank" rel = "noopener" > Privacy Policy</ a >
< span > · </ span >
< a href = "https://wiki.lotusguild.org/en/Legal/terms-of-service" target = "_blank" rel = "noopener" > Terms of Service</ a >
< span > · </ span >
< span > Powered by Matrix · E2E Encrypted</ span >
</ p >
</ div > <!-- container -->
2026-03-19 23:06:00 -04:00
< script >
// Show scroll hint only on touch devices; hide once table is scrolled
if ( 'ontouchstart' in window || navigator . maxTouchPoints > 0 ) {
var hint = document . getElementById ( 'scrollHint' );
if ( hint ) hint . style . display = 'block' ;
var wrap = hint && hint . nextElementSibling ;
if ( wrap ) wrap . addEventListener ( 'scroll' , function hide () {
hint . style . display = 'none' ;
wrap . removeEventListener ( 'scroll' , hide );
}, { passive : true });
}
</ script >
2026-03-18 10:36:51 -04:00
</ body >
</ html >