CINXE.COM

Play

<!DOCTYPE html> <html lang="en-US" class="no-js"> <head> <meta charset="UTF-8" /><script type="text/javascript">(window.NREUM||(NREUM={})).init={ajax:{deny_list:["bam.nr-data.net"]}};(window.NREUM||(NREUM={})).loader_config={licenseKey:"b9d80a2312",applicationID:"467627310"};;/*! For license information please see nr-loader-rum-1.281.0.min.js.LICENSE.txt */ (()=>{var e,t,r={122:(e,t,r)=>{"use strict";r.d(t,{a:()=>i});var n=r(944);function i(e,t){try{if(!e||"object"!=typeof e)return(0,n.R)(3);if(!t||"object"!=typeof t)return(0,n.R)(4);const r=Object.create(Object.getPrototypeOf(t),Object.getOwnPropertyDescriptors(t)),o=0===Object.keys(r).length?e:r;for(let a in o)if(void 0!==e[a])try{if(null===e[a]){r[a]=null;continue}Array.isArray(e[a])&&Array.isArray(t[a])?r[a]=Array.from(new Set([...e[a],...t[a]])):"object"==typeof e[a]&&"object"==typeof t[a]?r[a]=i(e[a],t[a]):r[a]=e[a]}catch(e){(0,n.R)(1,e)}return r}catch(e){(0,n.R)(2,e)}}},555:(e,t,r)=>{"use strict";r.d(t,{Vp:()=>c,fn:()=>s,x1:()=>u});var n=r(384),i=r(122);const o={beacon:n.NT.beacon,errorBeacon:n.NT.errorBeacon,licenseKey:void 0,applicationID:void 0,sa:void 0,queueTime:void 0,applicationTime:void 0,ttGuid:void 0,user:void 0,account:void 0,product:void 0,extra:void 0,jsAttributes:{},userAttributes:void 0,atts:void 0,transactionName:void 0,tNamePlain:void 0},a={};function s(e){try{const t=c(e);return!!t.licenseKey&&!!t.errorBeacon&&!!t.applicationID}catch(e){return!1}}function c(e){if(!e)throw new Error("All info objects require an agent identifier!");if(!a[e])throw new Error("Info for ".concat(e," was never set"));return a[e]}function u(e,t){if(!e)throw new Error("All info objects require an agent identifier!");a[e]=(0,i.a)(t,o);const r=(0,n.nY)(e);r&&(r.info=a[e])}},217:(e,t,r)=>{"use strict";r.d(t,{D0:()=>h,gD:()=>b,xN:()=>v});r(860).K7.genericEvents;const n="experimental.marks",i="experimental.measures",o="experimental.resources";var a=r(993);const s=e=>{if(!e||"string"!=typeof e)return!1;try{document.createDocumentFragment().querySelector(e)}catch{return!1}return!0};var c=r(614),u=r(944),l=r(384),d=r(122);const f="[data-nr-mask]",g=()=>{const e={feature_flags:[],experimental:{marks:!1,measures:!1,resources:!1},mask_selector:"*",block_selector:"[data-nr-block]",mask_input_options:{color:!1,date:!1,"datetime-local":!1,email:!1,month:!1,number:!1,range:!1,search:!1,tel:!1,text:!1,time:!1,url:!1,week:!1,textarea:!1,select:!1,password:!0}};return{ajax:{deny_list:void 0,block_internal:!0,enabled:!0,autoStart:!0},distributed_tracing:{enabled:void 0,exclude_newrelic_header:void 0,cors_use_newrelic_header:void 0,cors_use_tracecontext_headers:void 0,allowed_origins:void 0},get feature_flags(){return e.feature_flags},set feature_flags(t){e.feature_flags=t},generic_events:{enabled:!0,autoStart:!0},harvest:{interval:30},jserrors:{enabled:!0,autoStart:!0},logging:{enabled:!0,autoStart:!0,level:a.p_.INFO},metrics:{enabled:!0,autoStart:!0},obfuscate:void 0,page_action:{enabled:!0},page_view_event:{enabled:!0,autoStart:!0},page_view_timing:{enabled:!0,autoStart:!0},performance:{get capture_marks(){return e.feature_flags.includes(n)||e.experimental.marks},set capture_marks(t){e.experimental.marks=t},get capture_measures(){return e.feature_flags.includes(i)||e.experimental.measures},set capture_measures(t){e.experimental.measures=t},capture_detail:!0,resources:{get enabled(){return e.feature_flags.includes(o)||e.experimental.resources},set enabled(t){e.experimental.resources=t},asset_types:[],first_party_domains:[],ignore_newrelic:!0}},privacy:{cookies_enabled:!0},proxy:{assets:void 0,beacon:void 0},session:{expiresMs:c.wk,inactiveMs:c.BB},session_replay:{autoStart:!0,enabled:!1,preload:!1,sampling_rate:10,error_sampling_rate:100,collect_fonts:!1,inline_images:!1,fix_stylesheets:!0,mask_all_inputs:!0,get mask_text_selector(){return e.mask_selector},set mask_text_selector(t){s(t)?e.mask_selector="".concat(t,",").concat(f):""===t||null===t?e.mask_selector=f:(0,u.R)(5,t)},get block_class(){return"nr-block"},get ignore_class(){return"nr-ignore"},get mask_text_class(){return"nr-mask"},get block_selector(){return e.block_selector},set block_selector(t){s(t)?e.block_selector+=",".concat(t):""!==t&&(0,u.R)(6,t)},get mask_input_options(){return e.mask_input_options},set mask_input_options(t){t&&"object"==typeof t?e.mask_input_options={...t,password:!0}:(0,u.R)(7,t)}},session_trace:{enabled:!0,autoStart:!0},soft_navigations:{enabled:!0,autoStart:!0},spa:{enabled:!0,autoStart:!0},ssl:void 0,user_actions:{enabled:!0,elementAttributes:["id","className","tagName","type"]}}},p={},m="All configuration objects require an agent identifier!";function h(e){if(!e)throw new Error(m);if(!p[e])throw new Error("Configuration for ".concat(e," was never set"));return p[e]}function v(e,t){if(!e)throw new Error(m);p[e]=(0,d.a)(t,g());const r=(0,l.nY)(e);r&&(r.init=p[e])}function b(e,t){if(!e)throw new Error(m);var r=h(e);if(r){for(var n=t.split("."),i=0;i<n.length-1;i++)if("object"!=typeof(r=r[n[i]]))return;r=r[n[n.length-1]]}return r}},371:(e,t,r)=>{"use strict";r.d(t,{V:()=>f,f:()=>d});var n=r(122),i=r(384),o=r(154),a=r(324);let s=0;const c={buildEnv:a.F3,distMethod:a.Xs,version:a.xv,originTime:o.WN},u={customTransaction:void 0,disabled:!1,isolatedBacklog:!1,loaderType:void 0,maxBytes:3e4,onerror:void 0,ptid:void 0,releaseIds:{},appMetadata:{},session:void 0,denyList:void 0,timeKeeper:void 0,obfuscator:void 0,harvester:void 0},l={};function d(e){if(!e)throw new Error("All runtime objects require an agent identifier!");if(!l[e])throw new Error("Runtime for ".concat(e," was never set"));return l[e]}function f(e,t){if(!e)throw new Error("All runtime objects require an agent identifier!");l[e]={...(0,n.a)(t,u),...c},Object.hasOwnProperty.call(l[e],"harvestCount")||Object.defineProperty(l[e],"harvestCount",{get:()=>++s});const r=(0,i.nY)(e);r&&(r.runtime=l[e])}},324:(e,t,r)=>{"use strict";r.d(t,{F3:()=>i,Xs:()=>o,xv:()=>n});const n="1.281.0",i="PROD",o="CDN"},154:(e,t,r)=>{"use strict";r.d(t,{OF:()=>c,RI:()=>i,WN:()=>l,bv:()=>o,gm:()=>a,mw:()=>s,sb:()=>u});var n=r(863);const i="undefined"!=typeof window&&!!window.document,o="undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self.navigator instanceof WorkerNavigator||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis.navigator instanceof WorkerNavigator),a=i?window:"undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis),s=Boolean("hidden"===a?.document?.visibilityState),c=/iPad|iPhone|iPod/.test(a.navigator?.userAgent),u=c&&"undefined"==typeof SharedWorker,l=((()=>{const e=a.navigator?.userAgent?.match(/Firefox[/\s](\d+\.\d+)/);Array.isArray(e)&&e.length>=2&&e[1]})(),Date.now()-(0,n.t)())},687:(e,t,r)=>{"use strict";r.d(t,{Ak:()=>c,Ze:()=>d,x3:()=>u});var n=r(836),i=r(606),o=r(860),a=r(646);const s={};function c(e,t){const r={staged:!1,priority:o.P3[t]||0};l(e),s[e].get(t)||s[e].set(t,r)}function u(e,t){e&&s[e]&&(s[e].get(t)&&s[e].delete(t),g(e,t,!1),s[e].size&&f(e))}function l(e){if(!e)throw new Error("agentIdentifier required");s[e]||(s[e]=new Map)}function d(e="",t="feature",r=!1){if(l(e),!e||!s[e].get(t)||r)return g(e,t);s[e].get(t).staged=!0,f(e)}function f(e){const t=Array.from(s[e]);t.every((([e,t])=>t.staged))&&(t.sort(((e,t)=>e[1].priority-t[1].priority)),t.forEach((([t])=>{s[e].delete(t),g(e,t)})))}function g(e,t,r=!0){const o=e?n.ee.get(e):n.ee,s=i.i.handlers;if(!o.aborted&&o.backlog&&s){if(r){const e=o.backlog[t],r=s[t];if(r){for(let t=0;e&&t<e.length;++t)p(e[t],r);Object.entries(r).forEach((([e,t])=>{Object.values(t||{}).forEach((t=>{t[0]?.on&&t[0]?.context()instanceof a.y&&t[0].on(e,t[1])}))}))}}o.isolatedBacklog||delete s[t],o.backlog[t]=null,o.emit("drain-"+t,[])}}function p(e,t){var r=e[1];Object.values(t[r]||{}).forEach((t=>{var r=e[0];if(t[0]===r){var n=t[1],i=e[3],o=e[2];n.apply(i,o)}}))}},836:(e,t,r)=>{"use strict";r.d(t,{P:()=>c,ee:()=>u});var n=r(384),i=r(990),o=r(371),a=r(646),s=r(607);const c="nr@context:".concat(s.W),u=function e(t,r){var n={},s={},l={},d=!1;try{d=16===r.length&&(0,o.f)(r).isolatedBacklog}catch(e){}var f={on:p,addEventListener:p,removeEventListener:function(e,t){var r=n[e];if(!r)return;for(var i=0;i<r.length;i++)r[i]===t&&r.splice(i,1)},emit:function(e,r,n,i,o){!1!==o&&(o=!0);if(u.aborted&&!i)return;t&&o&&t.emit(e,r,n);for(var a=g(n),c=m(e),l=c.length,d=0;d<l;d++)c[d].apply(a,r);var p=v()[s[e]];p&&p.push([f,e,r,a]);return a},get:h,listeners:m,context:g,buffer:function(e,t){const r=v();if(t=t||"feature",f.aborted)return;Object.entries(e||{}).forEach((([e,n])=>{s[n]=t,t in r||(r[t]=[])}))},abort:function(){f._aborted=!0,Object.keys(f.backlog).forEach((e=>{delete f.backlog[e]}))},isBuffering:function(e){return!!v()[s[e]]},debugId:r,backlog:d?{}:t&&"object"==typeof t.backlog?t.backlog:{},isolatedBacklog:d};return Object.defineProperty(f,"aborted",{get:()=>{let e=f._aborted||!1;return e||(t&&(e=t.aborted),e)}}),f;function g(e){return e&&e instanceof a.y?e:e?(0,i.I)(e,c,(()=>new a.y(c))):new a.y(c)}function p(e,t){n[e]=m(e).concat(t)}function m(e){return n[e]||[]}function h(t){return l[t]=l[t]||e(f,t)}function v(){return f.backlog}}(void 0,"globalEE"),l=(0,n.Zm)();l.ee||(l.ee=u)},646:(e,t,r)=>{"use strict";r.d(t,{y:()=>n});class n{constructor(e){this.contextId=e}}},908:(e,t,r)=>{"use strict";r.d(t,{d:()=>n,p:()=>i});var n=r(836).ee.get("handle");function i(e,t,r,i,o){o?(o.buffer([e],i),o.emit(e,t,r)):(n.buffer([e],i),n.emit(e,t,r))}},606:(e,t,r)=>{"use strict";r.d(t,{i:()=>o});var n=r(908);o.on=a;var i=o.handlers={};function o(e,t,r,o){a(o||n.d,i,e,t,r)}function a(e,t,r,i,o){o||(o="feature"),e||(e=n.d);var a=t[o]=t[o]||{};(a[r]=a[r]||[]).push([e,i])}},878:(e,t,r)=>{"use strict";function n(e,t){return{capture:e,passive:!1,signal:t}}function i(e,t,r=!1,i){window.addEventListener(e,t,n(r,i))}function o(e,t,r=!1,i){document.addEventListener(e,t,n(r,i))}r.d(t,{DD:()=>o,jT:()=>n,sp:()=>i})},607:(e,t,r)=>{"use strict";r.d(t,{W:()=>n});const n=(0,r(566).bz)()},566:(e,t,r)=>{"use strict";r.d(t,{LA:()=>s,bz:()=>a});var n=r(154);const i="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";function o(e,t){return e?15&e[t]:16*Math.random()|0}function a(){const e=n.gm?.crypto||n.gm?.msCrypto;let t,r=0;return e&&e.getRandomValues&&(t=e.getRandomValues(new Uint8Array(30))),i.split("").map((e=>"x"===e?o(t,r++).toString(16):"y"===e?(3&o()|8).toString(16):e)).join("")}function s(e){const t=n.gm?.crypto||n.gm?.msCrypto;let r,i=0;t&&t.getRandomValues&&(r=t.getRandomValues(new Uint8Array(e)));const a=[];for(var s=0;s<e;s++)a.push(o(r,i++).toString(16));return a.join("")}},614:(e,t,r)=>{"use strict";r.d(t,{BB:()=>a,H3:()=>n,g:()=>u,iL:()=>c,tS:()=>s,uh:()=>i,wk:()=>o});const n="NRBA",i="SESSION",o=144e5,a=18e5,s={STARTED:"session-started",PAUSE:"session-pause",RESET:"session-reset",RESUME:"session-resume",UPDATE:"session-update"},c={SAME_TAB:"same-tab",CROSS_TAB:"cross-tab"},u={OFF:0,FULL:1,ERROR:2}},863:(e,t,r)=>{"use strict";function n(){return Math.floor(performance.now())}r.d(t,{t:()=>n})},944:(e,t,r)=>{"use strict";function n(e,t){"function"==typeof console.debug&&console.debug("New Relic Warning: https://github.com/newrelic/newrelic-browser-agent/blob/main/docs/warning-codes.md#".concat(e),t)}r.d(t,{R:()=>n})},284:(e,t,r)=>{"use strict";r.d(t,{t:()=>c,B:()=>s});var n=r(836),i=r(154);const o="newrelic";const a=new Set,s={};function c(e,t){const r=n.ee.get(t);s[t]??={},e&&"object"==typeof e&&(a.has(t)||(r.emit("rumresp",[e]),s[t]=e,a.add(t),function(e={}){try{i.gm.dispatchEvent(new CustomEvent(o,{detail:e}))}catch(e){}}({loaded:!0})))}},990:(e,t,r)=>{"use strict";r.d(t,{I:()=>i});var n=Object.prototype.hasOwnProperty;function i(e,t,r){if(n.call(e,t))return e[t];var i=r();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,t,{value:i,writable:!0,enumerable:!1}),i}catch(e){}return e[t]=i,i}},389:(e,t,r)=>{"use strict";function n(e,t=500,r={}){const n=r?.leading||!1;let i;return(...r)=>{n&&void 0===i&&(e.apply(this,r),i=setTimeout((()=>{i=clearTimeout(i)}),t)),n||(clearTimeout(i),i=setTimeout((()=>{e.apply(this,r)}),t))}}function i(e){let t=!1;return(...r)=>{t||(t=!0,e.apply(this,r))}}r.d(t,{J:()=>i,s:()=>n})},289:(e,t,r)=>{"use strict";r.d(t,{GG:()=>o,sB:()=>a});var n=r(878);function i(){return"undefined"==typeof document||"complete"===document.readyState}function o(e,t){if(i())return e();(0,n.sp)("load",e,t)}function a(e){if(i())return e();(0,n.DD)("DOMContentLoaded",e)}},384:(e,t,r)=>{"use strict";r.d(t,{NT:()=>o,US:()=>l,Zm:()=>a,bQ:()=>c,dV:()=>s,nY:()=>u,pV:()=>d});var n=r(154),i=r(863);const o={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net"};function a(){return n.gm.NREUM||(n.gm.NREUM={}),void 0===n.gm.newrelic&&(n.gm.newrelic=n.gm.NREUM),n.gm.NREUM}function s(){let e=a();return e.o||(e.o={ST:n.gm.setTimeout,SI:n.gm.setImmediate,CT:n.gm.clearTimeout,XHR:n.gm.XMLHttpRequest,REQ:n.gm.Request,EV:n.gm.Event,PR:n.gm.Promise,MO:n.gm.MutationObserver,FETCH:n.gm.fetch,WS:n.gm.WebSocket}),e}function c(e,t){let r=a();r.initializedAgents??={},t.initializedAt={ms:(0,i.t)(),date:new Date},r.initializedAgents[e]=t}function u(e){let t=a();return t.initializedAgents?.[e]}function l(e,t){a()[e]=t}function d(){return function(){let e=a();const t=e.info||{};e.info={beacon:o.beacon,errorBeacon:o.errorBeacon,...t}}(),function(){let e=a();const t=e.init||{};e.init={...t}}(),s(),function(){let e=a();const t=e.loader_config||{};e.loader_config={...t}}(),a()}},843:(e,t,r)=>{"use strict";r.d(t,{u:()=>i});var n=r(878);function i(e,t=!1,r,i){(0,n.DD)("visibilitychange",(function(){if(t)return void("hidden"===document.visibilityState&&e());e(document.visibilityState)}),r,i)}},434:(e,t,r)=>{"use strict";r.d(t,{Jt:()=>o,YM:()=>c});var n=r(836),i=r(607);const o="nr@original:".concat(i.W);var a=Object.prototype.hasOwnProperty,s=!1;function c(e,t){return e||(e=n.ee),r.inPlace=function(e,t,n,i,o){n||(n="");const a="-"===n.charAt(0);for(let s=0;s<t.length;s++){const c=t[s],u=e[c];l(u)||(e[c]=r(u,a?c+n:n,i,c,o))}},r.flag=o,r;function r(t,r,n,s,c){return l(t)?t:(r||(r=""),nrWrapper[o]=t,function(e,t,r){if(Object.defineProperty&&Object.keys)try{return Object.keys(e).forEach((function(r){Object.defineProperty(t,r,{get:function(){return e[r]},set:function(t){return e[r]=t,t}})})),t}catch(e){u([e],r)}for(var n in e)a.call(e,n)&&(t[n]=e[n])}(t,nrWrapper,e),nrWrapper);function nrWrapper(){var o,a,l,d;try{a=this,o=[...arguments],l="function"==typeof n?n(o,a):n||{}}catch(t){u([t,"",[o,a,s],l],e)}i(r+"start",[o,a,s],l,c);try{return d=t.apply(a,o)}catch(e){throw i(r+"err",[o,a,e],l,c),e}finally{i(r+"end",[o,a,d],l,c)}}}function i(r,n,i,o){if(!s||t){var a=s;s=!0;try{e.emit(r,n,i,t,o)}catch(t){u([t,r,n,i],e)}s=a}}}function u(e,t){t||(t=n.ee);try{t.emit("internal-error",e)}catch(e){}}function l(e){return!(e&&"function"==typeof e&&e.apply&&!e[o])}},993:(e,t,r)=>{"use strict";r.d(t,{ET:()=>o,p_:()=>i});var n=r(860);const i={ERROR:"ERROR",WARN:"WARN",INFO:"INFO",DEBUG:"DEBUG",TRACE:"TRACE"},o="log";n.K7.logging},969:(e,t,r)=>{"use strict";r.d(t,{TZ:()=>n,XG:()=>s,rs:()=>i,xV:()=>a,z_:()=>o});const n=r(860).K7.metrics,i="sm",o="cm",a="storeSupportabilityMetrics",s="storeEventMetrics"},630:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.pageViewEvent},782:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.pageViewTiming},344:(e,t,r)=>{"use strict";r.d(t,{G4:()=>i});var n=r(614);r(860).K7.sessionReplay;const i={RECORD:"recordReplay",PAUSE:"pauseReplay",REPLAY_RUNNING:"replayRunning",ERROR_DURING_REPLAY:"errorDuringReplay"};n.g.ERROR,n.g.FULL,n.g.OFF},234:(e,t,r)=>{"use strict";r.d(t,{W:()=>o});var n=r(836),i=r(687);class o{constructor(e,t){this.agentIdentifier=e,this.ee=n.ee.get(e),this.featureName=t,this.blocked=!1}deregisterDrain(){(0,i.x3)(this.agentIdentifier,this.featureName)}}},603:(e,t,r)=>{"use strict";r.d(t,{j:()=>K});var n=r(860),i=r(555),o=r(371),a=r(908),s=r(836),c=r(687),u=r(289),l=r(154),d=r(944),f=r(969),g=r(384),p=r(344);const m=["setErrorHandler","finished","addToTrace","addRelease","recordCustomEvent","addPageAction","setCurrentRouteName","setPageViewName","setCustomAttribute","interaction","noticeError","setUserId","setApplicationVersion","start",p.G4.RECORD,p.G4.PAUSE,"log","wrapLogger"],h=["setErrorHandler","finished","addToTrace","addRelease"];var v=r(863),b=r(614),y=r(993);var w=r(646),A=r(434);const R=new Map;function _(e,t,r,n){if("object"!=typeof t||!t||"string"!=typeof r||!r||"function"!=typeof t[r])return(0,d.R)(29);const i=function(e){return(e||s.ee).get("logger")}(e),o=(0,A.YM)(i),a=new w.y(s.P);a.level=n.level,a.customAttributes=n.customAttributes;const c=t[r]?.[A.Jt]||t[r];return R.set(c,a),o.inPlace(t,[r],"wrap-logger-",(()=>R.get(c))),i}function E(){const e=(0,g.pV)();m.forEach((t=>{e[t]=(...r)=>function(t,...r){let n=[];return Object.values(e.initializedAgents).forEach((e=>{e&&e.api?e.exposed&&e.api[t]&&n.push(e.api[t](...r)):(0,d.R)(38,t)})),n.length>1?n:n[0]}(t,...r)}))}const x={};function N(e,t,g=!1){t||(0,c.Ak)(e,"api");const m={};var w=s.ee.get(e),A=w.get("tracer");x[e]=b.g.OFF,w.on(p.G4.REPLAY_RUNNING,(t=>{x[e]=t}));var R="api-",E=R+"ixn-";function N(t,r,n,o){const a=(0,i.Vp)(e);return null===r?delete a.jsAttributes[t]:(0,i.x1)(e,{...a,jsAttributes:{...a.jsAttributes,[t]:r}}),j(R,n,!0,o||null===r?"session":void 0)(t,r)}function k(){}m.log=function(e,{customAttributes:t={},level:r=y.p_.INFO}={}){(0,a.p)(f.xV,["API/log/called"],void 0,n.K7.metrics,w),function(e,t,r={},i=y.p_.INFO){(0,a.p)(f.xV,["API/logging/".concat(i.toLowerCase(),"/called")],void 0,n.K7.metrics,e),(0,a.p)(y.ET,[(0,v.t)(),t,r,i],void 0,n.K7.logging,e)}(w,e,t,r)},m.wrapLogger=(e,t,{customAttributes:r={},level:i=y.p_.INFO}={})=>{(0,a.p)(f.xV,["API/wrapLogger/called"],void 0,n.K7.metrics,w),_(w,e,t,{customAttributes:r,level:i})},h.forEach((e=>{m[e]=j(R,e,!0,"api")})),m.addPageAction=j(R,"addPageAction",!0,n.K7.genericEvents),m.recordCustomEvent=j(R,"recordCustomEvent",!0,n.K7.genericEvents),m.setPageViewName=function(t,r){if("string"==typeof t)return"/"!==t.charAt(0)&&(t="/"+t),(0,o.f)(e).customTransaction=(r||"http://custom.transaction")+t,j(R,"setPageViewName",!0)()},m.setCustomAttribute=function(e,t,r=!1){if("string"==typeof e){if(["string","number","boolean"].includes(typeof t)||null===t)return N(e,t,"setCustomAttribute",r);(0,d.R)(40,typeof t)}else(0,d.R)(39,typeof e)},m.setUserId=function(e){if("string"==typeof e||null===e)return N("enduser.id",e,"setUserId",!0);(0,d.R)(41,typeof e)},m.setApplicationVersion=function(e){if("string"==typeof e||null===e)return N("application.version",e,"setApplicationVersion",!1);(0,d.R)(42,typeof e)},m.start=()=>{try{(0,a.p)(f.xV,["API/start/called"],void 0,n.K7.metrics,w),w.emit("manual-start-all")}catch(e){(0,d.R)(23,e)}},m[p.G4.RECORD]=function(){(0,a.p)(f.xV,["API/recordReplay/called"],void 0,n.K7.metrics,w),(0,a.p)(p.G4.RECORD,[],void 0,n.K7.sessionReplay,w)},m[p.G4.PAUSE]=function(){(0,a.p)(f.xV,["API/pauseReplay/called"],void 0,n.K7.metrics,w),(0,a.p)(p.G4.PAUSE,[],void 0,n.K7.sessionReplay,w)},m.interaction=function(e){return(new k).get("object"==typeof e?e:{})};const T=k.prototype={createTracer:function(e,t){var r={},i=this,o="function"==typeof t;return(0,a.p)(f.xV,["API/createTracer/called"],void 0,n.K7.metrics,w),g||(0,a.p)(E+"tracer",[(0,v.t)(),e,r],i,n.K7.spa,w),function(){if(A.emit((o?"":"no-")+"fn-start",[(0,v.t)(),i,o],r),o)try{return t.apply(this,arguments)}catch(e){const t="string"==typeof e?new Error(e):e;throw A.emit("fn-err",[arguments,this,t],r),t}finally{A.emit("fn-end",[(0,v.t)()],r)}}}};function j(e,t,r,i){return function(){return(0,a.p)(f.xV,["API/"+t+"/called"],void 0,n.K7.metrics,w),i&&(0,a.p)(e+t,[r?(0,v.t)():performance.now(),...arguments],r?null:this,i,w),r?void 0:this}}function I(){r.e(296).then(r.bind(r,778)).then((({setAPI:t})=>{t(e),(0,c.Ze)(e,"api")})).catch((e=>{(0,d.R)(27,e),w.abort()}))}return["actionText","setName","setAttribute","save","ignore","onEnd","getContext","end","get"].forEach((e=>{T[e]=j(E,e,void 0,g?n.K7.softNav:n.K7.spa)})),m.setCurrentRouteName=g?j(E,"routeName",void 0,n.K7.softNav):j(R,"routeName",!0,n.K7.spa),m.noticeError=function(t,r){"string"==typeof t&&(t=new Error(t)),(0,a.p)(f.xV,["API/noticeError/called"],void 0,n.K7.metrics,w),(0,a.p)("err",[t,(0,v.t)(),!1,r,!!x[e]],void 0,n.K7.jserrors,w)},l.RI?(0,u.GG)((()=>I()),!0):I(),m}var k=r(217),T=r(122);const j={accountID:void 0,trustKey:void 0,agentID:void 0,licenseKey:void 0,applicationID:void 0,xpid:void 0},I={};var S=r(284);const O=e=>{const t=e.startsWith("http");e+="/",r.p=t?e:"https://"+e};let P=!1;function K(e,t={},r,n){let{init:a,info:c,loader_config:u,runtime:d={},exposed:f=!0}=t;d.loaderType=r;const p=(0,g.pV)();c||(a=p.init,c=p.info,u=p.loader_config),(0,k.xN)(e.agentIdentifier,a||{}),function(e,t){if(!e)throw new Error("All loader-config objects require an agent identifier!");I[e]=(0,T.a)(t,j);const r=(0,g.nY)(e);r&&(r.loader_config=I[e])}(e.agentIdentifier,u||{}),c.jsAttributes??={},l.bv&&(c.jsAttributes.isWorker=!0),(0,i.x1)(e.agentIdentifier,c);const m=(0,k.D0)(e.agentIdentifier),h=[c.beacon,c.errorBeacon];P||(m.proxy.assets&&(O(m.proxy.assets),h.push(m.proxy.assets)),m.proxy.beacon&&h.push(m.proxy.beacon),E(),(0,g.US)("activatedFeatures",S.B),e.runSoftNavOverSpa&&=!0===m.soft_navigations.enabled&&m.feature_flags.includes("soft_nav")),d.denyList=[...m.ajax.deny_list||[],...m.ajax.block_internal?h:[]],d.ptid=e.agentIdentifier,(0,o.V)(e.agentIdentifier,d),e.ee=s.ee.get(e.agentIdentifier),void 0===e.api&&(e.api=N(e.agentIdentifier,n,e.runSoftNavOverSpa)),void 0===e.exposed&&(e.exposed=f),P=!0}},374:(e,t,r)=>{r.nc=(()=>{try{return document?.currentScript?.nonce}catch(e){}return""})()},860:(e,t,r)=>{"use strict";r.d(t,{$J:()=>u,K7:()=>s,P3:()=>c,XX:()=>i,qY:()=>n,v4:()=>a});const n="events",i="jserrors",o="browser/blobs",a="rum",s={ajax:"ajax",genericEvents:"generic_events",jserrors:i,logging:"logging",metrics:"metrics",pageAction:"page_action",pageViewEvent:"page_view_event",pageViewTiming:"page_view_timing",sessionReplay:"session_replay",sessionTrace:"session_trace",softNav:"soft_navigations",spa:"spa"},c={[s.pageViewEvent]:1,[s.pageViewTiming]:2,[s.metrics]:3,[s.jserrors]:4,[s.spa]:5,[s.ajax]:6,[s.sessionTrace]:7,[s.softNav]:8,[s.sessionReplay]:9,[s.logging]:10,[s.genericEvents]:11},u={[s.pageViewEvent]:a,[s.pageViewTiming]:n,[s.ajax]:n,[s.spa]:n,[s.softNav]:n,[s.metrics]:i,[s.jserrors]:i,[s.sessionTrace]:o,[s.sessionReplay]:o,[s.logging]:"browser/logs",[s.genericEvents]:"ins"}}},n={};function i(e){var t=n[e];if(void 0!==t)return t.exports;var o=n[e]={exports:{}};return r[e](o,o.exports,i),o.exports}i.m=r,i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>"nr-rum-1.281.0.min.js",i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="NRBA-1.281.0.PROD:",i.l=(r,n,o,a)=>{if(e[r])e[r].push(n);else{var s,c;if(void 0!==o)for(var u=document.getElementsByTagName("script"),l=0;l<u.length;l++){var d=u[l];if(d.getAttribute("src")==r||d.getAttribute("data-webpack")==t+o){s=d;break}}if(!s){c=!0;var f={296:"sha512-zqOtfbjYsGTkQScey1O8Hh9fA1+m2RFxLpfv7BWqqTivgQ6iM13v6QJ4d5xykyDwx1GoMFmngC4SKpFn6VciYg=="};(s=document.createElement("script")).charset="utf-8",s.timeout=120,i.nc&&s.setAttribute("nonce",i.nc),s.setAttribute("data-webpack",t+o),s.src=r,0!==s.src.indexOf(window.location.origin+"/")&&(s.crossOrigin="anonymous"),f[a]&&(s.integrity=f[a])}e[r]=[n];var g=(t,n)=>{s.onerror=s.onload=null,clearTimeout(p);var i=e[r];if(delete e[r],s.parentNode&&s.parentNode.removeChild(s),i&&i.forEach((e=>e(n))),t)return t(n)},p=setTimeout(g.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=g.bind(null,s.onerror),s.onload=g.bind(null,s.onload),c&&document.head.appendChild(s)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.p="https://js-agent.newrelic.com/",(()=>{var e={374:0,840:0};i.f.j=(t,r)=>{var n=i.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var o=new Promise(((r,i)=>n=e[t]=[r,i]));r.push(n[2]=o);var a=i.p+i.u(t),s=new Error;i.l(a,(r=>{if(i.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var o=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;s.message="Loading chunk "+t+" failed.\n("+o+": "+a+")",s.name="ChunkLoadError",s.type=o,s.request=a,n[1](s)}}),"chunk-"+t,t)}};var t=(t,r)=>{var n,o,[a,s,c]=r,u=0;if(a.some((t=>0!==e[t]))){for(n in s)i.o(s,n)&&(i.m[n]=s[n]);if(c)c(i)}for(t&&t(r);u<a.length;u++)o=a[u],i.o(e,o)&&e[o]&&e[o][0](),e[o]=0},r=self["webpackChunk:NRBA-1.281.0.PROD"]=self["webpackChunk:NRBA-1.281.0.PROD"]||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})(),(()=>{"use strict";i(374);var e=i(944),t=i(344),r=i(566);class n{agentIdentifier;constructor(){this.agentIdentifier=(0,r.LA)(16)}#e(t,...r){if("function"==typeof this.api?.[t])return this.api[t](...r);(0,e.R)(35,t)}addPageAction(e,t){return this.#e("addPageAction",e,t)}recordCustomEvent(e,t){return this.#e("recordCustomEvent",e,t)}setPageViewName(e,t){return this.#e("setPageViewName",e,t)}setCustomAttribute(e,t,r){return this.#e("setCustomAttribute",e,t,r)}noticeError(e,t){return this.#e("noticeError",e,t)}setUserId(e){return this.#e("setUserId",e)}setApplicationVersion(e){return this.#e("setApplicationVersion",e)}setErrorHandler(e){return this.#e("setErrorHandler",e)}addRelease(e,t){return this.#e("addRelease",e,t)}log(e,t){return this.#e("log",e,t)}}class o extends n{#e(t,...r){if("function"==typeof this.api?.[t])return this.api[t](...r);(0,e.R)(35,t)}start(){return this.#e("start")}finished(e){return this.#e("finished",e)}recordReplay(){return this.#e(t.G4.RECORD)}pauseReplay(){return this.#e(t.G4.PAUSE)}addToTrace(e){return this.#e("addToTrace",e)}setCurrentRouteName(e){return this.#e("setCurrentRouteName",e)}interaction(){return this.#e("interaction")}wrapLogger(e,t,r){return this.#e("wrapLogger",e,t,r)}}var a=i(860),s=i(217);const c=Object.values(a.K7);function u(e){const t={};return c.forEach((r=>{t[r]=function(e,t){return!0===(0,s.gD)(t,"".concat(e,".enabled"))}(r,e)})),t}var l=i(603);var d=i(687),f=i(234),g=i(289),p=i(154),m=i(384);const h=e=>p.RI&&!0===(0,s.gD)(e,"privacy.cookies_enabled");function v(e){return!!(0,m.dV)().o.MO&&h(e)&&!0===(0,s.gD)(e,"session_trace.enabled")}var b=i(389);class y extends f.W{constructor(e,t,r=!0){super(e.agentIdentifier,t),this.auto=r,this.abortHandler=void 0,this.featAggregate=void 0,this.onAggregateImported=void 0,!1===e.init[this.featureName].autoStart&&(this.auto=!1),this.auto?(0,d.Ak)(e.agentIdentifier,t):this.ee.on("manual-start-all",(0,b.J)((()=>{(0,d.Ak)(e.agentIdentifier,this.featureName),this.auto=!0,this.importAggregator(e)})))}importAggregator(t,r={}){if(this.featAggregate||!this.auto)return;let n;this.onAggregateImported=new Promise((e=>{n=e}));const o=async()=>{let o;try{if(h(this.agentIdentifier)){const{setupAgentSession:e}=await i.e(296).then(i.bind(i,861));o=e(t)}}catch(t){(0,e.R)(20,t),this.ee.emit("internal-error",[t]),this.featureName===a.K7.sessionReplay&&this.abortHandler?.()}try{if(!this.#t(this.featureName,o))return(0,d.Ze)(this.agentIdentifier,this.featureName),void n(!1);const{lazyFeatureLoader:e}=await i.e(296).then(i.bind(i,103)),{Aggregate:a}=await e(this.featureName,"aggregate");this.featAggregate=new a(t,r),t.runtime.harvester.initializedAggregates.push(this.featAggregate),n(!0)}catch(t){(0,e.R)(34,t),this.abortHandler?.(),(0,d.Ze)(this.agentIdentifier,this.featureName,!0),n(!1),this.ee&&this.ee.abort()}};p.RI?(0,g.GG)((()=>o()),!0):o()}#t(e,t){switch(e){case a.K7.sessionReplay:return v(this.agentIdentifier)&&!!t;case a.K7.sessionTrace:return!!t;default:return!0}}}var w=i(630);class A extends y{static featureName=w.T;constructor(e,t=!0){super(e,w.T,t),this.importAggregator(e)}}var R=i(908),_=i(843),E=i(878),x=i(782),N=i(863);class k extends y{static featureName=x.T;constructor(e,t=!0){super(e,x.T,t),p.RI&&((0,_.u)((()=>(0,R.p)("docHidden",[(0,N.t)()],void 0,x.T,this.ee)),!0),(0,E.sp)("pagehide",(()=>(0,R.p)("winPagehide",[(0,N.t)()],void 0,x.T,this.ee))),this.importAggregator(e))}}var T=i(969);class j extends y{static featureName=T.TZ;constructor(e,t=!0){super(e,T.TZ,t),this.importAggregator(e)}}new class extends o{constructor(t){super(),p.gm?(this.features={},(0,m.bQ)(this.agentIdentifier,this),this.desiredFeatures=new Set(t.features||[]),this.desiredFeatures.add(A),this.runSoftNavOverSpa=[...this.desiredFeatures].some((e=>e.featureName===a.K7.softNav)),(0,l.j)(this,t,t.loaderType||"agent"),this.run()):(0,e.R)(21)}get config(){return{info:this.info,init:this.init,loader_config:this.loader_config,runtime:this.runtime}}run(){try{const t=u(this.agentIdentifier),r=[...this.desiredFeatures];r.sort(((e,t)=>a.P3[e.featureName]-a.P3[t.featureName])),r.forEach((r=>{if(!t[r.featureName]&&r.featureName!==a.K7.pageViewEvent)return;if(this.runSoftNavOverSpa&&r.featureName===a.K7.spa)return;if(!this.runSoftNavOverSpa&&r.featureName===a.K7.softNav)return;const n=function(e){switch(e){case a.K7.ajax:return[a.K7.jserrors];case a.K7.sessionTrace:return[a.K7.ajax,a.K7.pageViewEvent];case a.K7.sessionReplay:return[a.K7.sessionTrace];case a.K7.pageViewTiming:return[a.K7.pageViewEvent];default:return[]}}(r.featureName).filter((e=>!(e in this.features)));n.length>0&&(0,e.R)(36,{targetFeature:r.featureName,missingDependencies:n}),this.features[r.featureName]=new r(this)}))}catch(t){(0,e.R)(22,t);for(const e in this.features)this.features[e].abortHandler?.();const r=(0,m.Zm)();delete r.initializedAgents[this.agentIdentifier]?.api,delete r.initializedAgents[this.agentIdentifier]?.features,delete this.sharedAggregator;return r.ee.get(this.agentIdentifier).abort(),!1}}}({features:[A,k,j],loaderType:"lite"})})()})();</script> <meta name="viewport" content="width=device-width, initial-scale=1" /> <script type="text/javascript" id="cmp-inserter"> (function() { window.performance.mark('cmpstub start'); const cmpUrl = 'https://cdn.cookielaw.org/consent/cmp.stub.js'; const cmpScript = document.createElement('script'); cmpScript.async = true; cmpScript.type = 'text/javascript'; cmpScript.src = cmpUrl; cmpScript.setAttribute( 'charset', 'UTF-8' ); cmpScript.setAttribute('id', 'cmp-stub'); const cmpNode = document.getElementById('cmp-inserter'); cmpNode.parentNode.insertBefore(cmpScript, cmpNode.nextSibling); window.performance.mark('cmpstub end'); })(); </script> <script type="text/javascript"> /** * OptanonWrapper callback function. We use the OptanonWrapper function to listen for a user event and determine script behavior based on the user event. * * @return void */ function OptanonWrapper() { const otherRegionApplies = ( localStorage.getItem( 'otherRegion' ) !== null ) ? localStorage.getItem( 'otherRegion' ) : false; const ccpaApplies = ( localStorage.getItem( 'ccpaApplies' ) !== null ) ? localStorage.getItem( 'ccpaApplies' ) : false; const OTgeolocation = OneTrust.getGeolocationData(); // We use a block to be able to break from this in order to gain performance. regionFunctionBlock: { if ( otherRegionApplies === 'true' ) { console.log('otherRegionApplies is true'); // Performance. No need to execute other Javascript if the user is not GDPR/CCPA on subsequent visits. break regionFunctionBlock; } else if ( ( 'true' === ccpaApplies ) || ( 'US' === OTgeolocation.country ) ) { console.log('CCPA is true'); // User is within CCPA region. ccpaHelper(); } else { console.log('gdprHelper running'); /* User may be visiting for the first time and we now * need to know if this user is from GDPR or other region. */ gdprHelper(); } } let OTConsentCookieInit = OneTrustGetCookie( 'OptanonConsent' ); let OTConsentGroups = OneTrustGetGroups ( OTConsentCookieInit ); OneTrustGetInitialGroups(); OneTrustSetConsentValues( OTConsentGroups ); /** * Sets a localStorageItem based on its updated value. * */ function setLocalStorageItem( key, value ) { localStorage.setItem( key, value); } /** * Checks presence of query parameter within the URL * Returns true/false depending if it has the word 'regionLog' * and if it's equal to 1. */ function regionLogger() { const queryString = window.location.search; const searchParams = new URLSearchParams( queryString ); return ( ( searchParams.has( 'regionLog' ) ) && ( ( searchParams.get('regionLog') === '1' ) ) ); } /** * Inserts the GDPR stub script. * Then it checks if the user is from a GDPR specific region * using the __tcfapi function which in turn, uses the * getTCData command, which is to retrieve end-user consent * data for IAB purposes, vendors, legitimate interest, publisher * restrictions and more. Calls the gdprUpdateStorage function which is * what sets the localStorage item. */ function gdprHelper() { const tcfApplies = ( localStorage.getItem( 'gdprApplies' ) !== null ) ? localStorage.getItem( 'gdprApplies' ) : false; const gdprLogger = regionLogger(); if ( gdprLogger ) { console.log('gdprHelper helper running'); } // User is a GDPR visitor. if ( ( tcfApplies === true ) || ( typeof __tcfapi === 'function' ) ) { // This will give us a response that the user is within GDPR. __tcfapi('ping', 2, (pingReturn) => { const tcfScriptID = 'tfc-stub'; // We run this only once. if( ( document.getElementById( tcfScriptID ) === null ) && ( true === pingReturn.gdprApplies ) ) { const tcfURL = 'https://cdn.cookielaw.org/consent/tcf.stub.js'; const tcfScript = document.createElement('script'); tcfScript.async = true; tcfScript.type = 'text/javascript'; tcfScript.src = tcfURL; tcfScript.setAttribute( 'charset', 'UTF-8' ); tcfScript.setAttribute('id', tcfScriptID); const tfcNode = document.getElementById('cmp-stub'); tfcNode.parentNode.insertBefore(tcfScript, tfcNode.nextSibling); } }); gdprUpdateStorage(); } else { // User is not GDPR and not CCPA. So it is from outside. We set a localStorage item for performance. const otherRegionApplies = ( localStorage.getItem( 'otherRegion' ) !== null ) ? localStorage.getItem( 'otherRegion' ) : false; if ( otherRegionApplies === false ) { setLocalStorageItem('otherRegion', true); } } } /** * Updates the storage for GDPR only. It checks that the string has changed and if so, it updates the localStorage * for GDPR. */ function gdprUpdateStorage() { const gdprLogger = regionLogger(); __tcfapi( 'addEventListener' , 2, ( tcData, success ) => { if ( success ) { const gdprString = tcData.tcString; const gdprCurrentString = localStorage.getItem( 'gdprString' ); if( gdprLogger ) { console.log('GDPR applies and is set to:' + gdprString); console.log('GDPRData:'); console.log(tcData); } if ( gdprString !== gdprCurrentString ) { if( gdprLogger ) { console.log('GDPR Consent will change on refresh' ); console.log('Old Value: ' + gdprCurrentString ); console.log('New Value: ' + gdprString ); } setLocalStorageItem('gdprApplies', true); setLocalStorageItem('gdprString', gdprString); } } }); } /** * Inserts the CCPA stub script. * Then on page load, it checks if the user is from a CCPA specific region * using the __uspapi function which in turn, uses the * getUSPData command, which is to retrieve end-user consent * data for IAB purposes, vendors, legitimate interest, publisher * restrictions and more. Calls the ccpaUpdateStorage function which is * what sets the localStorage item. */ function ccpaHelper() { setLocalStorageItem('ccpaApplies', true); const ccpaApplies = ( localStorage.getItem( 'ccpaApplies' ) !== null ) ? localStorage.getItem( 'ccpaApplies' ) : false; const ccpaLogger = regionLogger(); if ( ccpaLogger ) { console.log('ccpaHelper helper running'); } const ccpaScriptID = 'ccpa-stub'; const ccpaURL = 'https://cdn.cookielaw.org/opt-out/otCCPAiab.js'; const ccpaScript = document.createElement('script'); ccpaScript.async = true; ccpaScript.type = 'text/javascript'; ccpaScript.src = ccpaURL; ccpaScript.setAttribute('id', ccpaScriptID); ccpaScript.setAttribute('ccpa-opt-out-ids', 'C0001,C0002,C0003,C0004'); ccpaScript.setAttribute( 'charset', 'UTF-8' ); ccpaScript.setAttribute('ccpa-opt-out-geo', 'ca'); ccpaScript.setAttribute('ccpa-opt-out-lspa', 'true'); const ccpaNode = document.getElementById('cmp-stub'); ccpaNode.parentNode.insertBefore(ccpaScript, ccpaNode.nextSibling); // We update the local Storage Item for CCPA. window.addEventListener("load", function () { if ( typeof __uspapi === "function" ) { ccpaUpdateStorage(); } }); } /** * Updates the storage for CCPA only. It checks that the string has changed and if so, it updates the localStorage * for CCPA. */ function ccpaUpdateStorage() { const ccpaLogger = regionLogger(); __uspapi( 'getUSPData' , 1, ( uspData, success ) => { if ( (success) && ( uspData.uspString !== '1---' ) ) { const ccpaString = uspData.uspString; const ccpaCurrentString = localStorage.getItem( 'ccpaString' ); if( ccpaLogger ) { console.log('USPA applies and is set to:' + ccpaString); console.log('USPA Data: '); console.log(uspData); } if ( ccpaString !== ccpaCurrentString ) { if( ccpaLogger ) { console.log('CCPA Consent will change on refresh' ); console.log('Old Value: ' + ccpaCurrentString ); console.log('New Value: ' + ccpaString ); } setLocalStorageItem('ccpaString', ccpaString); } } }); } // Assign OnetrustActiveGroups to a custom initial variable so we can compare any changes to this data layer. function OneTrustGetInitialGroups() { OptanonWrapperCount = ''; OTinitGroups = OnetrustActiveGroups; // See https://community.cookiepro.com/s/article/UUID-66bcaaf1-c7ca-5f32-6760-c75a1337c226?language=en_US } // Returns the OptanonConsent cookie using its name as a parameter. Not parsed. function OneTrustGetCookie( name ) { const value = `; ${document.cookie}`; const parts = value.split(`; ${name}=`); if (parts.length === 2) { return decodeURIComponent( parts.pop().split(';').shift() ); } return; } // Parses the OptanonConsent Cookie values only. We are interested in the groups (which carry the consent). Returns an object with all the values of said cookie. function OneTrustGetConsentObject( OTcookie ) { let OTConsentObj = {}; OTcookie.split('&').forEach( ( pair ) => { if( pair !== '' ) { let splitpair = pair.split('='); let key = splitpair[0].charAt(0).toLowerCase() + splitpair[0].slice(1).split(' ').join(''); OTConsentObj[key] = splitpair[1]; } }); return OTConsentObj; } // Grabs the OptanonConsent cookie, turns this into an object (using OneTrustGetConsentObject), targets the 'groups' value, turns it into an array, removes the first element of the array. function OneTrustGetGroups ( cookie ) { let OTConsentArr = []; let OTConsentGroupsStr = OneTrustGetConsentObject(cookie).groups; OTConsentArr = OTConsentGroupsStr.split(","); OTConsentArr.shift(); return OTConsentArr; } // Sets the consent values based on the groups paramater, which is an array of consent categories that has been parsed from the OptanonConsent cookie. function OneTrustSetConsentValues( groups ){ // Create a json list with the values ​​of each consent. These values ​​will be updated if the user starts to toggle consent. // We then create a local storage item to read these values in other parts of the theme that require it. Converted to json in case we need to keep adding items. let json_consent = {}; json_consent[ "C0002" ] = groups[0].includes('2:1') ? true : false; json_consent[ "C0003" ] = groups[1].includes('3:1') ? true : false; json_consent[ "C0004" ] = groups[2].includes('4:1') ? true : false; let consent = JSON.stringify( json_consent ); localStorage.setItem( 'consent_one_trust_bdc', consent ); } // OneTrust event listener that fires whenever someone confirms cosent preferences (banner). Optanon.OnConsentChanged( function() { OTinitGroups = OnetrustActiveGroups; let OTConsentCookieChanged = OneTrustGetCookie( 'OptanonConsent' ); let OTConsentGroups = OneTrustGetGroups ( OTConsentCookieChanged ); OneTrustSetConsentValues( OTConsentGroups ); }); } </script> <script type="text/javascript" id="ot-inserter"> (function() { const otUrl = 'https://cdn.cookielaw.org/scripttemplates/otSDKStub.js'; const otScript = document.createElement('script'); otScript.async = true; otScript.type = 'text/javascript'; otScript.src = otUrl; otScript.setAttribute('id', 'onetrustSDK'); otScript.setAttribute('charset', 'UTF-8'); otScript.setAttribute('data-domain-script', '1744ffcc-f9fb-436a-97fd-6530afa75829'); const otNode = document.getElementById('ot-inserter'); otNode.parentNode.insertBefore(otScript, otNode.nextSibling); })(); </script> <script>(function(html){html.className = html.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script> <style id="typekit-font-loading"> @import url("https://p.typekit.net/p.css?s=1&k=ewj0jxz&ht=tk&f=12784.12094.12095&a=43290994&app=typekit&e=css"); @font-face { font-family:"franklin-gothic-urw-cond"; src:url("https://use.typekit.net/af/f4a030/000000000000000077359dfc/30/l?primer=fff1a989570eb474b8c22c57cc7199e63bfc7e911b750165d0199218f0b7e7cc&fvd=n5&v=3") format("woff2"),url("https://use.typekit.net/af/f4a030/000000000000000077359dfc/30/d?primer=fff1a989570eb474b8c22c57cc7199e63bfc7e911b750165d0199218f0b7e7cc&fvd=n5&v=3") format("woff"),url("https://use.typekit.net/af/f4a030/000000000000000077359dfc/30/a?primer=fff1a989570eb474b8c22c57cc7199e63bfc7e911b750165d0199218f0b7e7cc&fvd=n5&v=3") format("opentype"); font-display:swap;font-style:normal;font-weight:500;font-stretch:normal; } @font-face { font-family:"franklin-gothic-urw-cond"; src:url("https://use.typekit.net/af/a2031c/0000000000000000000118b9/27/l?primer=fff1a989570eb474b8c22c57cc7199e63bfc7e911b750165d0199218f0b7e7cc&fvd=n7&v=3") format("woff2"),url("https://use.typekit.net/af/a2031c/0000000000000000000118b9/27/d?primer=fff1a989570eb474b8c22c57cc7199e63bfc7e911b750165d0199218f0b7e7cc&fvd=n7&v=3") format("woff"),url("https://use.typekit.net/af/a2031c/0000000000000000000118b9/27/a?primer=fff1a989570eb474b8c22c57cc7199e63bfc7e911b750165d0199218f0b7e7cc&fvd=n7&v=3") format("opentype"); font-display:swap;font-style:normal;font-weight:700;font-stretch:normal; } </style> <style id="cls-ad-css"> [id="ad_lead1"] { min-height: 50px; } @media only screen and (min-width: 768px) { [id="ad_lead1"] { min-height: 90px; } } [id="ad_sectionfront1"], [id="ad_sectionfront2"], [id="ad_articlerail1"], [id="ad_articlerail2"] { position: relative; } [id="ad_sectionfront1"]::before, [id="ad_sectionfront2"]::before, [id="ad_articlerail1"]::before, [id="ad_articlerail2"]::before { content: "Advertisement"; color: #68686d; display: block; font-family:"franklin-gothic-urw-cond"; font-size: .875rem; font-weight: 700; padding-bottom: 0.25rem; text-align: center; text-transform: uppercase; } .m-real-estate-listing__content [id="ad_sectionfront1"]::before, .m-real-estate-listing__content [id="ad_sectionfront2"]::before, .m-real-estate-listing__content [id="ad_articlerail1"]::before, .m-real-estate-listing__content [id="ad_articlerail2"]::before { display: none; } @media only screen and (min-width: 768px) { .m-real-estate-listing__content [id="ad_sectionfront1"]::before, .m-real-estate-listing__content [id="ad_sectionfront2"]::before, .m-real-estate-listing__content [id="ad_articlerail1"]::before, .m-real-estate-listing__content [id="ad_articlerail2"]::before { display: block; } } .m-advert--600 { height: 600px; } .m-sports-bar { min-height: 59px; } </style> <link rel="preconnect" href="https://cdn.cookielaw.org" crossorigin /><link rel="preconnect" href="//ads.pubmatic.com" crossorigin /><link rel="dns-prefetch" href="https://c.amazon-adsystem.com"><link rel="preconnect" href="https://c.amazon-adsystem.com" crossorigin><link rel="preconnect" href="//securepubads.g.doubleclick.net" crossorigin /><link rel="preconnect" href="https://use.typekit.net" crossorigin /><link rel="preconnect" href="https://p.typekit.net" crossorigin /><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /><link rel="preload" as="font" href="https://fonts.googleapis.com/css2?family=Source+Serif+Pro:ital,wght@0,400;0,600;0,700;1,400;1,600;1,700&display=swap" as="style" /><link href="https://fonts.googleapis.com/css2?family=Source+Serif+Pro:ital,wght@0,400;0,600;0,700;1,400;1,600;1,700&display=swap" rel="stylesheet"><link rel="preload" as="font" href="https://use.typekit.net/af/f4a030/000000000000000077359dfa/30/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3" /><link rel="preload" as="font" href="https://use.typekit.net/af/f4a030/000000000000000077359dfa/30/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3" /><link rel="preload" as="font" href="https://use.typekit.net/af/a2031c/0000000000000000000118b9/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3" /><link rel="preload" as="font" href="https://use.typekit.net/af/a2031c/0000000000000000000118b9/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3" /><meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /> <style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style> <script type="text/javascript" id="pwt-inserter"> (function() { window.performance.mark('pwt start'); let setProfile = window.matchMedia('(min-width: 1024px)').matches; const mobileNonGDPR = '12624'; const desktopNonGDPR = '12623'; const mobileGDPR = '12502'; const desktopGDPR = '12501'; let reportingId = ''; function setPWTScript (PWTid) { var url = '//ads.pubmatic.com/AdServer/js/pwt/159928/' + reportingId; var profileVersionId = ''; var wtads = document.createElement('script'); wtads.async = true; wtads.type = 'text/javascript'; wtads.src = url + profileVersionId + '/pwt.js'; var node = document.getElementById('pwt-inserter'); node.parentNode.insertBefore(wtads, node.nextSibling); window.performance.mark('pwt end'); } let regionLock = false; let otherRegionApplies = localStorage.getItem( 'otherRegion' ); let ccpaApplies = localStorage.getItem( 'ccpaApplies' ); let gdprApplies = localStorage.getItem( 'gdprApplies' ); // This check is on subsequent page loads, since the localStorage item // has been already been set. We use a regionLock variable as a lock // to determine whether we need to run a Promise or not. if ( ( 'true' === otherRegionApplies ) || ( 'true' === ccpaApplies ) ){ reportingId = setProfile ? desktopNonGDPR : mobileNonGDPR; regionLock = true; } else if ( 'true' === gdprApplies ) { // It's GDPR, so load GDPR PWT Profile reportingId = setProfile ? desktopGDPR : mobileGDPR; regionLock = true; } // We are unsure what region the first time visitor is, so we need to run // a promise in order to wait until OneTrust is loaded, and two, which // region is this user from? if ( !regionLock ) { // On first load, it is not obvious which region the user is from. const CMPTIMEOUT = 5500; // 1000ms = 1 seconds. // This is the promise callback function, with a SetTimeout that runs every 30ms. function ensureRegionIsSet( CMPTIMEOUT ) { var start = Date.now(); return new Promise( waitForRegion ); // Set the promise object within the ensureRegionIsSet function // waitForRegion makes the decision whether the condition is met // or the timeout has been exceeded which means // this promise will be rejected. function waitForRegion(resolve, reject) { otherRegionApplies = localStorage.getItem( 'otherRegion' ); ccpaApplies = localStorage.getItem( 'ccpaApplies' ); gdprApplies = localStorage.getItem( 'gdprApplies' ); // We want OneTrust to be loaded and two, wait until the localStorage item is set to true for any region. if ( ( typeof OptanonWrapper === 'function') && ( ( 'true' === otherRegionApplies ) || ( 'true' === ccpaApplies ) || ( 'true' === gdprApplies ) )) { resolve("Region is determined"); } else if ( CMPTIMEOUT && ( Date.now() - start ) >= CMPTIMEOUT ) { reject( new Error("timeout") ); } else { setTimeout( waitForRegion.bind(this, resolve, reject), 30 ); } } } // This will run the promise. ensureRegionIsSet( CMPTIMEOUT ).then(function(){ // If it's 'other' or CCPA region, load non GDPR PWT profiles. if ( ( 'true' === otherRegionApplies ) || ( 'true' === ccpaApplies ) ) { reportingId = setProfile ? desktopNonGDPR : mobileNonGDPR; setPWTScript(reportingId); } else { // It's GDPR, load PWT Profile with those modules baked in. reportingId = setProfile ? desktopGDPR : mobileGDPR; setPWTScript(reportingId); } }); } else { setPWTScript(reportingId); } })(); </script> <script src="https://www.boston.com/wp-content/themes/bdc-2020/includes/gam/lazy-load-ad.min.js" type="text/javascript"></script> <script src="//securepubads.g.doubleclick.net/tag/js/gpt.js" type="text/javascript" id="securepubads.g" async></script> <script async src="https://c.amazon-adsystem.com/aax2/apstag.js"></script> <script> window.apstag = window.apstag || { init: function() { apstag._Q.push(["i", arguments, (new Date).getTime()]) }, fetchBids: function() { apstag._Q.push(["f", arguments, (new Date).getTime()]) }, setDisplayBids: function() {}, _Q: [] }; </script> <script id="boston-ads" type="text/javascript"> var PWT = {}; var adLazyLoading = false; var googletag = googletag || {}; var gptRan = false; window.initAdserverFlag = false; var FAILSAFE_TIMEOUT = 600; const DYNAMIC_NAME = '/community'; var adSlots = []; googletag.cmd = googletag.cmd || []; </script> <script id="boston-init-adserver" type="text/javascript"> // this function will act as a lock and will call the GPT API function initAdserver(forced) { if((forced === true && window.initAdserverFlag !== true) || (PWT.a9_BidsReceived && PWT.ow_BidsReceived)){ window.initAdserverFlag = true; PWT.a9_BidsReceived = PWT.ow_BidsReceived = false; if( 'undefined' !== typeof AdLazyLoader ) { adLazyLoading = true; var slotsToLazyLoad = []; for ( var prop in window.adSlots ) { if ( window.adSlots.hasOwnProperty( prop ) ) { slotsToLazyLoad.push( window.adSlots[ prop ] ); } } AdLazyLoader.registerSlots( slotsToLazyLoad ); } else { googletag.pubads().refresh(); } } } </script> <script id="boston-init-tam" type="text/javascript"> var initParams = { pubID: '3453', adServer: 'googletag', videoAdServer: 'DFP' }; /* * If we have CCPA user, pass the consent along. */ const ccpaApplies = localStorage.getItem( 'ccpaApplies' ); if( null !== ccpaApplies ) { //This is a CCPA user, pass the consent. let storageCCPA = localStorage.getItem( 'ccpaString' ); initParams.params = { us_privacy: storageCCPA }; } apstag.init(initParams); let slots = []; slots = [ { slotID: 'ad_lead1', sizes: [[728, 90], [970, 90], [320, 50]] }, { slotID: 'ad_articlerail1', sizes: [[300,250], [300,600], [160,600]] }, { slotID: 'ad_articlerail2', sizes: [[300,250], [300,600], [160,600]] }, ]; // Check if is inarticle1 unit. if ( 'ad_inarticle1' === 'ad_inarticle1' ) { // Push multiformat video & display slot. slots.push( { slotID: 'ad_inarticle1', mediaType: 'multi-format', multiFormatProperties: { display: { sizes: [[ 728, 90 ], [ 970, 90 ], [ 970, 250 ], [ 300, 250 ], [ 320, 100 ], [ 320, 50 ]] }, video: { sizes: [[ 300,400 ]] } } } ); } else if ( 1 === 1 ) { slots.push( { slotID: 'ad_inarticle1', mediaType: 'video', video: { sizes: [[ 1, 1 ], [ 640, 480 ]] } } ); } else { slots.push({ slotID: 'ad_inarticle1', sizes: [[ 728, 90 ], [ 970, 90 ], [ 970, 250 ], [ 300, 250 ], [ 320, 100 ], [ 320, 50 ]] }); } // Check if is inarticle1 unit. if ( 'ad_inarticle2' === 'ad_inarticle1' ) { // Push multiformat video & display slot. slots.push( { slotID: 'ad_inarticle2', mediaType: 'multi-format', multiFormatProperties: { display: { sizes: [[ 728, 90 ], [ 970, 90 ], [ 970, 250 ], [ 300, 250 ], [ 320, 100 ], [ 320, 50 ]] }, video: { sizes: [[ 300,400 ]] } } } ); } else if ( 2 === 1 ) { slots.push( { slotID: 'ad_inarticle_video1', mediaType: 'video', video: { sizes: [[ 1, 1 ], [ 640, 480 ]] } } ); } else { slots.push({ slotID: 'ad_inarticle2', sizes: [[ 728, 90 ], [ 970, 90 ], [ 970, 250 ], [ 300, 250 ], [ 320, 100 ], [ 320, 50 ]] }); } // Check if is inarticle1 unit. if ( 'ad_inarticle3' === 'ad_inarticle1' ) { // Push multiformat video & display slot. slots.push( { slotID: 'ad_inarticle3', mediaType: 'multi-format', multiFormatProperties: { display: { sizes: [[ 728, 90 ], [ 970, 90 ], [ 970, 250 ], [ 300, 250 ], [ 320, 100 ], [ 320, 50 ]] }, video: { sizes: [[ 300,400 ]] } } } ); } else if ( 3 === 1 ) { slots.push( { slotID: 'ad_inarticle2', mediaType: 'video', video: { sizes: [[ 1, 1 ], [ 640, 480 ]] } } ); } else { slots.push({ slotID: 'ad_inarticle3', sizes: [[ 728, 90 ], [ 970, 90 ], [ 970, 250 ], [ 300, 250 ], [ 320, 100 ], [ 320, 50 ]] }); } // Check if is inarticle1 unit. if ( 'ad_inarticle4' === 'ad_inarticle1' ) { // Push multiformat video & display slot. slots.push( { slotID: 'ad_inarticle4', mediaType: 'multi-format', multiFormatProperties: { display: { sizes: [[ 728, 90 ], [ 970, 90 ], [ 970, 250 ], [ 300, 250 ], [ 320, 100 ], [ 320, 50 ]] }, video: { sizes: [[ 300,400 ]] } } } ); } else if ( 4 === 1 ) { slots.push( { slotID: 'ad_inarticle3', mediaType: 'video', video: { sizes: [[ 1, 1 ], [ 640, 480 ]] } } ); } else { slots.push({ slotID: 'ad_inarticle4', sizes: [[ 728, 90 ], [ 970, 90 ], [ 970, 250 ], [ 300, 250 ], [ 320, 100 ], [ 320, 50 ]] }); } // Check if is inarticle1 unit. if ( 'ad_inarticle5' === 'ad_inarticle1' ) { // Push multiformat video & display slot. slots.push( { slotID: 'ad_inarticle5', mediaType: 'multi-format', multiFormatProperties: { display: { sizes: [[ 728, 90 ], [ 970, 90 ], [ 970, 250 ], [ 300, 250 ], [ 320, 100 ], [ 320, 50 ]] }, video: { sizes: [[ 300,400 ]] } } } ); } else if ( 5 === 1 ) { slots.push( { slotID: 'ad_inarticle4', mediaType: 'video', video: { sizes: [[ 1, 1 ], [ 640, 480 ]] } } ); } else { slots.push({ slotID: 'ad_inarticle5', sizes: [[ 728, 90 ], [ 970, 90 ], [ 970, 250 ], [ 300, 250 ], [ 320, 100 ], [ 320, 50 ]] }); } // Check if is inarticle1 unit. if ( 'ad_inarticle6' === 'ad_inarticle1' ) { // Push multiformat video & display slot. slots.push( { slotID: 'ad_inarticle6', mediaType: 'multi-format', multiFormatProperties: { display: { sizes: [[ 728, 90 ], [ 970, 90 ], [ 970, 250 ], [ 300, 250 ], [ 320, 100 ], [ 320, 50 ]] }, video: { sizes: [[ 300,400 ]] } } } ); } else if ( 6 === 1 ) { slots.push( { slotID: 'ad_inarticle5', mediaType: 'video', video: { sizes: [[ 1, 1 ], [ 640, 480 ]] } } ); } else { slots.push({ slotID: 'ad_inarticle6', sizes: [[ 728, 90 ], [ 970, 90 ], [ 970, 250 ], [ 300, 250 ], [ 320, 100 ], [ 320, 50 ]] }); } // Check if is inarticle1 unit. if ( 'ad_inarticle7' === 'ad_inarticle1' ) { // Push multiformat video & display slot. slots.push( { slotID: 'ad_inarticle7', mediaType: 'multi-format', multiFormatProperties: { display: { sizes: [[ 728, 90 ], [ 970, 90 ], [ 970, 250 ], [ 300, 250 ], [ 320, 100 ], [ 320, 50 ]] }, video: { sizes: [[ 300,400 ]] } } } ); } else if ( 7 === 1 ) { slots.push( { slotID: 'ad_inarticle6', mediaType: 'video', video: { sizes: [[ 1, 1 ], [ 640, 480 ]] } } ); } else { slots.push({ slotID: 'ad_inarticle7', sizes: [[ 728, 90 ], [ 970, 90 ], [ 970, 250 ], [ 300, 250 ], [ 320, 100 ], [ 320, 50 ]] }); } apstag.fetchBids({ slots: slots, timeout: 2e3 // Make Sure this timeout is less than or equal to OpenWrap TimeOut. }, function(bids) { googletag.cmd.push(function(){ apstag.setDisplayBids(); PWT.a9_BidsReceived = true; initAdserver(false); }); }); </script> <script id="boston-gam" type="text/javascript"> googletag.cmd.push(function() { var leaderMapping = googletag .sizeMapping() .addSize([0, 0], [[300, 250], [320, 50], [320, 100], [ 325, 508 ], [ 325, 204 ]]) .addSize([768, 200], [[728, 90], [300,250]]) .addSize([960, 200], [[728, 90], [620, 366], [300, 250]]) .addSize([1280, 200], [[970, 250], [970, 90], [728, 90], [620, 366], [300, 250]]) .build(); var leader1Mapping = googletag .sizeMapping() .addSize([0, 0], [320, 50]) .addSize([768, 200], [[768, 90], [728, 90]]) .addSize([1050, 200], [[970, 90], [728, 90]]) .build(); var leader2Mapping = googletag .sizeMapping() .addSize([0, 0], [[300, 250], [320, 100], [320, 50], [ 325, 508 ], [ 325, 204 ]]) .addSize([768, 200], [[728, 90], [300, 250]]) .addSize([1050, 200], [[728, 90], [620, 366], [300, 250]]) .build(); var railMapping = googletag .sizeMapping() .addSize([0, 0], []) .addSize([768, 200], []) .addSize([1050, 200], [[300, 250], [300, 600], [160,600]]) .build(); var videoMapping = googletag .sizeMapping() .addSize([0, 0], [[1, 1], [640, 480]]) .addSize([768, 200], [[1, 1], [640, 480]]) .addSize([1050, 200], [[1, 1], [640, 480]]) .build(); adSlots['ad_lead1'] = googletag .defineSlot('/61381659/boston.com' + DYNAMIC_NAME, [[768, 90], [728, 90], [970, 90], [320, 50]], 'ad_lead1' ) .setTargeting('pos', [['lead1'], ['atf']]) .defineSizeMapping( leader1Mapping ) .addService( googletag.pubads() ); adSlots['ad_articlerail1'] = googletag .defineSlot('/61381659/boston.com' + DYNAMIC_NAME, [[300,250], [300,600], [160,600]], 'ad_articlerail1') .setTargeting('pos', [['articlerail1'], ['atf']]) .defineSizeMapping(railMapping) .addService( googletag.pubads() ); adSlots['ad_articlerail2'] = googletag .defineSlot('/61381659/boston.com' + DYNAMIC_NAME, [[300,250], [300,600], [160,600]], 'ad_articlerail2') .setTargeting('pos', [['articlerail2'], ['atf']]) .defineSizeMapping(railMapping) .addService( googletag.pubads() ); // Dynamically build the in-article ad definitions and add to the config definition based off of the number of in-article ads adSlots['ad_inarticle_video1'] = googletag .defineSlot('/61381659/boston.com' + DYNAMIC_NAME, [[1,1],[640,480]], 'ad_inarticle_video1' ) .setTargeting('pos', [['inarticle_video1'], ['btf']]) .defineSizeMapping( videoMapping ) .addService( googletag.pubads() ); adSlots['ad_inarticle1'] = googletag .defineSlot('/61381659/boston.com' + DYNAMIC_NAME, [[728,90],[970,90],[970,250],[300,250],[320,100],[320,50]], 'ad_inarticle1' ) .setTargeting('pos', [['inarticle1'], ['btf']]) .defineSizeMapping( leader2Mapping ) .addService( googletag.pubads() ); adSlots['ad_inarticle2'] = googletag .defineSlot('/61381659/boston.com' + DYNAMIC_NAME, [[728,90],[970,90],[970,250],[300,250],[320,100],[320,50]], 'ad_inarticle2' ) .setTargeting('pos', [['inarticle2'], ['btf']]) .defineSizeMapping( leader2Mapping ) .addService( googletag.pubads() ); adSlots['ad_inarticle3'] = googletag .defineSlot('/61381659/boston.com' + DYNAMIC_NAME, [[728,90],[970,90],[970,250],[300,250],[320,100],[320,50]], 'ad_inarticle3' ) .setTargeting('pos', [['inarticle3'], ['btf']]) .defineSizeMapping( leader2Mapping ) .addService( googletag.pubads() ); adSlots['ad_inarticle4'] = googletag .defineSlot('/61381659/boston.com' + DYNAMIC_NAME, [[728,90],[970,90],[970,250],[300,250],[320,100],[320,50]], 'ad_inarticle4' ) .setTargeting('pos', [['inarticle4'], ['btf']]) .defineSizeMapping( leader2Mapping ) .addService( googletag.pubads() ); adSlots['ad_inarticle5'] = googletag .defineSlot('/61381659/boston.com' + DYNAMIC_NAME, [[728,90],[970,90],[970,250],[300,250],[320,100],[320,50]], 'ad_inarticle5' ) .setTargeting('pos', [['inarticle5'], ['btf']]) .defineSizeMapping( leader2Mapping ) .addService( googletag.pubads() ); adSlots['ad_inarticle6'] = googletag .defineSlot('/61381659/boston.com' + DYNAMIC_NAME, [[728,90],[970,90],[970,250],[300,250],[320,100],[320,50]], 'ad_inarticle6' ) .setTargeting('pos', [['inarticle6'], ['btf']]) .defineSizeMapping( leader2Mapping ) .addService( googletag.pubads() ); adSlots['nativeteasebot'] = googletag .defineSlot('/61381659/boston.com' + DYNAMIC_NAME, [300,100], 'nativeteasebot') .setTargeting('pos', ['nativeteasebot']) .addService(googletag.pubads()); adSlots['presentedby'] = googletag .defineOutOfPageSlot('/61381659/boston.com' + DYNAMIC_NAME, 'presentedby') .setTargeting('pos', [['presentedby'], ['outofpage']]) .addService(googletag.pubads()); adSlots['oosvideo'] = googletag .defineOutOfPageSlot('/61381659/boston.com' + DYNAMIC_NAME, 'oosvideo') .setTargeting('pos', [['oosvideo'], ['outofpage']]) .addService(googletag.pubads()); // common targetings googletag.pubads() .setTargeting( 'pgtype', 'post' ) .setTargeting( 'authors', 'annie.jonas' ) .setTargeting( 'ptag', 'books' ) .setTargeting( 'tag', 'book-guides,books,cambridge,dorchester,east-boston,guides,holidays,shopping,somerville,things-to-do' ) .setTargeting( 's1', 'boston.com' ) .setTargeting( 's2', 'community' ) .setTargeting( 'pageurl', '_community_books_2024_11_25_the-ultimate-guide-to-independent-bookstores-2024_' ) .setTargeting( 'environment', ['production']) .setTargeting( 'adunblock', ['undefined' !== typeof( window._bcm_il ) ? 'true' : 'false'] ); /* * * BlueConic Reference * https://support.blueconic.com/hc/en-us/articles/115004519689-doubleclick-for-publishers--targeting-only-#adjust-your-google-ad-manager-implementation-code-0-1 * */ if ( typeof Storage !== "undefined" ) { const targetingParamStr = localStorage.getItem("bcDFPTargetingParams"); if ( targetingParamStr ) { const targetingParameters = JSON.parse( targetingParamStr ); targetingParameters.forEach( function( param, index ) { googletag.pubads().setTargeting( param.key, param.value ); }); } } // Register event handlers to observe lazy loading behavior. (this for the QA instructions) googletag.pubads().addEventListener( 'slotRequested', function( event ) { updateSlotStatus( event.slot.getSlotElementId(), 'fetched' ); }); googletag.pubads().addEventListener( 'slotOnload', function( event ) { updateSlotStatus( event.slot.getSlotElementId(), 'rendered' ); }); googletag.pubads().addEventListener( 'slotRenderEnded', function( event ) { var size = event.size; if(size === null) return; var slot = event.slot; var slotDiv = document.getElementById(slot.getSlotElementId()); if (size[0] > slotDiv.clientWidth) { slotDiv.style.width = size[0] + 'px'; } if (size[1] > slotDiv.clientHeight) { slotDiv.style.height = size[1] + 'px'; } }); googletag.pubads().enableSingleRequest(); googletag.pubads().disableInitialLoad(); googletag.enableServices(); /* The above code is a snippet of code that is used to call the Prebid.js library. */ if( typeof PWT.requestBids === 'function' ) { PWT.requestBids( PWT.generateConfForGPT(googletag.pubads().getSlots()), function(adUnitsArray) { PWT.addKeyValuePairsToGPTSlots(adUnitsArray); PWT.ow_BidsReceived = true; initAdserver(false); } ); } // No need to handle "else" part as we have A9 wrapper on page // OpenWrap code END here setTimeout(function() { initAdserver(true); // calling this function with forced mode set to true so that GPT API is always executed }, FAILSAFE_TIMEOUT); if ( (PWT.a9_BidsReceived && PWT.ow_BidsReceived) && ! adLazyLoading && 'undefined' !== typeof AdLazyLoader ) { // This is a fallback for if prebid has already returned and // attempted to register ads to lazy load before the ads have // all been defined. adLazyLoading = true; var slotsToLazyLoad = []; for ( var prop in window.adSlots ) { if ( window.adSlots.hasOwnProperty( prop ) ) { slotsToLazyLoad.push( window.adSlots[ prop ] ); } } AdLazyLoader.registerSlots( slotsToLazyLoad ); } // Checks that there is a video with ads available in the markup. const hasArcVideo = document.getElementsByClassName( 'a-video' ).length > 0 || ( typeof hasArcVideoPlayerAd !== 'undefined' && hasArcVideoPlayerAd ); /** * =================== * Arc Video * =================== */ if ( hasArcVideo ) { const params = [ 'sz=640x480', `iu=/61381659/boston.com${DYNAMIC_NAME}`, 'gdfp_req=1', 'env=vp', 'output=xml_vast3', 'unviewed_position_start=1', 'description_url=https%3A%2F%2Fboston.com', 'ciu_szs=300x250', `cust_params=${buildCustomParams()}`, ].join('&') window.PoWaSettings = window.PoWaSettings || {}; window.PoWaSettings.advertising = window.PoWaSettings.advertising || {}; if ( typeof hasArcVideoPlayerAd !== 'undefined' && hasArcVideoPlayerAd ) { /** * Calculates the formatted duration of a video in hours, minutes, and seconds. * * @param {Object} videoData - An object containing video data such as duration. * @param {number} videoData.duration - The duration of the video in milliseconds. * * @return {string} - The formatted duration of the video in the format hh:mm:ss. */ const getTime = (videoData) => { if ( !videoData.duration ) return ''; const duration = videoData.duration / 1000; const hours = Math.floor(duration / 3600); const minutes = Math.floor(duration / 60) % 60; const seconds = Math.floor(duration % 60); const hourDisplay = hours ? `${hours}:` : ''; const minuteDisplay = hours && minutes < 10 ? `0${minutes}:` : `${minutes}:`; const secondDisplay = seconds < 10 ? `0${seconds}` : seconds; return `${hourDisplay}${minuteDisplay}${secondDisplay}`; }; // Saves the listener interval ID. let intervalPoWaId; /** * In order to create the promo markup, the script needs to override values of a variable stored in the window object. * That is the reason to create an interval that listens to PoWaSettings as early in the execution as possible. */ function setWindowPoWaSettingsPromo() { if ( window.PoWaSettings ) { const playButtonSVG = `<svg class="bdc-arc-promo__play" height="20px" viewBox="0 0 24 40" width="12px"><title>Play</title><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="Play" transform="translate(0.916016, 0.000000)" fill="#FFFFFF" fill-rule="nonzero"><path d="M22.150346,18.47837 L19.03045,15.69057 L19.032738,15.68853 L2.182097,0.62952 C1.708623,0.20849 1.091049,-0.00203 0.473474,9.99999998e-06 C0.372832,9.99999998e-06 0.274478,0.00615 0.171549,0.01841 L0.002287,0.0368 L0.002287,25.268 L0,25.268 L0,39.9673 L0.176123,39.98365 C0.276765,39.99591 0.375119,40 0.473474,40 L0.480336,40 C1.093336,40 1.708623,39.79153 2.17981,39.37663 L22.150346,21.52778 C22.62382,21.10879 22.859414,20.55491 22.857126,20.00103 C22.859414,19.45124 22.62382,18.8994 22.150346,18.47837"></path></g></g></svg> `; // Play button SVG. const logoSVG = `<svg class="bdc-arc-promo__logo" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="svg47" version="1.1" viewBox="0 0 104 40" height="40" width="104"><title id="title2">BDC Logo</title><defs id="defs9"><path id="path-1" d="M 0.99414923,0.99002979 V 330.92546 H 79.979206 c 43.720834,0 66.151404,-22.04811 66.151404,-62.086 v 0 -62.09308 c 0,-20.20663 -10.56015,-37.62272 -30.3914,-45.42773 v 0 c 18.90343,-6.84179 28.54284,-23.34423 28.54284,-43.55086 v 0 -54.677601 c 0,-40.052053 -22.96884,-62.10015921 -66.165566,-62.10015921 v 0 z M 58.101082,49.739505 h 13.704814 c 10.014783,0 15.574618,6.863031 15.574618,18.733453 v 0 49.103602 c 0,12.06166 -5.38277,18.91052 -15.574618,18.91052 v 0 H 58.101082 Z m -0.19123,134.569235 h 12.401617 c 13.364849,0 18.917601,7.42963 18.733453,21.50983 v 0 57.45397 c 0,12.06166 -5.368604,18.90344 -15.567535,18.90344 v 0 H 57.909852 Z" /><path id="path-3" d="M 0.30715319,65.691033 V 271.43322 c 0,39.83958 29.27943181,65.61313 73.02151481,65.61313 v 0 c 43.749162,0 72.681552,-25.58232 72.681552,-65.61313 v 0 -205.742187 c 0,-39.867906 -28.74116,-65.62020709 -72.476157,-65.62020709 v 0 C 29.79198,0.07082591 0.49838315,25.823127 0.30715319,65.691033 Z M 57.768215,267.90609 V 69.388145 c 0,-12.422864 5.552752,-20.178302 15.560453,-20.178302 v 0 c 10.206014,0 15.213406,7.755438 15.213406,20.178302 v 0 198.517945 c 0,12.43703 -5.007392,20.21372 -15.213406,20.21372 v 0 c -10.007701,0 -15.560453,-7.77669 -15.560453,-20.21372 z" /><path id="path-5" d="m 0.74508222,65.322738 v 45.597722 c 0,26.50306 8.72575228,40.77448 25.77354878,54.11808 v 0 l 47.998721,39.83957 c 7.797933,7.43672 10.942603,12.99656 10.942603,26.70846 v 0 H 85.09166 v 36.31952 c 0,12.43703 -4.10082,20.21372 -14.278503,20.21372 v 0 c -10.007702,0 -14.646799,-7.77669 -14.646799,-20.21372 v 0 -59.67791 H 0.19264011 v 63.94163 c 0,40.04497 26.70136889,65.26608 70.25930389,65.26608 v 0 c 43.182556,0 72.100776,-25.22111 72.100776,-65.26608 v 0 -53.38857 c 0,-26.50306 -9.08696,-40.76031 -26.12768,-54.111 v 0 L 68.617553,124.63236 C 60.805455,117.22397 57.660785,111.64997 57.660785,97.93807 v 0 -28.549925 c 0,-12.422864 4.447867,-20.178302 14.632633,-20.178302 v 0 c 10.206014,0 14.271421,7.755438 14.271421,20.178302 v 0 53.756865 H 142.17026 V 65.322738 c 0,-40.052053 -26.68012,-65.25191209 -70.238054,-65.25191209 v 0 c -43.565018,0 -71.18712378,25.19985909 -71.18712378,65.25191209 z" /><path id="path-7" d="M 0.18414737,65.691033 V 271.43322 c 0,39.83958 29.28651463,65.61313 73.02859763,65.61313 v 0 c 43.734995,0 72.646135,-25.58232 72.646135,-65.61313 v 0 -205.742187 c 0,-39.867906 -29.08112,-65.62020709 -72.646135,-65.62020709 v 0 C 29.647727,0.07082591 0.18414737,25.823127 0.18414737,65.691033 Z M 57.638127,267.90609 V 69.388145 c 0,-12.422864 5.566917,-20.178302 15.574618,-20.178302 v 0 c 10.191848,0 15.192158,7.755438 15.192158,20.178302 v 0 198.517945 c 0,12.43703 -5.00031,20.21372 -15.192158,20.21372 v 0 c -10.007701,0 -15.574618,-7.77669 -15.574618,-20.21372 z" /><path id="path-9" d="m 1106.8983,130.37634 v 76.47073 c 0,14.81678 10.8788,24.38537 27.1475,24.38537 v 0 c 16.2546,0 26.9989,-9.49776 26.9989,-24.38537 v 0 -76.47073 c 0,-14.8097 -10.7443,-24.38536 -26.9989,-24.38536 v 0 c -16.2687,0 -27.1475,9.57566 -27.1475,24.38536 z m 21.354,75.16754 v -73.77935 c 0,-4.62494 2.0044,-7.51463 5.7935,-7.51463 v 0 c 3.7892,0 5.6449,2.88969 5.6449,7.51463 v 0 73.77935 c 0,4.62493 -1.8557,7.50046 -5.6449,7.50046 v 0 c -3.7183,0 -5.7935,-2.87553 -5.7935,-7.50046 z" /></defs><g style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:1" transform="matrix(0.06987876,0,0,0.06987876,7.3493524,8.3563326)" id="BDC_Logo_2020_Full_White"><g transform="translate(27,22.137254)" id="COM"><g transform="translate(0,2.784991)" id="Group-3"><mask fill="white" id="mask-2"><use height="100%" width="100%" y="0" x="0" id="use11" xlink:href="#path-1" /></mask><g id="Clip-2" /><polygon style="fill:#ffffff" points="239.40125,424.18902 239.40125,-92.273531 -92.262328,-92.273531 -92.262328,424.18902 " mask="url(#mask-2)" id="Fill-1" /></g><g transform="translate(162.32589)" id="Group-6"><mask fill="white" id="mask-4"><use height="100%" width="100%" y="0" x="0" id="use17" xlink:href="#path-3" /></mask><g id="Clip-5" /><polygon style="fill:#ffffff" points="239.2667,430.30991 239.2667,-93.192734 -92.956407,-93.192734 -92.956407,430.30991 " mask="url(#mask-4)" id="Fill-4" /></g><g transform="translate(325.0142)" id="Group-9"><mask fill="white" id="mask-6"><use height="100%" width="100%" y="0" x="0" id="use23" xlink:href="#path-5" /></mask><g id="Clip-8" /><polygon style="fill:#ffffff" points="235.81628,430.69945 235.81628,-93.192734 -93.056755,-93.192734 -93.056755,430.69945 " mask="url(#mask-6)" id="Fill-7" /></g><polygon style="fill:#ffffff" points="616.20077,55.310787 616.20077,3.7778541 475.14388,3.7778541 475.14388,55.112475 517.05157,55.112475 517.05157,333.69912 574.4843,333.69912 574.4843,55.112475 574.4843,55.310787 " id="Fill-10" /><polygon style="fill:#ffffff" points="892.02236,333.69912 941.16138,333.69912 941.16138,3.7778541 889.24599,3.7778541 889.24599,108.49396 890.16672,177.82545 889.24599,177.82545 851.99156,3.7778541 793.2273,3.7778541 793.2273,333.69912 845.13561,333.69912 845.13561,196.37475 844.21487,132.42604 845.13561,132.42604 " id="Fill-14" /><g transform="translate(625.65744)" id="Group-13"><mask fill="white" id="mask-8"><use height="100%" width="100%" y="0" x="0" id="use31" xlink:href="#path-7" /></mask><g id="Clip-12" /><polygon style="fill:#ffffff" points="239.12244,430.30991 239.12244,-93.192734 -93.086495,-93.192734 -93.086495,430.30991 " mask="url(#mask-8)" id="Fill-11" /></g><polygon style="fill:#ffffff" points="1280.7886,333.59429 1356.1191,333.59429 1356.1191,3.6659492 973.64498,3.6659492 973.64498,56.119619 1304.9898,56.119619 1304.9898,281.13354 1241.9831,281.13354 1241.9831,324.98186 1142.8977,281.13354 973.64498,281.13354 973.64498,333.59429 1144.895,333.59429 1280.7886,393.72549 " id="Fill-15" /><polygon style="fill:#ffffff" points="1026.8791,231.25368 1026.8791,202.2009 997.84761,202.2009 997.84761,231.25368 " id="Fill-16" /><polygon style="fill:#ffffff" points="1188.5549,176.95146 1188.4203,152.70066 1188.7603,152.70066 1197.1036,231.23244 1213.2873,231.23244 1221.7651,152.70066 1222.1051,152.70066 1221.7651,176.95146 1221.7651,231.23244 1241.2706,231.23244 1241.2706,108.60445 1212.9473,108.60445 1205.4327,184.11904 1205.0927,184.11904 1197.5852,108.60445 1169.0565,108.60445 1169.0565,231.23244 1188.5549,231.23244 " id="Fill-23" /><mask fill="white" id="mask-10"><use height="100%" width="100%" y="0" x="0" id="use40" xlink:href="#path-9" /></mask><use height="100%" width="100%" y="0" x="0" style="fill:#ffffff" xlink:href="#path-9" id="Clip-21" /><path style="fill:#ffffff" id="Clip-18" d="m 1046.8804,130.37634 v 76.47073 c 0,14.81678 10.7514,24.38537 26.8005,24.38537 v 0 c 16.1979,0 26.1135,-9.49776 26.1135,-24.38537 v 0 -24.7324 h -20.8086 v 23.42921 c 0,4.62493 -1.5157,7.51463 -5.3049,7.51463 v 0 c -3.7254,0 -5.4394,-2.8897 -5.4394,-7.51463 v 0 -73.79352 c 0,-4.61077 1.6573,-7.50046 5.4394,-7.50046 v 0 c 3.7892,0 5.3049,2.88969 5.3049,7.50046 v 0 21.70106 h 20.8086 v -23.07508 c 0,-14.8097 -9.9156,-24.39953 -26.1135,-24.39953 v 0 c -16.0491,0 -26.8005,9.58983 -26.8005,24.39953 z" /></g></g></svg> `; // Play button SVG. window.PoWaSettings.promo = window.PoWaSettings.promo || { template: (settings) => { return ` <div class="bdc-arc-promo powa-click-promo-play" ${settings.image ? ` style="background-image: url('${settings.image}')"` : ''}> <div class="bdc-arc-promo__bar"> <div class="bdc-arc-promo__controls"> ${playButtonSVG} <span class="bdc-arc-promo__duration">${getTime(settings.videoData)}</span> </div> ${logoSVG} </div> </div> `; }, style: () => ` .powa-shot { background-position: center; background-size: cover; height: 100%; position: absolute; width: 100%; } .bdc-arc-promo { background-position: center; background-size: cover; display: flex; height: 100%; } .bdc-arc-promo__bar { display: flex; margin-top: auto; padding: 10px; width: 100%; } .bdc-arc-promo__controls { align-items: center; background: #0000007d; display: inline-flex; margin-bottom: -10px; margin-left: -10px; margin-top: auto; max-height: 40px; padding: 10px; } .bdc-arc-promo__controls .bdc-arc-promo__play { margin-right: 10px; } .bdc-arc-promo__logo { margin-left: auto; opacity: .5; } .bdc-arc-promo__duration { color: #FFFFFF; font-family: "franklin-gothic-urw-cond", arial; } .bdc-arc-promo, .bdc-arc-promo__controls svg { cursor: pointer; } `, }; stopWindowPoWaListening(); } } // Starts the listener interval. function startWindowPoWaListening() { intervalPoWaId = setInterval(setWindowPoWaSettingsPromo, 100); } // Stops the listener interval. function stopWindowPoWaListening() { clearInterval(intervalPoWaId); } // Loads the listener interval as soon as the site has started. window.addEventListener('DOMContentLoaded', startWindowPoWaListening); window.PoWaSettings.advertising.adBar = true; window.addEventListener('powaError', function () { document.getElementsByClassName('a-arc-video-advert')[0].remove(); }); } // Define the ad tag to be used by the player. window.PoWaSettings.advertising.adTag = function () { return `//pubads.g.doubleclick.net/gampad/ads?${params}`; }; /** * Builds the custom parameters needed for the ARC video preroll * * @return string - URL encoded string of parameters */ function buildCustomParams() { const getCurrentBreakPoint = function() { if ( window.outerWidth < 768 ) { return 'mobile'; } if ( window.outerWidth < 960 ) { return 'tablet'; } return 'desktop'; }; const getTestQueryString = function() { var queryString = window.location.search; var regex = /[\?\&]test=([^&]*)/; return queryString.match( regex ) ? queryString.match( regex )[1] : ''; }; const customParams = [ 'pos=preroll', 'breakpoint=' + getCurrentBreakPoint(), 'test=' + getTestQueryString(), ]; googletag .pubads() .getTargetingKeys() .forEach((key) => customParams.push(`${key}=${googletag.pubads().getTargeting(key)}`)); return encodeURIComponent( customParams.join('&') .replace('pgtype=post', 'pgtype=article') // Match legacy ad call format ); }; } }); //googletag.cmd.push /* * Updating the status of the slot. * This is only to check behaivor on branch env */ function updateSlotStatus( slotId, state ) { var elem = document.getElementById( slotId ); elem.className = 'activated'; console.log( slotId + ' status: ' + state ); } </script> <!-- This site is optimized with the Yoast SEO Premium plugin v23.0 (Yoast SEO v23.0) - https://yoast.com/wordpress/plugins/seo/ --> <title>The ultimate guide to independent bookstores in Greater Boston</title> <meta name="description" content="A new era of niche, independent bookstores is taking Greater Boston by storm – and shows no signs of slowing down." /> <link rel="canonical" href="https://www.boston.com/community/books/2024/11/25/the-ultimate-guide-to-independent-bookstores-2024/" /> <meta property="og:locale" content="en_US" /> <meta property="og:type" content="article" /> <meta property="og:title" content="The ultimate guide to independent bookstores in Greater Boston and beyond" /> <meta property="og:description" content="A new era of niche, independent bookstores is taking Greater Boston by storm – and shows no signs of slowing down." /> <meta property="og:url" content="https://www.boston.com/community/books/2024/11/25/the-ultimate-guide-to-independent-bookstores-2024/" /> <meta property="og:site_name" content="Boston.com" /> <meta property="article:publisher" content="https://www.facebook.com/boston" /> <meta property="article:published_time" content="2024-11-25T15:27:50+00:00" /> <meta property="article:modified_time" content="2025-01-14T21:23:08+00:00" /> <meta property="og:image" content="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_Wiggs__Quest_1-6740d4e00866c-768x432.jpg" /> <meta property="og:image:width" content="2560" /> <meta property="og:image:height" content="1714" /> <meta property="og:image:type" content="image/jpeg" /> <meta name="author" content="Annie Jonas" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:description" content="You’re never too far from a great bookstore if you live in Greater Boston." /> <meta name="twitter:image" content="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_Wiggs__Quest_1-6740d4e00866c-768x432.jpg" /> <meta name="twitter:creator" content="@BostonDotCom" /> <meta name="twitter:site" content="@BostonDotCom" /> <meta name="twitter:label1" content="Written by" /> <meta name="twitter:data1" content="Annie Jonas" /> <meta name="twitter:label2" content="Est. reading time" /> <meta name="twitter:data2" content="21 minutes" /> <script type="application/ld+json" class="yoast-schema-graph">{ "@context": "https://schema.org", "@graph": [ { "@type": "NewsArticle", "@id": "https://www.boston.com/community/books/2024/11/25/the-ultimate-guide-to-independent-bookstores-2024/#article", "isPartOf": { "@id": "https://www.boston.com/community/books/2024/11/25/the-ultimate-guide-to-independent-bookstores-2024/" }, "author": [ { "@id": "https://www.boston.com/#/schema/person/3051811ba8f22a1247501576226708ef" } ], "headline": "The ultimate guide to independent bookstores in Greater Boston and beyond", "datePublished": "2024-11-25T15:27:50+00:00", "dateModified": "2025-01-14T21:23:08+00:00", "mainEntityOfPage": { "@id": "https://www.boston.com/community/books/2024/11/25/the-ultimate-guide-to-independent-bookstores-2024/" }, "wordCount": 1955, "commentCount": 0, "publisher": { "@id": "https://www.boston.com/#organization" }, "image": { "@id": "https://www.boston.com/community/books/2024/11/25/the-ultimate-guide-to-independent-bookstores-2024/#primaryimage" }, "thumbnailUrl": "https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_Wiggs__Quest_1-6740d4e00866c-scaled.jpg", "keywords": [ "Book Guides", "Books", "Cambridge", "Dorchester", "East Boston", "Guides", "Holidays", "Shopping", "Somerville", "Things to Do" ], "articleSection": [ "Community" ], "inLanguage": "en-US", "potentialAction": [ { "@type": "CommentAction", "name": "Comment", "target": [ "https://www.boston.com/community/books/2024/11/25/the-ultimate-guide-to-independent-bookstores-2024/#respond" ] } ], "copyrightYear": "2024", "copyrightHolder": { "@id": "https://www.boston.com/#organization" } }, { "@type": "WebPage", "@id": "https://www.boston.com/community/books/2024/11/25/the-ultimate-guide-to-independent-bookstores-2024/", "url": "https://www.boston.com/community/books/2024/11/25/the-ultimate-guide-to-independent-bookstores-2024/", "name": "The ultimate guide to independent bookstores in Greater Boston", "isPartOf": { "@id": "https://www.boston.com/#website" }, "primaryImageOfPage": { "@id": "https://www.boston.com/community/books/2024/11/25/the-ultimate-guide-to-independent-bookstores-2024/#primaryimage" }, "image": { "@id": "https://www.boston.com/community/books/2024/11/25/the-ultimate-guide-to-independent-bookstores-2024/#primaryimage" }, "thumbnailUrl": "https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_Wiggs__Quest_1-6740d4e00866c-scaled.jpg", "datePublished": "2024-11-25T15:27:50+00:00", "dateModified": "2025-01-14T21:23:08+00:00", "description": "A new era of niche, independent bookstores is taking Greater Boston by storm – and shows no signs of slowing down.", "breadcrumb": { "@id": "https://www.boston.com/community/books/2024/11/25/the-ultimate-guide-to-independent-bookstores-2024/#breadcrumb" }, "inLanguage": "en-US", "potentialAction": [ { "@type": "ReadAction", "target": [ "https://www.boston.com/community/books/2024/11/25/the-ultimate-guide-to-independent-bookstores-2024/" ] } ] }, { "@type": "ImageObject", "inLanguage": "en-US", "@id": "https://www.boston.com/community/books/2024/11/25/the-ultimate-guide-to-independent-bookstores-2024/#primaryimage", "url": "https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_Wiggs__Quest_1-6740d4e00866c-scaled.jpg", "contentUrl": "https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_Wiggs__Quest_1-6740d4e00866c-scaled.jpg", "width": 2560, "height": 1714, "caption": "Caroline Sheridan runs Side Quest Books and Games, a new \"fairy-inspired\" fantasy bookstore in Bow Market." }, { "@type": "BreadcrumbList", "@id": "https://www.boston.com/community/books/2024/11/25/the-ultimate-guide-to-independent-bookstores-2024/#breadcrumb", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://www.boston.com/" }, { "@type": "ListItem", "position": 2, "name": "The ultimate guide to independent bookstores in Greater Boston and beyond" } ] }, { "@type": "WebSite", "@id": "https://www.boston.com/#website", "url": "https://www.boston.com/", "name": "Boston.com", "description": "Boston.com", "publisher": { "@id": "https://www.boston.com/#organization" }, "potentialAction": [ { "@type": "SearchAction", "target": { "@type": "EntryPoint", "urlTemplate": "https://www.boston.com/?s={search_term_string}" }, "query-input": "required name=search_term_string" } ], "inLanguage": "en-US" }, { "@type": "NewsMediaOrganization", "@id": "https://www.boston.com/#organization", "name": "Boston.com", "url": "https://www.boston.com", "logo": "https://bdc2020.o0bc.com/wp-content/uploads/2021/05/Boston.com-Logo-609cb231cf4d6.png", "image": { "@id": "https://www.boston.com/#/schema/logo/image/" }, "sameAs": [ "https://www.facebook.com/boston", "https://x.com/BostonDotCom", "https://www.instagram.com/boston/", "https://www.youtube.com/channel/UC8IkdxFyPXgw11n4Ew0osHQ" ], "address": "1 Exchange Place, Boston, MA 02109", "areaServed": [ "Boston", "Massachusetts", "New England" ], "description": "Boston.com is the region’s leading digital destination for information on all things Boston. Millions of visitors turn to our site for the best coverage of breaking news, things to do, sports, and entertainment in Greater Boston and beyond.", "email": "tips@boston.com", "foundingDate": "1995-10-30", "legalName": "Boston Globe Media Partners", "location": "Boston", "masthead": "https://www.boston.com/contact-us/" }, { "@type": "Person", "@id": "https://www.boston.com/#/schema/person/3051811ba8f22a1247501576226708ef", "name": "Annie Jonas", "image": { "@type": "ImageObject", "inLanguage": "en-US", "@id": "https://www.boston.com/#/schema/person/image/486678bb86085d6ba820e9b64ecd2ebc", "url": "https://www.boston.com/wp-content/uploads/2024/10/cropped-IMG_2875-671fb6f808237-671fb70325313-96x96.jpg", "contentUrl": "https://www.boston.com/wp-content/uploads/2024/10/cropped-IMG_2875-671fb6f808237-671fb70325313-96x96.jpg", "caption": "Annie Jonas" }, "description": "Annie Jonas is a Community writer at Boston.com. She works on understanding Boston.com readers by centering their voices, answering their questions, and sharing their stories. She also contributes to Boston.com&rsquo;s Book Club newsletter. Annie was previously a local editor at Patch.com in Massachusetts and a freelance newsletter writer at the Financial Times in New York.", "url": "https://www.boston.com/author/annie-jonas/" } ] }</script> <!-- / Yoast SEO Premium plugin. --> <link rel='dns-prefetch' href='//apps.bostonglobe.com' /> <link rel='dns-prefetch' href='//static.chartbeat.com' /> <link rel='dns-prefetch' href='//cdn.blueconic.net' /> <link rel='dns-prefetch' href='//buy.tinypass.com' /> <link rel="alternate" type="application/rss+xml" title="Boston.com &raquo; Feed" href="https://www.boston.com/feed/" /> <link rel='stylesheet' id='wp-block-library-css' href='https://bdc2020.o0bc.com/wp-includes/css/dist/block-library/style.min.css?ver=6.7.2' type='text/css' media='all' /> <style id='co-authors-plus-coauthors-style-inline-css' type='text/css'> .wp-block-co-authors-plus-coauthors.is-layout-flow [class*=wp-block-co-authors-plus]{display:inline} </style> <style id='co-authors-plus-avatar-style-inline-css' type='text/css'> .wp-block-co-authors-plus-avatar :where(img){height:auto;max-width:100%;vertical-align:bottom}.wp-block-co-authors-plus-coauthors.is-layout-flow .wp-block-co-authors-plus-avatar :where(img){vertical-align:middle}.wp-block-co-authors-plus-avatar:is(.alignleft,.alignright){display:table}.wp-block-co-authors-plus-avatar.aligncenter{display:table;margin-inline:auto} </style> <style id='co-authors-plus-image-style-inline-css' type='text/css'> .wp-block-co-authors-plus-image{margin-bottom:0}.wp-block-co-authors-plus-image :where(img){height:auto;max-width:100%;vertical-align:bottom}.wp-block-co-authors-plus-coauthors.is-layout-flow .wp-block-co-authors-plus-image :where(img){vertical-align:middle}.wp-block-co-authors-plus-image:is(.alignfull,.alignwide) :where(img){width:100%}.wp-block-co-authors-plus-image:is(.alignleft,.alignright){display:table}.wp-block-co-authors-plus-image.aligncenter{display:table;margin-inline:auto} </style> <link rel='stylesheet' id='wp_blocks_embed_weather_podcast-cgb-style-css-css' href='https://bdc2020.o0bc.com/wp-content/plugins/wp-block-embed-weather-podcast/dist/blocks.style.build.css' type='text/css' media='all' /> <style id='elasticpress-related-posts-style-inline-css' type='text/css'> .editor-styles-wrapper .wp-block-elasticpress-related-posts ul,.wp-block-elasticpress-related-posts ul{list-style-type:none;padding:0}.editor-styles-wrapper .wp-block-elasticpress-related-posts ul li a>div{display:inline} </style> <style id='classic-theme-styles-inline-css' type='text/css'> /*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} </style> <style id='global-styles-inline-css' type='text/css'> :root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--red: #bb2525;--wp--preset--color--background-black: #1a1a1a;--wp--preset--color--line-gray: #e1e1e1;--wp--preset--color--blue: #2c74de;--wp--preset--color--light-gray: #f1f1f1;--wp--preset--color--off-white: #fbf1e7;--wp--preset--color--mid-gray: #b6b6b6;--wp--preset--color--dark-gray: #68686d;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} :where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} :where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} :root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;} </style> <link rel='stylesheet' id='tenup-block-library-frontend-accordion-styles-css' href='https://bdc2020.o0bc.com/wp-content/plugins/block-library/dist/css/frontend-accordion-styles.css?ver=d899f5cabdebab30a4d631759350a871' type='text/css' media='all' /> <link rel='stylesheet' id='tablepress-default-css' href='https://bdc2020.o0bc.com/wp-content/plugins/tablepress-premium/css/build/default.css?ver=2.4.4-BGMP' type='text/css' media='all' /> <style id='tablepress-default-inline-css' type='text/css'> .tablepress{--style-variation:custom;--head-text-color:#7e7e7e;--head-bg-color:#fff;--head-active-bg-color:#d0d0d0;--odd-bg-color:#fff;--hover-bg-color:#d0d0d0;border:1px solid grey;border-collapse:collapse}.tablepress thead th{text-transform:uppercase;font-weight:700;border-left:1px solid grey;border-right:1px solid grey;border-bottom:3px solid grey}.tablepress tbody td a{color:var(--c-red);font-weight:700;text-decoration:none}.tablepress tbody td a:hover{color:var(--c-red);font-weight:700;text-decoration:underline;text-align:center}.tablepress tbody td{border-left:1px solid grey;border-right:1px solid grey}.tablepress td,.tablepress th,.dt-search,.dt-length,.dt-info,.dt-paging a,.dt-buttons{font-family:var(--f-primary)}.tablepress img{max-width:100%;height:auto}.tablepress-id-132 .column-1,.tablepress-id-132 .column-3,.tablepress-id-132 .column-5,{background-color:#d3dff2} </style> <link rel='stylesheet' id='tablepress-datatables-buttons-css' href='https://bdc2020.o0bc.com/wp-content/plugins/tablepress-premium/modules/css/build/datatables.buttons.css?ver=2.4.4-BGMP' type='text/css' media='all' /> <link rel='stylesheet' id='tablepress-datatables-columnfilterwidgets-css' href='https://bdc2020.o0bc.com/wp-content/plugins/tablepress-premium/modules/css/build/datatables.columnfilterwidgets.css?ver=2.4.4-BGMP' type='text/css' media='all' /> <link rel='stylesheet' id='tablepress-responsive-tables-css' href='https://bdc2020.o0bc.com/wp-content/plugins/tablepress-premium/modules/css/build/responsive-tables.css?ver=2.4.4-BGMP' type='text/css' media='all' /> <link rel='stylesheet' id='global-css' href='https://bdc2020.o0bc.com/wp-content/themes/bdc-2020/dist/css/global.css?ver=476348999e4a910c7553fd27c05ad0c1' type='text/css' media='all' /> <link rel='stylesheet' id='base-css' href='https://bdc2020.o0bc.com/wp-content/themes/bdc-2020/dist/css/base.css?ver=d64ef26a96a53d14751b910ee35561c9' type='text/css' media='all' /> <link rel='stylesheet' id='blocks-css' href='https://bdc2020.o0bc.com/wp-content/themes/bdc-2020/dist/css/blocks.css?ver=abad910b7fadab2ee42437f732afcc64' type='text/css' media='all' /> <link rel='stylesheet' id='molecules-css' href='https://bdc2020.o0bc.com/wp-content/themes/bdc-2020/dist/css/molecules.css?ver=62bdd78b204a0df54522d6e2c8b866dc' type='text/css' media='all' /> <link rel='stylesheet' id='organisms-css' href='https://bdc2020.o0bc.com/wp-content/themes/bdc-2020/dist/css/organisms.css?ver=eee026e343b2bff11349dde60c211c06' type='text/css' media='all' /> <link rel='stylesheet' id='styles-css' href='https://bdc2020.o0bc.com/wp-content/themes/bdc-2020/dist/css/style.css?ver=a0f111604c687f9ca6d7f7b77c5a49c6' type='text/css' media='all' /> <link rel='stylesheet' id='bdc-real-estate-css' href='https://bdc2020.o0bc.com/wp-content/themes/bdc-2020/dist/css/real-estate.css?ver=b300d7d969043b3ff84dbf12c9f98dd1' type='text/css' media='all' /> <link rel='stylesheet' id='tablepress-css' href='https://bdc2020.o0bc.com/wp-content/themes/bdc-2020/dist/css/tablepress.css?ver=0.1.4' type='text/css' media='all' /> <script type="text/javascript" src="https://apps.bostonglobe.com/common/js/enter-view/enter-view-0.1.0.min.js" id="enter-view--script-js"></script> <script type="text/javascript" src="https://apps.bostonglobe.com/common/js/pym/pym-1.3.2.min.js" id="pym--script-js"></script> <script type="text/javascript" id="chartbeat_head_js-js-extra"> /* <![CDATA[ */ var chartbeat_config = {"domain":"boston.com","uid":"8544","useCanonical":"1","oneTrusActive":"1","useAB":"","authors":"Annie Jonas","sections":"Community","title":"The ultimate guide to independent bookstores in Greater Boston"}; /* ]]> */ </script> <script type="text/javascript" src="https://bdc2020.o0bc.com/wp-content/plugins/bdc-chartbeat/js/bdc.chartbeat-head.js?ver=1739911107" id="chartbeat_head_js-js"></script> <script type="text/javascript" src="//static.chartbeat.com/js/chartbeat_mab.js?ver=6.7.2" id="chartbeat_mab-js"></script> <script type="text/javascript" src="https://bdc2020.o0bc.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script> <script type="text/javascript" id="ua-wn-js-extra"> /* <![CDATA[ */ var uaWnSettings = {"prompt":{"enabled":true,"prompt_views":2,"prompt_again_views":8}}; /* ]]> */ </script> <script type="text/plain" src="https://bdc2020.o0bc.com/wp-content/plugins/urban-airship-web-push-notifications/assets/js/notification.js?ver=1.3.4" id="ua-wn" class="optanon-category-C0003"></script><script type="text/plain" src="//cdn.blueconic.net/bostonglobemedia.js" id="blueconic_js" class="optanon-category-C0004"></script> <script type="text/plain" class="optanon-category-C0003"> !(function(o,n,t){t=o.createElement(n),o=o.getElementsByTagName(n)[0],t.async=1,t.src="https://fallaciousfifth.com/v2ojfJQXItusfVrUEda5saSZ5uxEMzujCipb6jl01lNcP_fOujjlpKPeM-wc-_90A",o.parentNode.insertBefore(t,o)})(document,"script"),(function(o,n){o[n]=o[n]||function(){(o[n].q=o[n].q||[]).push(arguments)}})(window,"admiral");!(function(c,e,o,t,n){function r(o,t){(function n(){try{return 0<(localStorage.getItem("v4ac1eiZr0")||"").split(",")[4]}catch(o){}return!1})()&&(t=c[e].pubads())&&t.setTargeting("admiral-engaged","true")}(n=c[e]=c[e]||{}).cmd=n.cmd||[],typeof n.pubads===o?r():typeof n.cmd.unshift===o?n.cmd.unshift(r):n.cmd.push(r)})(window,"googletag","function"); </script> <meta name="nota-post-source" content="script" /> <script type="text/javascript"> /* * This is checking if the user has opted out of analytics. * OptanonWrapper plugins/bdc-functionality/includes/BDC/Theme/OneTrustCMP.php:220 */ var ConsentOnetrust = localStorage.getItem( 'consent_one_trust_bdc' ); var CleanCreative = document.createElement( 'script' ); CleanCreative.setAttribute( 'src','//cadmus.script.ac/dz9qn8fh4jznm/script.js' ); CleanCreative.setAttribute( 'type','text/javascript' ); /* * The above code is checking if the user has given consent for the category "Marketing" * and if the user has given consent, then the script is appended to the head tag. */ if ( typeof OptanonWrapper === 'function' && ConsentOnetrust && JSON.parse( ConsentOnetrust ).C0003 === true ) { document.getElementsByTagName( 'head' )[0].appendChild( CleanCreative ); } if ( typeof OptanonWrapper !== 'function' ) { document.getElementsByTagName( 'head' )[0].appendChild( CleanCreative ); } </script> <!-- REGI ENV = PRD--><script type="text/javascript"> //Registration base URL regiBaseUrl = 'http://tomcat.boston.com/profiles/outside/REST/'; </script><link rel='manifest' href='https://www.boston.com/wp-content/themes/bdc-2020/manifest.json' /><link rel="amphtml" href="https://www.boston.com/community/books/2024/11/25/the-ultimate-guide-to-independent-bookstores-2024/?amp=1"> <!-- The following line must be placed in the head tag --> <script type="text/javascript" src="https://p.teads.tv/teads-fellow.js" async="true"></script> <script> if (typeof(window.bgmpGdpr) !== 'undefined' && !window.bgmpGdpr.isOptedOut()) { window.teads_e = window.teads_e || []; window.teads_adv_id = 39960;} </script> <!-- Start of global snippet: Please do not remove Place this snippet between the <head> and </head> tags on every page of your site. --> <!-- Global site tag (gtag.js) - Google Marketing Platform --> <script async src="https://www.googletagmanager.com/gtag/js?id=DC-11164343"></script> <script> const onetrustLibrary = 1; const onetrustConsent = localStorage.getItem('consent_one_trust_bdc'); window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push( arguments ); } gtag( 'js', new Date() ); /* * Setting the default consent for the user. * By default we granted */ gtag( 'consent', 'default', { 'analytics_storage': 'granted' } ); gtag( 'consent', 'default', { 'ad_storage': 'granted' } ); if ( 1 === onetrustLibrary && onetrustConsent && JSON.parse(onetrustConsent).C0002 === false ) { gtag( 'consent', 'update', { 'analytics_storage': 'denied' } ); } if ( 1 === onetrustLibrary && onetrustConsent && JSON.parse(onetrustConsent).C0004 === false ) { gtag( 'consent', 'update', { 'ads_storage': 'denied' } ); } gtag( 'config', 'DC-11164343' ); </script> <!-- End of global snippet: Please do not remove --> <link rel="icon" href="https://bdc2020.o0bc.com/wp-content/uploads/2021/05/BDC_Logo_2020_Social_WhiteBG-609c79a967eee-150x150.png" sizes="32x32" /> <link rel="icon" href="https://bdc2020.o0bc.com/wp-content/uploads/2021/05/BDC_Logo_2020_Social_WhiteBG-609c79a967eee-200x200.png" sizes="192x192" /> <link rel="apple-touch-icon" href="https://bdc2020.o0bc.com/wp-content/uploads/2021/05/BDC_Logo_2020_Social_WhiteBG-609c79a967eee-200x200.png" /> <meta name="msapplication-TileImage" content="https://bdc2020.o0bc.com/wp-content/uploads/2021/05/BDC_Logo_2020_Social_WhiteBG-609c79a967eee.png" /> <style type="text/css" id="wp-custom-css"> .m-gforms-poll-block .gpoll_button { display: none } </style> <meta property="og:type" content="article"/> <meta property="article:opinion" content="false"/> <meta property="article:content_tier" content="free"/> </head> <body class="post-template-default single single-post postid-32393215 single-format-standard wp-embed-responsive site-body "> <script src="https://www.boston.com/wp-content/plugins/bdc-chartbeat/js/bdc.chartbeat-body.js"></script> <!-- Begin Comscore Tag --> <script async> // Ensure _comscore is globally available window._comscore = window._comscore || []; function loadComscoreScript(bypassConsent) { var options = { enableFirstPartyCookie: true }; if (bypassConsent) { options.bypassUserConsentRequirementFor1PCookie = true; } window._comscore.push({ c1: "2", c2: "6035042", options: options }); (function() { var s = document.createElement("script"), el = document.getElementsByTagName("script")[0]; s.async = true; s.src = "https://sb.scorecardresearch.com/cs/6035042/beacon.js"; s.onerror = function() { console.error("Failed to load Comscore script."); }; el.parentNode.insertBefore(s, el); })(); } // Check consent before loading Comscore script function checkConsent() { const timeoutDuration = 7000; // Timeout duration in milliseconds (e.g., 5000ms = 5 seconds) const checkInterval = 30; // Interval duration in milliseconds (e.g., 100ms) const startTime = Date.now(); function checkValues() { var otherRegionApplies = localStorage.getItem('otherRegion'); var ccpaApplies = localStorage.getItem('ccpaApplies'); var gdprApplies = localStorage.getItem('gdprApplies'); if (otherRegionApplies === 'true') { loadComscoreScript(true); // Bypass consent if other region applies } else if (gdprApplies === 'true') { loadComscoreScript(false); // Load without bypass if GDPR applies } else if (ccpaApplies === 'true') { loadComscoreScript(false); // Load without bypass if CCPA applies } else if (Date.now() - startTime < timeoutDuration) { setTimeout(checkValues, checkInterval); // Check again after the interval } else { loadComscoreScript(true); // Bypass consent if timeout is reached } } checkValues(); } // Ensure OneTrust is loaded before checking consent function ensureOneTrustLoaded(callback) { var interval = setInterval(function() { if (typeof OneTrust !== 'undefined' && typeof OptanonWrapper !== 'undefined') { clearInterval(interval); callback(); } }, 10); // Check every 10ms // Timeout to avoid infinite loop in case OneTrust never loads setTimeout(function() { clearInterval(interval); callback(); }, 7000); // 7 seconds timeout } // Flag to ensure checkConsent is called only once var checkConsentCalled = false; ensureOneTrustLoaded(function() { if (!checkConsentCalled) { checkConsentCalled = true; checkConsent(); } }); </script> <!-- End Comscore Tag --> <!-- Facebook Pixel Code --> <script> !function(f,b,e,v,n,t,s) {if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)}; if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t,s)}(window, document,'script', 'https://connect.facebook.net/en_US/fbevents.js'); const onetrustStorageConsent = JSON.parse(localStorage.getItem( 'consent_one_trust_bdc' ) ); if ( ( onetrustStorageConsent !== null ) ) { /* The above code is parsing the JSON data from the local storage and storing it in a variable. * Checking if the user has given consent for the cookie C0002. * If the user has given consent, the variable consent will be set to 'grant'. * If the user has not given consent,the variable consent will be set to 'revoke'. * Documentation https://developers.facebook.com/docs/meta-pixel/implementation/gdpr */ if ( onetrustStorageConsent.C0002 !== true ) { fbq('consent', 'revoke'); fbq('dataProcessingOptions', []); } else { fbq('consent', 'grant'); fbq('dataProcessingOptions', ['LDU'], 0, 0); } } fbq('init', '989222871864976'); fbq('track', 'PageView'); </script> <!-- dpo is blank which means that no geolocation access is given --> <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=989222871864976&ev=PageView&noscript=1&dpo=" /></noscript> <!-- End Facebook Pixel Code --> <header class="o-site-header" id="site-header" aria-label="Site Header"> <section class="o-site-header__advert" aria-label="Leaderboard Advert"> <div id="js-advert--lead1" class="m-advert m-advert--lead1 m-advert--with-gray m-advert--header "><div class="m-advert__container"><div id="ad_lead1"><script type="type/javascript">googletag.cmd.push(function() { googletag.display("ad_lead1") })</script></div></div></div> </section> <a class="screen-reader-text" href="#site-content"> Skip to Main Content </a> <div class="o-site-header__masthead"> <div class="m-grid m-grid-container"> <div class="m-panel-menu"> <button aria-label="Toggle Panel menu" class="a-button a-button--with-icon m-panel-navigation__toggle" id="js-panel-navigation-trigger" aria-haspopup="true" aria-controls="js-panel-navigation" aria-expanded="false"> <svg class="a-icon m-panel-navigation__open" aria-hidden="true" width="19" height="15"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#menu"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#menu"></use></svg><span class="screen-reader-text">Open</span> <svg class="a-icon m-panel-navigation__close" aria-hidden="true" width="19" height="15"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#close-symbol"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#close-symbol"></use></svg><span class="screen-reader-text">Close</span> <span class="a-hide-mobile">Menu</span> </button> <nav id="js-panel-navigation" class="m-panel-navigation" aria-label="Mobile Navigation" aria-hidden="true"> <div class="m-panel-navigation__wrap" tabindex="-1"> <div class="m-panel-navigation_expose"> <ul class="a-list a-list--no-style m-panel-navigation__list"> <li class="m-panel-navigation__list-item menu-item"> <a href="https://www.boston.com"> Home </a> </li> </ul> <div class="menu-bdc-main-container"><ul id="panel-primary-nav" class="a-list a-list--no-style m-panel-navigation__menu"><li id="menu-item-22274386" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-22274386"><a href="https://www.boston.com/category/news/">News</a> <ul class="sub-menu"> <li id="menu-item-22667248" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22667248"><a href="https://www.boston.com/tag/local-news/">Local News</a></li> <li id="menu-item-22667254" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22667254"><a href="https://www.boston.com/tag/national-news/">National News</a></li> <li id="menu-item-22667253" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22667253"><a href="https://www.boston.com/tag/politics/">Politics</a></li> <li id="menu-item-32490719" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-32490719"><a href="https://www.boston.com/tag/massachusetts-obituaries/">Obituaries</a></li> <li id="menu-item-22667264" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22667264"><a href="https://www.boston.com/tag/crime/">Crime</a></li> <li id="menu-item-32439321" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-32439321"><a href="https://www.boston.com/tag/karen-read/">Karen Read</a></li> <li id="menu-item-28992764" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-28992764"><a href="https://www.boston.com/tag/traffic/">Traffic</a></li> </ul> </li> <li id="menu-item-22274480" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-22274480"><a href="https://www.boston.com/category/sports/">Sports</a> <ul class="sub-menu"> <li id="menu-item-22497525" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22497525"><a href="https://www.boston.com/tag/boston-celtics/">Celtics</a></li> <li id="menu-item-32255017" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-32255017"><a href="https://www.boston.com/tag/jayson-tatum/">Jayson Tatum</a></li> <li id="menu-item-32255024" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-32255024"><a href="https://www.boston.com/tag/jaylen-brown/">Jaylen Brown</a></li> <li id="menu-item-22497515" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22497515"><a href="https://www.boston.com/tag/new-england-patriots/">Patriots</a></li> <li id="menu-item-22497530" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22497530"><a href="https://www.boston.com/tag/boston-bruins/">Bruins</a></li> <li id="menu-item-22497520" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22497520"><a href="https://www.boston.com/tag/boston-red-sox/">Red Sox</a></li> <li id="menu-item-22672278" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672278"><a href="https://www.boston.com/tag/new-england-revolution/">Revs</a></li> </ul> </li> <li id="menu-item-22359876" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-22359876"><a href="https://www.boston.com/category/weather/">Weather</a> <ul class="sub-menu"> <li id="menu-item-23008219" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-23008219"><a href="https://www.boston.com/tag/weather-maps/">Maps</a></li> <li id="menu-item-23008224" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-23008224"><a href="https://www.boston.com/tag/storms/">Storms</a></li> <li id="menu-item-23008255" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-23008255"><a href="https://www.boston.com/tag/snow/">Snow</a></li> <li id="menu-item-32680987" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-32680987"><a href="https://www.boston.com/tease/check-current-weather-conditions-at-new-englands-skiing-areas/">Skiing Conditions</a></li> <li id="menu-item-23008199" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-23008199"><a href="https://www.boston.com/tag/climate-change/">Climate Change</a></li> </ul> </li> <li id="menu-item-25890194" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-25890194"><a href="https://www.boston.com/category/real-estate/">Real Estate</a> <ul class="sub-menu"> <li id="menu-item-25890218" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-25890218"><a href="https://www.boston.com/tag/home-improvement/">Reno</a></li> <li id="menu-item-25890221" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-25890221"><a href="https://www.boston.com/tag/new-developments/">Developments</a></li> <li id="menu-item-25890196" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-25890196"><a href="https://www.boston.com/tag/real-estate-news/">News</a></li> <li id="menu-item-25890197" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-25890197"><a href="https://www.boston.com/tag/home-buying/">Buying</a></li> <li id="menu-item-25890200" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-25890200"><a href="https://www.boston.com/tag/open-houses/">Open Houses</a></li> <li id="menu-item-25890207" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-25890207"><a href="https://www.boston.com/tag/renting/">Renting</a></li> <li id="menu-item-25890215" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-25890215"><a href="https://www.boston.com/tag/luxury-homes/">Luxury</a></li> </ul> </li> <li id="menu-item-22274495" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-22274495"><a href="https://www.boston.com/category/food/">Food</a> <ul class="sub-menu"> <li id="menu-item-22672249" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672249"><a href="https://www.boston.com/tag/restaurants/">Restaurants</a></li> <li id="menu-item-22672303" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672303"><a href="https://www.boston.com/tag/food-news/">News</a></li> <li id="menu-item-22672295" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672295"><a href="https://www.boston.com/tag/restaurant-reviews/">Reviews</a></li> <li id="menu-item-22672298" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672298"><a href="https://www.boston.com/tag/food-events/">Events</a></li> <li id="menu-item-22672251" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672251"><a href="https://www.boston.com/tag/breweries-bars/">Breweries &amp; Bars</a></li> <li id="menu-item-22672285" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672285"><a href="https://www.boston.com/tag/restaurant-closings/">Closings</a></li> <li id="menu-item-22672290" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672290"><a href="https://www.boston.com/tag/restaurant-openings/">Openings</a></li> <li id="menu-item-32256222" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-32256222"><a href="https://www.boston.com/newsletters-food-restaurants-bars/">Sign up for The Dish 🍽️</a></li> </ul> </li> <li id="menu-item-28296783" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-28296783"><a href="https://www.boston.com/category/love-letters/">Love Letters</a> <ul class="sub-menu"> <li id="menu-item-28296788" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-28296788"><a href="https://www.boston.com/latest-love-letter">Latest Post</a></li> <li id="menu-item-28297436" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-28297436"><a href="https://www.boston.com/question-for-meredith/">Send Letter</a></li> <li id="menu-item-28297426" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-28297426"><a href="https://www.boston.com/meredith-goldstein/">About</a></li> <li id="menu-item-28297421" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-28297421"><a href="https://www.boston.com/love-letters-podcast/">Podcast</a></li> <li id="menu-item-28297431" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-28297431"><a href="https://www.boston.com/cant-help-myself/">Book</a></li> <li id="menu-item-32453509" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-32453509"><a href="https://www.boston.com/love-letters-newsletter/">Newsletter</a></li> </ul> </li> <li id="menu-item-22274485" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-22274485"><a href="https://www.boston.com/category/culture/">Culture</a> <ul class="sub-menu"> <li id="menu-item-22672218" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672218"><a href="https://www.boston.com/tag/arts/">Arts</a></li> <li id="menu-item-22672229" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672229"><a href="https://www.boston.com/tag/entertainment/">Entertainment</a></li> <li id="menu-item-22672234" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672234"><a href="https://www.boston.com/tag/movies/">Movies</a></li> <li id="menu-item-22672235" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672235"><a href="https://www.boston.com/tag/tv/">TV</a></li> <li id="menu-item-24669784" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-24669784"><a href="https://www.boston.com/tag/streaming/">Streaming</a></li> <li id="menu-item-22672238" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672238"><a href="https://www.boston.com/tag/celebs/">Celebs</a></li> <li id="menu-item-22672241" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672241"><a href="https://www.boston.com/tag/music/">Music</a></li> <li id="menu-item-32753848" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-32753848"><a href="https://www.boston.com/newsletters-streaming-movies-tv-queue/">Sign up for The Queue</a></li> </ul> </li> <li id="menu-item-30874078" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-30874078"><a href="https://www.boston.com/category/things-to-do/">Things To Do</a> <ul class="sub-menu"> <li id="menu-item-31587664" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-31587664"><a href="https://www.boston.com/newsletters-things-to-do/">Newsletter</a></li> <li id="menu-item-32601347" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-32601347"><a href="https://www.boston.com/calendar-submission/">Submit your event</a></li> </ul> </li> <li id="menu-item-22360356" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-22360356"><a href="https://www.boston.com/category/travel/">Travel</a> <ul class="sub-menu"> <li id="menu-item-22993850" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22993850"><a href="https://www.boston.com/tag/visiting-boston/">Visiting Boston</a></li> <li id="menu-item-24976055" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-24976055"><a href="https://www.boston.com/tag/cape-cod-travel/">Cape Cod</a></li> <li id="menu-item-22672269" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672269"><a href="https://www.boston.com/tag/new-england-travel/">New England</a></li> <li id="menu-item-24976054" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-24976054"><a href="https://www.boston.com/tag/flights/">Flights</a></li> <li id="menu-item-24676057" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-24676057"><a href="https://www.boston.com/tag/outdoors/">Outdoors</a></li> <li id="menu-item-28323763" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-28323763"><a href="https://www.boston.com/tag/skiing/">Skiing</a></li> <li id="menu-item-32256227" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-32256227"><a href="https://www.boston.com/newsletters-scenic-six/">Sign up for Scenic Six</a></li> </ul> </li> <li id="menu-item-24270121" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-has-children menu-item-24270121 current-post-category"><a href="https://www.boston.com/category/community/">Community</a> <ul class="sub-menu"> <li id="menu-item-24063234" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-24063234"><a href="https://www.boston.com/tag/tell-us/">Tell Us</a></li> <li id="menu-item-28204065" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-28204065"><a href="https://www.boston.com/tag/neighborhoods/">Neighborhoods</a></li> <li id="menu-item-24063232" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-24063232"><a href="https://www.boston.com/tag/readers-say/">Readers Say</a></li> <li id="menu-item-24063239" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-24063239"><a href="https://www.boston.com/tag/book-club/">Book Club</a></li> <li id="menu-item-28991660" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-28991660"><a href="https://www.boston.com/tag/wickedpedia/">Wickedpedia</a></li> <li id="menu-item-26377957" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-26377957"><a href="https://www.boston.com/tag/the-b-side/">The B-Side</a></li> <li id="menu-item-24063244" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-24063244"><a href="https://www.boston.com/tag/cocktail-club/">Cocktail Club</a></li> </ul> </li> <li id="menu-item-22360995" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-has-children menu-item-22360995 menu-item-hamburger-only"><a href="https://www.boston.com/">Extra</a> <ul class="sub-menu"> <li id="menu-item-22361025" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22361025 menu-item-hamburger-only"><a href="https://www.boston.com/customer-support/">Customer Support</a></li> <li id="menu-item-22360999" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22360999 menu-item-hamburger-only"><a href="https://www.bostonglobemedia.com/">Advertise</a></li> <li id="menu-item-22361010" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22361010 menu-item-hamburger-only"><a href="https://advertising.bostonglobemedia.com/">Classified Ads</a></li> <li id="menu-item-22361055" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22361055 menu-item-hamburger-only"><a href="https://bostonglobemediapartners.applytojob.com/apply">Careers</a></li> <li id="menu-item-22361026" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22361026 menu-item-hamburger-only"><a href="https://www.boston.com/contact-us/">Contact Us</a></li> <li id="menu-item-22361019" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22361019 menu-item-hamburger-only"><a href="https://www.legacy.com/obituaries/bostonglobe/">Obituaries</a></li> <li id="menu-item-28173757" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-28173757"><a href="https://www.boston.com/newsletter-signup/">Newsletters</a></li> <li id="menu-item-25927243" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25927243"><a href="/tag/massachusetts-lottery/">Mass. Lottery</a></li> <li id="menu-item-25927251" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25927251"><a href="https://www.boston.com/tag/powerball/">Powerball</a></li> <li id="menu-item-25927254" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25927254"><a href="https://www.boston.com/tag/mega-millions/">Mega Millions</a></li> <li id="menu-item-22361035" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22361035 menu-item-hamburger-only"><a href="https://www.boston.com/horoscope/">Horoscopes</a></li> <li id="menu-item-22361043" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22361043 menu-item-hamburger-only"><a href="https://www.boston.com/comics/">Comics</a></li> <li id="menu-item-22361045" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22361045 menu-item-hamburger-only"><a href="https://www.boston.com/today-in-history/">Today in History</a></li> <li id="menu-item-22360996" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22360996 menu-item-hamburger-only"><a href="https://www.boston.com/fresh-start-submit-your-appeal/">Fresh Start</a></li> </ul> </li> <li id="menu-item-31235133" class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-31235133 menu-item-hamburger-only"><a href="https://www.boston.com/tag/weddings/">Weddings</a></li> <li id="menu-item-25195153" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-25195153"><a href="https://www.boston.com/category/cars/">Cars</a> <ul class="sub-menu"> <li id="menu-item-25195157" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-25195157"><a href="https://www.boston.com/new-car-specials/">New Car Specials</a></li> </ul> </li> <li id="menu-item-24512309" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24512309 menu-item-hamburger-only"><a href="https://games.boston.com/">Games</a></li> <li id="menu-item-32722766" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-32722766 menu-item-hamburger-only"><a href="https://www.boston.com/new-england-skiing-conditions/">Skiing Conditions</a></li> </ul></div> </div> </div> </nav> <div class="m-panel-overlay"></div> </div> <div id="site-logo" class="m-site-logo"> <a class="m-site-logo__link" href="https://www.boston.com"> <span class="screen-reader-text">Boston.com</span> <img width="133" height="39" src="https://www.boston.com/wp-content/themes/bdc-2020/dist/images/boston-com-logo.png" aria-hidden="true" alt="" /> </a> </div> <nav class="m-secondary-menu" aria-label="Utility Navigation" id="utility-navigation"> <ul class="m-secondary-menu__list a-list--no-style"> <li class="m-header-search"> <button id="js-search-button" aria-controls="header-search-form" aria-expanded="false" aria-haspopup="true" class="a-button a-button--icon a-button--icon-svg" type="button"> <svg class="a-icon" aria-hidden="true" width="20" height="20"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#search"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#search"></use></svg> <svg class="a-icon a-icon--close" aria-hidden="true" width="20" height="20"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#close"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#close"></use></svg> <span class="screen-reader-text">Search</span> </button> <div id="js-search-form" class="m-header-search__form" aria-hidden="true"> <form role="search" id="searchform--header" class="m-search-form m-search-form--header" method="get" action="https://www.boston.com/"> <label for="search-field-search-form-3" class="screen-reader-text m-search-form__label"> Search for: </label> <input class="m-search-form__input" type="text" id="search-field-search-form-3" value="" placeholder="Search Boston.com" name="s" /> <button class="m-search-form__button" tabindex="-1" type="submit" aria-label="Submit"> <svg class="a-icon a-icon--no-action" aria-hidden="true" width="20" height="20"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#search"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#search"></use></svg><span class="screen-reader-text">Search Boston.com</span> </button> </form> </div> </li> </ul> </nav> </div> </div> <div class="o-site-header__menu"> <div class="m-grid-container m-grid-container-inline"> <nav aria-label="Main Site Navigation" class="m-site-navigation m-site-navigation--left" id="site-navigation" itemscope itemtype="https://schema.org/SiteNavigationElement"> <div class="menu-bdc-main-container"><ul id="menu-bdc-main" class="m-primary-menu m-primary-menu--section-level a-list--no-style"><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-22274386"><a href="https://www.boston.com/category/news/">News</a> <ul class="sub-menu"> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22667248"><a href="https://www.boston.com/tag/local-news/">Local News</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22667254"><a href="https://www.boston.com/tag/national-news/">National News</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22667253"><a href="https://www.boston.com/tag/politics/">Politics</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-32490719"><a href="https://www.boston.com/tag/massachusetts-obituaries/">Obituaries</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22667264"><a href="https://www.boston.com/tag/crime/">Crime</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-32439321"><a href="https://www.boston.com/tag/karen-read/">Karen Read</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-28992764"><a href="https://www.boston.com/tag/traffic/">Traffic</a></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-22274480"><a href="https://www.boston.com/category/sports/">Sports</a> <ul class="sub-menu"> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22497525"><a href="https://www.boston.com/tag/boston-celtics/">Celtics</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-32255017"><a href="https://www.boston.com/tag/jayson-tatum/">Jayson Tatum</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-32255024"><a href="https://www.boston.com/tag/jaylen-brown/">Jaylen Brown</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22497515"><a href="https://www.boston.com/tag/new-england-patriots/">Patriots</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22497530"><a href="https://www.boston.com/tag/boston-bruins/">Bruins</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22497520"><a href="https://www.boston.com/tag/boston-red-sox/">Red Sox</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672278"><a href="https://www.boston.com/tag/new-england-revolution/">Revs</a></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-22359876"><a href="https://www.boston.com/category/weather/">Weather</a> <ul class="sub-menu"> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-23008219"><a href="https://www.boston.com/tag/weather-maps/">Maps</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-23008224"><a href="https://www.boston.com/tag/storms/">Storms</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-23008255"><a href="https://www.boston.com/tag/snow/">Snow</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-32680987"><a href="https://www.boston.com/tease/check-current-weather-conditions-at-new-englands-skiing-areas/">Skiing Conditions</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-23008199"><a href="https://www.boston.com/tag/climate-change/">Climate Change</a></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-25890194"><a href="https://www.boston.com/category/real-estate/">Real Estate</a> <ul class="sub-menu"> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-25890218"><a href="https://www.boston.com/tag/home-improvement/">Reno</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-25890221"><a href="https://www.boston.com/tag/new-developments/">Developments</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-25890196"><a href="https://www.boston.com/tag/real-estate-news/">News</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-25890197"><a href="https://www.boston.com/tag/home-buying/">Buying</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-25890200"><a href="https://www.boston.com/tag/open-houses/">Open Houses</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-25890207"><a href="https://www.boston.com/tag/renting/">Renting</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-25890215"><a href="https://www.boston.com/tag/luxury-homes/">Luxury</a></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-22274495"><a href="https://www.boston.com/category/food/">Food</a> <ul class="sub-menu"> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672249"><a href="https://www.boston.com/tag/restaurants/">Restaurants</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672303"><a href="https://www.boston.com/tag/food-news/">News</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672295"><a href="https://www.boston.com/tag/restaurant-reviews/">Reviews</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672298"><a href="https://www.boston.com/tag/food-events/">Events</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672251"><a href="https://www.boston.com/tag/breweries-bars/">Breweries &amp; Bars</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672285"><a href="https://www.boston.com/tag/restaurant-closings/">Closings</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672290"><a href="https://www.boston.com/tag/restaurant-openings/">Openings</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-32256222"><a href="https://www.boston.com/newsletters-food-restaurants-bars/">Sign up for The Dish 🍽️</a></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-28296783"><a href="https://www.boston.com/category/love-letters/">Love Letters</a> <ul class="sub-menu"> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-28296788"><a href="https://www.boston.com/latest-love-letter">Latest Post</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-28297436"><a href="https://www.boston.com/question-for-meredith/">Send Letter</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-28297426"><a href="https://www.boston.com/meredith-goldstein/">About</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-28297421"><a href="https://www.boston.com/love-letters-podcast/">Podcast</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-28297431"><a href="https://www.boston.com/cant-help-myself/">Book</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-32453509"><a href="https://www.boston.com/love-letters-newsletter/">Newsletter</a></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-22274485"><a href="https://www.boston.com/category/culture/">Culture</a> <ul class="sub-menu"> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672218"><a href="https://www.boston.com/tag/arts/">Arts</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672229"><a href="https://www.boston.com/tag/entertainment/">Entertainment</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672234"><a href="https://www.boston.com/tag/movies/">Movies</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672235"><a href="https://www.boston.com/tag/tv/">TV</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-24669784"><a href="https://www.boston.com/tag/streaming/">Streaming</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672238"><a href="https://www.boston.com/tag/celebs/">Celebs</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672241"><a href="https://www.boston.com/tag/music/">Music</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-32753848"><a href="https://www.boston.com/newsletters-streaming-movies-tv-queue/">Sign up for The Queue</a></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-30874078"><a href="https://www.boston.com/category/things-to-do/">Things To Do</a> <ul class="sub-menu"> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-31587664"><a href="https://www.boston.com/newsletters-things-to-do/">Newsletter</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-32601347"><a href="https://www.boston.com/calendar-submission/">Submit your event</a></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-22360356"><a href="https://www.boston.com/category/travel/">Travel</a> <ul class="sub-menu"> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22993850"><a href="https://www.boston.com/tag/visiting-boston/">Visiting Boston</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-24976055"><a href="https://www.boston.com/tag/cape-cod-travel/">Cape Cod</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-22672269"><a href="https://www.boston.com/tag/new-england-travel/">New England</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-24976054"><a href="https://www.boston.com/tag/flights/">Flights</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-24676057"><a href="https://www.boston.com/tag/outdoors/">Outdoors</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-28323763"><a href="https://www.boston.com/tag/skiing/">Skiing</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-32256227"><a href="https://www.boston.com/newsletters-scenic-six/">Sign up for Scenic Six</a></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-has-children menu-item-24270121 current-post-category"><a href="https://www.boston.com/category/community/">Community</a> <ul class="sub-menu"> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-24063234"><a href="https://www.boston.com/tag/tell-us/">Tell Us</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-28204065"><a href="https://www.boston.com/tag/neighborhoods/">Neighborhoods</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-24063232"><a href="https://www.boston.com/tag/readers-say/">Readers Say</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-24063239"><a href="https://www.boston.com/tag/book-club/">Book Club</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-28991660"><a href="https://www.boston.com/tag/wickedpedia/">Wickedpedia</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-26377957"><a href="https://www.boston.com/tag/the-b-side/">The B-Side</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-24063244"><a href="https://www.boston.com/tag/cocktail-club/">Cocktail Club</a></li> </ul> </li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-has-children menu-item-22360995 menu-item-hamburger-only"><a href="https://www.boston.com/">Extra</a> <ul class="sub-menu"> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22361025 menu-item-hamburger-only"><a href="https://www.boston.com/customer-support/">Customer Support</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22360999 menu-item-hamburger-only"><a href="https://www.bostonglobemedia.com/">Advertise</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22361010 menu-item-hamburger-only"><a href="https://advertising.bostonglobemedia.com/">Classified Ads</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22361055 menu-item-hamburger-only"><a href="https://bostonglobemediapartners.applytojob.com/apply">Careers</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22361026 menu-item-hamburger-only"><a href="https://www.boston.com/contact-us/">Contact Us</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22361019 menu-item-hamburger-only"><a href="https://www.legacy.com/obituaries/bostonglobe/">Obituaries</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-28173757"><a href="https://www.boston.com/newsletter-signup/">Newsletters</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25927243"><a href="/tag/massachusetts-lottery/">Mass. Lottery</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25927251"><a href="https://www.boston.com/tag/powerball/">Powerball</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25927254"><a href="https://www.boston.com/tag/mega-millions/">Mega Millions</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22361035 menu-item-hamburger-only"><a href="https://www.boston.com/horoscope/">Horoscopes</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22361043 menu-item-hamburger-only"><a href="https://www.boston.com/comics/">Comics</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22361045 menu-item-hamburger-only"><a href="https://www.boston.com/today-in-history/">Today in History</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22360996 menu-item-hamburger-only"><a href="https://www.boston.com/fresh-start-submit-your-appeal/">Fresh Start</a></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-post_tag menu-item-31235133 menu-item-hamburger-only"><a href="https://www.boston.com/tag/weddings/">Weddings</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-25195153"><a href="https://www.boston.com/category/cars/">Cars</a> <ul class="sub-menu"> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-25195157"><a href="https://www.boston.com/new-car-specials/">New Car Specials</a></li> </ul> </li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24512309 menu-item-hamburger-only"><a href="https://games.boston.com/">Games</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-32722766 menu-item-hamburger-only"><a href="https://www.boston.com/new-england-skiing-conditions/">Skiing Conditions</a></li> </ul></div> </nav> <nav aria-label="Trending Navigation" class="m-site-navigation m-site-navigation--right m-site-navigation--trending" id="trending-navigation" itemscope itemtype="https://schema.org/SiteNavigationElement"> <div class="menu-bdc-trending-container"><ul id="menu-bdc-trending" class="m-primary-menu m-primary-menu--trending a-list--no-style"><li id="menu-item-32299117" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-32299117"><a href="https://www.boston.com/news/local-news/2025/02/20/moulton-warren-push-back-on-expected-irs-layoffs/">IRS layoffs</a></li> <li id="menu-item-29838788" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-29838788"><a href="https://www.boston.com/news/business/2025/02/20/informa-techtarget-a-mass-pioneer-in-remote-work-is-calling-its-workers-back-to-office/">TechTarget</a></li> <li id="menu-item-29648242" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-29648242"><a href="https://www.boston.com/community/books/2025/02/19/50-books-to-add-to-your-reading-list-this-black-history-month/">Black History Month</a></li> </ul></div> </nav> </div> </div> </header> <main class="t-main" id="site-content" aria-label="Main Site Content"> <div id="oosvideo"> <script> googletag.cmd.push(function() { googletag.display('oosvideo'); }); </script> </div> <div class="m-grid-container t-layout t-layout--is-single t-layout--with-sidebar t-layout--standard-image "> <section class="t-layout__main "> <article class="content-well content-well--article" role="main"> <div id="presentedby"> <script> googletag.cmd.push(function() { googletag.display('presentedby'); }); </script> </div> <header class="m-article-header m-article-header--standard"> <span id="article-header-primary-term"> <a class="a-term a-term--primary" href="https://www.boston.com/tag/books/"> Books </a> </span> <h1 class="m-article-header__headline">The ultimate guide to independent bookstores in Greater Boston and beyond</h1> <h2 class="m-article-header__sub-headline">You’re never too far from a great bookstore if you live in Greater Boston.</h2> <figure class="a-photo m-article-header__photo "> <img width="768" height="432" src="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_Wiggs__Quest_1-6740d4e00866c-768x432.jpg" class="attachment-16:9 size-16:9 wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_Wiggs__Quest_1-6740d4e00866c-768x432.jpg?width=200 200w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_Wiggs__Quest_1-6740d4e00866c-768x432.jpg?width=300 300w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_Wiggs__Quest_1-6740d4e00866c-768x432.jpg?width=400 400w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_Wiggs__Quest_1-6740d4e00866c-768x432.jpg?width=500 500w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_Wiggs__Quest_1-6740d4e00866c-768x432.jpg?width=600 600w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_Wiggs__Quest_1-6740d4e00866c-768x432.jpg?width=700 700w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_Wiggs__Quest_1-6740d4e00866c-768x432.jpg?width=800 800w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_Wiggs__Quest_1-6740d4e00866c-768x432.jpg?width=900 900w" sizes="auto, (max-width: 768px) 100vw, 768px" /> <figcaption class="a-photo__caption"> Caroline Sheridan runs Side Quest Books and Games, a new "fairy-inspired" fantasy bookstore in Bow Market.<em> (Jonathan Wiggs /Globe Staff)</em> </figcaption> </figure> <div class="m-article-header__meta"> <div class="m-article-header__byline"> <p class="m-article-header__author"> By <a class="a-link a-link--inline" href="https://www.boston.com/author/annie-jonas/">Annie Jonas</a> </p> <time class="m-article-header__date"> November 25, 2024 </time> <div class="m-article-header__word-estimate"><span>8 minutes to read</span></div> </div> <div class="m-article-header__social"> <ul class="a-list--no-style m-social-share"><li class="m-social-share__item"><a id="sharetools-facebook" class="m-social-share__link" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.boston.com%2F%3Fpost_type%3Dpost%26p%3D32393215" rel="noopener noreferr" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" class="a-icon" aria-hidden="true" role="presentation" width="18" height="15"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#facebook-white"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#facebook-white"></use></svg><span class="screen-reader-text">Facebook</span></a></li><li class="m-social-share__item"><a id="sharetools-twitter" class="m-social-share__link" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.boston.com%2F%3Fpost_type%3Dpost%26p%3D32393215" rel="noopener noreferr" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" class="a-icon" aria-hidden="true" role="presentation" width="18" height="15"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#twitter-white"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#twitter-white"></use></svg><span class="screen-reader-text">Twitter</span></a></li><li class="m-social-share__item"><a id="sharetools-email" class="m-social-share__link" href="/cdn-cgi/l/email-protection#fcc38f899e96999f88c1a89499d9cecc89908895919d8899d9cecc9b89959899d9cecc8893d9cecc959298998c999298999288d9cecc9e9393978f88938e998fd9cecc9592d9ceccbb8e999d88998ed9ceccbe938f889392d9cecc9d9298d9cecc9e9985939298da9e939885c19488888c8fd9cfbdd9cebad9ceba8b8b8bd29e938f889392d29f9391d9cebad9cfba8c938f88a388858c99d9cfb88c938f88d9ceca8cd9cfb8cfcecfc5cfcecdc9" rel="noopener noreferr" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" class="a-icon" aria-hidden="true" role="presentation" width="18" height="15"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#mail-white"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#mail-white"></use></svg><span class="screen-reader-text">Email</span></a></li><li class="m-social-share__item"><a id="sharetools-copylink" class="m-social-share__link js-copy-link" data-clipboard-text="https://www.boston.com/?post_type=post&#038;p=32393215" rel="noopener noreferr" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" class="a-icon" aria-hidden="true" role="presentation" width="18" height="15"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#link-white"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#link-white"></use></svg><span class="screen-reader-text">Email</span></a></li><li class="m-social-share__item m-social-share__comments"><a href="#comments" class="m-social-share__comments-link">3</a></li></ul> </div> </div> </header> <p>A new era of niche, independent bookstores is taking Boston by storm &ndash; and shows no signs of slowing down.</p><p>Among the cohort of bookstores with a special focus is the much-anticipated <a href="https://lovestruckbooks.com/">Lovestruck Books</a>. The romance bookstore is set to open this winter in Harvard Square as a place where those smitten with the genre can find their happily ever after in the bookstore&#8217;s shelves. It&#8217;s a place to not only build community, but where readers can find <em>their</em> community, owner Rachel Kanter said. </p><p>But romance isn&rsquo;t the only genre carving out a space for itself in Boston&rsquo;s book scene. At least seven niche, independent bookstores have sprung up around the city in recent years<strong> </strong>&ndash; and more are on the way.&nbsp;</p><figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="2560" height="1825" src="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/LYLFB7DNALPFQOC47RODJ6RQXQ-6740da189cc9f-scaled.jpg" alt="" class="wp-image-32393378" srcset="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/LYLFB7DNALPFQOC47RODJ6RQXQ-6740da189cc9f-scaled.jpg?width=200 200w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/LYLFB7DNALPFQOC47RODJ6RQXQ-6740da189cc9f-scaled.jpg?width=300 300w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/LYLFB7DNALPFQOC47RODJ6RQXQ-6740da189cc9f-scaled.jpg?width=400 400w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/LYLFB7DNALPFQOC47RODJ6RQXQ-6740da189cc9f-scaled.jpg?width=500 500w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/LYLFB7DNALPFQOC47RODJ6RQXQ-6740da189cc9f-scaled.jpg?width=600 600w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/LYLFB7DNALPFQOC47RODJ6RQXQ-6740da189cc9f-scaled.jpg?width=700 700w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/LYLFB7DNALPFQOC47RODJ6RQXQ-6740da189cc9f-scaled.jpg?width=800 800w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/LYLFB7DNALPFQOC47RODJ6RQXQ-6740da189cc9f-scaled.jpg?width=900 900w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /><figcaption class="wp-element-caption">Christina Pascucci-Ciampa, owner of All She Wrote bookstore poses for a portrait with a stack of her favorite books. <em>(Jessica Rinaldi/Globe Staff)</em></figcaption></figure><p>At <a href="https://www.allshewrotebooks.com/">All She Wrote Books</a>, a feminist and queer bookstore, readers can find a curated selection of books with a focus on intersectional feminism. Christina Pascucci-Ciampa founded the bookstore as a pop-up in 2019 before moving to a brick-and-mortar store in Assembly Row in 2020, and later relocating to East Somerville in 2023.&nbsp;</p><div class="m-content-advert"><div class="m-content-advert-wrap"><span class="m-content-advert-title">Advertisement:</span><div id="js-advert--inarticle_video1" class="m-advert m-advert--inarticle_video1 "><div class="m-advert__container"><div id="ad_inarticle_video1"><script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script><script type="type/javascript">googletag.cmd.push(function() { googletag.display("ad_inarticle_video1") })</script></div></div></div></div></div><p>Add to the growing list <a href="https://www.instagram.com/overthetunnelbooks/?hl=en">Over the Tunnel Books</a>, a speakeasy-style, subterranean bookshop in East Boston selling food related publications. The store is one of three businesses owned by Eastie resident Alexis Cervasio, and is located underneath her grocery store, <a href="https://www.ebogrocery.com/">EBO &amp; Co. Grocery</a>. </p><figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="2560" height="1614" src="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_005-6740d54620e8e-scaled.jpg" alt="" class="wp-image-32393241" srcset="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_005-6740d54620e8e-scaled.jpg?width=200 200w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_005-6740d54620e8e-scaled.jpg?width=300 300w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_005-6740d54620e8e-scaled.jpg?width=400 400w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_005-6740d54620e8e-scaled.jpg?width=500 500w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_005-6740d54620e8e-scaled.jpg?width=600 600w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_005-6740d54620e8e-scaled.jpg?width=700 700w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_005-6740d54620e8e-scaled.jpg?width=800 800w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_005-6740d54620e8e-scaled.jpg?width=900 900w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /><figcaption class="wp-element-caption">Over the Tunnel Books, a 150-square-foot bookstore located in the basement of EBO Grocery above the Sumner Tunnel on Tuesday, August 20, 2024 in East Boston. The concept is owned by Alexis Cervasio. <em>(Andrew Burke-Stevenson for The Boston Globe)</em></figcaption></figure><p>&ldquo;You take a left at the wine fridge, and you go down the stairs to the bookstore,&rdquo; she told Boston.com. Cervasio envisioned the bookstore as an extension of her home, a communal living room and lounge for foodies. </p><p>&ldquo;It&#8217;s a good hideaway. There&#8217;s no clocks. It&#8217;s like you&#8217;re in Vegas. You can just let time slip away,&rdquo; she said. The bookstore is located directly over the Sumner Tunnel (hence its name), and opened in December of 2023.&nbsp;</p><figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="2560" height="1778" src="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_001-6740dcdd784e0-scaled.jpg" alt="" class="wp-image-32393501" srcset="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_001-6740dcdd784e0-scaled.jpg?width=200 200w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_001-6740dcdd784e0-scaled.jpg?width=300 300w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_001-6740dcdd784e0-scaled.jpg?width=400 400w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_001-6740dcdd784e0-scaled.jpg?width=500 500w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_001-6740dcdd784e0-scaled.jpg?width=600 600w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_001-6740dcdd784e0-scaled.jpg?width=700 700w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_001-6740dcdd784e0-scaled.jpg?width=800 800w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_2024-08-20_24tunnelbookstore_abs_001-6740dcdd784e0-scaled.jpg?width=900 900w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /><figcaption class="wp-element-caption">Alexis Cervasio, owner of Over the Tunnel Books, a 150-square-foot bookstore located in the basement of EBO Grocery, which she also owns, above the Sumner Tunnel on Tuesday, August 20, 2024 in East Boston. <em>(Andrew Burke-Stevenson for The Boston Globe)</em><i> &#8211; Andrew Burke-Stevenson for The Boston Globe</i></figcaption></figure><p>There&rsquo;s <a href="https://www.instagram.com/readmylipsboston/?hl=en">Read My Lips Boston</a>, an inclusive romance pop-up bookstore run by twins Lily and Hannah Barrett. The duo held their first pop-up in February of 2024.</p><div class="m-content-advert"><div class="m-content-advert-wrap"><span class="m-content-advert-title">Advertisement:</span><div id="js-advert--inarticle1" class="m-advert m-advert--inarticle1 "><div class="m-advert__container"><div id="ad_inarticle1"><script type="type/javascript">googletag.cmd.push(function() { googletag.display("ad_inarticle1") })</script></div></div></div></div></div><p>Newer additions to Boston&rsquo;s book scene include <a href="https://www.narrativebookshop.com/">Narrative</a>, a Somerville bookstore which focuses on books by and about people of color. The shop opened in May to mighty acclaim from neighbors (see: the bookstore <a href="https://www.boston.com/news/local-news/2024/05/27/new-independent-somerville-bookstore-almost-sells-out-after-grand-opening/">nearly sold out</a> after its grand opening).&nbsp;</p><figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="2030" height="2247" src="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/MHossain-Headshot_July2024-6740da4d4eb18.jpeg" alt="" class="wp-image-32393385" srcset="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/MHossain-Headshot_July2024-6740da4d4eb18.jpeg?width=200 200w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/MHossain-Headshot_July2024-6740da4d4eb18.jpeg?width=300 300w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/MHossain-Headshot_July2024-6740da4d4eb18.jpeg?width=400 400w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/MHossain-Headshot_July2024-6740da4d4eb18.jpeg?width=500 500w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/MHossain-Headshot_July2024-6740da4d4eb18.jpeg?width=600 600w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/MHossain-Headshot_July2024-6740da4d4eb18.jpeg?width=700 700w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/MHossain-Headshot_July2024-6740da4d4eb18.jpeg?width=800 800w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/MHossain-Headshot_July2024-6740da4d4eb18.jpeg?width=900 900w" sizes="auto, (max-width: 2030px) 100vw, 2030px" /><figcaption class="wp-element-caption">Mila Hossain, owner of Narrative, poses for a photo outside her bookstore in Somerville. <em>(Photo by Kayla Robbins)</em></figcaption></figure><p>Most recently, <a href="https://sidequestbooks.com/">Side Quest Books and Games</a> opened their brick-and-mortar bookstore in Somerville&rsquo;s Bow Market in August, after operating as a pop-up shop. The bookstore focuses on fantasy books and role-playing games from underrepresented or marginalized creators.</p><p>On Friday, <a href="https://justbook-ish.com/">JustBook-ish</a>, a highly curated literary gathering space in Dorchester, held its grand opening and ribbon cutting ceremony. The bookstore was founded by Porsha Olayiwola, Boston&rsquo;s poet laureate, and Bing Broderick, former director of Haley House.</p><p>And there&rsquo;s plenty more coming soon, like the aforementioned Lovestruck Books and <a href="https://www.facebook.com/p/Dr-Ellie-Paris-Social-Bookstore-Ice-Cream-Cafe-100085056460089/">Dr. Ellie Paris Social Bookstore &amp; Ice Cream Cafe</a> in Brockton, which also opened on Friday.</p><h2 class="wp-block-heading" id="h-how-did-boston-get-so-many-niche-bookstores">How did Boston get so many niche bookstores?</h2><p>Many independent bookstore owners told Boston.com they felt a shift in the literary world post-pandemic that likely produced the diverse, niche landscape we see in Boston&#8217;s book scene today.</p><p>The boom in independent bookselling, coupled with a desire for connection, increased demand for these niche bookstores, which function as sites of intentional community, they said.</p><div class="m-content-advert"><div class="m-content-advert-wrap"><span class="m-content-advert-title">Advertisement:</span><div id="js-advert--inarticle2" class="m-advert m-advert--inarticle2 "><div class="m-advert__container"><div id="ad_inarticle2"><script type="type/javascript">googletag.cmd.push(function() { googletag.display("ad_inarticle2") })</script></div></div></div></div></div><p>For Kanter, it was the opening and massive success of <a href="https://www.therippedbodice.com/">The Ripped Bodice</a>, a romance bookstore in Park Slope, Brooklyn in 2023, that confirmed her giddy inkling; something new and exciting was happening in the industry, and she had to be part of it.</p><p>&ldquo;It felt like kismet. It was a real endorsement of the fact that there is a market for this. There is an appetite for these spaces where people can get together and really celebrate romance,&rdquo; she said in an interview with Boston.com in July.&nbsp;</p><p>This was also the case for Mila Hossain, owner of Narrative in Somerville. She turned to reading during quarantine as a means of comfort and escapism amidst incredible isolation. But this period did not bode dark days for her, nor for the book industry. Rather, the pandemic helped bring her idea to open a bookstore to fruition &ndash; and like a phoenix rising from the ashes, hundreds of independent bookstores like hers were born.</p><figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="768" src="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-3-6740d7f37b7a6.jpeg" alt="" class="wp-image-32393320" srcset="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-3-6740d7f37b7a6.jpeg?width=200 200w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-3-6740d7f37b7a6.jpeg?width=300 300w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-3-6740d7f37b7a6.jpeg?width=400 400w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-3-6740d7f37b7a6.jpeg?width=500 500w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-3-6740d7f37b7a6.jpeg?width=600 600w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-3-6740d7f37b7a6.jpeg?width=700 700w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-3-6740d7f37b7a6.jpeg?width=800 800w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-3-6740d7f37b7a6.jpeg?width=900 900w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">The interior of Narrative, located at 387 Highland Ave. in Somerville. <em>(Photo courtesy of Mila Hossain)</em></figcaption></figure><p><a href="https://www.nytimes.com/2022/07/10/books/bookstores-diversity-pandemic.html">More than 300 new independent bookstores</a> have emerged across the country in the past couple of years, according to the <em>New York Times</em>. Hossain credits the surge to the pandemic and a renewed understanding that bookstores are more than just places to shop; they are lifelines for community and connection.</p><div class="m-content-advert"><div class="m-content-advert-wrap"><span class="m-content-advert-title">Advertisement:</span><div id="js-advert--inarticle3" class="m-advert m-advert--inarticle3 "><div class="m-advert__container"><div id="ad_inarticle3"><script type="type/javascript">googletag.cmd.push(function() { googletag.display("ad_inarticle3") })</script></div></div></div></div></div><p>&ldquo;A lot of people really realized how important these spaces are and how important it is to make sure that they keep existing,&rdquo; she said.&nbsp;</p><p>Porsha Olayiwola, co-founder of JustBook-ish in Dorchester, said she has &ldquo;definitely&rdquo; seen a rise in the number of independent bookstores serving a particular audience.&nbsp;</p><p>She credits this &ldquo;resurgence&rdquo; of niche bookstores to the pandemic-era boom in bookselling and social movements, as well as a political climate that has raised the stakes for books and bookstores.</p><figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="2560" height="1920" src="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/IMG_4943_1-6740db4df25a4-scaled.jpg" alt="" class="wp-image-32393476" srcset="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/IMG_4943_1-6740db4df25a4-scaled.jpg?width=200 200w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/IMG_4943_1-6740db4df25a4-scaled.jpg?width=300 300w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/IMG_4943_1-6740db4df25a4-scaled.jpg?width=400 400w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/IMG_4943_1-6740db4df25a4-scaled.jpg?width=500 500w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/IMG_4943_1-6740db4df25a4-scaled.jpg?width=600 600w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/IMG_4943_1-6740db4df25a4-scaled.jpg?width=700 700w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/IMG_4943_1-6740db4df25a4-scaled.jpg?width=800 800w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/IMG_4943_1-6740db4df25a4-scaled.jpg?width=900 900w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /><figcaption class="wp-element-caption">A banned book display in JustBook-ish. <em>(Annie Jonas/Boston.com Staff)</em></figcaption></figure><p>&ldquo;I think part of it is probably the discourse around the banning of books and how that relates to the banning of humans. Bookstores just feel like a place where knowledge can be accessed and also accessible,&rdquo; she said.&nbsp;</p><p>Her bookstore&rsquo;s ethos, &ldquo;culturally curated, radically influenced, locally inspired,&rdquo; reflects this shift in the industry, and it&#8217;s something that will be carried through the shop&rsquo;s curation of books. </p><p>JustBook-ish sells books that are culturally relevant to the surrounding community, often with a social justice focus. Local writers and authors who often don&#8217;t have a home or space for their books will get a spot on JustBook-ish&rsquo;s shelves too, Olayiwola said. The store will also serve as a gathering place for programming and events with a literary and artistic focus, adding to the bookstore&rsquo;s niche.</p><p>&ldquo;There&#8217;s going to be an interesting interplay between our programming and our inventory. I think that our programming will impact our inventory,&rdquo; Olayiwola said.</p><h2 class="wp-block-heading" id="h-what-does-a-niche-bookstore-offer">What does a niche bookstore offer?</h2><p>Events, window displays and book shelves can all be curated to introduce a particular niche to a broad audience. </p><div class="m-content-advert"><div class="m-content-advert-wrap"><span class="m-content-advert-title">Advertisement:</span><div id="js-advert--inarticle4" class="m-advert m-advert--inarticle4 "><div class="m-advert__container"><div id="ad_inarticle4"><script type="type/javascript">googletag.cmd.push(function() { googletag.display("ad_inarticle4") })</script></div></div></div></div></div><p>Hossain&rsquo;s bookstore emphasizes marginalized voices and experiences, and she curated every single detail of the bookstore to reflect this focus, she said.&nbsp;This curation is what brings an extra value-add to customers, who &ldquo;crave that intentionality,&rdquo; she said.</p><p>&ldquo;You&#8217;re getting purpose. The curation has a lot of meaning. There&#8217;s a lot of intentionality behind the whole space and everything in it,&rdquo; she said. &ldquo;I think a lot of people really want to support that, which is wonderful.&rdquo;</p><figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="768" src="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-2-6740eec145572.jpeg" alt="" class="wp-image-32394031" srcset="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-2-6740eec145572.jpeg?width=200 200w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-2-6740eec145572.jpeg?width=300 300w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-2-6740eec145572.jpeg?width=400 400w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-2-6740eec145572.jpeg?width=500 500w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-2-6740eec145572.jpeg?width=600 600w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-2-6740eec145572.jpeg?width=700 700w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-2-6740eec145572.jpeg?width=800 800w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/Narrative-Interior-2-6740eec145572.jpeg?width=900 900w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">The interior of Narrative. <em>(Photo courtesy of Mila Hossain)</em></figcaption></figure><p>At first, Hossain worried that having a focus would be too limiting, that customers wouldn&#8217;t feel like they could find something for themselves. But she has found this not to be true, as &ldquo;everyone kind of understands that it is a place where everyone is welcome,&rdquo; she said.</p><p>&ldquo;My hope is that Narrative will make you feel seen, or give you some sort of connection or perspective. Even though we are niche and focused, that doesn&#8217;t mean that it&#8217;s not for you. There&#8217;s something here for everyone,&rdquo; Hossain added.</p><p>The inclusive nature of having a niche was a draw for many booksellers, like Olayiwola, the co-founder of JustBook-ish in Dorchester.</p><figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="2560" height="1707" src="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_kreiter03012021poet1-6740d84f12e85-scaled.jpg" alt="" class="wp-image-32393323" srcset="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_kreiter03012021poet1-6740d84f12e85-scaled.jpg?width=200 200w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_kreiter03012021poet1-6740d84f12e85-scaled.jpg?width=300 300w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_kreiter03012021poet1-6740d84f12e85-scaled.jpg?width=400 400w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_kreiter03012021poet1-6740d84f12e85-scaled.jpg?width=500 500w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_kreiter03012021poet1-6740d84f12e85-scaled.jpg?width=600 600w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_kreiter03012021poet1-6740d84f12e85-scaled.jpg?width=700 700w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_kreiter03012021poet1-6740d84f12e85-scaled.jpg?width=800 800w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/s3___bgmp-arc_arc-feeds_generic-photos_to-arc_kreiter03012021poet1-6740d84f12e85-scaled.jpg?width=900 900w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /><figcaption class="wp-element-caption">Porsha Olayiwola is Boston&#8217;s poet laureate and co-founder of JustBook-ish, a literary gathering place in Dorchester. <em>(Suzanne Kreiter/Globe Staff)</em></figcaption></figure><p> She said she hopes the identities she and her business partner, Bing Broderick, embody will help bring all kinds of people to the store.</p><p>&ldquo;At JustBook-ish, we&rsquo;re 50% woman-owned, 50% Black-owned, 100% queer-owned. Just us embodying those identities will hopefully invite folks who also have those identities. But beyond that, this intersectionality invites everybody in,&rdquo; she said.</p><div class="m-content-advert"><div class="m-content-advert-wrap"><span class="m-content-advert-title">Advertisement:</span><div id="js-advert--inarticle5" class="m-advert m-advert--inarticle5 "><div class="m-advert__container"><div id="ad_inarticle5"><script type="type/javascript">googletag.cmd.push(function() { googletag.display("ad_inarticle5") })</script></div></div></div></div></div><p>Twin sisters Lily and Hannah Barrett, owners of the inclusive romance pop-up bookstore <a href="https://www.instagram.com/readmylipsboston/?hl=en">Read My Lips Boston</a> felt similarly. Focusing on inclusive romance means they can share diverse perspectives and lived experiences, and it also allows people to &ldquo;read about others&rsquo; experiences, to put themselves in other shoes,&rdquo; Hannah Barrett said.</p><figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="768" height="1024" src="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/DC827261-BDB8-439E-A48F-28291D4A28F5_1_105_c-1-6740dabf943f4.jpeg" alt="" class="wp-image-32393432" srcset="https://bdc2020.o0bc.com/wp-content/uploads/2024/11/DC827261-BDB8-439E-A48F-28291D4A28F5_1_105_c-1-6740dabf943f4.jpeg?width=200 200w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/DC827261-BDB8-439E-A48F-28291D4A28F5_1_105_c-1-6740dabf943f4.jpeg?width=300 300w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/DC827261-BDB8-439E-A48F-28291D4A28F5_1_105_c-1-6740dabf943f4.jpeg?width=400 400w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/DC827261-BDB8-439E-A48F-28291D4A28F5_1_105_c-1-6740dabf943f4.jpeg?width=500 500w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/DC827261-BDB8-439E-A48F-28291D4A28F5_1_105_c-1-6740dabf943f4.jpeg?width=600 600w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/DC827261-BDB8-439E-A48F-28291D4A28F5_1_105_c-1-6740dabf943f4.jpeg?width=700 700w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/DC827261-BDB8-439E-A48F-28291D4A28F5_1_105_c-1-6740dabf943f4.jpeg?width=800 800w, https://bdc2020.o0bc.com/wp-content/uploads/2024/11/DC827261-BDB8-439E-A48F-28291D4A28F5_1_105_c-1-6740dabf943f4.jpeg?width=900 900w" sizes="auto, (max-width: 768px) 100vw, 768px" /><figcaption class="wp-element-caption">Lily and Hannah Barrett (right), owners of the inclusive romance pop-up bookstore Read My Lips Boston, talk to a customer (left). <em>(Photo courtesy of Lily and Hannah Barrett)</em></figcaption></figure><p>&ldquo;&#8203;&#8203;We wanted to create a space where people could feel seen <em>and</em> where they could also expand their perspectives,&rdquo; Lily Barrett added.</p><p>Having a niche is helpful from a practical standpoint, too. As a one-woman team, Hossain, the owner of Narrative, is responsible for everything that happens at the store. From bookselling and coordinating events, to the behind-the-scenes grunt work like taking inventory and cleaning, she does it all. Having a niche has helped her run her store as efficiently as possible.</p><p>&ldquo;It&#8217;s really nice for me to have something that is grounding and helps me organize my thoughts. I feel like I have built something that feels really intentional and meaningful, and having a focus and a niche really helps drive that,&rdquo; she said.</p><h2 class="wp-block-heading" id="h-a-bookstore-boom-or-a-reclaiming-of-boston-s-bookish-past">A bookstore boom or a &ldquo;reclaiming&rdquo; of Boston&rsquo;s bookish past?</h2><p>When Broderick, a co-founder of JustBook-ish, moved to Boston in 1987 there were around 25 bookstores in Harvard Square, he told Boston.com. The landscape today is beginning to reflect this past, more so than create something new, he believes.</p><p>&ldquo;I feel like we&#8217;re reclaiming to some degree,&rdquo; he said.&nbsp;</p><p>Indeed, according to a <a href="https://www.thecrimson.com/article/1989/6/26/no-bookstore-is-the-same-pthere/">1989 article in the <em>Harvard Crimson</em></a>, there were more than 25 bookstores across 10 blocks in Harvard Square &ndash; &ldquo;a bookstore for every type of shopper,&rdquo; student journalist Melissa R. Hart wrote.&nbsp;</p><div class="m-content-advert"><div class="m-content-advert-wrap"><span class="m-content-advert-title">Advertisement:</span><div id="js-advert--inarticle6" class="m-advert m-advert--inarticle6 "><div class="m-advert__container"><div id="ad_inarticle6"><script type="type/javascript">googletag.cmd.push(function() { googletag.display("ad_inarticle6") })</script></div></div></div></div></div><p>While Boston&rsquo;s book scene in 2024 might not be experiencing a renaissance to rival its bookish past, there is something to be said for the bookstore owners &ndash; many of them queer women and women of color &ndash; who are building the city&#8217;s niche bookstore scene. They&#8217;ve created a &ldquo;warm, welcoming, and celebratory&rdquo; industry that is not based on competition, but rather solidarity and support.</p><p>&ldquo;Other indie booksellers and bookstore owners see a new bookstore opening not as competition, but as a success for the industry,&rdquo; Kanter, the owner of Lovestruck Books, said. &ldquo;It&rsquo;s been really wonderful.&rdquo;</p><p>Hossain, owner of Narrative agreed, saying there is tremendous respect and support for each other&#8217;s niche and success.</p><p>&ldquo;There&rsquo;s not this sense of, &lsquo;If I&#8217;m thriving, I&#8217;m taking something away from one of them.&rsquo; It&#8217;s more so that, &lsquo;If I thrive, we all thrive together.&rsquo; Each of us has something different to offer, but it&#8217;s all tied together in a way,&rdquo; she said. </p><h2 class="wp-block-heading" id="h-map-where-to-find-the-best-bookstores-in-greater-boston">Map: Where to find the best bookstores in Greater Boston</h2><iframe loading="lazy" src="https://www.google.com/maps/d/embed?mid=1W48DDOMR60GYYbA8E-QwmgB38noVzjI&amp;ehbc=2E312F&amp;noprof=1" width="640" height="480"></iframe><h2 class="wp-block-heading" id="h-full-list-where-to-find-the-best-bookstores-in-greater-boston">Full list: Where to find the best bookstores in Greater Boston</h2> <div id="tablepress-110-no-2-scroll-buttons-wrapper" class="tablepress-scroll-buttons-wrapper"> <button class="tablepress-scroll-button tablepress-scroll-button-left" title="Scroll table left">❮</button> <div id="tablepress-110-no-2-scroll-wrapper" class="tablepress-scroll-wrapper"> <table id="tablepress-110-no-2" class="tablepress tablepress-id-110 tablepress-responsive"> <thead> <tr class="row-1 odd"> <th class="column-1">Bookstore</th><th class="column-2">Address</th><th class="column-3">What readers said</th> </tr> </thead> <tbody class="row-hover"> <tr class="row-2 even"> <td class="column-1"><a href="https://www.asanctuarycafe.com/" rel="noopener" target="_blank">A Sanctuary Cafe</a></td><td class="column-2">80 Charles St., Boston</td><td class="column-3"></td> </tr> <tr class="row-3 odd"> <td class="column-1"><a href="https://aesopsfable.com/" rel="noopener" target="_blank">All She Wrote Books</a></td><td class="column-2">75 Washington St., Somerville </td><td class="column-3">“It’s a women-owned and queer, feminist bookstore, but also neighborhood centered. It is inviting and inclusive. Also, Ruby the bookstore dog!” — Devon M., East Somerville</td> </tr> <tr class="row-4 even"> <td class="column-1"><a href="https://www.allshewrotebooks.com/" rel="noopener" target="_blank">Aesop’s Fable</a></td><td class="column-2">400 MA-16 #200, Holliston</td><td class="column-3">“It is small but cozy. They offer all types of books from adult to baby, fiction to nonfiction. They also have a great supply of gifts, games and puzzles. They have locals write reviews of their favorites and also offer a mystery book selection where you choose based on genre and the first sentence in the book. Plus the owners are great community partners. They participate in town events, have school book lists, etc.” — Kim B., Holliston</td> </tr> <tr class="row-5 odd"> <td class="column-1"><a href="https://www.anunlikelystory.com/" rel="noopener" target="_blank">An Unlikely Story</a></td><td class="column-2">111 South St., Plainville</td><td class="column-3"> “An Unlikely Story has everything you need for book lovers of all ages. They have an excellent selection of books and gift items, a cute cafe area with great menu items, and a wide selection of events/guest visits. The building has been renovated in a modern way that maintains its rustic charm.” — Stephanie L., Plainville</td> </tr> <tr class="row-6 even"> <td class="column-1"><a href="https://andoverbookstore.com/" rel="noopener" target="_blank">Andover Bookstore</a></td><td class="column-2">74 Main St., Andover</td><td class="column-3">“You have to respect that it is America’s oldest independent bookstore and still going strong. It’s intimate and cozy, just like a reading spot should be, and the knowledgeable staff keep a great inventory in stock and help with recommendations and special orders. Very glad to have this in our community!” — Lis T., Andover</td> </tr> <tr class="row-7 odd"> <td class="column-1"><a href="https://www.barrowbookstore.com/" rel="noopener" target="_blank">Barrow Book Store</a></td><td class="column-2">79 Main St. #2, Concord</td><td class="column-3">“Great selection, very eclectic. Technically a used bookstore but most books are in like new condition. Welcoming space, very well lit, well organized and a good price range — you can daydream about a first edition ‘Walden’ or buy a reading copy.” — Ali H., Boston</td> </tr> <tr class="row-8 even"> <td class="column-1"><a href="https://www.bhbooks.com/" rel="noopener" target="_blank">Beacon Hill Books &amp; Cafe</a></td><td class="column-2">71 Charles St., Boston</td><td class="column-3">“It is gorgeous, the most beautiful bookstore by far, the people who work there are knowledgeable and friendly, they have a great curated book selection, and if they don’t have what you are looking for, they will get it for you promptly. It is the BEST for children with a whole adorable floor to mesmerize little ones, and, once you are done, the café right down stairs serves yummy breakfast, lunch, tea and supper. I could live there!” — Alicia C., Beacon Hill</td> </tr> <tr class="row-9 odd"> <td class="column-1"><a href="https://www.bedlambookcafe.com/" rel="noopener" target="_blank">Bedlam Book Cafe</a></td><td class="column-2">138 Green St., Suite 1, Worcester</td><td class="column-3">“You can tell a lot of love and care goes into this bookstore. Quality books, intention, and a hidden gem of a cafe in the back.” — Julia, Worcester</td> </tr> <tr class="row-10 even"> <td class="column-1"><a href="https://www.belmontbooks.com/" rel="noopener" target="_blank">Belmont Books</a></td><td class="column-2">79 Leonard St., Belmont</td><td class="column-3">“Amazing recommendations from knowledgeable and kind staff. Remarkable events — both in store and at other venues. Delightful selection and customer service. And a sweet cafe!” — Stine O., Somerville</td> </tr> <tr class="row-11 odd"> <td class="column-1"><a href="https://bookendswinchester.indielite.org/" rel="noopener" target="_blank">Book Ends</a></td><td class="column-2">559 Main St., Winchester</td><td class="column-3">“There is a wonderful children’s section in addition to the wide variety of adult books. Book Ends hosts author signings, book parties, and is integrated into the community. They sell tickets for everything happening in Winchester from tickets to high school musicals, raffle tickets for non profits, and more. The staff really know the books and take lots of time to help customers find just the right book.” — Cassandra H., Winchester</td> </tr> <tr class="row-12 even"> <td class="column-1"><a href="https://www.brattlebookshop.com/" rel="noopener" target="_blank">Brattle Book Shop</a></td><td class="column-2">9 West St., Boston</td><td class="column-3">“It’s what a book shop should be. You can get lost in the stacks exploring old books. Cheap used books are put back into readers hands instead of heading to recycling. Rare old volumes can be explored.” — Joe Z., MetroWest</td> </tr> <tr class="row-13 odd"> <td class="column-1"><a href="https://www.brooklinebooksmith.com/" rel="noopener" target="_blank">Brookline Booksmith</a></td><td class="column-2">279 Harvard St., Brookline</td><td class="column-3">“The selection, atmosphere, and variety of products sold are wonderful. Every time I am in Coolidge Corner, it is on my agenda, whether I need another book or not. As a professional baker, I love their baking and cooking selections the most. You can always find whatever you need, and a few other things when you walk in.” — Nancy, Quincy</td> </tr> <tr class="row-14 even"> <td class="column-1"><a href="https://brynmawrbookstore.com/" rel="noopener" target="_blank">Bryn Mawr Book Store</a></td><td class="column-2">373 Huron Ave., Cambridge</td><td class="column-3">“First prints. Cozy.” — Anonymous</td> </tr> <tr class="row-15 odd"> <td class="column-1"><a href="https://commonwealthbooks.blackwidowpress.com/" rel="noopener" target="_blank">Commonwealth Books</a></td><td class="column-2">9 Spring Lane, Boston</td><td class="column-3">“Tucked away in an alley, this bookstore has given me many treasures throughout the years; best place to find rare out of prints.” — Javier M., Forest Hills</td> </tr> <tr class="row-16 even"> <td class="column-1"><a href="https://www.copperdogbooks.com/" rel="noopener" target="_blank">Copper Dog Books</a></td><td class="column-2">272 Cabot St., Beverly</td><td class="column-3">“Excellent selection, local author events, extremely helpful, and passionate staff who zeroed in on a perfect series for my picky tween, and it shares space with an amazing coffee shop, Atomic Coffee.” — Amanda R., Beverly</td> </tr> <tr class="row-17 odd"> <td class="column-1"><a href="https://www.dogtownbooks.com/" rel="noopener" target="_blank">Dogtown Books</a></td><td class="column-2">132 Main St., Gloucester</td><td class="column-3">“Old books, some new books, signed books, chairs to sit in. [I love] the way it is arranged, the prices, the whole vibe.” — Heidi C., Framingham</td> </tr> <tr class="row-18 even"> <td class="column-1"><a href="https://www.eastendbooksptown.com/" rel="noopener" target="_blank">East End Books</a></td><td class="column-2">389 Commercial St., Provincetown and 300 Pier 4 Blvd., Seaport</td><td class="column-3"></td> </tr> <tr class="row-19 odd"> <td class="column-1"><a href="https://www.facebook.com/p/Dr-Ellie-Paris-Social-Bookstore-Ice-Cream-Cafe-100085056460089/" rel="noopener" target="_blank">Ellie Paris Ice Cream Social Book Store &amp; Social Café</a></td><td class="column-2">278 Main St., Brockton</td><td class="column-3"></td> </tr> <tr class="row-20 even"> <td class="column-1"><a href="https://friartuckscomics.com/" rel="noopener" target="_blank">Friar Tuck&#8217;s Comics &amp; Collectibles</a></td><td class="column-2">310 Harvard St 2nd floor, Brookline</td><td class="column-3"></td> </tr> <tr class="row-21 odd"> <td class="column-1"><a href="https://frugalbookstore.net/" rel="noopener" target="_blank">Frugal Bookstore</a></td><td class="column-2">57 Warren St., Roxbury</td><td class="column-3">“The owners are SO kind, they always have what I’m looking for or can order it for me, and their recommendations are great. They’re a wonderful part of the community of Nubian.” — Nat, Jamaica Plain</td> </tr> <tr class="row-22 even"> <td class="column-1"><a href="https://gooddognewton.com/" rel="noopener" target="_blank">Good Dog Records &amp; Books</a></td><td class="column-2">1187 Centre St., Newton</td><td class="column-3">“Eclectic taste. Well-curated hole in the wall in Newton. I located a Chartreuse guide and some really difficult to source records.” — Robert, Metrowest</td> </tr> <tr class="row-23 odd"> <td class="column-1"><a href="https://www.grolierpoetrybookshop.org/" rel="noopener" target="_blank">Grolier Poetry Book Shop</a></td><td class="column-2">6 Plympton St., Cambridge</td><td class="column-3">“I love the magical feeling of stepping into America’s oldest poetry book store. The varied selections, particularly from local poets, attracts me. Poetry readings are frequent and community-building. The staff is thoughtful, kind, and helpful. I can’t imagine literary life without The Grolier.” — Jessica L., Waltham</td> </tr> <tr class="row-24 even"> <td class="column-1"><a href="https://www.harvard.com/index.php?/" rel="noopener" target="_blank">Harvard Book Store</a></td><td class="column-2">1256 Massachusetts Ave., Cambridge</td><td class="column-3">“I spend up to three hours browsing. The staff knows its stuff. Exceptional in getting special orders, especially from small publishers. Excellent remainder section and used book section. The author events are the best in the city.” — Chris M., Orleans</td> </tr> <tr class="row-25 odd"> <td class="column-1"><a href="https://www.hummingbirdbooks.com/" rel="noopener" target="_blank">Hummingbird Books</a></td><td class="column-2">55 Boylston St., Suite 5510, Chestnut Hill</td><td class="column-3">“The staff is so friendly and passionate! I love the way that they have created a community around the store by running a book club and holding nonprofit fundraisers like gift wrapping during the holidays. The store is so lovely and they have a great selection.” — Alexys F., Jamaica Plain</td> </tr> <tr class="row-26 even"> <td class="column-1"><a href="https://iambooksboston.com/" rel="noopener" target="_blank">I AM Books</a></td><td class="column-2">124 Salem St., Boston</td><td class="column-3">“Great selection of books, helpful and friendly staff. Love the selection of books dedicated to Italy. This is a gem of a bookstore.” — Pat S., North End</td> </tr> <tr class="row-27 odd"> <td class="column-1"><a href="https://www.jabberwockybookshop.com/" rel="noopener" target="_blank">Jabberwocky Bookshop</a></td><td class="column-2">50 Water St. #22, Newburyport</td><td class="column-3">“Nestled in the city’s Tannery Marketplace, this bookstore is simply the coziest. Visitors will be greeted by their welcoming staff, as well as their adorable and friendly dog. Throughout the shelves, you’ll find many useful handwritten notes and recommendations… And, after you find the perfect read, you can enjoy it right away at one of the nearby cafes or walk a few steps and sit along the waterfront.” — Jenny, Newburyport</td> </tr> <tr class="row-28 even"> <td class="column-1"><a href="https://www.justbook-ish.com/" rel="noopener" target="_blank">Just Book-ish</a></td><td class="column-2">1463 Dorchester Ave., Boston</td><td class="column-3"></td> </tr> <tr class="row-29 odd"> <td class="column-1"><a href="https://www.lalabookstore.com/" rel="noopener" target="_blank">Lala Books</a></td><td class="column-2">189 Market St., Lowell</td><td class="column-3">“Located in historic downtown Lowell Massachusetts, the book store offers every book genre one can think of. There’s a great section celebrating Lowell’s very rich and diverse history. You’ll even discover local artist creations scattered throughout the store. Including puzzles, fun gifts, and unique items for yourself. The staff at LaLa Books are the most knowledgeable I’ve met.” — Alex G.P., Lowell</td> </tr> <tr class="row-30 even"> <td class="column-1"><a href="https://www.littlebeebookshop.com/" rel="noopener" target="_blank">Little Bee Bookshop</a></td><td class="column-2">40 Main St., Ayer</td><td class="column-3">“Super cozy and sweet environment with a well curated, affordably priced selection of children’s books. Lots of kid-sized reading nooks, storytime events, and a little section for grown-ups too! Other favorite things: It’s right off the commuter rail, across the street from a rail trail, and has lots of handmade items from local crafters.” — Anonymous</td> </tr> <tr class="row-31 odd"> <td class="column-1"><a href="https://https://loveyourshelfusedbooks.square.site/" rel="noopener" target="_blank">Love Your Shelf</a></td><td class="column-2">9 N Main St, Unit #1<br /> Bellingham</td><td class="column-3"></td> </tr> <tr class="row-32 even"> <td class="column-1"><a href="https://www.lucyparsonscenter.org/" rel="noopener" target="_blank">Lucy Parsons Center</a></td><td class="column-2">358 Centre St. A, Jamaica Plain</td><td class="column-3"> “They have books nobody else does and host events from authors really pushing the bounds of political theory.” — Magz, Jamaica Plain</td> </tr> <tr class="row-33 odd"> <td class="column-1"><a href="http://mitpressbookstore.mit.edu/" rel="noopener" target="_blank">MIT Press Bookstore</a></td><td class="column-2">314 Main St., Cambridge</td><td class="column-3">“Great science and children’s selections. Great location in Kendall Square, right next to the T station. Wonderful, knowledgeable staff.” — Bob P., New Hampshire</td> </tr> <tr class="row-34 even"> <td class="column-1"><a href="https://mollysbookstore.com/" rel="noopener" target="_blank">Molly’s Bookstore</a></td><td class="column-2">667-669 Main St., Melrose</td><td class="column-3">“Every time I stop in there is always something new. The friendly service and personal recommendations!” — Katie C., Melrose</td> </tr> <tr class="row-35 odd"> <td class="column-1"><a href="https://www.instagram.com/moonandbackbookstore/" rel="noopener" target="_blank">Moon and Back Bookstore </a></td><td class="column-2">458 High St., Medford</td><td class="column-3"></td> </tr> <tr class="row-36 even"> <td class="column-1"><a href="https://shop.mtwyouth.org/" rel="noopener" target="_blank">More Than Words</a></td><td class="column-2">242 East Berkeley St., Boston</td><td class="column-3">“Youth run and lead. They even have records, fun events, stuff for kiddos, support other youth social enterprises like UTEC, and have awesome thrifted clothes! They also have cool author readings, like with Anita Diamant!” — Amanda, East Boston</td> </tr> <tr class="row-37 odd"> <td class="column-1"><a href="https://www.narrativebookshop.com/" rel="noopener" target="_blank">Narrative</a></td><td class="column-2">387 Highland Ave., Somerville</td><td class="column-3"></td> </tr> <tr class="row-38 even"> <td class="column-1"><a href="https://www.newtonvillebooks.com/" rel="noopener" target="_blank">Newtonville Books</a></td><td class="column-2">10 Langley Rd., Newton</td><td class="column-3">“Amazing service! Warm community with great readings and events. Feels like being in someone’s home and is sunny and warm. Makes me want to roar about how wonderful they are, especially the staff and owner.” — Anonymous, Newton</td> </tr> <tr class="row-39 odd"> <td class="column-1"><a href="https://www.instagram.com/overthetunnelbooks/" rel="noopener" target="_blank">Over The Tunnel Bookstore</a></td><td class="column-2">110 Meridian St, East Boston</td><td class="column-3"></td> </tr> <tr class="row-40 even"> <td class="column-1"><a href="https://pandemoniumbooks.com/" rel="noopener" target="_blank">Pandemonium Books &amp; Games</a></td><td class="column-2">4 Pleasant St., Cambridge</td><td class="column-3">&#8220;Pandemonium in Central Square for sci-fi. It&#8217;s good fun for the right sort of nerd.&#8221; &#8211; DD, Somerville</td> </tr> <tr class="row-41 odd"> <td class="column-1"><a href="https://paperandstringbooks.wordpress.com/" rel="noopener" target="_blank">Paper &amp; String</a></td><td class="column-2">59 Railroad Ave., South Hamilton</td><td class="column-3">“Small, intimate, great selection, top notch service… what more could you want!?” &#8211; Heather R., Hamilton</td> </tr> <tr class="row-42 even"> <td class="column-1"><a href="https://www.facebook.com/p/Paperback-Junction-100064440651779/" rel="noopener" target="_blank">Paperback Junction</a></td><td class="column-2">619 Washington St., South Easton</td><td class="column-3">“Lots of great books and the owners are beyond nice!” — Reed B., Easton</td> </tr> <tr class="row-43 odd"> <td class="column-1"><a href="https://papercutsbookshop.com/" rel="noopener" target="_blank">Papercuts Bookshop</a></td><td class="column-2">60 South St., Jamaica Plain</td><td class="column-3">“Intimate, current, community minded. Managed through the best and worst times when no one thought a real bookstore could survive in the era of Amazon.” — Michel S., Jamaica Plain</td> </tr> <tr class="row-44 even"> <td class="column-1"><a href="https://parksidebookshop.com/" rel="noopener" target="_blank">Parkside Bookshop</a></td><td class="column-2">260 Shawmut Ave., Boston</td><td class="column-3"></td> </tr> <tr class="row-45 odd"> <td class="column-1"><a href="https://parkstreetbooks.com/" rel="noopener" target="_blank">Park Street Books &amp; Toys</a></td><td class="column-2">504 Main St., Medfield</td><td class="column-3">“The excellent and lovingly curated book selection. The owner and staff are expert advisors who know how to recommend books for the people who have read it all, the boutique-style rooms for browsing by age group provide almost a clubhouse feeling and they even have a used book room. Park Street does more than sell books and educational toys, it fuels imaginations. I have visited bookstores across the U.S. and Canada. Park Street is one of a kind, a classic neighborhood book store devoted to the joy of reading.” — Ariadne A., Medfield</td> </tr> <tr class="row-46 even"> <td class="column-1"><a href="https://www.portersquarebooks.com/" rel="noopener" target="_blank">Porter Square Books (Cambridge)</a></td><td class="column-2">1815 Massachusetts Ave., Cambridge </td><td class="column-3">“Great and varied selection of books. Lots of nooks and crannies where you can privately peruse. The cafe is a nice addition and adds to the ambiance. Friendly staff.” — Jennifer J., Arlington</td> </tr> <tr class="row-47 odd"> <td class="column-1"><a href="https://www.portersquarebooks.com/" rel="noopener" target="_blank">Porter Square Books (Boston)</a></td><td class="column-2">50 Liberty Drive, Boston</td><td class="column-3">“It is an inviting bookstore with wonderful staff.” – Anonymous </td> </tr> <tr class="row-48 even"> <td class="column-1"><a href="https://www.posmanbooks.com/" rel="noopener" target="_blank">Posman Books</a></td><td class="column-2">127 Newbury St., Boston</td><td class="column-3">“Small, but with a good reading selection, a children&#8217;s area, and a cheerful and informed staff. Worth browsing and shopping at Possman books.” &#8211; Neil R., South Boston</td> </tr> <tr class="row-49 odd"> <td class="column-1"><a href="https://purplecouchbookshop.com/" rel="noopener" target="_blank">Purple Couch Bookshop</a></td><td class="column-2">350 Winthrop Ave., Unit 9b, North Andover</td><td class="column-3">“They are new and excited. Their selection is great and their staff is well informed. They are the best thing to hit the Merrimack Valley since labor laws.” — Sean M., North Andover</td> </tr> <tr class="row-50 even"> <td class="column-1"><a href="https://www.harvardsquare.com/venue/rodneys-bookstore/" rel="noopener" target="_blank">Rodney’s Bookstore</a></td><td class="column-2">23 Church St., Cambridge</td><td class="column-3">“Amazing selection of unexpected, specific, charming secondhand books.” — Anonymous</td> </tr> <tr class="row-51 odd"> <td class="column-1"><a href="https://rootandpress.com/" rel="noopener" target="_blank">Root and Press</a></td><td class="column-2">156 Shrewsbury St., Worcester</td><td class="column-3">“Great spot to spend the day, eat, drink, and chill.” — Sean S., Worcester</td> </tr> <tr class="row-52 even"> <td class="column-1"><a href="https://rozziebound.com/" rel="noopener" target="_blank">Rozzie Bound Co-op</a></td><td class="column-2">739 South St., Roslindale</td><td class="column-3">“Great little boutique bookstore that has a small but excellent and eclectic selection. If you don’t see what you want, just ask, and they will get it for you!” — Tina L., Roslindale</td> </tr> <tr class="row-53 odd"> <td class="column-1"><a href="https://www.seahowlbookshop.com/" rel="noopener" target="_blank">Sea Howl Bookshop</a></td><td class="column-2">46 Main St., Orleans</td><td class="column-3">“Sea Howl has [an] absolutely fantastic selection of books in an intimate and elegant space. The fiction and nonfiction selections are second to none. The cookbook selection is varied and delightful. As Sea Howl is on the Cape, there is also a strong regional selection of Cape-specific titles. The owners and staff make excellent and unexpected recommendations, and you always leave with a gem.” — Lexy B., Dennis</td> </tr> <tr class="row-54 even"> <td class="column-1"><a href="https://www.facebook.com/people/Seven-Stars-crystals-and-books/100054391606330/" rel="noopener" target="_blank">Seven Stars</a></td><td class="column-2">731 Massachusetts Ave., Cambridge</td><td class="column-3">“Great selection of health and wellness books, books on Taoism, Buddhism and various spiritual paths, plus calendars, crystals, tarot cards, singing bowls, and more. Friendly staff too.” — R.H., Brighton</td> </tr> <tr class="row-55 odd"> <td class="column-1"><a href="https://www.storybookcove.com/" rel="noopener" target="_blank">Storybook Cove</a></td><td class="column-2">775 Washington St. Suite 2, Hanover</td><td class="column-3">“Proximity to my home, great customer service (they order books if not in stock) and even delivered to our home!” — Magdalena, Holbrook</td> </tr> <tr class="row-56 even"> <td class="column-1"><a href="https://www.tatnuck.com/" rel="noopener" target="_blank">Tatnuck Bookseller</a></td><td class="column-2">18 Lyman St., Westborough</td><td class="column-3"></td> </tr> <tr class="row-57 odd"> <td class="column-1"><a href="http://www.bluebunnybooks.com/" rel="noopener" target="_blank">The Blue Bunny Books &amp; Toys</a></td><td class="column-2">577 High St., Dedham</td><td class="column-3"></td> </tr> <tr class="row-58 even"> <td class="column-1"><a href="https://thebookoasis.com/" rel="noopener" target="_blank">The Book Oasis</a></td><td class="column-2">311 Main St., Stoneham</td><td class="column-3">“The owners are wonderful people. If they don’t have a new book, they will find it for you. The option of being able to buy a used book and save a little money is a great thing for a middle class book lover like me.” — Nancy D., Stoneham</td> </tr> <tr class="row-59 odd"> <td class="column-1"><a href="https://www.book-rack.com/" rel="noopener" target="_blank">The Book Rack</a></td><td class="column-2">13 Medford St., Arlington</td><td class="column-3">“Good selection of new and used books, and quick ordering for anything that’s not in stock. Staff is friendly and knowledgeable. Our shy-ish kid has no problem asking for help on her own while we browse in other sections. And their used book credit program is phenomenal. We trade in books constantly, and they make it so easy and worthwhile. Thanks, Book Rack!” — David S., Arlington</td> </tr> <tr class="row-60 even"> <td class="column-1"><a href="https://bookshopofbeverlyfarms.com/" rel="noopener" target="_blank">The Bookshop of Beverly Farms</a></td><td class="column-2">40 West St., Beverly</td><td class="column-3">“Cozy and welcoming! Expertly curated with something for everyone! And with a kind and knowledgeable staff ready to chat about new books, celebrate old favorites, and support curious readers of all ages.” &#8211; Jason, Ipswich</td> </tr> <tr class="row-61 odd"> <td class="column-1"><a href="https://brewsterbookstore.com/" rel="noopener" target="_blank">The Brewster Bookstore</a></td><td class="column-2">2648 Main St., Brewster</td><td class="column-3">“The Brewster Bookshop on the Cape is a welcome respite from the rush hour traffic of Rt 6 in the summer. It&#8217;s especially warming and comforting on a rainy off-season afternoon. They have an excellent selection of local writers as well and books about the Cape that I haven&#8217;t found anywhere else. The other thing to mention about Brewster Book Shop is that the employees always make you feel welcome, which isn&#8217;t something I always experience when I visit indie book shops in New England, which is especially surprising considering how they publicize their struggles against the megastores. An indie book shop should make you feel it&#8217;s worth the effort and Brewster always does.” &#8211; Jim, Peabody</td> </tr> <tr class="row-62 even"> <td class="column-1"><a href="https://www.concordbookshop.com/" rel="noopener" target="_blank">The Concord Bookshop</a></td><td class="column-2">65 Main St., Concord</td><td class="column-3">“Great selection of interesting books. I can’t get by their windows without seeing something that catches my eye.” — Zahava, Carlisle</td> </tr> <tr class="row-63 odd"> <td class="column-1"><a href="https://thenextchapter-booksandmore.com/" rel="noopener" target="_blank">The Next Chapter Books and More</a></td><td class="column-2">1147 Hancock St., Quincy</td><td class="column-3">“The Next Chapter Books and More is set to open in Quincy this weekend, and we are all so excited to have an independent bookstore in the neighborhood. I can&#8217;t wait to spend way too much time and money there, and support this family.” &#8211; Hannah B., Quincy</td> </tr> <tr class="row-64 even"> <td class="column-1"><a href="https://www.silverunicornbooks.com/" rel="noopener" target="_blank">The Silver Unicorn Bookstore</a></td><td class="column-2">12 Spruce St., Acton</td><td class="column-3">Silver Unicorn in Acton is awesome. They frequently have local authors in, have story time for kids, and are owned by a local family. As a result, they participate in tons of community events including book fairs at the local schools. It’s a great place to grab a book or a gift with local flair.” — Brian D., Acton</td> </tr> <tr class="row-65 odd"> <td class="column-1"><a href="https://www.titcombsbookshop.com/" rel="noopener" target="_blank">Titcomb&#8217;s Bookshop</a></td><td class="column-2">423 MA-6A, East Sandwich</td><td class="column-3">“Thoughtfully selected books for all ages. Creative and unusual toys, gifts, and cards. And wonderful employees who are friendly and helpful.” &#8211; Philip A., Yarmouth</td> </tr> <tr class="row-66 even"> <td class="column-1"><a href="http://www.tresgatosjp.com/" rel="noopener" target="_blank">Tres Gatos</a></td><td class="column-2">470 Centre St., Jamaica Plain</td><td class="column-3">“It’s perfect. Where else can you sip a glass of wine, listen to some great vinyl, and browse books at the same time? Come for the food, stay for the book and record store!” — Sarah S., Roslindale</td> </tr> <tr class="row-67 odd"> <td class="column-1"><a href="https://www.tridentbookscafe.com/" rel="noopener" target="_blank">Trident Booksellers &amp; Cafe</a></td><td class="column-2">338 Newbury St., Boston</td><td class="column-3">“The welcoming ambiance, the great selection of books, and communal vibes of the cafe areas are unbeatable.” — Kushal A., Cambridge</td> </tr> <tr class="row-68 even"> <td class="column-1"><a href="https://usedbooksuperstore.com/" rel="noopener" target="_blank">Used Book Superstore</a></td><td class="column-2">256 Cambridge St., Burlington</td><td class="column-3">“Best place you will ever come across. So so so many titles. Among other stuff. If you’re a ‘bookie’ do yourself a favor and check this place out. The staff is beyond helpful and if you’re lucky enough to catch the owner there, he’s a hell of a guy.” — K. Cap, Milford</td> </tr> <tr class="row-69 odd"> <td class="column-1"><a href="https://www.wellesleybooks.com/" rel="noopener" target="_blank">Wellesley Books</a></td><td class="column-2">82 Central St., Wellesley</td><td class="column-3">“Wellesley Books has a great selection of books, terrific children’s section, knowledgeable staff, fun gift items, and just makes me happy when I’m there.” — Tina M., Wellesley</td> </tr> <tr class="row-70 even"> <td class="column-1"><a href="https://www.whitelambooks.com/" rel="noopener" target="_blank">Whitelam Books</a></td><td class="column-2">610 Main St., Reading</td><td class="column-3">“The staff are knowledgeable, personable, and kind. It’s also important to note that under some books on the shelf, the store included staff and customer reviews. Through these reviews, we have been able to find some wonderful novels. Additionally, whenever there is a book not in stock, the staff has been willing to order it for us, and the order always arrives in a timely manner. Whitelam Books has a wide range of books for every interest, including books by local authors. We are so glad that this wonderful book store is in our town.” — Molly T., Reading</td> </tr> <tr class="row-71 odd"> <td class="column-1"><a href="https://www.facebook.com/winthropbookdepot/" rel="noopener" target="_blank">Winthrop Book Depot &amp; Cafe</a></td><td class="column-2">215 Essex St., Salem</td><td class="column-3">“Good mix of used and new books. Many signed copies of new releases. Excellent selection of local history. Cool non-book items.” — Kristin S., Salem</td> </tr> <tr class="row-72 even"> <td class="column-1"><a href="https://www.wickedgoodbookstore.com/" rel="noopener" target="_blank">Wicked Good Books</a></td><td class="column-2">9 Somerset Ave, Winthrop</td><td class="column-3">“They have a wonderful selection of diverse children’s books for children of all backgrounds, as well as tweens and young adults, plus a nice curated selection of nonfiction and fiction, as well as [toys]… They have a busy coffee business too — mostly to go these days—and excellent muffins that are especially good heated and to go, a nice selection, including chocolate.” — Dean B., Winthrop</td> </tr> <tr class="row-73 odd"> <td class="column-1"><a href="https://wordstreetbooks.com/" rel="noopener" target="_blank">Word on the Street </a></td><td class="column-2">162 Main St., Marlborough</td><td class="column-3">“Great selection of books for kids and grown ups; and thoughtful gifts as well. Love the folks who work there, they offer great recommendations!” &#8211; Emily C., Southborough </td> </tr> </tbody> </table> </div> <button class="tablepress-scroll-button tablepress-scroll-button-right" title="Scroll table right">❯</button> </div> </p><p><em>Community co-op <a href="https://www.boston.com/author/nia-harmon/">Nia Harmon</a> contributed to this report.</em></p> <div class="o-author-single has-avatar"> <header class="m-author-card"> <div class="a-image a-image--square m-author-card__image"> <img class="" src="https://www.boston.com/wp-content/uploads/2024/10/cropped-IMG_2875-671fb6f808237-671fb70325313.jpg" alt="Profile image for Annie Jonas"> </div> <div class="m-author-card__text"> <h3 class="m-author-card__title"><a href="https://www.boston.com/author/annie-jonas">Annie Jonas</a></h3> </div> </header> <section class="author-info"> <div class="m-author__section" ><p>Annie Jonas is a Community writer at Boston.com. She was previously a local editor at Patch and a freelancer at the Financial Times.</p> </div> </section> </div> <div class="m-block m-generic-cta m-generic-cta--post-content m-generic-cta--dark m-generic-cta--homepage m-generic-cta--email-signup m-generic-cta-block-style--default t-amp__generic-cta"> <div class="m-generic-cta__wrap"> <div class="m-generic-cta__content"> <h3 class="m-generic-cta__title">Sign up for Book Club</h3> <p class="m-generic-cta__subtitle">Stay up to date on local books news, events, and recommendations from Boston.com.</p> </div> <div class="m-generic-cta__feature"> <form id="newsletter-form-4" class="m-form-newsletter m-form-newsletter--horizontal" action="" method="" data-mailchimp-list-ids="0c6e2a1200" > <fieldset form="newsletter-form"> <legend class="screen-reader-text"> Submit your email </legend> <label class="m-form-newsletter__label" for="email-form-4"> <span class="screen-reader-text">Enter your email address</span> <input class="a-input m-form-newsletter__input" type="email" id="email-form-4" name="email" placeholder="Email Address" aria-required="true" required> <p class="m-form-newsletter-error"></p> </label> <div id="email_hp_wrap" style="display: none" aria-hidden="true"> <input id="name_5" name="name_5" type="text" value="" autocomplete="nope" tabindex="-1" > </div> <button type="submit" name="submit" class="a-button a-button--primary m-form-newsletter__button"> Sign up </button> </fieldset> </form> </div> </div> </div> <div class="content-below-article"> </div> <div class="rev-content"> <div id="rev"> <div id="rc-widget-5c0cda" data-rc-widget data-widget-host="habitat" data-direct-delivery data-endpoint="//trends.revcontent.com" data-widget-id="109517"></div> </div> </div> <div> <div id="comments"> <div data-openweb-ad data-row="1" data-column="1"></div><h3 style="margin-bottom: 0.9375rem;">Conversation</h3><h5 style="margin-top: 0;">This discussion has ended. Please join elsewhere on Boston.com</h5></div> </div> </article> </section> <div class="t-layout__sidebar" id="sidebar-home"> <div class="m-widget"> <div class="m-advert m-advert--sidebar m-advert--600"> <div class="m-content-advert-wrap"> <div id="js-advert--articlerail1" class="m-advert m-advert--articlerail1 "><div class="m-advert__container"><div id="ad_articlerail1"><script type="type/javascript">googletag.cmd.push(function() { googletag.display("ad_articlerail1") })</script></div></div></div> </div> </div> </div> <div class="m-widget"> <div id="most-popular-posts" class="m-widget m-numbered-post-list"> <header class="m-numbered-post-list__header"> <h3 class="m-numbered-post-list__header-title"> Most Popular </h3> </header> <div class="m-numbered-post-list__posts"> <article id="m-numbered-post-list-1" class="m-numbered-post-list__post"> <a aria-label="Tatum’s leads Celtics to dominant win over Sixers: 7 takeaways" class="m-numbered-post-list__link" href="https://www.boston.com/sports/boston-celtics/2025/02/20/jayson-tatums-triple-double-leads-celtics-to-dominant-win-over-sixers-7-takeaways/"> <div class="m-numbered-post-list__image" data-count="1"> <img alt="Tatum’s leads Celtics to dominant win over Sixers: 7 takeaways" height="95" loading="lazy" src="//bdc2020.o0bc.com/wp-content/uploads/2025/02/Celtics_76ers_Basketball_88810-67b7f977c728e-768x432.jpg?width=190" width="95"/> </div> <div class="m-numbered-post-list__pseudo-link-container"> <span class="m-numbered-post-list__pseudo-link" > Tatum’s leads Celtics to dominant win over Sixers: 7 takeaways </span> </div> </a> </article> <article id="m-numbered-post-list-2" class="m-numbered-post-list__post"> <a aria-label="Canadian anthem singer at 4 Nations Face-Off changes lyric to protest Trump" class="m-numbered-post-list__link" href="https://www.boston.com/sports/boston-bruins/2025/02/20/singer-of-canadian-anthem-at-4-nations-face-off-changes-lyric-to-protest-trumps-51st-state-remarks/"> <div class="m-numbered-post-list__image" data-count="2"> <img alt="Canadian anthem singer at 4 Nations Face-Off changes lyric to protest Trump" height="95" loading="lazy" src="//bdc2020.o0bc.com/wp-content/uploads/2025/02/4_Nations_Canada_US_Hockey_49490-67b7ee677314e-768x432.jpg?width=190" width="95"/> </div> <div class="m-numbered-post-list__pseudo-link-container"> <span class="m-numbered-post-list__pseudo-link" > Canadian anthem singer at 4 Nations Face-Off changes lyric to protest Trump </span> </div> </a> </article> <article id="m-numbered-post-list-3" class="m-numbered-post-list__post"> <a aria-label="Watch: TD Garden crowd sings US national anthem at 4 Nations" class="m-numbered-post-list__link" href="https://www.boston.com/sports/boston-bruins/2025/02/20/td-garden-boston-team-usa-canada-4-nations-face-off-national-anthem/"> <div class="m-numbered-post-list__image" data-count="3"> <img alt="Watch: TD Garden crowd sings US national anthem at 4 Nations" height="95" loading="lazy" src="//bdc2020.o0bc.com/wp-content/uploads/2025/02/TTKL5SCGJR44PPCKJN4NUCGTCM-67b7ddf7004ca-768x432.jpg?width=190" width="95"/> </div> <div class="m-numbered-post-list__pseudo-link-container"> <span class="m-numbered-post-list__pseudo-link" > Watch: TD Garden crowd sings US national anthem at 4 Nations </span> </div> </a> </article> <article id="m-numbered-post-list-4" class="m-numbered-post-list__post"> <a aria-label="This is the best pizza in Boston, according to our pizza bracket" class="m-numbered-post-list__link" href="https://www.boston.com/community/food/2025/02/18/best-pizza-greater-boston-bracket/"> <div class="m-numbered-post-list__image" data-count="4"> <img alt="This is the best pizza in Boston, according to our pizza bracket" height="95" loading="lazy" src="//bdc2020.o0bc.com/wp-content/uploads/2025/02/IMG_1514-67b4f507a8e63-768x432.jpg?width=190" width="95"/> </div> <div class="m-numbered-post-list__pseudo-link-container"> <span class="m-numbered-post-list__pseudo-link" > This is the best pizza in Boston, according to our pizza bracket </span> </div> </a> </article> <article id="m-numbered-post-list-5" class="m-numbered-post-list__post"> <a aria-label="Mass. Teachers Association removes alleged antisemitic materials that sparked backlash" class="m-numbered-post-list__link" href="https://www.boston.com/news/local-news/2025/02/20/mass-teachers-association-removes-alleged-antisemitic-materials-that-sparked-backlash/"> <div class="m-numbered-post-list__image" data-count="5"> <img alt="Mass. Teachers Association removes alleged antisemitic materials that sparked backlash" height="95" loading="lazy" src="//bdc2020.o0bc.com/wp-content/uploads/2025/02/YSD6RM6BVHOHWCLC5YFPG7QWGA-67b75b0010588-768x432.jpg?width=190" width="95"/> </div> <div class="m-numbered-post-list__pseudo-link-container"> <span class="m-numbered-post-list__pseudo-link" > Mass. Teachers Association removes alleged antisemitic materials that sparked backlash </span> </div> </a> </article> </div> </div> </div> <div class="m-widget"> <div class="m-advert m-advert--sidebar"> <div class="m-content-advert-wrap"> <div id="js-advert--articlerail2" class="m-advert m-advert--articlerail2 m-advert--sticky"><div class="m-advert__container"><div id="ad_articlerail2"><script type="type/javascript">googletag.cmd.push(function() { googletag.display("ad_articlerail2") })</script></div></div></div> </div> </div> </div> </div> <div class="m-grid-container t-layout__related-news"> <hr class="a-thin-hr"> <section aria-label="In Related News" class="o-featured-content o-featured-content--c o-featured-content--c-related m-grid"> <div class="m-grid-span-8"> <header> <h3 class="o-featured-content__title"> In Related News </h3> </header> <section aria-label="These 37 Boston businesses received the city&#8217;s new liquor licenses" class="m-article-list-feature"> <a class="o-well-c__underline--no-decoration" href="https://www.boston.com/food/food-news/2025/02/13/37-boston-businesses-received-new-liquor-licenses/"> <div class="o-well-c__wrapper"> <div class="m-article-list-feature__image-container"> <img width="768" height="432" src="https://bdc2020.o0bc.com/wp-content/uploads/2024/09/AHVQJVDEBG4UBWLNO6MF5L4QOY-66d766c393475-768x432.jpg" class="o-featured-content__main-image m-article-list-feature__image" alt="" decoding="async" loading="lazy" srcset="https://bdc2020.o0bc.com/wp-content/uploads/2024/09/AHVQJVDEBG4UBWLNO6MF5L4QOY-66d766c393475-768x432.jpg?width=200 200w, https://bdc2020.o0bc.com/wp-content/uploads/2024/09/AHVQJVDEBG4UBWLNO6MF5L4QOY-66d766c393475-768x432.jpg?width=300 300w, https://bdc2020.o0bc.com/wp-content/uploads/2024/09/AHVQJVDEBG4UBWLNO6MF5L4QOY-66d766c393475-768x432.jpg?width=400 400w, https://bdc2020.o0bc.com/wp-content/uploads/2024/09/AHVQJVDEBG4UBWLNO6MF5L4QOY-66d766c393475-768x432.jpg?width=500 500w, https://bdc2020.o0bc.com/wp-content/uploads/2024/09/AHVQJVDEBG4UBWLNO6MF5L4QOY-66d766c393475-768x432.jpg?width=600 600w, https://bdc2020.o0bc.com/wp-content/uploads/2024/09/AHVQJVDEBG4UBWLNO6MF5L4QOY-66d766c393475-768x432.jpg?width=700 700w, https://bdc2020.o0bc.com/wp-content/uploads/2024/09/AHVQJVDEBG4UBWLNO6MF5L4QOY-66d766c393475-768x432.jpg?width=800 800w, https://bdc2020.o0bc.com/wp-content/uploads/2024/09/AHVQJVDEBG4UBWLNO6MF5L4QOY-66d766c393475-768x432.jpg?width=900 900w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </div> <div class="m-article-list-feature__content"> <h3 class="m-article-list-feature__headline"> <span class="js-article-card-link m-article-list-feature__link" data-p1="article_recirc_well"> These 37 Boston businesses received the city&#8217;s new liquor licenses </span> </h3> </div> </div> </a> </section> </div> <div class="o-featured-content__article-list o-featured-content--has-title m-grid-span-4"> <div class="o-well-c__wrapper"> <ul class="a-list--no-style m-article-list m-article-list--has-images"> <li class="js-article-card m-article-list__item o-featured-content__list-image"> <div id="nativeteasebot"> <script> googletag.cmd.push(function() { googletag.display('nativeteasebot'); }); </script> </div> </li> <li class="m-article-list__item o-featured-content__list-image"> <a class="o-well-c__underline--no-decoration" href="https://www.boston.com/food/readers-say/2025/02/04/best-vegan-and-vegetarian-dishes-in-greater-boston/"> <div class="o-well-c__wrapper o-well-c__list-item"> <img width="150" height="150" src="https://bdc2020.o0bc.com/wp-content/uploads/2020/01/LuLu-Green-salad-150x150.jpg" class="m-article-list__image" alt="Salad at LuLu Green" decoding="async" loading="lazy" srcset="https://bdc2020.o0bc.com/wp-content/uploads/2020/01/LuLu-Green-salad-150x150.jpg?width=200 200w, https://bdc2020.o0bc.com/wp-content/uploads/2020/01/LuLu-Green-salad-150x150.jpg?width=300 300w, https://bdc2020.o0bc.com/wp-content/uploads/2020/01/LuLu-Green-salad-150x150.jpg?width=400 400w, https://bdc2020.o0bc.com/wp-content/uploads/2020/01/LuLu-Green-salad-150x150.jpg?width=500 500w, https://bdc2020.o0bc.com/wp-content/uploads/2020/01/LuLu-Green-salad-150x150.jpg?width=600 600w, https://bdc2020.o0bc.com/wp-content/uploads/2020/01/LuLu-Green-salad-150x150.jpg?width=700 700w, https://bdc2020.o0bc.com/wp-content/uploads/2020/01/LuLu-Green-salad-150x150.jpg?width=800 800w, https://bdc2020.o0bc.com/wp-content/uploads/2020/01/LuLu-Green-salad-150x150.jpg?width=900 900w" sizes="auto, (max-width: 150px) 100vw, 150px" /> <div class="m-article-list__content o-featured-content__list-content"> <span class="m-article-list__topic"> <span class="a-link a-link--tag a-link--tag-transparent"> Readers Say </span> </span> <h4 class="m-article-list__headline o-featured-content__list-headline"> <span class="m-article-list__link" > Here’s where to get the best vegan and vegetarian dishes in Greater Boston </span> </h4> </div> </div> </a> </li> <li class="m-article-list__item o-featured-content__list-image"> <a class="o-well-c__underline--no-decoration" href="https://www.boston.com/community/book-club/2025/01/30/bookstore-bar-recommendations-drink-pairings/"> <div class="o-well-c__wrapper o-well-c__list-item"> <div class="m-article-list__content o-featured-content__list-content"> <span class="m-article-list__topic"> <span class="a-link a-link--tag a-link--tag-transparent"> Book Club </span> </span> <h4 class="m-article-list__headline o-featured-content__list-headline"> <span class="m-article-list__link" > These Greater Boston bookstores are pairing books with booze </span> </h4> </div> </div> </a> </li> </ul> </div> </div> </section> </div> </div> <!-- Page Content --> </main> <footer id="site-footer" class="o-site-footer" aria-label="Site Footer"> <div class="m-grid-container"> <section class="o-site-footer__meta m-grid"> <div class="o-site-footer__social m-grid-span-4"> <ul class="a-list--no-style m-social-share m-social-share--block m-social-share--footer"> <li class="m-social-share__item"> <a href="https://www.instagram.com/boston/" class="m-social-share__link" rel="nopenner noreferrer" target="_blank"> <svg class="a-icon a-icon--social" aria-hidden="true" width="21" height="17"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#instagram-white"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#instagram-white"></use></svg><span class="screen-reader-text">Follow Boston.com on Instagram (Opens in a New Tab)</span> </a> </li> <li class="m-social-share__item"> <a href="https://twitter.com/intent/user?screen_name=BostonDotCom" class="m-social-share__link" rel="nopenner noreferrer" target="_blank"> <svg class="a-icon a-icon--social" aria-hidden="true" width="21" height="17"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#twitter-white"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#twitter-white"></use></svg><span class="screen-reader-text">Follow Boston.com on Twitter (Opens in a New Tab)</span> </a> </li> <li class="m-social-share__item"> <a href="https://www.facebook.com/boston" class="m-social-share__link" rel="nopenner noreferrer" target="_blank"> <svg class="a-icon a-icon--social" aria-hidden="true" width="11" height="20"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#facebook-white"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#facebook-white"></use></svg><span class="screen-reader-text">Like Boston.com on Facebook (Opens in a New Tab)</span> </a> </li> </ul> </div> <div class="o-site-footer__colophon m-site-colophon m-grid-span-4"> <p class="m-site-colophon__text">&copy;2025 Boston Globe Media Partners, LLC</p> </div> <div class="o-site-footer__survey m-grid-span-4"> <a href="https://www.research.net/r/7W87PRW" class="a-link__survey">Tell Us What You Think</a> </div> <div class="o-site-footer__menu m-grid-span-12"> <nav class="o-site-footer__nav m-secondary-menu m-secondary-menu--footer a-list--no-style" aria-label="Footer Navigation"> <div class="menu-footer-container"><ul id="footer-menu" class="o-site-footer__menu-list m-secondary-menu__list a-list--no-style"><li id="menu-item-22362950" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22362950"><a href="https://www.boston.com/privacy-policy">Do not sell my data</a></li> <li id="menu-item-26585081" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-26585081"><a href="https://www.boston.com/online-gambling-content-disclaimer">GAMBLING DISCLAIMER</a></li> <li id="menu-item-22362921" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22362921"><a rel="privacy-policy" href="https://www.boston.com/privacy-policy/">Privacy Policy</a></li> <li id="menu-item-31876254" class="ot-info-display menu-item menu-item-type-custom menu-item-object-custom menu-item-31876254"><a href="#">Your Privacy Choices</a></li> <li id="menu-item-26304418" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-26304418"><a href="https://www.bostonglobemedia.com/advertise/">ADVERTISE</a></li> <li id="menu-item-22362900" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22362900"><a href="https://www.boston.com/terms-of-service">Terms of Service</a></li> <li id="menu-item-22362926" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22362926"><a href="https://www.boston.com/member-agreement">Member Agreement</a></li> <li id="menu-item-26304411" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-26304411"><a href="https://www.boston.com/contact-us/">CONTACT US</a></li> <li id="menu-item-23287074" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-23287074"><a href="https://globe.rec.pro.ukg.net/BOS1501BGMP/JobBoard/3ebc7d47-2d31-4b8d-817d-db673315517a/?q=&#038;o=postedDateDesc">CAREERS</a></li> <li id="menu-item-28837199" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-28837199"><a href="https://www.boston.com/html-sitemap/">Site Map</a></li> </ul></div> </nav> </div> </section> </div> </footer> <!-- Site Modal --> <div id="site-modal" class="o-site-modal" aria-hidden="true"> <div class="o-site-modal__overlay" tabindex="-1" data-a11y-dialog-hide></div> <div role="dialog" class="o-site-modal__content" aria-labelledby="m-site-modal-logo" aria-describedby="modal-description"> <button data-a11y-dialog-hide="site-modal" class="a-button o-site-modal__close" aria-label="Close this dialog window"> <svg class="a-icon" aria-hidden="true" width="17" height="17"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#close-symbol"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#close-symbol"></use></svg><span class="screen-reader-text">Close Modal</span> </button> <h3 id="m-site-modal-logo" class="m-site-logo"> <span class="screen-reader-text"> Boston.com Newsletter Signup </span> <svg class="a-icon" aria-hidden="true" width="200" height="50"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#logo"></use><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.boston.com/wp-content/themes/bdc-2020/assets/symbol-defs.svg#logo"></use></svg><span class="screen-reader-text">Boston.com Logo</span> </h3> <p id="modal-description" class="o-site-modal__description"> Stay up to date with everything Boston. Receive the latest news and breaking updates, straight from our newsroom to your inbox. </p> <!-- form id should match fieldset 'form' attribute --> <form id="newsletter-form-6" class="m-form-newsletter m-form-newsletter--vertical" action="" method="" data-mailchimp-list-ids="" > <h4 class="m-form-newsletter__heading"> Enter your email address </h4> <fieldset form="newsletter-form"> <legend class="screen-reader-text"> Submit your email </legend> <label class="m-form-newsletter__label" for="email-form-6"> <span class="screen-reader-text">Enter your email address</span> <input class="a-input m-form-newsletter__input" type="email" id="email-form-6" name="email" placeholder="Email Address" aria-required="true" required> <p class="m-form-newsletter-error"></p> </label> <div id="email_hp_wrap" style="display: none" aria-hidden="true"> <input id="name_7" name="name_7" type="text" value="" autocomplete="nope" tabindex="-1" > </div> <button type="submit" name="submit" class="a-button a-button--primary m-form-newsletter__button"> Subscribe </button> </fieldset> </form> <button type="button" name="cancel" class="a-button a-button--is-link a-c-red a-uppercase" data-a11y-dialog-hide="site-modal" > No thanks <span class="screen-reader-text"> - Closes Modal window </span> </button> </div> </div> <!-- / Site Modal --> <script type="text/javascript" id="ad-refresh-callback"> /** * Refresh the OpenWrap/Amazon ads. * * @param array slotsToRefresh The slots due to be refreshed. */ function refreshOpenWrapAds( slotsToRefresh ) { // Don't refresh "out of page" ads. const adsToNotRefresh = ['oosvideo', 'presentedby', 'outofpage']; slotsToRefresh = slotsToRefresh.filter((slot) => !adsToNotRefresh.includes(slot.getSlotElementId())) if (!slotsToRefresh.length) { return } // Remove the previous bids from GPT. PWT.removeKeyValuePairsFromGPTSlots( slotsToRefresh ); // Add targeting Refresh=true to ads that are being refreshed. slotsToRefresh.forEach((slot) => slot.setTargeting('refresh', 'true')) /* * The above code is checking if the Onetrust script is active or not. * If it is active, it checks if the user has given consent for the country code or not. * If the user has given consent, it will display the ads. */ apstag.setDisplayBids(); PWT.a9_BidsReceived = PWT.ow_BidsReceived = false; const amazonSlotsToRefresh = formatSlotsToAmazon( slotsToRefresh ), a9Promise = fetchAmazonBids( amazonSlotsToRefresh ), pubmaticPromise = fetchPubmaticBids( slotsToRefresh ); Promise.allSettled([a9Promise, pubmaticPromise]).then(results => { const allBiddersPromisesRejected = results.every(result => result.status === 'rejected'); if (!allBiddersPromisesRejected) { refreshAds(slotsToRefresh); } }); } /** * Converts the slots in the format required by Amazon. * * @param array slots The slots due to be refreshed. */ function formatSlotsToAmazon( slots ) { const amazonSlotsToRefresh = []; for (let index = 0; index < slots.length; index++) { const slotItem = slots[index], element = {}, slotSizes = [], size = []; element.slotID = slots[index].getSlotElementId(); element.slotName = slots[index].getAdUnitPath(); if ( slots[index].getSizes() ) { sizes = slots[index].getSizes(); for (let indexJ = 0; indexJ < sizes.length; indexJ++) { size[indexJ] = []; size[indexJ].push(sizes[indexJ].width, sizes[indexJ].height); slotSizes.push(size[indexJ]); } } element.sizes = slotSizes; amazonSlotsToRefresh.push(element); } return amazonSlotsToRefresh; } // Gets bids from Amazon for the provided adSlots. fetchAmazonBids = ( slots ) => { return new Promise( ((resolve) => { try { apstag.fetchBids({ slots: slots }, ( bids ) => { apstag.setDisplayBids(); PWT.a9_BidsReceived = true; resolve( bids ); }); } catch ( e ) { resolve( null ); } }) ); } // Gets bids from PubMatic for the provided adSlots. fetchPubmaticBids = ( slots ) => { PWT.removeKeyValuePairsFromGPTSlots( slots ); return new Promise( ( resolve ) => { try { PWT.requestBids( PWT.generateConfForGPT( slots ), ( adUnitsArray ) => { PWT.addKeyValuePairsToGPTSlots( adUnitsArray ); PWT.ow_BidsReceived = true; resolve( adUnitsArray ); }, ); } catch (e) { resolve( null ); } } ); } // Displays the adSlot provided using googletag. displayAdSlots = ( slots ) => { return new Promise( (( resolve ) => { try { for ( let i = 0; i < slots.length; i++ ) { googletag.display( slots[i] ); } resolve( slots ); } catch ( e ) { resolve( null ); } }) ); } // Refreshes the adSlots provided. refreshAds = ( slots ) => { PWT.initAdserverSet = true; displayAdSlots( slots ).then( slots => { googletag.pubads().refresh( slots ); } ) } </script> <script type="text/javascript"> (function (){ // The widget ID is set in PHP. const widget_id = 'rc-widget-5c0cda'; // IntersectionObserver is a vanilla JS api that detects where an element is // relative to the viewport. It eliminates the need for scroll listeners. // https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API const observer = new IntersectionObserver( entries => { // Initialize if the widget is within 500px of the bottom of the viewport. if ( entries[0].isIntersecting ) { initialize(); // Stop observing once the widget has been initialized. observer.unobserve( document.getElementById( widget_id )); } }, // The options for the IntersectionObserver. { rootMargin: '0px 0px 500px 0px' } ); // Start observing the widget observer.observe( document.getElementById( widget_id ) ); function initialize(){ const onetrust_active = 1; const gdprApplies = JSON.parse(localStorage.getItem( 'gdprApplies' ) ); const ccpaApplies = localStorage.getItem( 'ccpaApplies' ); const widget_revcontent = document.getElementById( widget_id ); const scripts_initialize = document.createElement( "script" ); // OneTrust (CMP) is on if ( onetrust_active ) { // User is from CCPA if ( ( null !== ccpaApplies ) ) { const storageCCPA = localStorage.getItem( 'ccpaString' ); widget_revcontent.setAttribute( "data-us-privacy", storageCCPA ); } // User is from GDPR if ( ( null !== gdprApplies ) ) { const storageGDPR = localStorage.getItem( 'gdprString' ); widget_revcontent.setAttribute( "data-gdpr", 1 ); widget_revcontent.setAttribute( "data-gdpr-consent", storageGDPR ); } } scripts_initialize.setAttribute( "type", "text/javascript" ); scripts_initialize.setAttribute( "src", "https://assets.revcontent.com/master/delivery.js" ); scripts_initialize.setAttribute( "defer", "defer" ); // Append the script to the widget widget_revcontent.after( scripts_initialize ); } })(); </script> <script type="text/javascript"> !function(n,t,c,e,u){function r(n){try{f=n(u)}catch(n){return h=n,void i(p,n)}i(s,f)}function i(n,t){for(var c=0;c<n.length;c++)d(n[c],t); }function o(n,t){return n&&(f?d(n,f):s.push(n)),t&&(h?d(t,h):p.push(t)),l}function a(n){return o(!1,n)}function d(t,c){ n.setTimeout(function(){t(c)},0)}var f,h,s=[],p=[],l={then:o,catch:a,_setup:r};n[e]=l;var v=t.createElement("script"); v.src=c,v.async=!0,v.id="_uasdk",v.rel=e,t.head.appendChild(v)}(window,document,'https://aswpsdkus.com/notify/v1/ua-sdk.min.js', 'UA', { appKey: 'XJoCGW0GRDietgEhEXpsJg', token: 'MTpYSm9DR1cwR1JEaWV0Z0VoRVhwc0pnOndCZ3RiWnpwQnFXakEtckxkQnlyTkE1NmRDaWxSMm5vNUFQNkRRZHFjN28', websitePushId: 'web.boston.com.remix', secureIframeUrl: 'https://www.boston.com/secure-bridge.html', vapidPublicKey: 'BHRLCpgLazdtSrznUKdHmTSjqjEg5PjeRqWDX2g1ezJ40WUFkKMeifMIXqjWC2OQlNoA9KYbl47GloxsgLdbYtE=' }); </script> <script type="module"> !function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function() {n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)} ;if(!f._fbq)f._fbq=n; n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window, document,'script','https://connect.facebook.net/en_US/fbevents.js'); const onetrustStorageConsent = JSON.parse(localStorage.getItem( 'consent_one_trust_bdc' ) ); /* The above code is parsing the JSON data from the local storage and storing it in a variable. * Checking if the user has given consent for the cookie C0002. * If the user has given consent, the variable consent will be set to 'grant'. * If the user has not given consent,the variable consent will be set to 'revoke'. * Documentation https://developers.facebook.com/docs/meta-pixel/implementation/gdpr */ if ( ( onetrustStorageConsent !== null ) && (onetrustStorageConsent.C0002 !== true ) ) { fbq('consent', 'revoke'); fbq('dataProcessingOptions', []); } else { fbq('consent', 'grant'); fbq('dataProcessingOptions', ['LDU'], 0, 0); } fbq('init', '813236348753005'); fbq('track', 'PageView'); </script> <!-- dpo is blank which means that no geolocation access is given --> <noscript><img height="1" width="1" class="hidden" src="https://www.facebook.com/tr?id=813236348753005&ev=PageView&noscript=1&dpo=" /></noscript> <script type="text/javascript" id="ot-manage-links"> const otDisplayClassEl = document.getElementsByClassName("ot-info-display"); for ( const otLinkEl of otDisplayClassEl ) { let otLinks = otLinkEl.getElementsByTagName("a"); for ( const otLinkEl of otLinks ) { let otLinkElAttr = otLinkEl.getAttribute("href") if( otLinkElAttr === "#" ) { otLinkEl.addEventListener( "click", function() { OneTrust.ToggleInfoDisplay(); event.preventDefault(); } ); } } } </script> <script type="text/javascript" src="https://bdc2020.o0bc.com/wp-includes/js/dist/vendor/wp-polyfill.min.js?ver=3.15.0" id="wp-polyfill-js"></script> <script type="text/javascript" id="frontend-js-extra"> /* <![CDATA[ */ var bdcFeatureFlags = {"real-estate":"1","arc-video-ads":"0","archive-pagination-schema-removal":"1","love-letters":"1","bdc-events":"1","bdc-cache-headers":"1","bdc-time-to-read":"1","election-widgets-lazy-load":"0"}; var sportsbarData = {"is_home":"","tags":"book-guides,books,cambridge,dorchester,east-boston,guides,holidays,shopping,somerville,things-to-do","category":"community"}; var breakingNews = {"post_id":"32393215","category_id":""}; var gformsData = {"ajaxurl":"https:\/\/www.boston.com\/wp-admin\/admin-ajax.php"}; var bdc2020Webpack = {"path":"https:\/\/www.boston.com\/wp-content\/themes\/bdc-2020\/dist\/"}; /* ]]> */ </script> <script type="text/javascript" src="https://bdc2020.o0bc.com/wp-content/themes/bdc-2020/dist/js/frontend.js?ver=186f392f6caeac7c85301fc35781151e" id="frontend-js" async></script> <script type="text/javascript" id="avc_frontend-js-extra"> /* <![CDATA[ */ var AdRefreshControl = {"advertiserIds":[],"lineItemIds":[],"sizesToExclude":"","slotIdsToExclude":[],"viewabilityThreshold":"70","refreshInterval":"30","maximumRefreshes":"10","refreshCallback":"refreshOpenWrapAds"}; /* ]]> */ </script> <script type="text/javascript" src="https://bdc2020.o0bc.com/wp-content/plugins/ad-refresh-control/dist/js/frontend.js?ver=1.1.0" id="avc_frontend-js"></script> <script type="text/javascript" src="https://bdc2020.o0bc.com/wp-content/plugins/block-library/dist/js/frontend-accordion-scripts.js?ver=8563120eb740c7cc17ee526901535e7c" id="tenup-block-library-frontend-accordion-scripts-js"></script> <script type="text/plain" class="optanon-category-C0001" type="text/javascript" id="tinypass-js-before"> /* <![CDATA[ */ (function() { // Ensure the 'tp' namespace exists for Piano scripts. window.tp = window.tp || []; window.pdl = window.pdl || {}; // Set the consent version to v2. window.pdl.requireConsent = 'v2'; window.pdl.consent = {}; window.pdl.consent.products = ['COMPOSER', 'ID']; // Set the Application ID for Piano. tp.push(["setAid", "3276IrWrpu"]); // Set the Cxense Site ID for Piano. tp.push(["setCxenseSiteId", "5859613349622668998"]); // Set the API endpoint based on the environment (production or sandbox). tp.push(["setEndpoint", "https://buy.tinypass.com/api/v3"]); // Set the Piano ID URL for authentication. tp.push(["setPianoIdUrl", "https://buy.piano.io"]); // Configure user provider settings to use Piano ID only if enabled. tp.push(["setUseTinypassAccounts", false ]); tp.push(["setUsePianoIdUserProvider", false ]); // Set Piano Custom variables tp.push(["setCustomVariable", "page_type", "post"]); tp.push(["setContentCreated", "2024-11-25T20:27:50+00:00"]); tp.push(["setContentAuthor", "Annie Jonas"]); // Set Piano Tags tp.push(["setTags", ["Book Guides","Books","Cambridge","Dorchester","East Boston","Guides","Holidays","Shopping","Somerville","Things to Do"]]); // Initialize Piano services (Piano ID and Composer). tp.push(["init", function() { // Check and set consent for Piano services. It also makes the setPianoConsent method available. function setPianoConsent() { // Define custom consent mode settings window.pdl.consent_modifiers = { 'COMPOSER': { 'source': 'opt-out', 'patches': [ { 'action': 'include', 'item': { 'key': 'pcus', 'type': 'cookie', } }, { 'action': 'include', 'item': { 'key': 'pcfe', 'type': 'cookie', } }, ] }, 'ID': { 'source': 'opt-out', 'patches': [ { 'action': 'include', 'item': { 'key': 'pnid-tc-string', 'type': 'cookie', } }, ] }, 'DL': { 'source': 'opt-out' }, }; // Parse the groups consent string from window.OnetrustActiveGroups const consentGroups = Object.fromEntries( window.OnetrustActiveGroups .split(',') .filter(group => group.trim()) // Remove empty or whitespace-only strings .map(group => [group, true]) ); // If consentGroup is not empty if (Object.keys(consentGroups).length > 0) { consentMode = 'opt-in'; // Default to 'opt-in' // All cookies allowed. if ( consentGroups.C0002 && consentGroups.C0003 && consentGroups.C0004 ) { consentMode = 'opt-in'; } // Only optional cookies blocked. else if ( consentGroups.C0002 && consentGroups.C0003 && !consentGroups.C0004 ) { consentMode = 'essential'; } // At least one essential cookie blocked. else if ( (!consentGroups.C0002 || !consentGroups.C0003) && consentGroups.C0004 ) { consentMode = 'custom'; } // All cookies blocked. else if ( (!consentGroups.C0002 || !consentGroups.C0003) && !consentGroups.C0004 ) { consentMode = 'opt-out'; } // Set consent tp.consent.setAllPurposes(consentMode); } } // Check if consent has been given for Piano services. if (!tp.consent.getByPurpose()) { // If consent has not been given, set the consent. setPianoConsent(); } // Hook on to the OneTrust consent change calllback in case the user changes their consent. window.OneTrust.OnConsentChanged = function() { setPianoConsent(); }; // Initialize Piano ID only if enabled // Initialize Piano Composer experience for content access management. // Check if consent has been given for Piano services. if (tp.consent.getByPurpose()) { tp.experience.init(); } else { // If consent has not been given, set the consent. setPianoConsent(); tp.experience.init(); } }]); })(); /* ]]> */ </script> <script type="text/plain" class="optanon-category-C0001" type="text/javascript" src="https://buy.tinypass.com/api/tinypass.min.js" id="tinypass-js"></script> <script type="text/javascript" id="bgmp-regi-bundle-js-js-extra"> /* <![CDATA[ */ var bgmpRegi = {"regi_signup_form_path":"https:\/\/www.boston.com\/wp-content\/plugins\/wp-plugin-regi-spot-im\/markup\/signup-form.php?blog_name=Boston.com","blog_name":"Boston.com"}; /* ]]> */ </script> <script type="text/javascript" src="https://bdc2020.o0bc.com/wp-content/plugins/wp-plugin-regi-spot-im//bgmp-regi-bundle.js?ver=0.0.3" id="bgmp-regi-bundle-js-js"></script> <script type="text/javascript" src="https://bdc2020.o0bc.com/wp-content/plugins/tablepress-premium/modules/js/responsive-scroll-buttons.min.js?ver=2.4.4-BGMP" id="tablepress-responsive-scroll-buttons-js"></script> <script type="text/javascript" src="https://bdc2020.o0bc.com/wp-content/plugins/tablepress-premium/js/jquery.datatables.min.js?ver=2.4.4-BGMP" id="tablepress-datatables-js"></script> <script type="text/javascript" src="https://bdc2020.o0bc.com/wp-content/plugins/bdc-functionality/assets/js/tracker/lib/AppMeasurement/AppMeasurement.js?ver=2.22.0" id="app_measurement-js"></script> <script type="text/javascript" id="bdc_tracker-js-extra"> /* <![CDATA[ */ var bdcfunctionalityWebpack = {"path":"https:\/\/www.boston.com\/wp-content\/plugins\/bdc-functionality\/dist\/"}; var bdcDigitalData = {"settings":{"reportSuite":"nytbglobe,nytbgglobal","customLinksReportSuite":"nytbglobe","trackingServer":"smetrics.boston.com"},"pageInstanceID":"The ultimate guide to independent bookstores in Greater Boston and beyond-www.boston.com","page":{"pageInfo":{"pageID":"The ultimate guide to independent bookstores in Greater Boston and beyond","internalLinks":"javascript:,cars.com,boston.com,bostonglobe.com,globe.com,cityfeet.com,legacy.com,monstermoving.com,movietickets.com,newsbank.com,salary.com,snocountry.com,travidia.com,uclick.com,zap2it.com,bostondirtdogs.com,adperfect.com,bankrate.com,ce.com,flightview.com,gabriels.com,harvestadsdepot.com,interviewmastery.com,localattitude.com,pair.com,resume.com,sportsballot.com,vanlines.com,boston.addresses.com,boston.jiwire.com,boston.stats.com,gadzoo.com,jobview.boston.monster.com,mrboffo.com,mypublicnotices.com,upickem.com,realtraffic.maptuit.com,caspio.com,upickem.net,boston.houzz.com,localhost,www.boston.com","destinationURL":"https:\/\/www.boston.com\/community\/books\/2024\/11\/25\/the-ultimate-guide-to-independent-bookstores-2024\/","pageURL":"https:\/\/www.boston.com\/community\/books\/2024\/11\/25\/the-ultimate-guide-to-independent-bookstores-2024\/","channel":"Community","campaign":"","subsection":"Books","rssID":"","authors":"Annie Jonas","pageLayout":"rail-header-standard","pagination":"","p1":"","pageType":"article page","publishDate":"11\/25\/2024","videoName":"","cms":"WordPress","environment":"Live","summaryLength":330,"searchKeyword":"","trackingCode":"","keywords":"Book Guides,Books,Cambridge,Dorchester,East Boston,Guides,Holidays,Shopping,Somerville,Things to Do","sponsorName":"","loginStatus":"logged out","publicationName":"Boston.com","galleryName":null,"codeVersion":"2.22.0","articleID":"BDC-32393215","refresh":"","registrationID":"","newsletter":""}}}; /* ]]> */ </script> <script type="text/javascript" src="https://bdc2020.o0bc.com/wp-content/plugins/bdc-functionality/dist/js/tracker.js?ver=6c088ae1959cff7c6c385d8c28993a82" id="bdc_tracker-js"></script> <script type="text/javascript"> jQuery(function($){ var DT_language={"en_US":{}}; $('#tablepress-110').DataTable({"language":DT_language["en_US"],"order":[],"orderClasses":false,"stripeClasses":["even","odd"],"pagingType":"simple"}); $('#tablepress-110-no-2').DataTable({"language":DT_language["en_US"],"order":[],"orderClasses":false,"stripeClasses":["even","odd"],"pagingType":"simple"}); }); </script> <script> const oneTrustEl = document.getElementsByClassName( 'onetrust-revcontent' ); if ( oneTrustEl.length > 0 ) { // If less than 1, no RevContent is running. // Is this if really needed? let ccpaSet = localStorage.getItem( 'ccpaApplies' ); if ( ( null !== ccpaSet ) ) { let storageCCPA = localStorage.getItem( 'ccpaString' ); oneTrustEl[0].setAttribute( "data-us-privacy", storageCCPA ); } let gdprSet = localStorage.getItem( 'gdprApplies' ); if ( ( null !== gdprSet ) ) { let storageGDPR = localStorage.getItem( 'gdprString' ); oneTrustEl[0].setAttribute( "data-gdpr", 1 ); oneTrustEl[0].setAttribute( "data-gdpr-consent", storageGDPR ); } } </script> <script type="text/javascript"> window.addEventListener('DOMContentLoaded', (event) => { const airshipExtrajs = document.getElementById("ua-wn-js-extra"); const ConsentFromOnetrustStorage = JSON.parse(localStorage.getItem( 'consent_one_trust_bdc' ) ); if ( airshipExtrajs ) { if ( ( null !== ConsentFromOnetrustStorage ) && ( ConsentFromOnetrustStorage.C0003 ) ) { document.getElementById('ua-wn-js-extra').setAttribute('type', 'text/plain'); document.getElementById('ua-wn-js-extra').setAttribute('class', 'optanon-category-C0003'); } } }); </script> <script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","licenseKey":"b9d80a2312","applicationID":"467627310","transactionName":"ZFNbMkJTVxVYVRcMDV0ZehNDRlYLFmUKCwVfUxlLEGJWFU0=","queueTime":0,"applicationTime":775,"atts":"SBRMRApJREobV0FfGU5L","errorBeacon":"bam.nr-data.net","agent":""}</script></body> </html> <!-- plugin=object-cache-pro client=phpredis metric#hits=21261 metric#misses=44 metric#hit-ratio=99.8 metric#bytes=3561939 metric#prefetches=0 metric#store-reads=236 metric#store-writes=13 metric#store-hits=599 metric#store-misses=37 metric#sql-queries=7 metric#ms-total=864.60 metric#ms-cache=84.19 metric#ms-cache-avg=0.3395 metric#ms-cache-ratio=9.7 -->

Pages: 1 2 3 4 5 6 7 8 9 10