Singaporean Healthy Food Startup Grain Rebrands to 'food that delights', Cuts Prices

As reported by Yon Heong Tung at e27 on 5 October 2016. More details can be found here.

Singapore-based healthy food delivery startup Grain is rebranding itself to a company that delivers delicious but healthy food. Grain Co-Founder Yi Sung Yong believes that this brand refresh — which may come off as unduly subtle — is a necessary step forward for the company.
“From the start, we always stood for the few things–delicious, healthy, fast and affordable,” Sung told e27.
Sung gave some examples of healthy but delicious food including the “‘Slow Braised Beef and Duck Confit (on beetroot lasagne)’.
Another popular dish–Dry Laksa–has also been treated with a healthy makeover. “Instead of using the traditional laksa gravy (coconut milk, chilli oil, sambal paste, etc.), we steamed winter melon for it to be used as a binding agent with our dry laksa paste.”
Additionally, the starting price of food has been lowered from S$10.95 (US$8.00) to S$8.95 (US$6.50).
/** * helper function to take the form and * get back a js object with field/value mappings * ignoring submit fields and fields whose name we can't ascertain */ function serialize(form){ return .filter(isInputElement) .filter(isNotSubmit) .filter(hasFieldName) .reduce(function(data, node, index) { data[getFieldName(node)] = node.value return data; }, {}); } /** * Check if this form element is of type input */ function isInputElement(node) { return node.tagName.toLowerCase() === 'input'; } /** * Check if this is a 'submit' input element */ function isNotSubmit(node) { return node.type !== 'submit'; } /** * Ensure field has a derived name */ function hasFieldName(node) { return getFieldName(node) !== 'unknown'; } /** * Attempt to ascertain "name" of field. * * they don't give inputs real `name` attributes, so * best guess is to hack around the element's label text, * falling back to the placeholder text. (their html is * not semantic and often labels erroneously reference * parent divs instead of sibling input elements) * * strip out the stars they show when validation fails * * if label is misplaced _and_ there's no placeholder, * this function is insufficient */ function getFieldName(input) { if (!input.labels.length) return input.placeholder || 'unknown'; var labelText = input.labels[0].textContent.trim(); return ~labelText.indexOf(' *') ? labelText.slice(0, labelText.indexOf(' *')) : labelText; } /** * Listen for form submissions and send identify * if you'd like an event too, just delete the '//' in the track line */ document.forms[0].addEventListener('submit', function(e) { analytics.identify(serialize(; // analytics.track('Submitted Form'); });