-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
333 lines (313 loc) · 33 KB
/
Copy pathindex.html
File metadata and controls
333 lines (313 loc) · 33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#1c1c1a" media="(prefers-color-scheme: dark)">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="apple-mobile-web-app-title" content="HDB Resale">
<meta name="mobile-web-app-capable" content="yes">
<meta name="description" content="See what Singapore HDB flats actually sold for - median resale prices by town, flat type, distance to the MRT and postal district. Free, official data.gov.sg records, refreshed weekly.">
<link rel="canonical" href="https://sghdbresale.com/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="SG HDB Resale">
<meta property="og:locale" content="en_SG">
<meta property="og:title" content="SG HDB Resale - a decade of Singapore HDB resale prices">
<meta property="og:description" content="See what Singapore HDB flats actually sold for - median resale prices by town, flat type, MRT proximity and postal district. Free, official data, refreshed weekly.">
<meta property="og:url" content="https://sghdbresale.com/">
<meta property="og:image" content="https://sghdbresale.com/og-image.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="SG HDB Resale - a decade of Singapore HDB resale prices">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="SG HDB Resale - a decade of Singapore HDB resale prices">
<meta name="twitter:description" content="See what Singapore HDB flats actually sold for - median resale prices by town, flat type, MRT proximity and postal district. Free, official data, refreshed weekly.">
<meta name="twitter:image" content="https://sghdbresale.com/og-image.png">
<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"SG HDB Resale","alternateName":"SG HDB Resale Dashboard","url":"https://sghdbresale.com/","description":"A free dashboard of Singapore HDB resale flat prices - median prices by town and flat type, MRT proximity, postal district rankings and this year's market.","inLanguage":"en-SG","publisher":{"@type":"Organization","name":"SG HDB Resale","url":"https://sghdbresale.com/"}}</script>
<link rel="manifest" href="manifest.webmanifest">
<link rel="apple-touch-icon" href="icons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="icons/favicon-32.png">
<link rel="icon" type="image/png" sizes="16x16" href="icons/favicon-16.png">
<!-- Google AdSense -->
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6257747517291345" crossorigin="anonymous"></script>
<title>SG HDB Resale - a decade of Singapore HDB resale prices</title>
<script>(function(){try{var t=localStorage.getItem("theme");if(t==="light"||t==="dark")document.documentElement.setAttribute("data-theme",t);}catch(e){}})();</script>
<style>
:root{
--font-sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
--font-serif:"Iowan Old Style","Palatino Linotype",Palatino,"Georgia",serif;
--color-background-primary:#fff;--color-background-secondary:#f5f5f4;--color-background-info:#eef4fb;
--color-text-primary:#1a1a1a;--color-text-secondary:#6b6b6b;--color-text-tertiary:#6f6f6f;
--color-text-info:#2c6cb0;--color-text-success:#0f6e56;--color-text-danger:#993c1d;
--color-border-primary:#d4d4d4;--color-border-secondary:#e0e0e0;--color-border-tertiary:#ececec;
--border-radius-md:10px;--border-radius-lg:14px;
}
@media(prefers-color-scheme:dark){:root:not([data-theme="light"]){
--color-background-primary:#1c1c1a;--color-background-secondary:#2a2a28;--color-background-info:#1e2a38;
--color-text-primary:#f5f5f3;--color-text-secondary:#a8a8a4;--color-text-tertiary:#949490;
--color-text-info:#6aa9e0;--color-text-success:#4cc4a0;--color-text-danger:#e08a6a;
--color-border-primary:#3a3a38;--color-border-secondary:#333331;--color-border-tertiary:#2c2c2a;
}}
:root[data-theme="dark"]{
--color-background-primary:#1c1c1a;--color-background-secondary:#2a2a28;--color-background-info:#1e2a38;
--color-text-primary:#f5f5f3;--color-text-secondary:#a8a8a4;--color-text-tertiary:#949490;
--color-text-info:#6aa9e0;--color-text-success:#4cc4a0;--color-text-danger:#e08a6a;
--color-border-primary:#3a3a38;--color-border-secondary:#333331;--color-border-tertiary:#2c2c2a;
}
*{box-sizing:border-box}
body{margin:0;background:var(--color-background-primary);color:var(--color-text-primary);font-family:var(--font-sans)}
.wrap{max-width:1000px;margin:0 auto;padding:1.25rem 1.5rem 2rem}
.nav{position:sticky;top:0;z-index:50;background:var(--color-background-primary);border-bottom:1px solid var(--color-border-secondary);margin-bottom:0;box-shadow:0 1px 0 rgba(0,0,0,0.02)}
.nav-inner{max-width:1000px;margin:0 auto;padding:0 1.5rem;display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-height:58px;justify-content:space-between}
.nav-brand{font-size:13px;font-weight:600;color:var(--color-text-primary);white-space:nowrap;display:flex;align-items:center;gap:7px;text-decoration:none}
.nav-brand svg{flex-shrink:0}
.nav-link{font-size:13px;font-weight:500;padding:8px 15px;border-radius:8px;color:var(--color-text-secondary);text-decoration:none;white-space:nowrap;transition:all .12s;border:1px solid transparent;position:relative}
.nav-link:hover{background:var(--color-background-secondary);color:var(--color-text-primary)}
.nav-link.active{background:var(--color-text-primary);color:var(--color-background-primary)}
/*NAVDROPDOWN*/
.nav-group{position:relative;display:inline-flex}
.nav-group-btn{font-family:inherit;cursor:pointer;background:transparent;display:inline-flex;align-items:center;gap:5px}
.nav-caret{opacity:.65;transition:transform .15s}
.nav-group[data-open="true"] .nav-caret{transform:rotate(180deg)}
.nav-menu{display:none;position:absolute;top:calc(100% + 6px);left:0;min-width:196px;background:var(--color-background-primary);border:1px solid var(--color-border-primary);border-radius:var(--border-radius-md);box-shadow:0 8px 28px rgba(0,0,0,.14);padding:6px;z-index:60}.nav-group[data-open="true"] .nav-menu::before{content:"";position:absolute;left:0;right:0;top:-6px;height:6px}
.nav-group[data-open="true"] .nav-menu{display:block}
.nav-menu-link{display:block;font-size:13px;font-weight:500;padding:8px 12px;border-radius:6px;color:var(--color-text-secondary);text-decoration:none;white-space:nowrap;border:1px solid transparent}
.nav-menu-link:hover{background:var(--color-background-secondary);color:var(--color-text-primary)}
.nav-menu-link.active{color:var(--color-text-primary);font-weight:640;background:var(--color-background-secondary)}
.nav-toggle{display:none;align-items:center;justify-content:center;width:34px;height:34px;padding:0;border:1px solid var(--color-border-secondary);background:transparent;border-radius:8px;color:var(--color-text-secondary);cursor:pointer;transition:background .12s,color .12s,border-color .12s}
.nav-toggle:hover{background:var(--color-background-secondary);color:var(--color-text-primary);border-color:var(--color-border-primary)}
.nav-toggle svg{display:block}
.nav-links{display:contents}
@media(max-width:900px){
.nav-inner{flex-wrap:nowrap;min-height:54px;padding:8px 1rem;gap:8px}
.nav-brand{margin-right:auto}
.nav-toggle{display:inline-flex}
.nav-links{display:none;position:absolute;top:100%;left:0;right:0;flex-direction:column;align-items:stretch;gap:2px;background:var(--color-background-primary);border-bottom:1px solid var(--color-border-secondary);box-shadow:0 10px 28px rgba(0,0,0,.14);padding:8px 1rem 12px;max-height:calc(100vh - 54px);overflow-y:auto}
.nav[data-menu-open="true"] .nav-links{display:flex}
.nav-links .nav-link{width:100%;box-sizing:border-box;text-align:left;font-size:14px;padding:11px 12px}
.nav-links .nav-link.active{background:var(--color-text-primary);color:var(--color-background-primary)}
.nav-group{display:block;width:100%;position:static}
.nav-links .nav-group-btn{width:100%;justify-content:flex-start;font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--color-text-tertiary);padding:14px 12px 4px;cursor:default}
.nav-links .nav-group-btn.active{background:transparent;color:var(--color-text-tertiary)}
.nav-caret{display:none}
.nav-menu{display:block;position:static;border:none;box-shadow:none;padding:0;min-width:0;background:transparent}
.nav-group[data-open="true"] .nav-menu::before{display:none}
.nav-menu-link{padding:10px 12px 10px 22px;font-size:14px}
}
.hero{padding:.25rem 0 .5rem}
.hero-eyebrow{font-size:12px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--color-text-info);margin:0 0 12px}
.hero-title{font-size:34px;line-height:1.18;font-weight:600;letter-spacing:-.01em;margin:0 0 14px;max-width:15em}
.hero-lede{font-size:16px;line-height:1.6;color:var(--color-text-secondary);margin:0 0 18px}
.hero-trust{display:flex;flex-wrap:wrap;gap:6px 20px;padding:12px 0;border-top:1px solid var(--color-border-secondary);border-bottom:1px solid var(--color-border-secondary);margin-bottom:1.75rem}
.hero-trust span{font-size:13px;color:var(--color-text-secondary);display:inline-flex;align-items:center}
.hero-trust span::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--color-text-success);display:inline-block;margin-right:8px}
.pulse{margin:0 0 1.75rem;border:1px solid var(--color-border-secondary);border-radius:var(--border-radius-lg);background:var(--color-background-secondary);overflow:hidden}
.pulse-head{display:flex;align-items:center;gap:9px;padding:12px 20px;border-bottom:1px solid var(--color-border-secondary);font-size:12.5px;color:var(--color-text-secondary)}
.pulse-cta{display:flex;align-items:center;gap:6px;padding:11px 20px;border-top:1px solid var(--color-border-secondary);font-size:13px;font-weight:600;color:var(--color-text-info);text-decoration:none;background:var(--color-background-primary)}
.pulse-cta:hover{background:var(--color-background-secondary)}
.pulse-head strong{color:var(--color-text-primary);font-weight:600}
.pulse-dot{width:8px;height:8px;border-radius:50%;background:var(--color-text-success);flex:none;animation:pulseping 2.6s ease-out infinite}
@keyframes pulseping{0%{box-shadow:0 0 0 0 rgba(15,110,86,.5)}70%{box-shadow:0 0 0 7px transparent}100%{box-shadow:0 0 0 0 transparent}}
@media(prefers-reduced-motion:reduce){.pulse-dot{animation:none}}
.pulse-grid{display:grid;grid-template-columns:repeat(4,1fr)}
.pstat{padding:18px 20px 20px;border-right:1px solid var(--color-border-secondary)}
.pstat:last-child{border-right:none}
.pk{font-size:12px;color:var(--color-text-secondary)}
.pv{font-size:28px;font-weight:700;letter-spacing:-.02em;margin-top:8px;line-height:1;font-variant-numeric:tabular-nums}
.ps{font-size:12px;color:var(--color-text-tertiary);margin-top:8px;line-height:1.4}
@media(max-width:640px){.pulse-grid{grid-template-columns:repeat(2,1fr)}.pstat:nth-child(2){border-right:none}.pstat:nth-child(1),.pstat:nth-child(2){border-bottom:1px solid var(--color-border-secondary)}}
@media(max-width:380px){.pulse-grid{grid-template-columns:1fr}.pstat{border-right:none;border-bottom:1px solid var(--color-border-secondary)}.pstat:last-child{border-bottom:none}}
.section-label{font-size:12px;font-weight:640;letter-spacing:.06em;text-transform:uppercase;color:var(--color-text-tertiary);margin:0 0 16px}
#roadmap{scroll-margin-top:72px}
.roadmap-intro{font-size:15px;line-height:1.6;color:var(--color-text-secondary);margin:0 0 18px;max-width:60ch}
.roadmap{display:grid;grid-template-columns:repeat(2,1fr);gap:14px;margin-top:16px;align-items:stretch}
@media(max-width:720px){.roadmap{grid-template-columns:1fr}}
.rstep{position:relative;border:1px solid var(--color-border-secondary);border-radius:var(--border-radius-lg);background:var(--color-background-secondary);padding:22px 24px 22px 66px}
.rnum{position:absolute;left:22px;top:22px;width:30px;height:30px;border-radius:50%;background:var(--color-text-primary);color:var(--color-background-primary);font-size:14px;font-weight:700;display:flex;align-items:center;justify-content:center;font-variant-numeric:tabular-nums}
.rstep h3{font-family:var(--font-serif);margin:0;font-size:20px;line-height:1.2;font-weight:600;color:var(--color-text-primary)}
.rstep p{font-family:var(--font-serif);margin:8px 0 0;font-size:15.5px;line-height:1.5;color:var(--color-text-secondary);max-width:60ch}
.rrow{margin-top:12px;display:flex;flex-wrap:wrap;gap:8px 8px;align-items:center}
.rlabel{font-family:var(--font-sans);font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--color-text-tertiary);margin-right:2px}
.rlink{font-family:var(--font-sans);font-size:13px;font-weight:600;text-decoration:none;padding:6px 12px;border-radius:8px;border:1px solid var(--color-border-primary);color:var(--color-text-primary);background:var(--color-background-primary);transition:border-color .12s,color .12s}
.rlink:hover{border-color:var(--color-text-info);color:var(--color-text-info)}
.rlink.read{background:transparent;border-style:dashed;color:var(--color-text-secondary)}
.rlink.read:hover{color:var(--color-text-info);border-color:var(--color-text-info)}
@media(max-width:600px){.rstep{padding:20px 18px}.rnum{position:static;margin-bottom:12px}}
.feature{display:block;text-decoration:none;border:1px solid var(--color-border-secondary);border-radius:var(--border-radius-lg);background:var(--color-background-secondary);padding:28px 30px;transition:border-color .12s,transform .12s}
.feature:hover{border-color:var(--color-text-primary);transform:translateY(-2px)}
.feature .tag{font-size:12px;font-weight:640;letter-spacing:.05em;text-transform:uppercase;color:var(--color-text-info)}
.feature h2{font-family:var(--font-serif);font-size:clamp(22px,3.2vw,29px);line-height:1.15;font-weight:600;margin:12px 0 0;color:var(--color-text-primary);text-wrap:balance}
.feature p{font-family:var(--font-serif);font-size:16.5px;line-height:1.55;color:var(--color-text-secondary);margin:12px 0 0;max-width:56ch}
.feature .meta{font-family:var(--font-sans);font-size:13px;color:var(--color-text-tertiary);margin:16px 0 0;display:flex;gap:14px;flex-wrap:wrap;align-items:center}
.feature .go{font-family:var(--font-sans);color:var(--color-text-info);font-weight:640}
.grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin-top:16px}
@media(max-width:640px){.grid{grid-template-columns:1fr}}
.card{border:1px solid var(--color-border-secondary);border-radius:var(--border-radius-lg);background:var(--color-background-primary);padding:22px 24px;display:flex;flex-direction:column;gap:9px}
.card .kick{font-family:var(--font-sans);font-size:12px;font-weight:640;letter-spacing:.05em;text-transform:uppercase;color:var(--color-text-tertiary)}
.card h3{font-family:var(--font-serif);margin:0;font-size:19px;line-height:1.25;font-weight:600;color:var(--color-text-primary)}
.card p{font-family:var(--font-sans);margin:0;font-size:14px;line-height:1.5;color:var(--color-text-secondary)}
.card .soon{align-self:flex-start;margin-top:2px;font-family:var(--font-sans);font-size:11.5px;font-weight:640;letter-spacing:.03em;color:var(--color-text-tertiary);background:var(--color-background-secondary);padding:3px 9px;border-radius:20px}
a.card{text-decoration:none;transition:border-color .12s,transform .12s}
a.card:hover{border-color:var(--color-text-info);transform:translateY(-2px)}
.card .go{font-family:var(--font-sans);font-size:13.5px;font-weight:640;color:var(--color-text-info);margin-top:2px}
.hero-start{font-size:13px;font-weight:600;color:var(--color-text-secondary);margin:0 0 12px}
.hero-cards{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}
.hero-card{text-decoration:none;background:var(--color-background-secondary);border:1px solid var(--color-border-secondary);border-radius:var(--border-radius-lg);padding:24px 26px;display:block;transition:border-color .12s,transform .12s}
.hero-card:hover{border-color:var(--color-text-primary);transform:translateY(-2px)}
.hero-card svg{width:26px;height:26px;color:var(--color-text-info);display:block}
.hero-card .hc-t{font-size:18px;font-weight:600;color:var(--color-text-primary);margin:14px 0 6px}
.hero-card .hc-t::after{content:" \2192";color:var(--color-text-tertiary);font-weight:400}
.hero-card .hc-d{font-size:14px;line-height:1.55;color:var(--color-text-secondary);margin:0}
@media(max-width:600px){.hero-title{font-size:26px}.hero-cards{grid-template-columns:1fr}}
.div{border:none;border-top:1px solid var(--color-border-secondary);margin:2.25rem 0}
.cta{background:var(--color-background-secondary);border:1px solid var(--color-border-secondary);border-radius:var(--border-radius-lg);padding:22px 24px;display:flex;flex-wrap:wrap;align-items:center;gap:12px 24px;justify-content:space-between}
.cta-copy{max-width:34em}
.cta-copy h2{font-size:18px;font-weight:600;margin:0 0 6px}
.cta-copy p{font-size:14px;line-height:1.55;color:var(--color-text-secondary);margin:0}
.cta-btn{font-size:14px;font-weight:600;text-decoration:none;padding:11px 20px;border-radius:9px;background:var(--color-text-primary);color:var(--color-background-primary);white-space:nowrap;transition:opacity .12s}
.cta-btn:hover{opacity:.85}
.note{font-size:13px;line-height:1.6;color:var(--color-text-secondary);margin:1.75rem 0 0}
.note a{color:var(--color-text-info);text-decoration:none}
.note a:hover{text-decoration:underline}
.site-footer{border-top:1px solid var(--color-border-secondary);margin-top:2.5rem}
.footer-inner{max-width:1000px;margin:0 auto;padding:1.25rem 1.5rem;display:flex;flex-wrap:wrap;align-items:center;gap:6px 16px;justify-content:space-between}
.footer-brand{font-size:13px;font-weight:600;color:var(--color-text-secondary)}
.footer-nav{display:flex;gap:16px;flex-wrap:wrap}
.footer-nav a{font-size:13px;color:var(--color-text-secondary);text-decoration:none;display:inline-block;padding:5px 2px}
.footer-nav a:hover{color:var(--color-text-primary)}
.footer-note{font-size:12px;color:var(--color-text-tertiary)}
.theme-toggle{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;border:1px solid var(--color-border-secondary);background:transparent;border-radius:8px;color:var(--color-text-secondary);cursor:pointer;transition:background .12s,color .12s,border-color .12s}
.theme-toggle:hover{background:var(--color-background-secondary);color:var(--color-text-primary);border-color:var(--color-border-primary)}
.theme-toggle svg{width:17px;height:17px;display:block}
@media(max-width:600px){.theme-toggle{width:30px;height:30px}}
</style>
</head>
<body>
<div class="nav"><div class="nav-inner"><a class="nav-brand" href="/"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z"/><path d="M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2"/><path d="M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2"/><path d="M10 6h4"/><path d="M10 10h4"/><path d="M10 14h4"/><path d="M10 18h4"/></svg>SG HDB Resale</a><button class="nav-toggle" id="nav-toggle" type="button" aria-label="Menu" aria-expanded="false" aria-controls="nav-links"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg></button><div class="nav-links" id="nav-links"><a class="nav-link" href="/overview">Overview</a><a class="nav-link" href="/towns/">Towns</a><a class="nav-link" href="/map">Map</a><a class="nav-link" href="/insights">Insights</a><a class="nav-link" href="/guides/">Guides</a><a class="nav-link" href="/search">Search</a><a class="nav-link" href="/calculators">Calculators</a><div class="nav-group"><button type="button" class="nav-link nav-group-btn" aria-haspopup="true" aria-expanded="false">Dashboard<svg class="nav-caret" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg></button><div class="nav-menu" role="menu"><a class="nav-menu-link" href="/find-a-flat" role="menuitem">Find a Flat</a><a class="nav-menu-link" href="/analysis-by-town" role="menuitem">Analysis by Town</a><a class="nav-menu-link" href="/by-district" role="menuitem">By District</a><a class="nav-menu-link" href="/this-year" role="menuitem">This Year</a></div></div></div><button class="theme-toggle" id="theme-toggle" type="button" aria-label="Toggle theme"></button></div></div>
<div class="wrap">
<section class="hero">
<p class="hero-eyebrow">A decade of Singapore's HDB resale market</p>
<h1 class="hero-title">Buying, selling, or just wondering where prices are headed?</h1>
<p class="hero-lede">Real HDB resale transactions - every sale in Singapore since 2012, not opinions or estimates. Explore the market yourself through interactive dashboards, or follow the buyer's roadmap below step by step. Every figure comes from official data.gov.sg records, refreshed weekly.</p>
<div class="hero-trust"><span>Official data.gov.sg records</span><span>300,000+ transactions</span><span>Refreshed weekly</span></div>
</section>
<section class="pulse" aria-label="Latest market snapshot">
<!--PULSE:START-->
<div class="pulse-head"><span class="pulse-dot"></span>Monthly Pulse - <strong>August 2026</strong> so far - refreshed weekly from data.gov.sg</div>
<div class="pulse-grid">
<div class="pstat"><div class="pk">Median resale price</div><div class="pv">$635,000</div><div class="ps">2,384 sales so far in August</div></div>
<div class="pstat"><div class="pk">Year-on-year</div><div class="pv">+2.1%</div><div class="ps">vs August 2025 - provisional so far</div></div>
<div class="pstat"><div class="pk">Million-dollar flats</div><div class="pv">1,276</div><div class="ps">so far in 2026 · 1,593 in 2025</div></div>
<div class="pstat"><div class="pk">Transactions analysed</div><div class="pv">328,687</div><div class="ps">every resale since 2012</div></div>
</div>
<!--PULSE:END-->
<a class="pulse-cta" href="/this-month">See what moved this month →</a>
</section>
<section id="roadmap" aria-label="Buyer's roadmap">
<p class="section-label">Start here · Buyer's roadmap</p>
<p class="roadmap-intro">New to buying a resale flat? Work through it in order - each step points to the dashboards and guides for that stage.</p>
<div class="roadmap">
<div class="rstep">
<div class="rnum">1</div>
<h3>See where prices have been</h3>
<p>Before anything else, get a feel for the whole market. A decade of medians shows how far prices have climbed, and how steady the climb has (or hasn't) been.</p>
<div class="rrow"><span class="rlabel">Explore</span><a class="rlink" href="/overview">Overview</a></div>
<div class="rrow"><span class="rlabel">Read</span><a class="rlink read" href="/guides/is-now-a-good-time">Is now a good time to buy?</a></div>
</div>
<div class="rstep">
<div class="rnum">2</div>
<h3>Zoom in on right now</h3>
<p>The decade sets context; the last few months set expectations. See the latest medians and what actually moved in the newest data.</p>
<div class="rrow"><span class="rlabel">Explore</span><a class="rlink" href="/this-month">This Month</a><a class="rlink" href="/this-year">This Year</a></div>
</div>
<div class="rstep">
<div class="rnum">3</div>
<h3>Narrow down to towns</h3>
<p>Price is mostly about place. Compare all 26 towns, then dig into the ones you like - flat types, the near-MRT premium, mature vs non-mature.</p>
<div class="rrow"><span class="rlabel">Explore</span><a class="rlink" href="/towns/">Towns</a><a class="rlink" href="/analysis-by-town">Analysis by Town</a><a class="rlink" href="/by-district">By District</a></div>
<div class="rrow"><span class="rlabel">Read</span><a class="rlink read" href="/guides/mature-vs-non-mature">Mature vs non-mature estates</a><a class="rlink read" href="/guides/mrt-price-premium">Is the near-MRT premium worth it?</a></div>
</div>
<div class="rstep">
<div class="rnum">4</div>
<h3>Check what you can afford</h3>
<p>With a shortlist in hand, turn it into a budget. Work out a realistic price ceiling, then see which towns and flat types actually fit.</p>
<div class="rrow"><span class="rlabel">Explore</span><a class="rlink" href="/affordability">Affordability calculator</a><a class="rlink" href="/loan-calculator">HDB loan calculator</a><a class="rlink" href="/find-a-flat">Find a Flat</a></div>
<div class="rrow"><span class="rlabel">Read</span><a class="rlink read" href="/guides/hdb-vs-bank-loan">HDB loan or bank loan?</a></div>
</div>
<div class="rstep">
<div class="rnum">5</div>
<h3>Count the real costs</h3>
<p>The price tag isn't the whole bill. Downpayment, stamp duty, option fee, grants, COV - and which parts must be cash, not CPF.</p>
<div class="rrow"><span class="rlabel">Explore</span><a class="rlink" href="/stamp-duty">Stamp duty calculator</a><a class="rlink" href="/grants">Grant checker</a></div>
<div class="rrow"><span class="rlabel">Read</span><a class="rlink read" href="/guides/buying-costs">What a resale flat really costs</a><a class="rlink read" href="/guides/cash-over-valuation">Cash over valuation, explained</a></div>
</div>
<div class="rstep">
<div class="rnum">6</div>
<h3>Know what you're buying into</h3>
<p>Two flats at the same price aren't equal. Lease age quietly shapes value and financing; eligibility and the 5-year MOP shape your options.</p>
<div class="rrow"><span class="rlabel">Read</span><a class="rlink read" href="/guides/lease-decay">Lease decay, explained</a><a class="rlink read" href="/guides/mop-and-eligibility">Who can buy, and when can you sell?</a></div>
</div>
<div class="rstep">
<div class="rnum">7</div>
<h3>Make the offer, step by step</h3>
<p>You've found the flat. Here's every gate from the HFE letter to the keys - in order, with costs and timing - plus how to place an asking price inside a fair range.</p>
<div class="rrow"><span class="rlabel">Read</span><a class="rlink read" href="/guides/buying-timeline">Buying a resale flat, step by step</a><a class="rlink read" href="/guides/fair-price">How to tell if an asking price is fair</a></div>
</div>
</div>
<p class="roadmap-intro" style="margin:18px 0 0"><a class="rlink read" href="/guides/" style="display:inline-block">Browse all guides →</a></p>
</section>
<hr class="div">
<p class="hero-start">Prefer to explore the numbers yourself?</p>
<div class="hero-cards">
<a class="hero-card" href="/towns/"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M3 6l6-3 6 3 6-3v15l-6 3-6-3-6 3z"/><line x1="9" y1="3" x2="9" y2="18"/><line x1="15" y1="6" x2="15" y2="21"/></svg><p class="hc-t">Resale prices by town</p><p class="hc-d">Median price, flat types and the near-MRT premium for all 26 towns.</p></a>
<a class="hero-card" href="/find-a-flat"><svg 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><p class="hc-t">Find a flat you can afford</p><p class="hc-d">Set a budget and see which towns are within reach.</p></a>
<a class="hero-card" href="/analysis-by-town"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg><p class="hc-t">See what MRT proximity costs</p><p class="hc-d">How price changes by distance to the MRT, town by town.</p></a>
<a class="hero-card" href="/by-district"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><polygon points="1 6 1 22 8 18 16 22 23 18 23 2 16 6 8 2 1 6"/><line x1="8" y1="2" x2="8" y2="18"/><line x1="16" y1="6" x2="16" y2="22"/></svg><p class="hc-t">Compare districts</p><p class="hc-d">Rank all 28 postal districts by price and growth.</p></a>
<a class="hero-card" href="/this-year"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="18" rx="2"/><line x1="16" y1="2" x2="16" y2="6"/><line x1="8" y1="2" x2="8" y2="6"/><line x1="3" y1="10" x2="21" y2="10"/></svg><p class="hc-t">This month's market</p><p class="hc-d">The latest medians, town by town, year to date.</p></a>
<a class="hero-card" href="/insights"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/></svg><p class="hc-t">Surprising findings</p><p class="hc-d">Five things buried in the data most buyers miss.</p></a>
</div>
<hr class="div">
<section class="cta">
<div class="cta-copy">
<h2>Prefer the big picture first?</h2>
<p>The Overview dashboard charts a decade of the whole market at once - median price by flat type, transaction volume, and a town-by-town comparison you can filter by year and flat type.</p>
</div>
<a class="cta-btn" href="/overview">Open the Overview →</a>
</section>
<p class="note">Every figure comes from the official <a href="https://data.gov.sg/collections/189/view" rel="noopener">data.gov.sg</a> resale-price records, geocoded against OneMap for MRT distance and postal district. Nothing is modelled or estimated - these are actual recorded transactions. <a href="/about">How this site works →</a></p>
</div>
<footer class="site-footer"><div class="footer-inner">
<span class="footer-brand">SG HDB Resale</span>
<nav class="footer-nav"><a href="/about">About</a><a href="/contact">Contact</a><a href="/terms">Terms</a><a href="/privacy">Privacy</a></nav>
<span class="footer-note">Data: data.gov.sg & OneMap</span>
</div></footer>
<script>
// GoatCounter analytics
window.goatcounter={no_onload:location.hostname==='localhost'};
</script>
<script data-goatcounter="https://sghdbresale.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
<script>
if ('serviceWorker' in navigator) {
window.addEventListener('load', function () {
navigator.serviceWorker.register('sw.js').catch(function () {});
});
}
</script>
<script>
(function(){
var root=document.documentElement,btn=document.getElementById('theme-toggle');if(!btn)return;
var MOON="<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"/></svg>",SUN="<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"5\"/><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"/><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"/><line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"/><line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"/><line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"/><line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"/><line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"/><line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"/></svg>";
function eff(){var t=root.getAttribute('data-theme');return (t==='light'||t==='dark')?t:((window.matchMedia&&window.matchMedia('(prefers-color-scheme:dark)').matches)?'dark':'light');}
function paint(){var d=eff()==='dark';btn.innerHTML=d?SUN:MOON;var l=d?'Switch to light theme':'Switch to dark theme';btn.setAttribute('aria-label',l);btn.setAttribute('title',l);}
btn.addEventListener('click',function(){var n=eff()==='dark'?'light':'dark';root.setAttribute('data-theme',n);try{localStorage.setItem('theme',n);}catch(e){}paint();});
paint();
})();
</script>
<script>/*NAVJS*/
(function(){var g=document.querySelector('.nav-group');if(!g)return;var btn=g.querySelector('.nav-group-btn');function set(o){g.setAttribute('data-open',o?'true':'false');btn.setAttribute('aria-expanded',o?'true':'false');}if(window.matchMedia&&window.matchMedia('(hover:hover)').matches){g.addEventListener('mouseenter',function(){set(true);});g.addEventListener('mouseleave',function(){set(false);});}btn.addEventListener('click',function(e){e.preventDefault();set(g.getAttribute('data-open')!=='true');});document.addEventListener('click',function(e){if(!g.contains(e.target))set(false);});document.addEventListener('keydown',function(e){if(e.key==='Escape')set(false);});})();
(function(){var n=document.querySelector('.nav');if(!n)return;var t=document.getElementById('nav-toggle');if(!t)return;function set(o){n.setAttribute('data-menu-open',o?'true':'false');t.setAttribute('aria-expanded',o?'true':'false');}t.addEventListener('click',function(e){e.preventDefault();e.stopPropagation();set(n.getAttribute('data-menu-open')!=='true');});document.addEventListener('click',function(e){if(!n.contains(e.target))set(false);});document.addEventListener('keydown',function(e){if(e.key==='Escape')set(false);});n.querySelectorAll('.nav-links a').forEach(function(a){a.addEventListener('click',function(){set(false);});});})();
</script>
</body>
</html>