Jay Phelps is creating Open Source Software, community support, and training material
7

patrons

$190
per month
I'm obsessed with WebAssembly and Reactive Programming/RxJS. Right now I contribute to these communities in my free time, but I'd love to devote more time to them--or even work on them full-time, if such a dream were possible. Any and all contributions help.
If you're a business who wants to sponsor specific feature work, or focus on anything else in particular, let me know as well.

Thank you for your support!

RxJS

RxJS is the de facto standard Reactive Programming library for JavaScript, and contains a reference implementation for the TC39 Observable proposal. Using RxJS, you can represent multiple asynchronous data streams (that come from diverse sources, e.g., stock quote, tweets, computer events, web service requests, etc.), and subscribe to the event stream using the Observer object. The Observable notifies the subscribed Observer instance whenever an event occurs. Although RxJS is UI framework-agnostic, it has become integral to some, like  Angular.

My Involvement

I'd really like to devote more time to making RxJS better, particularly improving documentation and training materials. Although most assume RxJS is maintained by Microsoft, Google, and Netflix, it no longer is. None of the core team members have maintaining RxJS as part of their role. It's 100% volunteer these days.


redux-observable

RxJS 5-based middleware for Redux. Compose and cancel async actions to create side effects and handle business logic using normal idiomatic RxJS patterns.

My Involvement

Created by Ben Lesh and I in the first half of 2016. Although I gave a talk on it at Netflix event, it's actually maintained solely by me in my free time. There's also a large amount of support and community related maintenance. Github issues, StackOverflow questions, Gitter questions, etc.

I'd also like to make the testing story behind redux-observable lightyears better and more clear, as well as document many more RxJS patterns that might help those who learn RxJS by using it while redux-observable.



Jaguar, a new Reactive Dataflow Programming Language

I'm an armchair compiler nut with a focus on research into new programming models. After discovering Reactive Programming and RxJS it became clear that Rx was effectively a domain-specific "programming language" bolted onto a traditional imperative, procedural environment. i.e. you write RxJS in JavaScript, Java, etc. but it doesn't have the runtime behavior of typical code from that language. Stepping even further back, this would apply to any programming language based on control flow, nearly every modern programming language. Instead, I wondered what a first-class Reactive Dataflow language would look like? Think Microsoft Excel-like reactive semantics, but fully featured, typesafe, with syntax similar to JavaScript/Swift/Rust.

2 years ago I began my research into just that, first looking for prior art. Research into Dataflow languages has provided insight into previous challenges, solutions, and experiments (Lucid, Lustre, etc). There have also been similar attempts at first-class Reactive Languages (FrTime, Flapjax, etc), but none of them provided the polish, abstractions, semantics, and familiarity I think people are looking for.

My Plan

I've been nailing down the initial semantics of the language using early compiler prototypes targeting WebAssembly. The compilation of the language is not as straightforward as traditional languages; nearly all tooling, patterns, education, papers, etc assume the language can be modeled as traditional control flow. So a large amount of work has gone into how it can be efficiently transformed into control flow since the program ultimately has to run on either a stack machine (WebAssembly) or register machines (machine code). I'm designing the language with a Web-first mindset, targeting WebAssembly initially. Support for native machine code targets via LLVM will come later. I feel pretty strongly that  WebAssembly is the future.

It may be hard to grasp what a first-class Reactive language means. Think about how in Microsoft Excel you don't need to explicitly propagate change, it just happens. And how async/await makes async code more declarative without needing callbacks, think similar to that but with streams of values. Here's a couple examples to give you a taste:

Incrementing interval every 1 second


// an interval stream, increments every 1 sec
let i = |0, i delay 1s + 1|

do log(i)
// 0..1..2..3..etc

UI example with remote data fetching


struct SearchResult(username: String)

public fun render(limit: Number) {
  let search: InputElement // optional forward declaration
  let query = search.value debounce 300ms

  // every time the query value changes a new request will be made
  // and it cancels any previously pending request via `switch`, which
  // is just like RxJS's `switchMap` aka `flatMapLatest`
  let response = switch http::getJson<SearchResult[]>('/api/users/?q=${query}&limit=${limit}')

  // we don't need virtual DOM, instead this is
  // creating real DOM elements which we will update
  // and read from as-is. More similar to templating langs
  // like Angular/Ember/Vue/etc
  return
    <div>
      <label>
        Search:
        <input let search // definition for the `let search` above
          placeholder="Search for a user..."
        />
      </label>
      {match response {
        Pending =>
          <div>Loading...</div>

        Failure(message) =>
          <div>Error: {message}</div>

        Success(results) => {
          // methods are "operators" using infix syntax,
          // like the familiar binary expression `a + b`
          // which is using the operator `+`.
          // Here we're applying some list operators
          // like map and filter. Without syntax highlighting
          // this can look a little unfamiliar, don't worry!

          let usernames = results
            filter (result => result.isActive)
            map (result => result.username)

          // the parentheses are optional, I included
          // them for your familiarity

          return
            <ul>
              {usernames map (result =>
                <li>{result.username}</li>
              )}
            </ul>
        }
      }}
    </div>
}

Tiers
Backer
$10 or more per month 5 patrons
Generous Backer
$50 or more per month 1 patron
Silver Sponsor
$100 or more per month 1 patron
  • A personal thank you from me
  • A public tweet thanking you
  • Your name or company logo on redux-observable.js.org/BACKERS.html
  • 30 minutes per month of remote pairing/mentoring, and priority support on my OSS.
Gold Sponsor
$500 or more per month 0 patrons
  • A personal thank you from me
  • A public tweet thanking you every month
  • Your name or company logo on redux-observable.js.org/BACKERS.html
  • Your name or company logo on redux-observable's website, at the top of the redux-observable homepage 
  • Two hours per month of remote pairing/mentoring, and priority support on my OSS
Platinum Sponsor
$1,000 or more per month 0 patrons
  • A personal thank you from me
  • A public tweet thanking you every month
  • Your name or company logo on redux-observable.js.org/BACKERS.html
  • Your name or company logo on redux-observable's website, at the top of every page of redux-observable.js.org
  • Four hours per month of remote pairing/mentoring, and priority support on my OSS


https://redux-observable.js.org 


---


Want something more? Like a 1:1 mentoring, custom features added, specific bugs fixed, or support SLA? Reach out to me via any medium to discuss, e.g. DMs https://twitter.com/_jayphelps

Goals
$190 of $4,000 per month
If reached, I could spend more than half of my time on RxJS, redux-observable, Jaguar, and other open source, reactive programming things.
1 of 3
I'm obsessed with WebAssembly and Reactive Programming/RxJS. Right now I contribute to these communities in my free time, but I'd love to devote more time to them--or even work on them full-time, if such a dream were possible. Any and all contributions help.
If you're a business who wants to sponsor specific feature work, or focus on anything else in particular, let me know as well.

Thank you for your support!

RxJS

RxJS is the de facto standard Reactive Programming library for JavaScript, and contains a reference implementation for the TC39 Observable proposal. Using RxJS, you can represent multiple asynchronous data streams (that come from diverse sources, e.g., stock quote, tweets, computer events, web service requests, etc.), and subscribe to the event stream using the Observer object. The Observable notifies the subscribed Observer instance whenever an event occurs. Although RxJS is UI framework-agnostic, it has become integral to some, like  Angular.

My Involvement

I'd really like to devote more time to making RxJS better, particularly improving documentation and training materials. Although most assume RxJS is maintained by Microsoft, Google, and Netflix, it no longer is. None of the core team members have maintaining RxJS as part of their role. It's 100% volunteer these days.


redux-observable

RxJS 5-based middleware for Redux. Compose and cancel async actions to create side effects and handle business logic using normal idiomatic RxJS patterns.

My Involvement

Created by Ben Lesh and I in the first half of 2016. Although I gave a talk on it at Netflix event, it's actually maintained solely by me in my free time. There's also a large amount of support and community related maintenance. Github issues, StackOverflow questions, Gitter questions, etc.

I'd also like to make the testing story behind redux-observable lightyears better and more clear, as well as document many more RxJS patterns that might help those who learn RxJS by using it while redux-observable.



Jaguar, a new Reactive Dataflow Programming Language

I'm an armchair compiler nut with a focus on research into new programming models. After discovering Reactive Programming and RxJS it became clear that Rx was effectively a domain-specific "programming language" bolted onto a traditional imperative, procedural environment. i.e. you write RxJS in JavaScript, Java, etc. but it doesn't have the runtime behavior of typical code from that language. Stepping even further back, this would apply to any programming language based on control flow, nearly every modern programming language. Instead, I wondered what a first-class Reactive Dataflow language would look like? Think Microsoft Excel-like reactive semantics, but fully featured, typesafe, with syntax similar to JavaScript/Swift/Rust.

2 years ago I began my research into just that, first looking for prior art. Research into Dataflow languages has provided insight into previous challenges, solutions, and experiments (Lucid, Lustre, etc). There have also been similar attempts at first-class Reactive Languages (FrTime, Flapjax, etc), but none of them provided the polish, abstractions, semantics, and familiarity I think people are looking for.

My Plan

I've been nailing down the initial semantics of the language using early compiler prototypes targeting WebAssembly. The compilation of the language is not as straightforward as traditional languages; nearly all tooling, patterns, education, papers, etc assume the language can be modeled as traditional control flow. So a large amount of work has gone into how it can be efficiently transformed into control flow since the program ultimately has to run on either a stack machine (WebAssembly) or register machines (machine code). I'm designing the language with a Web-first mindset, targeting WebAssembly initially. Support for native machine code targets via LLVM will come later. I feel pretty strongly that  WebAssembly is the future.

It may be hard to grasp what a first-class Reactive language means. Think about how in Microsoft Excel you don't need to explicitly propagate change, it just happens. And how async/await makes async code more declarative without needing callbacks, think similar to that but with streams of values. Here's a couple examples to give you a taste:

Incrementing interval every 1 second


// an interval stream, increments every 1 sec
let i = |0, i delay 1s + 1|

do log(i)
// 0..1..2..3..etc

UI example with remote data fetching


struct SearchResult(username: String)

public fun render(limit: Number) {
  let search: InputElement // optional forward declaration
  let query = search.value debounce 300ms

  // every time the query value changes a new request will be made
  // and it cancels any previously pending request via `switch`, which
  // is just like RxJS's `switchMap` aka `flatMapLatest`
  let response = switch http::getJson<SearchResult[]>('/api/users/?q=${query}&limit=${limit}')

  // we don't need virtual DOM, instead this is
  // creating real DOM elements which we will update
  // and read from as-is. More similar to templating langs
  // like Angular/Ember/Vue/etc
  return
    <div>
      <label>
        Search:
        <input let search // definition for the `let search` above
          placeholder="Search for a user..."
        />
      </label>
      {match response {
        Pending =>
          <div>Loading...</div>

        Failure(message) =>
          <div>Error: {message}</div>

        Success(results) => {
          // methods are "operators" using infix syntax,
          // like the familiar binary expression `a + b`
          // which is using the operator `+`.
          // Here we're applying some list operators
          // like map and filter. Without syntax highlighting
          // this can look a little unfamiliar, don't worry!

          let usernames = results
            filter (result => result.isActive)
            map (result => result.username)

          // the parentheses are optional, I included
          // them for your familiarity

          return
            <ul>
              {usernames map (result =>
                <li>{result.username}</li>
              )}
            </ul>
        }
      }}
    </div>
}

Recent posts by Jay Phelps

Tiers
Backer
$10 or more per month 5 patrons
Generous Backer
$50 or more per month 1 patron
Silver Sponsor
$100 or more per month 1 patron
  • A personal thank you from me
  • A public tweet thanking you
  • Your name or company logo on redux-observable.js.org/BACKERS.html
  • 30 minutes per month of remote pairing/mentoring, and priority support on my OSS.
Gold Sponsor
$500 or more per month 0 patrons
  • A personal thank you from me
  • A public tweet thanking you every month
  • Your name or company logo on redux-observable.js.org/BACKERS.html
  • Your name or company logo on redux-observable's website, at the top of the redux-observable homepage 
  • Two hours per month of remote pairing/mentoring, and priority support on my OSS
Platinum Sponsor
$1,000 or more per month 0 patrons
  • A personal thank you from me
  • A public tweet thanking you every month
  • Your name or company logo on redux-observable.js.org/BACKERS.html
  • Your name or company logo on redux-observable's website, at the top of every page of redux-observable.js.org
  • Four hours per month of remote pairing/mentoring, and priority support on my OSS


https://redux-observable.js.org 


---


Want something more? Like a 1:1 mentoring, custom features added, specific bugs fixed, or support SLA? Reach out to me via any medium to discuss, e.g. DMs https://twitter.com/_jayphelps