
Show HN: This page exists only if someone is looking at it - losvedir
http://ephemeralp2p.durazo.us/2bbbf21959178ef2f935e90fc60e5b6e368d27514fe305ca7dcecc32c0134838
======
losvedir
Author here. Amusingly, I wanted to link to the HN discussion on the page, but
couldn't figure out how to... I don't think it's possible! Something I hadn't
considered until just now with a content addressable web is there are no
cycles in the links.

Edit: Another amusing anecdote. I've been following this on log2viz (the
heroku realtime performance monitoring tool), and was aghast to see high
response times and memory usage. Then I realized I was actually looking at the
dashboard for one of my rails apps! Phoenix is sitting pretty at about 35MB
memory usage, and a median response time of 5ms, so far.

~~~
sktrdie
Do you know about WebRTC and Webtorrent? You can do this even without a relay
server. Just browser-to-browser.

~~~
SomeCallMeTim
It's worth noting that WebRTC still requires a server of SOME sort --
typically you want a "signaling" server, and you need at least a STUN server
to pierce firewalls, though the latter can be found for free.

And some corporate networks are too restrictive to be pierced by STUN, which
means you need a TURN server, which is a relay server.

But yes, 98% of the time, WebRTC can go directly browser to browser. As long
as neither browser is Internet Explorer. Sigh.

~~~
billmalarky
These guys have an open source plugin that allows IE to join the webRTC party.

[http://skylink.io/plugin/](http://skylink.io/plugin/)

This library they also have makes WebRTC cross browser compatible.

[https://github.com/Temasys/AdapterJS](https://github.com/Temasys/AdapterJS)

------
rhythmvs
Interesting to watch Gmail reading along…

Send the link with the hash using your gmail account, stay tuned at the
corresponding page on
[http://ephemeralp2p.durazo.us](http://ephemeralp2p.durazo.us), watch
“Currently viewing” pop to "2" immediately after you sent the mail. Obviously,
the Google borg is slurping up each and every address on the Web it is fed.

~~~
zuck9
They can't be doing this. What if just opening the link does a destructive
action, like unsubscribing or posting a comment on your website?

~~~
superuser2
Idempotency of HTTP GET requests is not a theoretical concern.

~~~
ipsum2
Idempotence has nothing to do with it. POSTs are also Idempotent.

~~~
dragonwriter
> Idempotence has nothing to do with it. POSTs are also Idempotent.

No, of the "base" HTTP/1.1 methods, all safe methods (GET, HEAD, OPTIONS,
TRACE) and some unsafe methods (PUT and DELETE) are idempotent.

POST is neither safe nor idempotent (and safety is the key feature here,
rather than idempotence.)

GET, HEAD, and POST are _cacheable_ methods, which you may be confusing with
idempotent methods. These are very different categories, however.

------
addandsubtract
Don't all dynamic pages only exist if someone is looking at it?

I think a better title would be "This page only exists AS LONG AS someone is
looking at it"

Either way, cool demo!

~~~
DanitaBaires
I think the concept is akin to a beach ball that is passed from hand to hand.
It only exists one instance of it. With a webserver, a new instance is created
for each user viewing the page.

~~~
personjerry
A beach ball that can be held simultaneously by any amount of people, though

~~~
rawTruthHurts
Read this aloud: "[] that is passed from hand to hand. "

------
dheera
I once implemented a crude but serverless P2P in JavaScript by using pulse-
width-modulating information inside bandwidth usage; anyone on the same Wi-Fi
frequency would then be able to stream some arbitrary fixed-bitrate content
and observe the drops in their bandwidth throughput to pick up the modulated
information. But it was hellishly slow (a couple of bytes a second at best, a
couple of bits at worst), and didn't work as soon as there were 3 devices on
the frequency.

Would be interested to explore other ways to make pure-JS mesh networking
happen. I've thought of using the JavaScript image pinging trick to "port
scan" the entire subnet for peers, and communicate by "mildly DDoSing" each
other with pings, but haven't actually tried yet.

Another potential method to pure-JS P2P is by using the microphone and speaker
and building a mesh network at inaudible frequencies but this requires
microphone permissions and won't work beyond the same room, and would be only
several hundred bytes per second at best.

------
weavejester
WebRTC, and in particular, RTCDataChannel, might be what you're looking for to
get true P2P data transfer.

See:
[http://www.html5rocks.com/en/tutorials/webrtc/basics/](http://www.html5rocks.com/en/tutorials/webrtc/basics/)

~~~
bonestamp2
Ya, OP should have a look at icecomm for that... makes it really easy to
implement WebRTC in multiple browsers. It was on hacker news a while back:

[http://icecomm.io/](http://icecomm.io/)

------
marknadal
Feross has built the thing the author talks about, a Bittorrent client in the
browser called WebTorrent, it is super awesome and incredibly useful for
sending files, check it out at: [http://instant.io](http://instant.io) !

~~~
losvedir
Very cool! This is exactly what I had in mind, but couldn't find any
implementations of it. Thanks for sharing.

------
chrismccord
This is a fantastic example of using Phoenix channels! For those interested in
how channels work, check out my ElixirConfEU Phoenix keynote where I give an
overview:

[https://www.youtube.com/watch?v=u21S_vq5CTw](https://www.youtube.com/watch?v=u21S_vq5CTw)

------
darklajid
Very nice idea and I'm sure that it's a great way to play with Elixir/a
platform. Well done!

Two questions:

1) You talk about P2P uses, but would it be feasible to 'seed' a true P2P net?
A site that delivers the application, and everything from there is P2P vs.
'ask the server so that the server asks potential peers (clients?)'?

2)

I got this at the top:

Connecting to websocket. Connected! Listening for content for hash
2bbbf21959178ef2f935e90fc60e5b6e368d27514fe305ca7dcecc32c0134838 Requesting
content. Received content for hash
2bbbf21959178ef2f935e90fc60e5b6e368d27514fe305ca7dcecc32c0134838 Received
content for hash
2bbbf21959178ef2f935e90fc60e5b6e368d27514fe305ca7dcecc32c0134838 Standing
by... ready to share this content!

Two answers for the hash? Intentional? Fine? If that happens quite a lot, you
might waste more bandwidth/resources than necessary in your experiment?

~~~
losvedir
Great questions!

For (1) I'm not sure. I'm primarily a backend dev, so this was partly an
experiment for me to play with the front end, too. I kind of hope javascript
is not able to connect "sideways" to other ordinary browsers. I would think
they'd need to be running some sort of server, which I don't think the browser
can get going. Would be happy to learn more about this from someone more
knowledgeable.

Regarding (2), you should have seen my first approach: Every new client
broadcasted a request for the content, and everyone with it responded! Now
_that_ was a waste of bandwidth.

But what I've done here is I send the request for content out to everyone with
it, with a probability of 1/N, where N is roughly the number of people with
it. So in your case, it looks like it got sent to two folks. Sometimes it gets
sent to none, in which case the client will retry in 2 seconds.

It was a little tricky to figure out since phoenix runs every socket
connection in its own erlang process (great for robustness and concurrency,
but a real mind bender if you're not used to it). So this probabilistic
approach was the best I could come up with, instead of having some master
process select the right person to send the request to.

~~~
pjc50
Maybe the side-channel connections could be built on WebRTC, which includes
STUN facilities for making the connection.

------
learnstats2
This is a wonderful proof-of-concept and has potential applications in better
decentralising web services.

Keep going!

~~~
cjfont
However in this case, only the content is being decentralized, not the service
itself.

~~~
losvedir
Author here.

True, and a very clear way of putting it. Interestingly, since Erlang is so
well-suited for distributed computing, and Phoenix (the web framework I'm
using) has been built to take advantage of that, it wouldn't be too hard to
let someone else spin up this same service and take part in distributing the
content.

Off the top of my head, the only thing that wouldn't work is the "Currently
Viewing" counter, which relies on this all running on a single heroku dyno.
Otherwise, the socket messages are routed over a distributed PubSub layer,
which should be pretty easy to tap into.

~~~
stephengillie
It's a cool idea. What do you think about running it from an Android? (Isn't
there an Apache APK?) So you can only view the page while connected to the
phone's hotspot?

That would make it even more etheral.

------
natrius
This is very cool, and the content-addressable web is going to be a huge leap
forward for permanence and publishing without needing to run a server. Lots of
people are working towards this future. In particular, you should look into
IPFS.

[http://ipfs.io/](http://ipfs.io/)

~~~
losvedir
Oh wow, very cool. This is very much what I had in mind when thinking about a
content addressable web. Thanks for the tip.

~~~
whyrusleeping
Stop on by #ipfs on freenode irc, would love to chat :)

------
chaostheory
> But why?

The first thing that came to my mind is that this could be a great tool to
fight censorship

~~~
personjerry
Unless everyone hosting the page gets arrested

~~~
chaostheory
It's still practical since it makes things harder as opposed to one central
location for a server.

------
akumpf
Try this page, too!

[http://ephemeralp2p.durazo.us/82d78987fd1cd530302b81d5643739...](http://ephemeralp2p.durazo.us/82d78987fd1cd530302b81d5643739dd9b22f7f7214f10c771b5327729d88fe9)

This is a test page with embedded media via base64 encoding. This shouldn't
touch the server, so hopefully no bottlenecks for this page either :)

~~~
apetresc
Unfortunately it seems to have gone to 0 and therefore disappeared? =/

~~~
akumpf
Hmm, I'm still viewing it, and it says 4 others are also viewing right now...

~~~
apetresc
Oh, interesting. For me it's at 0 viewing, and stuck in a 'Requesting content'
loop -- and of course, as I wrote that, it found a peer! :)

------
swehner
Kind of related, [http://channelurl.com/](http://channelurl.com/) \-- the site
only has those pages that are linked to. In other words, the content of a page
is taken from its URL.

Example: a couple of Mark Twain quotes at

[http://channelurl.com/show/1f8b080054c8525500036d90b16a04310...](http://channelurl.com/show/1f8b080054c8525500036d90b16a04310c44fb83fb87e902e1b80f08a40829428a148185d4bab5bc76ce6b2db6f696fdfbc83e0229e24a12e37923bdcaba2486787c50b962d828667caea25c8f87e7ffdff1703c3ce2dd639715ca29410343cbaae1d4674ef28322d0cda682c233cf172ea0bc6b88793ab7ef2f69a3bd9a14254e41cf1842acd8a2b94d8534fa1d5566c6c2d2025276a0aa92630d1d57b86a37fa0a9cf966f68deca3e9ac28959387e42eadd1f50d5b3dd3b794a8fb095161408d730fb9d05aef94c23ef178f77e1371f0257276f584a9751791abd53d0f6a625e768c92eb68a2919f0c62aecdd860c6a584143d77b7a1f333b620b637576451c391b353b506e46e9495264bdb16d23ffa91f2affafc03e1127264b4010000)

Cheers

~~~
nosir33
I think this is great. The page is basically a markdown viewer and the link
has markdown encoded in it. If you pass the URL through a URL shortener, then
the URL shortener is effectively hosting the content of your page. It would be
cool if this was static HTML and the markdown was rendered in JS.

~~~
nosir33
This one has a WYSIWYG editor and renders the markdown using only javascript.
All content is in the URL and isn't even sent to the server.

[http://jbt.github.io/markdown-
editor/#bVPBTtwwEL37KwYt0u6W3a...](http://jbt.github.io/markdown-
editor/#bVPBTtwwEL37KwYt0u6W3aS90lMLpUUCqSrtCVXCiZ3Em9gT2ZNdoOq/d8ZBWw5IsRzZL+/NmzdZwOqro29Ttb0a9B6jNWu41bE3eAjwxTjCqNRnnVwNU7LNNEBjNU3RwuASnSsF7+CC4lBeeANncAeEkPTeAnUWGjdYAVxG3YIOBkzEEXQ+BxcY2llm4n1AbcCRgK/kssZANlACzffCx7chc/76cQMJ4QknqHWA1AlCCJNS6nrpISC0iAY0wSE6cqFlAj8yaSm4wUYg+0gbYWkxY1gCvaVOsEwckx2aQqkbxH7D5YrTk+y0QZSt0nHenpX6xLbExTJlEq7c2BM4P/vAvXl4eNjpvU51dCOp01UzhZochtX6jwI4XS2N2y/XRUd+WC2vQXsW46Niuf6o/vLi75X62bkE/NxjgDmq36uOaEznZdk66qaqqNGXu4pK/xLc1ubg1mJxsARcVh/wAK6B6yVnU72PvXSUcskHKZ/tqu+cTpI0bmMBl4hVzkzk78UVzKyzOov7aBiTxceIO1tTKgX3ol6uN9BE9HDoXN0pyc6FNLqopQUiww1Pm6yRO9fx2xM4icpz9jOMMyEG1dpLiYvFAu5oahoZRiMcXvc2E82jeH9sgaM32/Tq/vX7mqON/wd/1DHxMGTGC7Z062J85Vxc+nxUBEvl/LEY1AebraQnrv9x27m2G3gR1zo3JTMej4tdOnImbOjAs+x1cLpOBcY2n5VHdGnDi9RMD8cbmVv+PXCicaI8gVANWPcpy+3S1thm0GTf7IjRocdWu/I/blZpn904CjU2YDTpY7t5bhperMg/Y1L/AA==)

With source code: [https://github.com/jbt/markdown-
editor](https://github.com/jbt/markdown-editor)

~~~
swehner
Nice! Uses compression as well, I see.

Would be super cool if the URL encoding schemes of these two sites were
compatible!

OTH, I'm guessing the markdown-editor "site" cannot be searched.

Here is the result for the Google search of channelurl.com for "bird" /
[http://www.google.ca/cse?q=bird&cx=partner-
pub-1886386989888...](http://www.google.ca/cse?q=bird&cx=partner-
pub-1886386989888889:5320772169)

Kind of fun that way too!

------
tjallingt
Does this also mean that, technically, I can edit the page and someone else,
who connects after my edits, gets to see my edited page?

~~~
losvedir
Sneaky! But, no, the server double checks that the content you're sending
hashes to the correct thing.[0]

[0]
[https://github.com/losvedir/ephemeral2/blob/master/web/chann...](https://github.com/losvedir/ephemeral2/blob/master/web/channels/have_channel.ex#L21)

------
zecg
Damn you, author. This is cool and now I am loath to close the page.

------
jackgavigan

      Currently Viewing: 0
      
      Connecting to websocket.
    

Having a _Sixth Sense_ -style existential crisis moment here... o_0

~~~
myth_buster
Same here... but I'm viewing from inside corporate firewall and it may have
blocked some scripts.

------
callesgg
Well it still goes right through the server, so it only causes more strain on
the server than a standard setup.

The actual way to do this an acctualy call it p2p would be with a small WebRTC
framework that can bootstrap the actual site.

------
Nutomic
ZeroNet is quite similar to this (but runs as a seperate program):

[https://github.com/HelloZeroNet/ZeroNet](https://github.com/HelloZeroNet/ZeroNet)

------
gamekathu
I am getting : Currently viewing : 0, Connecting to websocket.. and nothing
happens. does this mean the trail has been lost and even the last user have
closed their browser?

~~~
crossroads091
See if you can view this:
[http://ephemeralp2p.durazo.us/1358fa296d21d03a6e6bf996e429f3...](http://ephemeralp2p.durazo.us/1358fa296d21d03a6e6bf996e429f315dd2cf9879034ba93580e3243e65669fd)

~~~
ZainRiz
It gawn

------
kreeben
Very cool! Interesting to see your findings. Maybe the browser is capable
already of simplifying p2p file sharing. It would be good to get rid of todays
torrent clients and have your browser run some slick p2p service instead that
also serves as a convenient way of sharing or sending files with collegues and
friends. I also really love the idea of tossing web content around (between)
peers like that. Good work, so far. Don't think you're done yet.

------
andrewmutz
Very cool!

Curious: If you want to have a lot of concurrent connections to your
Elixir/Phoenix server, do you need to up the OS file descriptor limit?

And can you do that on Heroku?

------
zhte415
All I got after 3 tries:

<code><!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta
http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport"
content="width=device-width, initial-scale=1"> <meta name="description"
content=""> <meta name="author" content="">

    
    
        <title>Ephemeral Hosting</title>
        <link rel="stylesheet" href="/css/app.css?vsn=30EBB49">
      </head>
    
      <body>
        <div class="container">
          <p>Currently Viewing: <span id="visitor-count">0</span></p>
          <div id="js-console" class="web-console"><ul></ul></div>
          <hr>
          <div id="content-goes-here">
    
            
    
          </div>
        </div>
        <script src="/js/app.js?vsn=3DA95D0"></script>
        <script>require("web/static/js/app")</script>
        <script>
          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
    
          ga('create', 'UA-61291061-1', 'auto');
          ga('send', 'pageview');
    
        </script>
      </body>

</html> </code>

~~~
losvedir
Hm, it's working for me. Did you try letting it sit a moment? The server
doesn't actually store the content, so it has to load a blank page first.
Eventually, you should receive the actual page content from a peer (via the
server, to verify that the content is correct).

------
claar
This is more interesting than the title eludes to; this is P2P via websockets.
Neat!

------
onion2k
Nice. Very nice.

If you ditched the hash that checks the content and made the whole page
'content-editable' (maybe with something that stripped certain tags like
images and video for obvious reasons), that might be fun. :)

~~~
losvedir
Ha, that's a fun idea. I imagine it would regress to a lot of inappropriate
ASCII art pretty quickly, though...

The SHA-256 checksum is actually part of what makes it very interesting to me,
though. Since the content of the page is guaranteed by the location of it,
it's kind of a shared web that anyone can help host.

------
aakilfernandes
Very cool stuff. I wonder if it would be possible to host an entire webapp
with sockets/rtc. I don't see why not, but it you'd have to re-invent decades
worth of architecture built around http.

------
axeldelmas
You should take a look at WebRTC's DataChannel. We're using it at Streamroot
to do P2P video streaming in the browser.

You're talking about filesharing in P2P, again, totally something you can do
with WebRTC. You should take a look at PeerJS if you want to experiment in no
time.

You also talked about BitTorrent in the browser: you should definitely take a
look at WebTorrent

------
kmfrk
Thsi reminds me of _Mystery Men_ 's Invisible Boy who has invisibility - but
only when no one is looking!

I need to re-watch that movie.

------
gojomo
It appears the content _does_ travel to and through the server, for both
initial hashing and later relaying to other clients.

Couldn't this be done without ever sending any content to the server, via in-
browser hashing and client-to-client connections? (The server could still be
used to help clients discover each other.)

------
99problemz
Here's another, it is a please CLICKME page, even if it doesn't look like it.
[0]

[0]
[http://ephemeralp2p.durazo.us/ae0fad06ab58fa6bbc1599733b6c0c...](http://ephemeralp2p.durazo.us/ae0fad06ab58fa6bbc1599733b6c0c1c06627472d635935da8551ae2071a9797)

~~~
losvedir
What is this exactly? As a general warning, I don't sanitize or otherwise
modify the shared content, so any sorts of badness could be there.

~~~
99problemz
An attempt (copy paste really) to try and keep the window open and the content
alive. Also, a request for the root/homepage could be funny if it was meta
[0].

[0]
[http://ephemeralp2p.durazo.us/7eb67dd70747b8e979e77119e813f4...](http://ephemeralp2p.durazo.us/7eb67dd70747b8e979e77119e813f49c0afdea83ae4745b25fdda15c2ec0a08c)

------
hoprocker
So cool! This is _almost_ BitTorrent, but the dependency on the server for
client coordination is still a weak point, and makes it more like Napster than
BT.

It would be an interesting project to try something similar with WebRTC, to
allow (as I understand it) actual P2P communication.

~~~
matjaz2k
[https://www.peercdn.com/](https://www.peercdn.com/)

~~~
hoprocker
Well then.

------
wstrange
So would we call it a heisenpage?

------
kreeben
It would be cool if you could drag and expand the log window. Can you patch
the content?

~~~
aylons
As the page is content-addressed, it can only change the content by changing
the address, thus creating a whole new webpage - address and content, after
all, define the resource.

------
dignick
Cool vid
[http://ephemeralp2p.durazo.us/a1ab6f2785e2df2f08f70168413e3a...](http://ephemeralp2p.durazo.us/a1ab6f2785e2df2f08f70168413e3a231789e9b836e441e690c1f13e9d68e95c)

------
dokument
Great proof of concept. I think it would also be interesting to have a version
that uses public keys instead of/in addition to the checksum for people to
publish content that they can edit and it be signed.

------
nathanb
Currently it doesn't seem to exist even if someone IS looking at it :)

------
redgetan
Can't help but comment that the title reminds me of a Doctor Who episode
"Blink" where the statues only exist if someone looks at it. Anyway, cool
Elixir project!

------
ccozan
Interesting, this is like a P2P Snapchat for text. Or no. Better said, I am
having trouble trying to associate this with something that exists already.

Good job for the innovation!

~~~
mathgeek
I've been thinking of it as somewhat like a Bluetooth pairing. Only exists
when two devices are connected.

------
jaywunder
For the very unlikely case someone can't see this:

This page exists only if someone is looking at it Hi! Welcome to Ephemeral
P2P. Thank you for loading this content. Your browser retrieved it from the
browser of someone currently viewing this page. You're now a part of the
network and someone who loads this page in the future may get it from you!

The server does not store this content anywhere, so as soon as the last person
closes their browser, it's gone. You can see a count of how "healthy" the page
is (how many people are viewing the content) at the top.

How does it work? At a high level, this is what happens:

From the homepage you enter the content you want to share. When you submit it,
you register the SHA-256 hash of the content on the server. Your browser
stands by with an open websocket to the server. When someone else visits a
link "/[sha256hash]", the server tries to retrieve the content from anyone
registered with that hash. The server double checks the hash of the content it
gets and then passes it along to the new person. That new person now registers
with the server as someone who knows the content for that hash. But why? Just
a simple experiment to play with websockets and concurrency.

The app is built in Elixir (compiles to erlang) with the Phoenix framework,
since it supports websockets out of the box. It's very "railsy" and in
addition to rails-style "controllers", it has "channels" which are like
controllers for websockets. Made building this thing a snap.

The app is hosted on a heroku 1X dyno and I'm hoping this hits the front page
of HN to see how many concurrent connections I can squeeze out of it. Erlang
is known for its concurrency, so I'd love to know how Elixir/Phoenix can serve
as an alternative to my usual rails when highly concurrent solutions are
needed. I plan to tweet my findings, so you can follow me (@losvedir) if
you're interested in them.

Where do we go from here? There are two aspects to this project that I've
found quite interesting, that I hope people explore:

Peer-to-peer over browser websockets Does something like this exist? I opted
for P2P of HTML injected into a container div, since I didn't want to deal
with the legalities of clients sharing binary files back and forth. But
someone wanting to deal with DMCA and all that might have an interesting
service here.

I could see this being a great alternative to something like sendfile (I think
that's a thing?), or DropBox, or what have you, when you just want to send a
file to a friend and it's too big for email. Big files could even be broken up
into individual SHA-256'ed pieces, and the list of SHA-256 hashes could be the
thing sent. The other side would then fetch each piece in turn and re-
assemble.

But that's starting to sound kind of like BitTorrent... I wonder if someone
could even make a web-based bittorrent client along these lines.

Content addressed web The cool thing about the page content being represented
by its SHA-256 hash is that it doesn't matter where the content comes from. If
anyone sends you the content, you can verify that it's what you were looking
for. This makes it well suited for peer-to-peer or otherwise distributed file
serving.

Imagine essentially an archival service where all kinds of content (web pages,
mp3s, videos, etc) are indexed according to their SHA-256. Hopefully this
content would be distributed around the world and backed up and all that good
stuff. Then if someone tweets a "hey, checkout this video I made [a2b89..]",
it can be retrieved from this "global store of all content" using that hash.
It's already very common to mention the SHA-256 alongside a download. Just
think if you could take that and download from this service.

Wikipedia is an amazing collection of knowledge in terms of articles. It seems
like it would be valuable to have a similar nonprofit service that was a
repository of "notable" files.

A quick warning I don't do any sanitization of the shared HTML content, so be
wary of other links that folks may post. But I don't think it's too great of a
security risk, since there's nothing private here (no https), and you
shouldn't be trusting me any more than any other random internet person.

In closing... Thanks for checking this out! Feel free to fork the repo on
github and play around with it yourself!

And a big thanks to the friendly folks on the #elixir-lang IRC channel who
have been very helpful in building this.

A (more) permament version of this content can be found here.

~~~
nanofortnight
For time travellers:

[https://github.com/losvedir/ephemeral2/wiki/This-page-
exists...](https://github.com/losvedir/ephemeral2/wiki/This-page-exists-only-
if-someone-is-looking-at-it)

------
dmak
Wow this is pretty cool. Any feedback on Elixir?

~~~
unoti
Elixir is amazing. It's homiconic, like LISP, so being able to execute code at
compile time can have a game-changing impact on reducing boilerplate. And in
addiction to that, it's functional, so I can get the awesome benefits of
immutable programming, but without the dizzying complexity of, for example,
Scala's type system. And it's based on the Erlang VM, so I get the benefits of
battle-hardened concurrency and IO underpinnings.

Previously I stayed away from things like Go and Node/Express, because I felt
like it wasn't as easy for the type of work I do as Django, and was missing
key things like the admin CRUD interface. But when I looked at what's in the
Phoenix framework[1] and read the source, it started to feel like I'm
witnessing the dawn of the next Ruby on Rails revolution.
[http://www.phoenixframework.org/](http://www.phoenixframework.org/)

~~~
dj-wonk
"Elixir isn't homoiconic, it never was, and they no longer make that claim."
[https://news.ycombinator.com/item?id=7622746](https://news.ycombinator.com/item?id=7622746).

See
[http://c2.com/cgi/wiki?HomoiconicLanguages](http://c2.com/cgi/wiki?HomoiconicLanguages)
"Languages in which program code is represented as the language's fundamental
data type are called 'homoiconic'."

------
ArekDymalski
>Request received... >Content sent!

That was rewarding :)

------
houshuang
This is awesome. Would be fun to see more statistics - how many people have I
provided the page for, for example.

------
matjaz2k
check out [https://www.peercdn.com](https://www.peercdn.com)

------
LaFolle
Beautiful Idea!

So, when I load the page how is it decided that which client should serve me
the content?

------
taylorbuley
darknets are awesome

i'm the author of a long-existing indexeddb javascript library. IDB can store
all kinds of wonderful objects, including binary blobs. if you're inspired by
client side data, you should check out indexeddb!

~~~
jaytaylor
How about a link to it?

------
tudborg
Fun, but not really P2P. Have a look at WebRTC for actual P2P :)

------
adamkochanowicz
This is a sweet concept!

------
sova
go page! hahaha so awesome

------
suyash
Ironically that is how most of the websites and webpages exist now - been the
norm for couple of years since we started dynamically showing content via AJAX
and lazy loading. There is nothing novel here.

~~~
LaFolle
You missed the idea here. Its not about AJAX loading. Its about how the
content is served to the client without server storing the data to be served
(content). You should spend more time on shared link to glean the beauty of
this.

