You are here
Home > Uncategorized > Exploring Options: Developing a South Palo Alto Circulator

Exploring Options: Developing a South Palo Alto Circulator

Last night, I reviewed VTA’s Next Network plan again and recalled that two lines within the City of Palo Alto, Lines 88 and 89, were to be eliminated due to low ridership. The VTA then came with a solution to develop Line 288, a school day-only service operating mostly within the current Line 88. However, given that Caltrain will expand weekday service to California Avenue station, I thought to myself: how should the VTA take advantage of that service expansion and, hopefully, gain even more passengers?
Based on the upcoming Caltrain Schedule Changes from 10 April 2017, California Avenue station will see more train service during the weekday rush hours, including:

  • Two new limited-stop trains serving the station at 6:48am and 7:49am
  • Two new Baby Bullet trains serving the station at 5:18pm and 6:18pm

With those additions, California Avenue will get to see more train service during rush hours:

  • AM rush (between 6am and 9am): 8 trains northbound, 5 trains southbound
  • PM rush (between 4pm and 7pm): 4 trains northbound, 9 trains southbound
In terms of how it plays out with the VTA’s Next Network, however, it becomes problematic. The Santa Clara Valley Transportation Authority (VTA) is considering to ax both Lines 88 and 89, which provide circulator services around neighborhoods in south Palo Alto, including California Avenue Caltrain, Stanford University, Stanford Industrial Park, Palo Alto VA Hospital, and multiple neighborhood shopping and community centers. The primary reason the VTA wants to eliminate both lines is “low ridership”; based on the Transit Audit report from 2014, however, both lines have seen higher ridership than the standard boardings per hour, making them productive services.

#element-53b90eda-c564-4b8f-b956-2f2c36a6cb5d .simple-table-wrapper {
padding: 20px 0;
#element-53b90eda-c564-4b8f-b956-2f2c36a6cb5d .simple-table {
width: 100%;
border: 1px solid #C9CDCF;
border-spacing: 0;
#element-53b90eda-c564-4b8f-b956-2f2c36a6cb5d .simple-table td.cell {
border-right: 1px solid #C9CDCF;
border-bottom: 1px solid #C9CDCF;
word-break: break-word;
background-color: #FFFFFF;
width: 25%;
#element-53b90eda-c564-4b8f-b956-2f2c36a6cb5d .simple-table td.cell .paragraph {
width: 90%;
margin: 0 5%;
padding-bottom: 10px;
padding-top: 10px;
text-align: center;
#element-53b90eda-c564-4b8f-b956-2f2c36a6cb5d tr:first-child td,
#element-53b90eda-c564-4b8f-b956-2f2c36a6cb5d td:first-of-type {
background-color: #F8F8F8;
#element-53b90eda-c564-4b8f-b956-2f2c36a6cb5d tr:first-child td .paragraph,
#element-53b90eda-c564-4b8f-b956-2f2c36a6cb5d td:first-of-type .paragraph {
font-weight: 700;
#element-53b90eda-c564-4b8f-b956-2f2c36a6cb5d .simple-table tr:last-child td {
border-bottom: none;
#element-53b90eda-c564-4b8f-b956-2f2c36a6cb5d .simple-table td:last-of-type {
border-right: none;
#element-53b90eda-c564-4b8f-b956-2f2c36a6cb5d .simple-table .empty-content-area-element {
padding-left: 0px !important;

Service Type
Minimum Boardings/Hour
Actual Boardings/Hour

function setupElement686997666723811260() {
var elementRequire = require || _wAMD.require;
], function(
) {
var dependencies = null || [];
var platform_element_id = “702688850553606843-1.4.3”;
if (typeof _W.loadedPlatformDependencies === ‘undefined’) {
_W.loadedPlatformDependencies = [];
if (typeof _W.platformElements === ‘undefined’) {
_W.platformElements = [];
if (typeof _W.platformElements[platform_element_id] === ‘undefined’) {
_W.platformElements[platform_element_id] = {};
_W.platformElements[platform_element_id].deferredObject = new $.Deferred();
_W.platformElements[platform_element_id].deferredPromise = _W.platformElements[platform_element_id].deferredObject.promise();
if(_.intersection(_W.loadedPlatformDependencies, dependencies).length !== dependencies.length){
_.reduce(dependencies, function(promise, nextScript){
return promise.then(function(){
return $.getScript(nextScript);
}, $().promise()).then(function(){
if (dependencies.length === 0){
var _ElementDefinition = /**
* This is required for element rendering to be possible
* @type {PlatformElement}
(function() {
var SimpleTable = PlatformElement.extend({
initialize: function() {
setSizes: function() {
var sizes = this.settings.get(‘tableSizes’);
// if the # of columns isn’t the size of the array of lengths, ignore it.
if (sizes && sizes != “default” && this.settings.get(‘columns’) == sizes.length) {
var columns = this.$(‘tr’).each(function(index, value) {
var cells = $(value).find(‘td’).each(function(index2, value2) {
$(value2).css(‘width’, sizes[index2] + ‘%’);
return SimpleTable;
if (typeof _ElementDefinition == ‘undefined’ || typeof _ElementDefinition == ‘null’) {
var _ElementDefinition = PlatformElement.extend({});
var _Element = _ElementDefinition.extend({
initialize: function() {
// we still want to call the initialize function defined by the developer
// however, we don’t want to call it until placeholders have been replaced
this.placeholderInterval = setInterval(function() {
// so use setInterval to check for placeholders.
if (this.$(‘.platform-element-child-placeholder’).length == 0) {
}.bind(this), 100);
_Element.prototype.settings = new PlatformElementSettings({“columns_each”:[{“columns_index”:0},{“columns_index”:1},{“columns_index”:2},{“columns_index”:3}],”rows_each”:[{“rows_index”:0},{“rows_index”:1},{“rows_index”:2}],”columns”:4,”rows”:3,”style”:”top”,”alignment”:”center”,”titleColor”:”#F8F8F8″,”backgroundColor”:”#FFFFFF”,”borderColor”:”#C9CDCF”,”tableSizes”:[15,22,29,32]});
_Element.prototype.settings.page_element_id = “686997666723811260”;
_Element.prototype.element_id = “53b90eda-c564-4b8f-b956-2f2c36a6cb5d”;
_Element.prototype.user_id = “3466466”;
_Element.prototype.site_id = “484589221176252212”;
_Element.prototype.assets_path = “//”;
new _Element({
el: ‘#element-53b90eda-c564-4b8f-b956-2f2c36a6cb5d’
if (typeof document.documentElement.appReady == ‘undefined’) {
document.documentElement.appReady = 0;
if (document.documentElement.appReady || (window.inEditor && window.inEditor())) {
} else if (document.createEvent && document.addEventListener) {
document.addEventListener(‘appReady’, setupElement686997666723811260, false);
} else {
document.documentElement.attachEvent(‘onpropertychange’, function(event){
if (event.propertyName == ‘appReady’) {

Indeed, removing such services can be harmful in terms of providing connectivity in southern Palo Alto. Furthermore, there is a twist: the VTA does not decide on its own how such transit services in Palo Alto are operated. Instead, the City of Palo Alto works alongside the VTA, Caltrain, and other transit agencies that go through the city. Stanford University also contributes heavily in encouraging public transportation services to and from the university, not to mention it operating its own public transportation system (cf. Stanford Marguerite).

Instead of disbanding Lines 88 and 89, I have proposed developing a Community Circulator that will serve most areas on both lines. In addition, it will also serve Costco and nearby commercial centers around Charleston & Independence in Mountain View. A map can be seen below (orange being a clockwise loop, blue being counterclockwise), with the terminus being at California Avenue Caltrain.

In this setup, passengers can use the same bus to travel between Caltrain and the following attractions:

  • Stanford Industrial Park
  • Palo Alto VA Hospital
  • Schools: Gunn High School, Hoover Elementary School, Palo Verde Elementary School,┬áTerman Middle School
  • Oshman Family Jewish Community Center
  • Costco Mountain View
  • Best Buy Mountain View
  • Old Middlefield Way commercial area
  • Palo Alto Buddhist Temple (on Louis north of Colorado)
The proposed frequencies for this loop service are as follows:

  • Every 15 minutes peak periods (6am to 9am, 2pm to 7pm)
    • Clockwise and counterclockwise operate every 30 minutes
  • Every 30 minutes off-peak (9am to 2pm, after 7pm)
    • Clockwise and counterclockwise operate every 60 minutes

if (!window.scribd_js_loaded) { window.scribd_js_loaded = true; document.write(“”+”ipt>”); } var scribd_doc_341687858 = scribd.Document.getDoc(341687858, “key-QfLruc6qMJYbFynUhnhA”); scribd_doc_341687858.addParam(“jsapi_version”, 2); scribd_doc_341687858.addParam(“height”, 500); scribd_doc_341687858.addParam(“width”, “100%”); scribd_doc_341687858.write(“doc_341687858”);

When I submitted this proposal to one of my transit planner friends in the VTA, he commented that the loop may be too long and up to 3 buses may be allocated to that service. However, given my frequency proposals, I have determined that it will need up to 4 buses during peak hours and 2 off-peak. The biggest challenge for this route is dealing with Charleston Avenue where a nearby interchange to and from US-101 often causes congestion that spills from Rengstorff Blvd., especially during the rush hour. By routing the buses through Independence Avenue, service on this line can be more reliable and efficient rather than being stuck in traffic along two major corridors near Costco, Charleston and Rengstorff. The trade off, however, is longer walking distances to nearby commercial centers facing Rengstorff Boulevard, which could provide passenger opportunities.

Leave a Reply