2026-07-07 07:11:50 +00:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "UTF-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< title > Stockholm City Intelligence — Landvex< / title >
< meta name = "description" content = "Continuous intelligence across Stockholm districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district." >
2026-07-12 12:41:35 +00:00
< link rel = "canonical" href = "https://www.landvex.com/cities/stockholm/" >
2026-07-07 07:11:50 +00:00
< meta name = "robots" content = "index, follow" >
< meta property = "og:type" content = "website" >
2026-07-12 12:41:35 +00:00
< meta property = "og:url" content = "https://www.landvex.com/cities/stockholm/" >
2026-07-07 07:11:50 +00:00
< meta property = "og:title" content = "Stockholm City Intelligence — Landvex" >
< meta property = "og:description" content = "Continuous intelligence across Stockholm districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district." >
2026-07-12 12:41:35 +00:00
< meta property = "og:image" content = "https://www.landvex.com/og-image.jpg" >
2026-07-07 07:11:50 +00:00
< meta name = "twitter:card" content = "summary_large_image" >
< link rel = "icon" type = "image/svg+xml" href = "/favicon.svg" >
< link rel = "icon" type = "image/x-icon" href = "/favicon.ico" >
< link rel = "apple-touch-icon" href = "/apple-touch-icon.png" >
< style >
* , * :: before , * :: after { box-sizing : border-box ; margin : 0 ; padding : 0 ; }
: root {
--bg-dark : #f5f5f7 ;
--blue : #0066FF ;
--blue-dark : #0052CC ;
--blue-glow : rgba ( 0 , 102 , 255 , 0.15 ) ;
--text-dark : #0a0a0a ;
--text-body : #3a3a3a ;
--text-muted : #6B6B6B ;
--text-light : #1d1d1f ;
--text-dim : #6B6B6B ;
--surface : #ffffff ;
--surface-2 : #f5f5f7 ;
--border : rgba ( 0 , 0 , 0 , 0.08 ) ;
--radius-sm : 8 px ;
--radius-md : 14 px ;
--radius-lg : 24 px ;
}
html { scroll-behavior : smooth ; }
body {
font-family : - apple-system , BlinkMacSystemFont , 'Inter' , 'Helvetica Neue' , sans-serif ;
background : var ( - - bg - dark ) ;
color : var ( - - text - light ) ;
line-height : 1.6 ;
-webkit- font-smoothing : antialiased ;
}
a { color : inherit ; text-decoration : none ; }
nav {
position : fixed ; top : 0 ; left : 0 ; right : 0 ; z-index : 100 ;
display : flex ; align-items : center ; justify-content : space-between ;
padding : 0 40 px ; height : 64 px ;
2026-07-12 12:41:35 +00:00
background : rgba ( 255 , 255 , 255 , 0.88 ) ;
2026-07-07 07:11:50 +00:00
backdrop-filter : blur ( 16 px ) ;
-webkit- backdrop-filter : blur ( 16 px ) ;
border-bottom : 1 px solid var ( - - border ) ;
}
. nav-logo {
font-size : 18 px ;
font-weight : 700 ;
letter-spacing : -0.3 px ;
color : #1d1d1f ; }
. btn {
2026-07-12 12:41:35 +00:00
display : inline-flex ; align-items : center ; gap : 6 px ;
padding : 10 px 22 px ;
2026-07-07 07:11:50 +00:00
background : var ( - - blue ) ; color : #1d1d1f ;
font-size : 14 px ; font-weight : 600 ;
border-radius : var ( - - radius - md ) ;
border : none ; cursor : pointer ;
transition : background 0.2 s , transform 0.15 s ;
}
. btn : hover { background : var ( - - blue - dark ) ; transform : translateY ( -1 px ) ; }
. btn-outline {
background : transparent ;
border : 1.5 px solid rgba ( 0 , 0 , 0 , 0.18 ) ;
color : var ( - - text - light ) ;
}
. btn-outline : hover { background : rgba ( 0 , 0 , 0 , 0.04 ) ; transform : translateY ( -1 px ) ; }
2026-07-12 12:41:35 +00:00
. btn-lg { padding : 14 px 30 px ; font-size : 16 px ; border-radius : var ( - - radius - md ) ; }
2026-07-07 07:11:50 +00:00
. hero {
min-height : 90 vh ;
display : flex ; flex-direction : column ; align-items : center ; justify-content : center ;
text-align : center ;
2026-07-12 12:41:35 +00:00
padding : 120 px 24 px 80 px ;
2026-07-07 07:11:50 +00:00
position : relative ; overflow : hidden ;
}
2026-07-12 12:41:35 +00:00
. hero :: before {
content : '' ;
position : absolute ;
top : -200 px ; left : 50 % ; transform : translateX ( -50 % ) ;
width : 900 px ; height : 600 px ;
background : radial-gradient ( ellipse at center , rgba ( 0 , 102 , 255 , 0.12 ) 0 % , transparent 70 % ) ;
pointer-events : none ;
}
2026-07-07 07:11:50 +00:00
2026-07-12 12:41:35 +00:00
. hero-eyebrow {
display : inline-flex ; align-items : center ; gap : 8 px ;
background : rgba ( 0 , 102 , 255 , 0.1 ) ;
border : 1 px solid rgba ( 0 , 102 , 255 , 0.25 ) ;
color : #5599ff ;
font-size : 12 px ; font-weight : 600 ; letter-spacing : 0.08 em ;
text-transform : uppercase ;
padding : 6 px 16 px ; border-radius : 100 px ;
margin-bottom : 28 px ;
}
2026-07-07 07:11:50 +00:00
. hero h1 {
font-size : clamp ( 36 px , 6 vw , 68 px ) ;
font-weight : 800 ; letter-spacing : -2 px ; line-height : 1.05 ;
color : #1d1d1f ; max-width : 820 px ; margin-bottom : 24 px ;
}
. hero-sub {
font-size : clamp ( 16 px , 2 vw , 19 px ) ;
color : var ( - - text - dim ) ; max-width : 680 px ; line-height : 1.65 ;
margin-bottom : 40 px ;
}
2026-07-12 12:41:35 +00:00
. hero-ctas { display : flex ; gap : 14 px ; flex-wrap : wrap ; justify-content : center ; }
2026-07-07 07:11:50 +00:00
2026-07-12 12:41:35 +00:00
section { padding : 96 px 24 px ; }
2026-07-07 07:11:50 +00:00
. container { max-width : 1140 px ; margin : 0 auto ; }
. section-label {
font-size : 12 px ; font-weight : 700 ; letter-spacing : 0.1 em ;
2026-07-12 12:41:35 +00:00
text-transform : uppercase ; color : var ( - - blue ) ; margin-bottom : 16 px ;
2026-07-07 07:11:50 +00:00
}
. section-title {
font-size : clamp ( 28 px , 4 vw , 44 px ) ;
font-weight : 800 ; letter-spacing : -1.2 px ; line-height : 1.1 ;
2026-07-12 12:41:35 +00:00
color : #1d1d1f ; margin-bottom : 16 px ;
2026-07-07 07:11:50 +00:00
}
. section-sub {
font-size : 17 px ; color : var ( - - text - dim ) ;
max-width : 600 px ; line-height : 1.7 ;
}
/* OVERVIEW STATS */
. stats-row {
2026-07-12 12:41:35 +00:00
display : grid ; grid-template-columns : repeat ( 3 , 1 fr ) ; gap : 20 px ;
2026-07-07 07:11:50 +00:00
margin-top : 40 px ;
}
. stat-card {
background : var ( - - surface -2 ) ; border : 1 px solid var ( - - border ) ;
2026-07-12 12:41:35 +00:00
border-radius : var ( - - radius - lg ) ; padding : 28 px 24 px ;
2026-07-07 07:11:50 +00:00
transition : border-color 0.25 s ;
}
. stat-card : hover { border-color : rgba ( 0 , 102 , 255 , 0.3 ) ; }
. stat-icon {
width : 36 px ; height : 36 px ; margin-bottom : 14 px ;
color : var ( - - blue ) ;
}
. stat-value {
font-size : 32 px ; font-weight : 800 ; color : #1d1d1f ; letter-spacing : -1 px ;
margin-bottom : 4 px ;
}
. stat-label { font-size : 14 px ; color : var ( - - text - dim ) ; line-height : 1.5 ; }
/* DISTRICTS */
. districts-bg { background : var ( - - surface ) ; }
. districts-grid {
2026-07-12 12:41:35 +00:00
display : grid ; grid-template-columns : repeat ( 4 , 1 fr ) ; gap : 12 px ;
2026-07-07 07:11:50 +00:00
margin-top : 40 px ;
}
. district-chip {
background : var ( - - bg - dark ) ; border : 1 px solid var ( - - border ) ;
2026-07-12 12:41:35 +00:00
border-radius : var ( - - radius - md ) ; padding : 16 px 20 px ;
display : flex ; align-items : center ; gap : 10 px ;
2026-07-07 07:11:50 +00:00
}
. district-chip . chip-dot {
2026-07-12 12:41:35 +00:00
width : 8 px ; height : 8 px ; border-radius : var ( - - radius - full ) ;
2026-07-07 07:11:50 +00:00
background : var ( - - blue ) ; flex-shrink : 0 ;
}
. district-chip span { font-size : 14 px ; font-weight : 600 ; color : var ( - - text - light ) ; }
/* INTELLIGENCE PRODUCTS */
. intel-grid {
2026-07-12 12:41:35 +00:00
display : grid ; grid-template-columns : repeat ( 2 , 1 fr ) ; gap : 20 px ;
2026-07-07 07:11:50 +00:00
margin-top : 40 px ;
}
. intel-card {
background : var ( - - surface -2 ) ; border : 1 px solid var ( - - border ) ;
2026-07-12 12:41:35 +00:00
border-radius : var ( - - radius - lg ) ; padding : 32 px 28 px ;
2026-07-07 07:11:50 +00:00
transition : border-color 0.25 s , transform 0.2 s ;
}
. intel-card : hover { border-color : rgba ( 0 , 102 , 255 , 0.35 ) ; transform : translateY ( -3 px ) ; }
. intel-icon {
2026-07-12 12:41:35 +00:00
width : 32 px ; height : 32 px ; margin-bottom : 16 px ;
2026-07-07 07:11:50 +00:00
color : var ( - - blue ) ;
}
. intel-card h3 { font-size : 17 px ; font-weight : 700 ; color : #1d1d1f ; margin-bottom : 8 px ; }
. intel-card p { font-size : 14 px ; color : var ( - - text - dim ) ; line-height : 1.6 ; }
/* SCORES TABLE */
. scores-table-wrap { margin-top : 40 px ; overflow-x : auto ; }
. scores-table {
width : 100 % ; border-collapse : collapse ;
font-size : 14 px ;
}
. scores-table th {
2026-07-12 12:41:35 +00:00
text-align : left ; padding : 12 px 20 px ;
2026-07-07 07:11:50 +00:00
font-size : 11 px ; font-weight : 700 ; letter-spacing : 0.08 em ;
text-transform : uppercase ; color : var ( - - text - muted ) ;
border-bottom : 1 px solid var ( - - border ) ;
}
. scores-table th : not ( : first-child ) { text-align : center ; }
. scores-table td {
2026-07-12 12:41:35 +00:00
padding : 16 px 20 px ;
2026-07-07 07:11:50 +00:00
border-bottom : 1 px solid rgba ( 0 , 0 , 0 , 0.04 ) ;
color : var ( - - text - light ) ;
}
. scores-table td : not ( : first-child ) { text-align : center ; }
. scores-table tr : hover td { background : rgba ( 0 , 0 , 0 , 0.02 ) ; }
. score-pill {
display : inline-block ;
font-size : 14 px ; font-weight : 700 ;
2026-07-12 12:41:35 +00:00
padding : 4 px 12 px ; border-radius : 100 px ;
2026-07-07 07:11:50 +00:00
background : rgba ( 0 , 102 , 255 , 0.12 ) ;
color : #5599ff ;
}
. score-pill . high { background : rgba ( 0 , 200 , 80 , 0.1 ) ; color : #4ade80 ; }
. score-pill . mid { background : rgba ( 0 , 102 , 255 , 0.12 ) ; color : #60a5fa ; }
. score-pill . low { background : rgba ( 255 , 180 , 0 , 0.1 ) ; color : #fbbf24 ; }
. district-name { font-weight : 600 ; color : #1d1d1f ; }
. table-note {
margin-top : 12 px ; font-size : 12 px ; color : var ( - - text - muted ) ;
}
/* CONTRADICTION ENGINE */
. contradiction-bg { background : #e8f0fe ; }
. contradiction-box {
background : rgba ( 0 , 0 , 0 , .05 ) ;
border : 1 px solid rgba ( 0 , 0 , 0 , .1 ) ;
2026-07-12 12:41:35 +00:00
border-radius : var ( - - radius - lg ) ; padding : 36 px 40 px ; margin-bottom : 32 px ;
2026-07-07 07:11:50 +00:00
}
. conflict-header {
display : flex ; align-items : flex-start ; gap : 16 px ; margin-bottom : 24 px ;
}
. conflict-flag-svg { flex-shrink : 0 ; margin-top : 2 px ; }
. conflict-title { color : #f87171 ; font-weight : 800 ; font-size : .9375 rem ; margin-bottom : 4 px ; }
. conflict-desc { color : rgba ( 0 , 0 , 0 , .6 ) ; font-size : .875 rem ; line-height : 1.6 ; }
. conflict-grid { display : grid ; grid-template-columns : 1 fr 1 fr ; gap : 16 px ; }
2026-07-12 12:41:35 +00:00
. conflict-side { border-radius : var ( - - radius - md ) ; padding : 16 px ; }
2026-07-07 07:11:50 +00:00
. conflict-official { background : rgba ( 34 , 197 , 94 , .1 ) ; border : 1 px solid rgba ( 34 , 197 , 94 , .2 ) ; }
. conflict-observed { background : rgba ( 239 , 68 , 68 , .1 ) ; border : 1 px solid rgba ( 239 , 68 , 68 , .2 ) ; }
. conflict-side-label {
font-size : .75 rem ; font-weight : 700 ; text-transform : uppercase ;
letter-spacing : .08 em ; margin-bottom : 10 px ;
}
. conflict-official . conflict-side-label { color : #86efac ; }
. conflict-observed . conflict-side-label { color : #fca5a5 ; }
2026-07-12 12:41:35 +00:00
. conflict-side ul { list-style : none ; padding : 0 ; margin : 0 ; display : flex ; flex-direction : column ; gap : 6 px ; }
2026-07-07 07:11:50 +00:00
. conflict-side li { color : rgba ( 0 , 0 , 0 , .7 ) ; font-size : .875 rem ; }
. conflict-footer {
margin-top : 20 px ; padding-top : 20 px ;
border-top : 1 px solid rgba ( 0 , 0 , 0 , .1 ) ;
display : flex ; justify-content : space-between ; align-items : center ;
}
. conflict-footer-label { color : rgba ( 0 , 0 , 0 , .75 ) ; font-size : .8125 rem ; }
. conflict-confidence { color : #f87171 ; font-weight : 800 ; font-size : 1.125 rem ; }
2026-07-12 12:41:35 +00:00
. ce-features { display : grid ; grid-template-columns : repeat ( 3 , 1 fr ) ; gap : 20 px ; }
2026-07-07 07:11:50 +00:00
. ce-feature { text-align : center ; padding : 20 px ; }
. ce-feature-icon {
width : 28 px ; height : 28 px ; margin : 0 auto 10 px ;
color : rgba ( 0 , 0 , 0 , 0.75 ) ;
}
. ce-feature h4 { color : #1d1d1f ; font-weight : 700 ; margin-bottom : 6 px ; }
. ce-feature p { color : rgba ( 0 , 0 , 0 , .75 ) ; font-size : .8125 rem ; }
/* CTA BANNER */
. cta-banner {
2026-07-12 12:41:35 +00:00
background : #e8f0fe ; border-radius : var ( - - radius - lg ) ; padding : 40 px 48 px ;
display : flex ; align-items : center ; gap : 48 px ; flex-wrap : wrap ;
2026-07-07 07:11:50 +00:00
margin-top : 48 px ;
}
. cta-banner h3 { color : #1d1d1f ; font-size : 1.25 rem ; font-weight : 800 ; margin-bottom : 8 px ; }
. cta-banner p { color : rgba ( 0 , 0 , 0 , .7 ) ; line-height : 1.65 ; font-size : .9375 rem ; }
. cta-banner-text { flex : 1 ; min-width : 260 px ; }
/* CONTACT */
. contact-wrapper { max-width : 680 px ; margin : 0 auto ; text-align : center ; }
. contact-wrapper . section-title { margin-bottom : 10 px ; }
. contact-wrapper . section-sub { margin : 0 auto 48 px ; }
. contact-form {
background : var ( - - surface ) ; border : 1 px solid var ( - - border ) ;
border-radius : var ( - - radius - lg ) ; padding : 40 px ; text-align : left ;
}
2026-07-12 12:41:35 +00:00
. form-group { display : flex ; flex-direction : column ; gap : 8 px ; margin-bottom : 16 px ; }
2026-07-07 07:11:50 +00:00
. form-group label { font-size : 13 px ; font-weight : 600 ; color : var ( - - text - dim ) ; }
. form-group input , . form-group textarea {
background : var ( - - bg - dark ) ; border : 1.5 px solid var ( - - border ) ;
border-radius : var ( - - radius - md ) ; color : #1d1d1f ;
2026-07-12 12:41:35 +00:00
font-size : 15 px ; font-family : inherit ; padding : 12 px 16 px ;
2026-07-07 07:11:50 +00:00
outline : none ; transition : border-color 0.2 s ; width : 100 % ;
}
. form-group input : focus , . form-group textarea : focus { border-color : var ( - - blue ) ; }
. form-group input :: placeholder , . form-group textarea :: placeholder { color : var ( - - text - muted ) ; }
. form-group textarea { min-height : 120 px ; resize : vertical ; }
. form-note { font-size : 12 px ; color : var ( - - text - muted ) ; margin-top : 12 px ; text-align : center ; }
# form-message {
2026-07-12 12:41:35 +00:00
display : none ; padding : 14 px 20 px ; border-radius : var ( - - radius - md ) ;
2026-07-07 07:11:50 +00:00
font-size : 14 px ; font-weight : 600 ; text-align : center ; margin-top : 16 px ;
}
# form-message . success { background : rgba ( 0 , 200 , 80 , 0.1 ) ; border : 1 px solid rgba ( 0 , 200 , 80 , 0.25 ) ; color : #4ade80 ; }
# form-message . error { background : rgba ( 255 , 60 , 60 , 0.1 ) ; border : 1 px solid rgba ( 255 , 60 , 60 , 0.25 ) ; color : #f87171 ; }
/* FOOTER */
footer { border-top : 1 px solid var ( - - border ) ; padding : 40 px ; }
. footer-inner {
max-width : 1140 px ; margin : 0 auto ;
display : flex ; align-items : center ; justify-content : space-between ;
2026-07-12 12:41:35 +00:00
flex-wrap : wrap ; gap : 20 px ;
2026-07-07 07:11:50 +00:00
}
. footer-logo { font-size : 17 px ; font-weight : 700 ; color : #1d1d1f ; }
. footer-copy { font-size : 13 px ; color : var ( - - text - muted ) ; }
. footer-tagline { font-size : 12 px ; color : var ( - - text - muted ) ; margin-top : 4 px ; }
2026-07-12 12:41:35 +00:00
. footer-links { display : flex ; gap : 24 px ; align-items : center ; flex-wrap : wrap ; }
2026-07-07 07:11:50 +00:00
. footer-links a { font-size : 14 px ; color : var ( - - text - muted ) ; transition : color 0.2 s ; }
. footer-links a : hover { color : #1d1d1f ; }
. footer-social {
2026-07-12 12:41:35 +00:00
width : 32 px ; height : 32 px ; border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius - md ) ;
2026-07-07 07:11:50 +00:00
display : flex ; align-items : center ; justify-content : center ;
transition : border-color 0.2 s , background 0.2 s ;
}
. footer-social : hover { border-color : rgba ( 0 , 0 , 0 , 0.25 ) ; background : rgba ( 0 , 0 , 0 , 0.04 ) ; }
@ media ( max-width : 900px ) {
nav { padding : 0 20 px ; }
. stats-row { grid-template-columns : 1 fr 1 fr ; }
. districts-grid { grid-template-columns : repeat ( 2 , 1 fr ) ; }
. intel-grid { grid-template-columns : 1 fr ; }
. conflict-grid { grid-template-columns : 1 fr ; }
. ce-features { grid-template-columns : 1 fr ; }
}
@ media ( max-width : 600px ) {
section { padding : 48 px 0 !important ; }
. stats-row { grid-template-columns : 1 fr 1 fr !important ; }
. districts-grid { grid-template-columns : 1 fr 1 fr !important ; }
. intel-grid { grid-template-columns : 1 fr !important ; }
. conflict-grid { grid-template-columns : 1 fr !important ; }
. ce-features { grid-template-columns : 1 fr !important ; }
. scores-grid { grid-template-columns : 1 fr 1 fr !important ; }
2026-07-12 12:41:35 +00:00
. cta-banner { flex-direction : column !important ; gap : 16 px !important ; padding : 28 px 24 px ; }
2026-07-07 07:11:50 +00:00
. cta-banner-text { min-width : 0 !important ; }
. container { padding : 0 16 px !important ; box-sizing : border-box ; }
2026-07-12 12:41:35 +00:00
. contact-form { padding : 24 px 20 px ; }
2026-07-07 07:11:50 +00:00
nav { padding : 0 16 px ; }
. hero h1 { letter-spacing : -1 px ; }
}
@ media ( max-width : 400px ) {
. stats-row { grid-template-columns : 1 fr !important ; }
. districts-grid { grid-template-columns : 1 fr !important ; }
. scores-grid { grid-template-columns : 1 fr !important ; }
}
2026-07-12 12:41:35 +00:00
. lv-disclaimer { font-size : .75 rem ; color : rgba ( 0 , 0 , 0 , .75 ) ; margin-top : 24 px ; padding : 12 px 16 px ; background : rgba ( 0 , 0 , 0 , .04 ) ; border-radius : var ( - - radius - md ) ; line-height : 1.6 ; max-width : 800 px }
2026-07-07 07:11:50 +00:00
. lv-disclaimer a { color : rgba ( 0 , 0 , 0 , .65 ) ; text-decoration : underline }
. lv-disclaimer--light { color : #888 ; background : #f5f5f5 }
. lv-disclaimer--light a { color : #555 }
< / style >
< script type = "application/ld+json" >
{
"@context" : "https://schema.org" ,
"@type" : "BreadcrumbList" ,
"itemListElement" : [
{
"@type" : "ListItem" ,
"position" : 1 ,
"name" : "Landvex" ,
2026-07-12 12:41:35 +00:00
"item" : "https://www.landvex.com/"
2026-07-07 07:11:50 +00:00
} ,
{
"@type" : "ListItem" ,
"position" : 2 ,
"name" : "Cities" ,
2026-07-12 12:41:35 +00:00
"item" : "https://www.landvex.com/cities/"
2026-07-07 07:11:50 +00:00
} ,
{
"@type" : "ListItem" ,
"position" : 3 ,
"name" : "Stockholm" ,
2026-07-12 12:41:35 +00:00
"item" : "https://www.landvex.com/cities/stockholm/"
2026-07-07 07:11:50 +00:00
}
]
}
< / script >
2026-07-12 12:41:35 +00:00
< link rel = "alternate" hreflang = "x-default" href = "https://www.landvex.com/" >
< link rel = "alternate" hreflang = "en" href = "https://www.landvex.com/" >
2026-07-07 07:11:50 +00:00
< link rel = "alternate" hreflang = "sv" href = "https://landvex.se/" >
< link rel = "alternate" hreflang = "de" href = "https://landvex.de/" >
< link rel = "alternate" hreflang = "fr" href = "https://landvex.fr/" >
< link rel = "alternate" hreflang = "en-GB" href = "https://landvex.co.uk/" >
< link rel = "alternate" hreflang = "it" href = "https://landvex.it/" >
< style >
@ media ( max-width : 640px ) {
. hero h1 { font-size : 2 rem !important ; }
. hero p { font-size : 1 rem !important ; }
. card { padding : 1.5 rem !important ; }
. grid { grid-template-columns : 1 fr !important ; }
. btn { padding : 0.75 rem 1.5 rem !important ; font-size : 1 rem !important ; }
}
< / style >
< / head >
< body >
2026-07-12 12:41:35 +00:00
< nav >
2026-07-07 07:11:50 +00:00
< a class = "nav-logo" href = "https://landvex.com/" > ← Back to Landvex< / a >
2026-07-12 12:41:35 +00:00
< a class = "btn btn-outline" href = "#contact" > Get in touch → < / a >
2026-07-07 07:11:50 +00:00
< / nav >
<!-- HERO -->
2026-07-12 12:41:35 +00:00
< section class = "hero" >
< div class = "hero-eyebrow" > City Intelligence — Stockholm< / div >
2026-07-07 07:11:50 +00:00
< h1 > Stockholm — City Intelligence Report< / h1 >
2026-07-12 12:41:35 +00:00
< p class = "hero-sub" > Continuous monitoring of commercial activity, infrastructure conditions and urban development across Stockholm’ s districts. Updated from field observations.< / p >
2026-07-07 07:11:50 +00:00
< div class = "hero-ctas" >
2026-07-12 12:41:35 +00:00
< a class = "btn btn-lg" href = "#contact" > Request Stockholm briefing → < / a >
2026-07-07 07:11:50 +00:00
< a class = "btn btn-outline btn-lg" href = "#overview" > City overview< / a >
< / div >
< / section >
<!-- OVERVIEW -->
2026-07-12 12:41:35 +00:00
< section id = "overview" style = "background:var(--surface)" >
< div class = "container" >
2026-07-07 07:11:50 +00:00
< div class = "section-label" > City overview< / div >
< h2 class = "section-title" > Stockholm at a glance< / h2 >
< p class = "section-sub" > Key statistics informing Landvex intelligence collection and scoring across Stockholm’ s urban area.< / p >
< div class = "stats-row" >
2026-07-12 12:41:35 +00:00
< div class = "stat-card" style = "cursor:pointer;" onclick = "location.href='#contact'" role = "button" tabindex = "0" >
2026-07-07 07:11:50 +00:00
< svg class = "stat-icon" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.8" stroke-linecap = "round" stroke-linejoin = "round" >
< path d = "M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" / >
< circle cx = "9" cy = "7" r = "4" / >
< path d = "M23 21v-2a4 4 0 0 0-3-3.87" / >
< path d = "M16 3.13a4 4 0 0 1 0 7.75" / >
< / svg >
< div class = "stat-value" > 975,000< / div >
< div class = "stat-label" > City population — Sweden’ s largest urban centre< / div >
< / div >
2026-07-12 12:41:35 +00:00
< div class = "stat-card" style = "cursor:pointer;" onclick = "location.href='#contact'" role = "button" tabindex = "0" >
2026-07-07 07:11:50 +00:00
< svg class = "stat-icon" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.8" stroke-linecap = "round" stroke-linejoin = "round" >
< line x1 = "12" y1 = "1" x2 = "12" y2 = "23" / >
< path d = "M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6" / >
< / svg >
< div class = "stat-value" > Top 5 Nordic< / div >
< div class = "stat-label" > GDP rank among Nordic cities< / div >
< / div >
2026-07-12 12:41:35 +00:00
< div class = "stat-card" style = "cursor:pointer;" onclick = "location.href='#contact'" role = "button" tabindex = "0" >
2026-07-07 07:11:50 +00:00
< svg class = "stat-icon" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.8" stroke-linecap = "round" stroke-linejoin = "round" >
< rect x = "2" y = "3" width = "20" height = "14" rx = "2" ry = "2" / >
< line x1 = "8" y1 = "21" x2 = "16" y2 = "21" / >
< line x1 = "12" y1 = "17" x2 = "12" y2 = "21" / >
< / svg >
< div class = "stat-value" > Tech · Finance< / div >
< div class = "stat-label" > Key sectors: technology, finance, public sector< / div >
< / div >
< / div >
< / div >
< / section >
<!-- DISTRICTS -->
2026-07-12 12:41:35 +00:00
< section id = "districts" class = "districts-bg" style = "background: var(--bg-dark)" >
< div class = "container" >
2026-07-07 07:11:50 +00:00
< div class = "section-label" > Coverage< / div >
< h2 class = "section-title" > Districts covered< / h2 >
< p class = "section-sub" > Landvex field intelligence spans all major commercial and residential districts across Stockholm.< / p >
< div class = "districts-grid" >
< div class = "district-chip" > < span class = "chip-dot" > < / span > < span > Norrmalm (CBD)< / span > < / div >
< div class = "district-chip" > < span class = "chip-dot" > < / span > < span > Sö dermalm< / span > < / div >
< div class = "district-chip" > < span class = "chip-dot" > < / span > < span > Ö stermalm< / span > < / div >
< div class = "district-chip" > < span class = "chip-dot" > < / span > < span > Kungsholmen< / span > < / div >
< div class = "district-chip" > < span class = "chip-dot" > < / span > < span > Vasastan< / span > < / div >
< div class = "district-chip" > < span class = "chip-dot" > < / span > < span > Järva< / span > < / div >
< div class = "district-chip" > < span class = "chip-dot" > < / span > < span > Farsta< / span > < / div >
< div class = "district-chip" > < span class = "chip-dot" > < / span > < span > Nacka< / span > < / div >
< / div >
< / div >
< / section >
<!-- ACTIVE INTELLIGENCE -->
2026-07-12 12:41:35 +00:00
< section id = "intelligence" style = "background:var(--surface)" >
< div class = "container" >
2026-07-07 07:11:50 +00:00
< div class = "section-label" > Active intelligence< / div >
< h2 class = "section-title" > What Landvex monitors in Stockholm< / h2 >
< p class = "section-sub" > Four continuous intelligence streams, updated from field observations and cross-referenced against official sources.< / p >
< div class = "intel-grid" >
2026-07-12 12:41:35 +00:00
< div class = "intel-card" style = "cursor:pointer;" onclick = "location.href='#contact'" role = "button" tabindex = "0" >
2026-07-07 07:11:50 +00:00
< svg class = "intel-icon" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.8" stroke-linecap = "round" stroke-linejoin = "round" >
< path d = "M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" / >
< polyline points = "9 22 9 12 15 12 15 22" / >
< / svg >
< h3 > Commercial Vitality Score< / h3 >
< p > Measures vacancy rates, business openings and closures, foot traffic signals, and commercial activity across each district. Launching August 2026.< / p >
< / div >
2026-07-12 12:41:35 +00:00
< div class = "intel-card" style = "cursor:pointer;" onclick = "location.href='#contact'" role = "button" tabindex = "0" >
2026-07-07 07:11:50 +00:00
< svg class = "intel-icon" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.8" stroke-linecap = "round" stroke-linejoin = "round" >
< polygon points = "7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2" / >
< line x1 = "12" y1 = "8" x2 = "12" y2 = "12" / >
< line x1 = "12" y1 = "16" x2 = "12.01" y2 = "16" / >
< / svg >
< h3 > Infrastructure Risk Index< / h3 >
< p > Identifies infrastructure degradation, transport disruptions, and maintenance backlogs that affect business continuity and investment risk across Stockholm’ s districts.< / p >
< / div >
2026-07-12 12:41:35 +00:00
< div class = "intel-card" style = "cursor:pointer;" onclick = "location.href='#contact'" role = "button" tabindex = "0" >
2026-07-07 07:11:50 +00:00
< svg class = "intel-icon" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.8" stroke-linecap = "round" stroke-linejoin = "round" >
< polyline points = "22 12 18 12 15 21 9 3 6 12 2 12" / >
< / svg >
< h3 > Development Forecast< / h3 >
< p > Tracks planning applications, construction activity, and development signals. Identifies emerging opportunities and area trajectories before they appear in official statistics.< / p >
< / div >
2026-07-12 12:41:35 +00:00
< div class = "intel-card" style = "cursor:pointer;" onclick = "location.href='#contact'" role = "button" tabindex = "0" >
2026-07-07 07:11:50 +00:00
< svg class = "intel-icon" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.8" stroke-linecap = "round" stroke-linejoin = "round" >
< line x1 = "18" y1 = "20" x2 = "18" y2 = "10" / >
< line x1 = "12" y1 = "20" x2 = "12" y2 = "4" / >
< line x1 = "6" y1 = "20" x2 = "6" y2 = "14" / >
< / svg >
< h3 > Growth Velocity< / h3 >
< p > How fast is each district changing? Landvex Growth Velocity captures the rate of transformation — identifying which areas are accelerating, plateauing, or in decline.< / p >
< / div >
< / div >
< / div >
< / section >
<!-- SCORES TABLE -->
2026-07-12 12:41:35 +00:00
< section id = "scores" style = "background: var(--bg-dark)" >
< div class = "container" >
2026-07-07 07:11:50 +00:00
< div class = "section-label" > District scores< / div >
< h2 class = "section-title" > Sample intelligence scores< / h2 >
2026-07-12 12:41:35 +00:00
< p class = "section-sub" style = "background:#fff3cd;border:2px solid #ffc107;border-radius: var(--radius-md);padding:12px 16px;color:#856404;font-weight:600;" > < svg width = "20" height = "20" viewBox = "0 0 20 20" fill = "none" > < path d = "M10 3L17 17H3L10 3Z" stroke = "#f59e0b" stroke-width = "2" / > < path d = "M10 8V12M10 14V14.5" stroke = "#f59e0b" stroke-width = "2" stroke-linecap = "round" / > < / svg > ILLUSTRATIVE SAMPLE DATA — These scores are synthetic examples for demonstration purposes only. They do not represent actual measured values.< / p >
2026-07-07 07:11:50 +00:00
< div class = "scores-table-wrap" >
< table class = "scores-table" >
< thead >
< tr >
< th > District< / th >
< th > Opportunity< / th >
< th > Growth< / th >
< th > Infra Stability< / th >
< th > Vitality< / th >
< / tr >
< / thead >
< tbody >
< tr >
< td class = "district-name" > Norrmalm< / td >
< td > < span class = "score-pill mid" > 74< / span > < / td >
< td > < span class = "score-pill low" > 58< / span > < / td >
< td > < span class = "score-pill high" > 88< / span > < / td >
< td > < span class = "score-pill high" > 82< / span > < / td >
< / tr >
< tr >
< td class = "district-name" > Sö dermalm< / td >
< td > < span class = "score-pill mid" > 71< / span > < / td >
< td > < span class = "score-pill mid" > 67< / span > < / td >
< td > < span class = "score-pill mid" > 79< / span > < / td >
< td > < span class = "score-pill high" > 86< / span > < / td >
< / tr >
< tr >
< td class = "district-name" > Järva< / td >
< td > < span class = "score-pill mid" > 63< / span > < / td >
< td > < span class = "score-pill mid" > 74< / span > < / td >
< td > < span class = "score-pill mid" > 71< / span > < / td >
< td > < span class = "score-pill mid" > 61< / span > < / td >
< / tr >
< tr >
< td class = "district-name" > Nacka< / td >
< td > < span class = "score-pill mid" > 78< / span > < / td >
< td > < span class = "score-pill high" > 81< / span > < / td >
< td > < span class = "score-pill high" > 84< / span > < / td >
< td > < span class = "score-pill mid" > 73< / span > < / td >
< / tr >
< / tbody >
< / table >
< p class = "table-note" > Scores are illustrative placeholders. Live data from field observations available Aug 2026.< / p >
< / div >
< / div >
< / section >
<!-- CONTRADICTION ENGINE -->
< section class = "contradiction-bg" id = "contradiction" >
2026-07-12 12:41:35 +00:00
< div class = "container" style = "max-width:900px" >
< div style = "text-align:center;margin-bottom:56px" >
< div class = "section-label" style = "color:rgba(0,0,0,.75)" > Contradiction Engine< / div >
< h2 class = "section-title" style = "color: #1d1d1f" > Most systems tell you what the data says.< br > Landvex tells you what doesn’ t add up.< / h2 >
< p class = "section-sub" style = "color:rgba(0,0,0,.75);margin:0 auto;max-width:600px" > When official municipal development plans diverge from observed commercial activity, Landvex surfaces the conflict — not just the consensus.< / p >
2026-07-07 07:11:50 +00:00
< / div >
2026-07-12 12:41:35 +00:00
< div style = "background:#fff3cd;border:1px solid #ffc107;border-radius: var(--radius-md);padding:12px 16px;margin-bottom:20px;font-size:13px;font-weight:600;color:#856404;text-align:center" >
ILLUSTRATIVE SAMPLE — not real intelligence
2026-07-07 07:11:50 +00:00
< / div >
< div class = "contradiction-box" >
< div class = "conflict-header" >
< svg class = "conflict-flag-svg" width = "28" height = "28" viewBox = "0 0 24 24" fill = "none" stroke = "#f87171" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >
< path d = "M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z" / >
< line x1 = "4" y1 = "22" x2 = "4" y2 = "15" / >
< / svg >
< div >
< div class = "conflict-title" > Narrative Conflict Detected — Stockholm — Järva / Norrmalm< / div >
< div class = "conflict-desc" > Official municipal development plans vs observed commercial activity. Field data reveals divergence between planned urban investment zones and measured commercial vitality on the ground.< / div >
< / div >
< / div >
< div class = "conflict-grid" >
< div class = "conflict-side conflict-official" >
< div class = "conflict-side-label" > Official narrative< / div >
< ul >
2026-07-12 12:41:35 +00:00
< li > & #100003 Municipal investment zone: Järva priority growth< / li >
< li > & #100003 Norrmalm: stable CBD with anchor tenants< / li >
< li > & #100003 Development permits: 14 approved 2024– 2025< / li >
2026-07-07 07:11:50 +00:00
< / ul >
< / div >
< div class = "conflict-side conflict-observed" >
< div class = "conflict-side-label" > Observed reality< / div >
< ul >
2026-07-12 12:41:35 +00:00
< li > & #100007 Järva commercial vacancy above city average< / li >
< li > & #100007 Norrmalm: 3 anchor retailers downsizing footprint< / li >
< li > & #100007 Development activity below permit volume< / li >
< li > & #100007 Nacka outperforming planned growth projections< / li >
2026-07-07 07:11:50 +00:00
< / ul >
< / div >
< / div >
< div class = "conflict-footer" >
< span class = "conflict-footer-label" > Confidence in official narrative< / span >
< span class = "conflict-confidence" > 51%< / span >
< / div >
< / div >
< div class = "ce-features" >
< div class = "ce-feature" >
< svg class = "ce-feature-icon" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.8" stroke-linecap = "round" stroke-linejoin = "round" >
< circle cx = "11" cy = "11" r = "8" / >
< line x1 = "21" y1 = "21" x2 = "16.65" y2 = "16.65" / >
< / svg >
< h4 > Show me what I’ m missing< / h4 >
< p > Blind spots not visible in official data or internal reports< / p >
< / div >
< div class = "ce-feature" >
< svg class = "ce-feature-icon" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.8" stroke-linecap = "round" stroke-linejoin = "round" >
< path d = "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" / >
< / svg >
< h4 > AI Red Team< / h4 >
< p > Every conclusion is actively challenged by a second model before delivery< / p >
< / div >
< div class = "ce-feature" >
< svg class = "ce-feature-icon" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.8" stroke-linecap = "round" stroke-linejoin = "round" >
< circle cx = "12" cy = "12" r = "10" / >
< line x1 = "12" y1 = "8" x2 = "12" y2 = "12" / >
< line x1 = "12" y1 = "16" x2 = "12.01" y2 = "16" / >
< / svg >
< h4 > Which assumptions are wrong?< / h4 >
< p > Identify where your thesis conflicts with observed reality< / p >
< / div >
< / div >
< / div >
< / section >
<!-- CTA -->
2026-07-12 12:41:35 +00:00
< section id = "briefing" style = "background:var(--surface)" >
< div class = "container" >
2026-07-07 07:11:50 +00:00
< div class = "cta-banner" >
< div class = "cta-banner-text" >
< h3 > Request Stockholm intelligence briefing< / h3 >
< p > Get field-verified district scores, contradiction analysis, and custom intelligence for your Stockholm decision. Delivered in 24– 72 hours.< / p >
< / div >
2026-07-12 12:41:35 +00:00
< a class = "btn btn-lg" href = "#contact" style = "white-space:nowrap;flex-shrink:0" > Request briefing → < / a >
2026-07-07 07:11:50 +00:00
< / div >
< / div >
< / section >
<!-- CONTACT -->
< section id = "contact" >
2026-07-12 12:41:35 +00:00
< div class = "container" >
2026-07-07 07:11:50 +00:00
< div class = "contact-wrapper" >
< div class = "section-label" > Request a briefing< / div >
< h2 class = "section-title" > What decision are you trying to make?< / h2 >
< p class = "section-sub" > Tell us the question you need answered about Stockholm. We’ ll show you how Landvex can support it.< / p >
< form class = "contact-form" id = "contact-form" >
< div class = "form-group" >
< label for = "name" > Name< / label >
< input type = "text" id = "name" name = "name" placeholder = "Your name" required >
< / div >
< div class = "form-group" >
< label for = "email" > Email< / label >
< input type = "email" id = "email" name = "email" placeholder = "you@organisation.com" required >
< / div >
< div class = "form-group" >
< label for = "message" > Message< / label >
< textarea id = "message" name = "message" placeholder = "Describe the decision you need to make about Stockholm — what you need to know, which districts, and why it matters..." > < / textarea >
< / div >
2026-07-12 12:41:35 +00:00
< button type = "submit" class = "btn btn-lg" style = "width:100%; justify-content: center;" >
2026-07-07 07:11:50 +00:00
Request Stockholm briefing →
< / button >
< p class = "form-note" > We don’ t spam. Your information stays private.< / p >
< div id = "form-message" > < / div >
< / form >
< / div >
< / div >
< p class = "lv-disclaimer" > Intelligence outputs are indicative and advisory only. Based on field observations — not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. < a href = "/methodology/" > Methodology →< / a > < / p >
< / section >
2026-07-12 12:41:35 +00:00
< footer >
2026-07-07 07:11:50 +00:00
< div class = "footer-inner" >
< div >
< div class = "footer-logo" > LandveX< / div >
< div class = "footer-copy" > © 2026 Landvex AB · Org.nr 559141-7042< / div >
< div class = "footer-tagline" > Decision intelligence for the physical world.< / div >
< / div >
< div class = "footer-links" >
< a href = "https://landvex.com/" > Home< / a >
< a href = "/verticals/" > Verticals< / a >
< a href = "/methodology/" > Methodology< / a >
< a href = "/security/" > Security< / a >
< a href = "https://www.quixzoom.com/" target = "_blank" rel = "noopener" > quiXzoom → < / a >
< a href = "mailto:contact@landvex.com" > contact@landvex.com< / a >
2026-07-12 12:41:35 +00:00
< a href = "mailto:security@landvex.com" style = "color:var(--text-muted,#888)" > security@landvex.com< / a >
2026-07-07 07:11:50 +00:00
< a href = "https://www.linkedin.com/company/landvex" target = "_blank" rel = "noopener" class = "footer-social" title = "LandveX on LinkedIn" >
< svg width = "16" height = "16" viewBox = "0 0 24 24" fill = "none" xmlns = "http://www.w3.org/2000/svg" >
< path d = "M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z" stroke = "#888" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" / >
< rect x = "2" y = "9" width = "4" height = "12" stroke = "#888" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" / >
< circle cx = "4" cy = "4" r = "2" stroke = "#888" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" / >
< / svg >
< / a >
< a href = "https://x.com/landvex" target = "_blank" rel = "noopener" class = "footer-social" title = "LandveX on X" >
< svg width = "15" height = "15" viewBox = "0 0 24 24" fill = "#888" xmlns = "http://www.w3.org/2000/svg" >
< path d = "M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.746l7.73-8.835L1.254 2.25H8.08l4.253 5.622 5.912-5.622Zm-1.161 17.52h1.833L7.084 4.126H5.117z" / >
< / svg >
< / a >
< / div >
< / div >
< / footer >
< script >
document . getElementById ( 'contact-form' ) . addEventListener ( 'submit' , async function ( e ) {
e . preventDefault ( ) ;
const btn = this . querySelector ( 'button[type="submit"]' ) ;
const msgEl = document . getElementById ( 'form-message' ) ;
btn . disabled = true ; btn . textContent = 'Sending...' ;
const data = {
source : 'landvex-city-stockholm' ,
name : this . name . value ,
email : this . email . value ,
message : this . message . value
} ;
try {
const res = await fetch ( 'https://api.quixzoom.com/api/qz/waitlist' , {
method : 'POST' ,
headers : { 'Content-Type' : 'application/json' } ,
body : JSON . stringify ( data )
} ) ;
if ( res . ok || res . status === 201 ) {
msgEl . className = 'success' ;
msgEl . textContent = "\u2713 Request received. We\u2019ll be in touch within one business day." ;
msgEl . style . display = 'block' ;
this . reset ( ) ;
} else { throw new Error ( 'Server error ' + res . status ) ; }
} catch ( err ) {
msgEl . className = 'error' ;
msgEl . textContent = 'Something went wrong. Please email us directly at contact@landvex.com.' ;
msgEl . style . display = 'block' ;
}
btn . disabled = false ; btn . textContent = 'Request Stockholm briefing \u2192' ;
} ) ;
document . querySelectorAll ( 'a[href^="#"]' ) . forEach ( a => {
a . addEventListener ( 'click' , e => {
const target = document . querySelector ( a . getAttribute ( 'href' ) ) ;
if ( target ) { e . preventDefault ( ) ; target . scrollIntoView ( { behavior : 'smooth' , block : 'start' } ) ; }
} ) ;
} ) ;
< / script >
< / body >
< / html >