
Exponent – Build native apps in JS that work across both iOS and Android - wosos
https://getexponent.com/
======
blakeross
I know lots of platforms-of-the-month come through HN, and it's hard to filter
the signal from the noise...just wanted to add another voice that Exponent is
indeed awesome. Built by one of the sharpest (and most humble) teams in the
valley.

~~~
doozy
I suggest NativeScript as an alternative that's very similar in scope but far
more mature, definitely not a platform-of-the-month. The latest version is
built on top of TypeScript and Angular 2 instead of React Native like
Exponent.

I wonder why we don't hear that much about them in HN.

[https://www.nativescript.org/](https://www.nativescript.org/)

~~~
jameside
A more apt comparison might be React Native and NativeScript--both are
frameworks that bridge native APIs to JavaScript. In contrast, Exponent is a
mobile environment of which React Native is one piece.

Before choosing React Native, we deeply investigated bridging native and
JavaScript on our own and one of the ways was a NativeScript-like approach.
When React Native was announced we looked at the beta and saw that it
exhibited many characteristics we believe are important in a next-gen app
framework.

We saw that React Native was designed for multicore phones by dividing work
across multiple threads, namely application logic (JS), view and text layout
(this is significant), and rendering. Other work like image decoding also runs
on a separate thread. One reason React Native's multithreading is fantastic is
because hardware manufacturers are adding more cores faster than they are
improving the performance of those cores, partly because power consumption
grows superlinearly with respect to frequency. The React team is also in the
early stages of exploring incremental rendering, which may allow us to
parallelize React rendering in JS as well as native.

So far we're happy we chose React Native for Exponent. There's a lot of
interest and activity around it and it's on the right track in several ways.

------
lnanek2
I tested out React Native on Android the other day and it was a real disaster.
It doesn't compile for all the CPU ABIs (instruction sets) we have, so if you
have native libraries for x86 or arm 64 in your app it immediately breaks it
completely. You have to remove all your own libraries for unsupported
architectures, then modify your build not to include them, then depend on
those platform's compatibility features to run React Native's libraries built
for older ABIs like arm v7.

Once you get it running despite their poor support for Android CPUs in their
native libraries, half the examples and half the dependencies on the web out
there crash immediately because they decided you have to import React and
Component from "react" instead of "react-native" now. And there's no stack
trace at all when it crashes for that error since it crashes before the normal
source map functionality that provides them. My company has hundreds of files
being used by React Native on iOS, but they are unusable due to this, even
hours of search and replace cannot fix it because it is still crashing out,
probably due to one of a dozen dependencies. Similarly if you try to use react
redux 4 you are screwed, only 3 is supported. Woe be to anyone who upgrades
that dependency.

As a Java programmer who is used to compile time errors when something is
wrong, React Native where it crashes constantly at runtime due to poor
platform decisions like forcing developers to use a different package from
earlier versions is a tough pill to swallow.

~~~
mukeshsoni
Why is the top comment on every story a negative one? Is nothing good anymore?

~~~
thesmallestcat
Maybe it's because of:

> half the dependencies on the web out there crash immediately because they
> decided you have to import React and Component from "react" instead of
> "react-native" now.

That resonates for anybody who has done serious work with npm packages over
the past few years. It seems like horrific breakage is the norm. Package
authors break backwards compatibility for the stupidest "improvements."

~~~
dikaiosune
So please correct me if I'm wrong, but aren't these papercuts the exact
motivating reason for something like Exponent?

------
dabit3
I've been building React Native apps since the platform was released. Exponent
not only makes the process much easier and approachable, it makes it a breeze
to share the final app with your clients or people who you want to test
externally. The team at Exponent also contributes a ton to the RN ecosystem as
core contributors to React Native and open sourcing a lot of awesome RN
components. If you're looking at building cross platform mobile apps I highly
recommend checking out Exponent!

------
satya164
Exponent is super cool. Super simple to start building an app. I wish I could
use it for every RN project I work on. The team is very responsive too.
Totally recommend.

~~~
phmagic
Can you elaborate on why you cannot use it for every RN project you work on?

------
The_Hoff
I've been using [https://www.decosoftware.com/](https://www.decosoftware.com/)
and like it a lot, but I really like the documentation on the Exponent
website.

Part of the allure of writing React Native apps for me is that knowing React
would make me a more valuable developer. I'm curious to see how comfortable I
feel saying "I know React" after using these IDEs long-term.

~~~
brentvatne
Deco is great! We'd love to get Exponent and Deco playing well together, we've
discussed it with their team but haven't had the time yet -- it'll happen one
day.

------
jain_chirag04
I have been using exponent libs for almost a year now. They are doing such
amazing work. Highly recommended!

------
coldtea
Hmm, they say you can buy an Exponent app through the App Store, and then you
can push updates to it through them, and they show up the "next time the user
opens the app without having to do through the App Store"?

I don't think downloading scripting or native code that changes how an app
behaves from outside sources has been allowed on the App Store, so what gives?

~~~
jameside
A couple of years ago Apple changed the iOS developer terms to say it's OK to
download and run JavaScript as long as it's run on the built-in WebKit or
JavaScriptCore engine (section 3.3.2 if you're curious). Exponent uses the
built-in JavaScriptCore on iOS.

------
jameslk
This looks very interesting, but I'd like to know that if I ever did need to
fall back to native APIs, I could keep the code I've written using Exponent's
APIs still (even if that means I couldn't use the convenient build tools
anymore). Is this possible?

~~~
brentvatne
There are a few of ways to do this right now:

\- Fork the Exponent client and add your native API.

\- Try to get a patch into upstream.

\- If it's not urgent, ask us if we plan to implement it and if it seems like
a common enough use case we would add it to our roadmap.

\- Go into the Exponent source and copy whatever native code you need into a
new React Native project.

We're also working on a way to "eject" from Exponent similar to the create-
react-app eject command but easier to reverse and to keep receiving updates to
Exponent, because it's not an "all-in" kind of eject, you can read more about
that here: [https://blog.getexponent.com/answered-on-slack-ejecting-
from...](https://blog.getexponent.com/answered-on-slack-ejecting-from-
exponent-154bdca57dc1#.yr55mmqtc) (caveat: this feature is still in early
development)

~~~
skanga
Does it support Bluetooth LE communications?

------
gok
Finally, the performance and language design of JavaScript with the write-
once-work-in-one-place of native development.

------
brentvatne
Hi all! Thanks for the post! Here are some links to help you check out
Exponent and get any idea what it can do -- all you need to do is download the
Exponent client from the app / play store and you can open any of these:

\- Pocketgear - a pokedex app:
[https://getexponent.com/@rncommunity/pocketgear](https://getexponent.com/@rncommunity/pocketgear)

\- A fun little app I've been working on for a few days for an upcoming talk:
[https://getexponent.com/@community/growler-
prowler](https://getexponent.com/@community/growler-prowler)

\- An IP Subnet Calculator:
[https://getexponent.com/@levic92/ipcalc](https://getexponent.com/@levic92/ipcalc)

\- The navigation/routing library that we recommend to be used with Exponent:
[https://getexponent.com/@community/ex-navigation-
example](https://getexponent.com/@community/ex-navigation-example)

\- A work-in-progress showcase of animations that you can do with React Native
/ Exponent: [https://getexponent.com/@community/animations-
showcase](https://getexponent.com/@community/animations-showcase)

\- Shared element transitions are possible too:
[https://getexponent.com/@janic/shared-
elements](https://getexponent.com/@janic/shared-elements)

\- A showcase of some of the components that you can use with Exponent:
[https://getexponent.com/@notbrent/native-component-
list](https://getexponent.com/@notbrent/native-component-list) (tap out the ^
icon in the top right)

\- "Floaty Plane" \- a simple game:
[http://getexponent.com/@exponent/floatyplane](http://getexponent.com/@exponent/floatyplane)

\- An experiment to re-create basic Wunderlist UI:
[https://getexponent.com/@mastermo/wunderlist](https://getexponent.com/@mastermo/wunderlist)

\- A pre-launch version of "React Native Playground" in Exponent:
[https://getexponent.com/@rnplay/rnplay](https://getexponent.com/@rnplay/rnplay)
(just sign in as a guest and go to the Explore tab)

\- An image gallery example: [https://getexponent.com/@community/image-
gallery-example](https://getexponent.com/@community/image-gallery-example)

\- A Pomodoro app UI:
[https://getexponent.com/@exponent/pomodoro](https://getexponent.com/@exponent/pomodoro)

\- A tab view component demo: [http://exp.host/@rncommunity/react-native-tab-
view-demos](http://exp.host/@rncommunity/react-native-tab-view-demos)

The largest app on our platform right now is li.st for Android:
[https://play.google.com/store/apps/details?id=st.li.listapp&...](https://play.google.com/store/apps/details?id=st.li.listapp&hl=en)

------
Kiro
I'm interested in the game example. How is that built exactly? Is the game
built in React Native (I presume not) or is React Native just used for UI
elements? If so, what is the game built with?

~~~
nikki93
Hey! I made floatyplane. The source code is here:
[https://github.com/exponentjs/floatyplane](https://github.com/exponentjs/floatyplane)

Here's a video of a talk explaining how the game works:
[https://www.youtube.com/watch?v=2_KV7Ha_gRk](https://www.youtube.com/watch?v=2_KV7Ha_gRk)

The game runs on Exponent and uses React Native for rendering (as all Exponent
apps do). It uses individual `Image` components for each sprite. This gets
choppy when you have a lot of sprites so we're experimenting with more
performant ways of rendering for games.

~~~
Kiro
Wow, thank you very much! Response from the developer with source code and
talk. Couldn't wish for more. Thanks again!

------
fredliu
I've ran through most of the intro doc, but I'm still not sure if Exponent
supports invoking platform/system APIs? E.g. if I want to access clipboard
contents, or wifi network configuration, etc, how can it be done with
Exponent? With React Native, I can write corresponding functionalities using
Java or Swift/ObjC, and then integrate it with the RN main app, but how can
this be done with Exponent?

~~~
ccheever
Hi-

Exponent exposes all of the React Native built-in APIs which encompass a lot
of what you're asking about.

For example, here is the Clipboard API: [https://facebook.github.io/react-
native/docs/clipboard.html](https://facebook.github.io/react-
native/docs/clipboard.html)

Wifi network configuration is more complicated, but there are some things
exposed like "NetInfo" which lets you know the current state of connectivity.
[https://facebook.github.io/react-
native/docs/netinfo.html](https://facebook.github.io/react-
native/docs/netinfo.html)

The complete React Native docs are here: [https://facebook.github.io/react-
native/](https://facebook.github.io/react-native/) and Exponent specific docs
are here: [http://docs.getexponent.com/](http://docs.getexponent.com/)

For now, Exponent just lets you write things that only use JS, and we make
that easy and reliable and straightforward. We actually think this is the best
way to write most apps that can be built this way since the code is easier to
maintain and works cross platform, and you can do things like instant updates
much more reliably when all your code is JS.

We're looking at a way you can write Java/Swift/Obj-C extensions for Exponent,
but that will take us some time.

~~~
fredliu
Thanks a lot for the explanation. I'll try out exponent and see how far I can
go without resolving to native :)

------
dvcrn
Check out re-natal [0] if you are interested in using react native with
clojurescript. Re-frame (cljs's redux?) and reagent (cljs's react wrapper) are
a joy to use and clojurescript with REPL is something I'd pick over plain JS
almost any day.

Give it a try! It's pretty solid.

[0]: [https://github.com/drapanjanas/re-
natal](https://github.com/drapanjanas/re-natal)

~~~
nikki93
ClojureScript along with re-frame/reagent/etc. can actually be used with
Exponent too! "lein new exponent my-project" creates an exponent project,
ready with figwheel for live REPL. The template can be found here if you want
to just read it online: [https://github.com/tiensonqin/exponent-cljs-
template](https://github.com/tiensonqin/exponent-cljs-template)

~~~
dvcrn
Interesting. Did you use this in the past? How does it perform vs re-natal
without exponent?

~~~
nikki93
It actually is based on the re-natal code but automatically saves and uses the
devserver ip and doesnt need th ios/android native code because it runs in
Exponent. Other than that the functionality is the same I think, with the same
difference as plain RN vs. Exponent.

------
atoko
Since native modules can't be used with this, what is the difference between
this and, say, Appcelerator Titanium?

~~~
jesseruder
I think Appcelerator Titanium is more comparable to React Native than to
Exponent. Here's a post by Brent about the differences between Exponent and
React Native: [http://stackoverflow.com/questions/39170622/what-is-the-
diff...](http://stackoverflow.com/questions/39170622/what-is-the-difference-
between-exponent-and-react-native). You can join us on Slack if you want to
discuss more! [https://slack.exponentjs.com/](https://slack.exponentjs.com/)

(I work on Exponent)

------
joefreeman
This looks cool. But are the builds happening remotely on the Exponent
servers, or have I misunderstood that?

Edit - brentvatne just answered this: "we handle builds for you when you want
to ship to the app store, before that you can just use the Exponent client".

~~~
jesseruder
Hey Joe. I work on Exponent.

When you're developing you can use Exponent's apps from the App Store/Play
Store, so you can get started immediately and let other people test your app
easily. Once you're ready to put your app in the stores you start a build
using our CLI and we build it on our servers (see
[https://docs.getexponent.com/versions/latest/guides/building...](https://docs.getexponent.com/versions/latest/guides/building-
standalone-apps.html)). We want to make it easy for people on Windows and
Linux to build apps so don't require you to use Xcode or Android Studio. If
you don't want the builds to happen on our servers our clients are open source
so you can do it yourself if you want
([https://github.com/exponentjs/exponent](https://github.com/exponentjs/exponent)).

~~~
geoka9
Thank you so much for your work!

> We want to make it easy for people on Windows and Linux to build apps

Is there a Linux version of XDE? I can't seem to find it.

~~~
jesseruder
We don't have a binary for Linux yet (keep meaning to do it, want to get to it
soon) but building from source works!
[https://github.com/exponentjs/xde#build-from-
source](https://github.com/exponentjs/xde#build-from-source)

~~~
geoka9
That's even better. Thanks again!

------
seabass
Without support for native modules, is it at all possible to use something
like card.io with Exponent? Also, are there any plans to allow plugins that
make use of native modules in the way the core SDK uses them?

~~~
jesseruder
card.io isn't supported right now, but it's definitely on our list! If you
want to use it right now you can send us a PR or just maintain a fork of our
clients.

We have some plans to allow custom native modules without forking the client
but that's probably a few months out. If you join our slack we'll let you know
about any updates:
[https://slack.exponentjs.com/](https://slack.exponentjs.com/)

------
el5r
Does XDE run on Raspberry Pi? (Or if not, how difficult would it be to port?)
It would be a nice hook to introduce people to programming if they could write
mobile apps on the Pi.

~~~
ccheever
I think it should? If you had Linux running on it and a monitor and keyboard
hooked up, I can't think of any reason why it wouldn't work.

If there are any problems, they would probably be easy to fix. The thing I'd
be most worried about is just that some things might run very slow on the Pi.

------
aantix
What's the preferred way to test an Exponent based app?

~~~
nikki93
Also if you meant automated testing, here's an Exponent app that runs jasmine
to test Exponent SDK API end-to-end: [https://github.com/exponentjs/test-
suite](https://github.com/exponentjs/test-suite) This is useful for testing
network requests, API calls, etc. in your app JS.

------
nbclark
On the one hand I like this, as it adds in more shared functionality across
both iOS and Android out of the box (maps for example). On the other hand, I
believe this also breaks the ability to add in custom RN modules, which is
part of the reason I enjoy it. Would love to see some of this getting folded
back into react native core.

~~~
brentvatne
Hi there! I work on Exponent.

We intentionally chose to not let users drop down to native -- the idea of
having an interpreted language that sits on top of a native runtime on
multiple platforms is not a new one, and it allows for so many benefits that
you lose out on if developers can add arbitrary compiled code with direct
access to system APIs.

Additionally, there is a significant value-add of using Exponent in terms of
upgrades. As great as React Native is, it also moves extremely fast and it can
be difficult to keep up with new releases -- a change in React Native might
cause several of your native dependencies to break, and you'll need to fork
those libraries and fix them if the maintainer isn't keeping on the same
schedule as you. Updates with Exponent are as simple as updating JavaScript,
which has much less churn and breaking changes than the native side (the React
API itself is very mature, the APIs for specific native components may
change).

Another nice advantage of this is that you can work on an iOS app from Windows
and Linux, because you don't need to compile your app with Xcode (we handle
builds for you when you want to ship to the app store, before that you can
just use the Exponent client).

We ship with a bunch of APIs out of the box and are constantly improving them
and adding more. We have analytics tools like Amplitude and Segment built in,
Maps, Facebook login (working on Google Login), and more:
[https://docs.getexponent.com/versions/latest/index.html](https://docs.getexponent.com/versions/latest/index.html)

React Native is still very early, though, and Exponent is just a small team of
seven, so we understand that we can't possibly expose every API that
developers working with the platform might want. So, we are working on a way
for developers to be able to still take advantage of the Exponent toolchain
and layer on native code. I've written up our approach in more detail here:
[https://blog.getexponent.com/answered-on-slack-ejecting-
from...](https://blog.getexponent.com/answered-on-slack-ejecting-from-
exponent-154bdca57dc1#.yr55mmqtc)

~~~
dcosson
Interesting choice, and thanks for the detailed explanation.

Sounds like at the end of the day it comes down to Exponent being committed to
the user never having to build their own app. I can see that being interesting
a to a single dev, or a small app or someone new to mobile development, but to
be honest I don't think I could justify using Exponent at a company. On any
reasonably experienced team of developers, building an app when native
components change or distributing it with something like hockeyapp is not very
difficult, so I just wouldn't trade the flexibility of being able to do tricky
parts directly in native code for not having to build the app.

------
Kiro
This looks really nice. I have a question about React Native though. I was
under the impression that React Native meant that you could just take your
components from your website and build an app out of it. I'v realized that's
not the case. What is the benefit of React Native if you can't share the
components?

~~~
jameside
You can share some components, especially more abstract ones. For example,
react-redux creates higher-order components that work with both React DOM and
React Native. There's also a project called react-native-web that implements
React Native's View components using React DOM's primitive components
([https://github.com/necolas/react-native-
web](https://github.com/necolas/react-native-web)).

Components aside, you can share your models and data stores, utilities like
Immutable.js and lodash, and other environment-agnostic JavaScript. In
addition to code, you can share a lot of knowledge like how to write
components, structure an app, use npm, and even just write JavaScript.

~~~
Kiro
Well, you've convinced me. I'm trying this out. Thanks!

messutied, you're shadowbanned so I can't reply but thank you for your
response!

------
ThaJay
How about vector icons, barcode scanning and playing sound? At the moment I'm
using:

    
    
      react-native-vector-icons
      react-native-sound
      react-native-barcodescanner
      react-native-camera

and did not find docs on those features yet. This does look interesting but
I'll stick to vanilla react-native for now.

------
denver_f_h
It's promising. I wonder how different is it from Appcelerator Titanium ? I
used it 5 years ago and it converts the written JS into real native code. The
downside is that if Apple releases a new set of APIs, you have to wait till
the editor (Appcelerator) releases the JS bridge to those new APIs.

~~~
ccheever
Some of the biggest differences are: (1) Exponent is a free open source
project, and we don't try to charge developers to use it. (Titanium is open
source now but they try to make money by charging people for premium features
--which is totally fine, but just different from what we do)

(2) Exponent is based on React Native which is newer and people seem to like
better (search Google for blog posts about experiences using React Native and
then search Google for blog posts about using Titanium), though I can't
actually compare them personally since I don't know that much about the inner
workings of Titanium.

(3) You can do instant app updates with Exponent since the JS is run on the
device rather than being cross compiled to native code. I don't think you can
do this with Titanium (though I may be wrong -- they've added a lot of
features since I last checked on it)

------
latortuga
The video says you support Linux for XDE but I don't see[1] a build for it.

[1]
[https://docs.getexponent.com/versions/v10.0.0/introduction/i...](https://docs.getexponent.com/versions/v10.0.0/introduction/installation.html)

~~~
ccheever
For Linux, you have to build it from source.
[https://github.com/exponentjs/xde#build-from-
source](https://github.com/exponentjs/xde#build-from-source) It's usually
pretty smooth to do so.

~~~
vors
I think it would make sense to provide pre-build packages for few popular
distros (Ubuntu, CentOS, Arch). There are some tools that make it much easier,
i.e. fpm
([https://github.com/jordansissel/fpm](https://github.com/jordansissel/fpm)).

~~~
jesseruder
We're planning on doing an AppImage for Linux since we're using Electron
Builder ([https://github.com/electron-userland/electron-
builder](https://github.com/electron-userland/electron-builder)). Just haven't
had time for it yet!

~~~
vors
Great, AppImage is even better!

------
hackerboos
I was following the Pluralsight course but it looks like Exponent had a big
upgrade a while back. Are the old binaries used on the course still available
somewhere?

~~~
ccheever
One thing that we do that we think is pretty cool is that we figured out a way
to include multiple versions of our SDK (and React Native) in a single binary,
so stuff you build with old versions will continue to work.

Here are the docs for SDK 10 (based on RN 0.33.0):
[https://docs.getexponent.com/versions/v10.0.0/index.html](https://docs.getexponent.com/versions/v10.0.0/index.html)

And here are the docs for SDK 9 (based on RN 0.31.0):
[https://docs.getexponent.com/versions/v9.0.0/index.html](https://docs.getexponent.com/versions/v9.0.0/index.html)

You can use either one.

Also, all our stuff is open source, so just go back and find the old release
tags on Github if you want older versions.

~~~
hackerboos
That's awesome. Will this work with your mobile application? I know that's
delivered through the app-store so I assume only the latest version is
available there?

Sorry I'm new to mobile development...

~~~
ccheever
The apps in the App Store/Play Store support multiple versions of our SDK. The
current versions support back through March. Not sure which SDK version the
Pluralsight course is targeting. It might be easier to follow our docs here:
[https://docs.getexponent.com/versions/latest/introduction/in...](https://docs.getexponent.com/versions/latest/introduction/index.html)
which will always be up to date.

------
scsilver
Do you abstract the Bluetooth modules? How does it interact with adding
something like the Facebook SDK?

~~~
jesseruder
Hello! I work on Exponent. We don't support Bluetooth right now but it's high
on our priority list. We have docs for Facebook here:
[https://docs.getexponent.com/versions/latest/sdk/facebook.ht...](https://docs.getexponent.com/versions/latest/sdk/facebook.html)

------
DenisM
Does this support iPad and Android tablets?

How about Windows tablet support?

~~~
jesseruder
We don't support Windows Phone - just iOS and Android.

Android tablets should work. We don't have native iPad support but we're
planning on adding it.

~~~
DenisM
I'm talking about Windows _tablet_ , not Windows phone.

~~~
jesseruder
Ah sorry, misread your comment. The dev tools will run on Windows 10, but the
client apps won't. The client apps run on iOS and Android and the dev tools
run on macOS, Windows, and Linux.

------
zem
i'm not too familiar with react native - how much support is there for using
languages other than javascript (i.e. a compiled-to-javascript language)?

~~~
jameside
One of my teammates working on Exponent was experimenting with ClojureScript
and got it running, and one of our YC batchmatches wrote their app with
ClojureScript and RN. It's still the very early days and I expect compiled-to-
JS to get easier to use. Compiled-to-WASM might also be a good option one day.

~~~
zem
i would be really excited about writing performant mobile apps in
clojurescript! i'll see if i can find working examples on google now that i
know people have done it.

------
erpellan
Does it allow recording video from the camera?

~~~
jesseruder
We support taking images with the camera but no video yet:
[https://docs.getexponent.com/versions/latest/sdk/imagepicker...](https://docs.getexponent.com/versions/latest/sdk/imagepicker.html).

~~~
ccheever
We want to add video recording support. It's on our list but probably a few
months out.

------
lardissone
I second tablet support.

------
andrewvijay
Intriguing. But how does exponent make money out of this?

~~~
jesseruder
Hey! I work on Exponent. Basically, we don't make money right now. Our plan is
to eventually help developers make money and take some cut of that. We're open
source so you'll never be locked in if we start doing anything you don't agree
with. We talk about it a little more at
[https://docs.getexponent.com/versions/latest/introduction/fa...](https://docs.getexponent.com/versions/latest/introduction/faq.html)

~~~
andrewvijay
That's totally cool. You guys seem to do a lot of work for free. Hope you get
the money you deserve.

