Hacker News new | past | comments | ask | show | jobs | submit login
Simple - An Obtvse clone written in Python (github.com/orf)
141 points by jsherer on March 28, 2012 | hide | past | favorite | 69 comments



I'd like to see one of these clones that more closely resembles the static site generators like Jekyll (http://jekyllrb.com/) or Hyde (http://ringce.com/hyde). Basically, the CMS would just be the interface to create new and manage existing content. It would have the standard static publish function that builds out the pages of the blog as HTML.

(NOTE: "Simple" is not my project)


Lightbulb (https://github.com/espeed/lightbulb) is a Git-powered, Neo4j-backed blog engine written in Python.

It allows you to create entries in ReStruturedText using a text editor. I designed it with Heroku in mind, but can be easily adapted for any Web environment that uses Git.

When you push to Heroku, the entry metadata will be automatically saved to Neo4j, and the HTML fragment generated from the ReStructuredText source file will be served off disk.

You can use the free Heroku dyno and Neo4j Add-on (https://addons.heroku.com/neo4j) to serve your blog for free.


What's the advantage of storing a blog in a graph database? Or is it just one of those "just because I could" things?


Hi Kamil - A database-backed blog enables you to easily integrate the content into your existing website -- for example, dynamically displaying the latest entry on the home page, and it makes it easy to style the blog with the site's existing templating system rather than maintaining a separate system.

I wanted the benefits of a dynamic app, but I wasn't willing to exchange Emacs for a Web-based editor so I created a hybrid engine.

I chose Neo4j because graphs are an elegant way of storing relational data. There are no tables to mess with and no joins (everything is explicitly joined). And if your blog's auth/commenting system uses data from the social graph, such as Facebook or Twitter, a graph database provides a clean way of storing the data.

Also, I am the author of Bulbs (https://github.com/espeed/bulbs), a graph-database framework written in Python, so using it was a natural choice.


> I chose Neo4j because graphs are an elegant way of storing relational data.

As opposed to, say, a Relational DBMS?

What you've done might be very interesting and rewarding to you, but it feels like you wasted three paragraphs in your response with something that falls right into the "just because I could" camp.


Another way to read it: Relational databases just aren't elegant.


"Elegance" is one of those empty words that's great for polarizing a debate without really adding any meaningful information.

Neo4j is neat and underutilized. I think rglullis is just saying, if that's why espeed used it, he could have saved three paragraphs of explanation by just saying that.


Notice I didn't just say it was elegant, I said why: "There are no tables to mess with and no joins (everything is explicitly joined)."

I find elegance in simplicity. If you don't need the tabular features of a relational database, why not use a graph DB for relational data? It's like a key value store with directly connected relationships.

This is so much simpler than having to deal with creating tables, DDLs, and migrations:

  >>> g = Graph()
  >>> james = g.vertices.create(name="James")
  >>> julie = g.vertices.create(name="Julie")
  >>> g.edges.create(james, "knows", julie)
Futhermore, there's no impedance mismatch so your code is cleaner.

But regardless, this is Hacker News where people explore, build, and share new things. I hope we're not moving to a place where that gets admonished.


I've actually looked a bit at bulbflow before, being a Python programmer who has had an interest in graph databases for quite some time. That's why I asked my question originally. Can you give an example of the types of relations you're using the DB to represent in a blog?


These are the base elements:

  * Nodes/Vertices: Person, Topic, Entry
  * Relationships/Edges: Tagged, Authored

  person -- authored --> entry
  entry -- tagged --> topic
Here's the base model: https://github.com/espeed/lightbulb/blob/master/lightbulb/mo...

The comment system is a separate, generic component.

Marko, the guy who created Gremlin (https://github.com/tinkerpop/gremlin/wiki), just released a Gremlin Tree step (https://github.com/tinkerpop/gremlin/wiki/Tree-Pattern), which makes it really easy to build a threaded comment tree in one quick shot.

If you have a large blog or content system, you can use likes and views to make content recommendations using a basic Gremlin collaborative filtering query:

  // calculate basic collaborative filtering for vertex with user_id
  def rank_items(user_id) {
      m = [:]
      g.v(user_id).out('likes').in('likes').out('likes').groupCount(m)
      m.sort{a,b -> a.value <=> b.value}
      return m.values()
  }
If you use Facebook, Twitter, or GitHub to authenticate users you can easily incorporate friends and followers into the recommendations.


Thanks for taking the time to explain, I'll definitely be doing some reading over the code.


I was really responding to mgkimsal, who brought up elegance. I'm all for experimentation, I am not for technical debates short on technical content. Please continue.


I use one called Blogofile[1], but it is entirely local. You basically give it the posts as markdown/restructured text and it generates the entire site as static HTML. I'm sure you could use it as a starting point to start the service you just mentioned, instead of having it read the posts from disk have it read them from a database.

The thing I like about static generators is that I don't have to worry about a programming language being present on my hosting site (http://funcptr.net is blogofile, http://bertjwregeer.com/ is Poole.py[2]) and the overhead is a lot smaller, since all I have is static files there is a lot less worry about accidentally causing CPU spikes, or a database being overloaded, and using sendfile() one can very quickly and efficiently serve up HTML files to clients.

[1]: http://www.blogofile.com/ [2]: https://bitbucket.org/obensonne/poole/overview


i've ported poole to python 3 just recently https://github.com/marban/Poole


I want to bake NLP into an existing CMS, so let me speak to your point. To extend your idea, these tools should be much more modular:

Simple/Obtvse should be an interface for adding posts and editing existing posts. Similarly, a command-line-interface can also be used for adding posts. (`newidea "I want a castle made of marshmellows"`)

The site is stored in a database when live, but the database can be transformed one-to-one into a directory of human-readable Markdown or ReStructuredText files.

Rendering is handled by a separate component, e.g. nanoc or jekyll. The important thing is that the site database can easily be mapped to a human readable format. The advantage of this approach is that it is easy to write a modular rendering engine without mucking with the specifics of the CMS.

For example, I want to automagically categorize posts in a taxonomy, find related posts, group posts that are lists, etc. using some NLP wizardry. I would much rather write this application for a directory of human-readable files, adding metadata fields to text files, than paint myself into a corner with a particular CMS.

Please email me if you are interested.


I'm making something like that at http://wr173.com/


I did a quick and dirty port of obtvse to jekyll last weekend. It still needs some work, though. It's here: https://github.com/drewinglis/obtvse-jekyll


I use Pelican for my blog. It's pretty straight forward. http://readthedocs.org/docs/pelican/en/2.8/


Then, it is not going to be as static as as static site generators like Jekyll or Hype. One good thing about those sites are that you don't have to serve those static sites from any hosting without any dynamic generation of the web pages.

But, with the feature you request, then, it doesn't really work for a static site generator. It is better to use normal caching with a dynamic site like how Simple is doing now.


I don't think you follow what he is asking for. Jekyll uses CLI-based software to output raw HTML files that can be served to website visitors. Why not create a database (or flat-file) driven CMS, with nice features (e.g. wysiwyg) that then outputs raw HTML files?

So basically just a UI for writing and managing the posts that sits on top of Jekyll.


It's funny, because this is what Movable Type did, back in the day. James Hague echoed your sentiments in "Solving the Wrong Problem": http://prog21.dadgum.com/130.html


Exactly. Give me lean and lightweight MovableType with a sprinkling of Simple/Obtvse/Svbtle. Easy (or no?) install. Nice UI. Simple export to HTML.


Blogger was like that too and I loved it. It's why I've had super basic shared hosting at Dreamhost for so long - it could handle pretty much any traffic by serving up plain HTML.

I'd be curious to see how a "Blogger of today" would fare if it also had Dropbox integration, so you could use specialized local apps like IA Writer if you wanted to but also still write or edit on the go without your main machine.


Yes. That is what most caching feature does. Take Ruby on Rails as example, if you have a static page, you can just cache it as just raw HTML file(after the first rendering).


That's what caching does, but it's not exactly the same use case. Jekyll just generates a folder full of static HTML files that I shoot out to a dumb server that doesn't run Ruby. I'd like continue to do this, and just run a shiny interface locally.

To do the same thing with the cache in a Rails app, I'd probably have to make a script to visit every page to get it to render to the cache, then copy the cache out. At that point, it'd probably be easier to ignore Rails' built-in caching and just to make a rake task that renders everything.


If you want a raw HTML file, what's stopping you from using CURL to get your raw HTML file and uploading it?


What's wrong with just

  wget -m -k -nH <your URL here>
combined with some sort of rsync?


Nice work with the Python style, though I believe Simple and Obtvse missed the point as with every clone of something out there that tries to replicate what they could see on the outside. Skipping over Dustin's attitude of the situation, no one really knows how Svbtle.com works on the inside do they?

From the outside look and the screenshots (because that's all Dustin showed you) it's a simple design and that's the point; it was never supposed to be a complex work of design for you to be proud that you could replicate it in 1 day in rails. Yeah, Dustin put some work into thinking what could work for the layout but once the application of the design is done, replication is beyond simple.

Clone all you want I think it's great but Dustin was really telling the story of the "network" the idea of a closely knit community of writers (pseudo-writers whichever you prefer). I look at it as similar to the Deck Ad network or Dribbble (before every desperate Designer begged for an invite). Or when an HN clone comes along, no one ever migrates across, they always come back here.

Point is, the one thing you are never going to have is the network, that human element that sets apart the clone from the real deal.


Whats funny is I agree with just about everything you've stated here, although I do believe we did get a pretty good idea of the backend with the screenshots.

But your point doesn't detract in any way from these projects. The point of Svbtle is the network. The point of Obtvse/Simple is the backend. You say "clone all you want" which is exactly what we did.. the goal was never to "beat" anyone or prove anything, it was to mimic the software, which we've already accomplished.

And IMO, that is more valuable than a network. Because now anyone can use it. And as good as Dustin's network ends up being, if it's never all-inclusive, it will always miss out on a the biggest and best talent-pool around... the internet.


> Go download Python 2.7+, Flask, Sqlalchemy and flask-sqlalchemy and you are good to go.

OP, you should learn about requirements.txt and virtualenv/virtualenvwrapper, it will make your life easier.


Of the many mentions of requirements.txt, this is the one that prompted me to figure this out. Thanks.

This post laid it out for me: http://www.saltycrane.com/blog/2009/05/notes-using-pip-and-v...


He actually has a REQUIRES file that's in requirements.txt format, so it looks like he kind of does.


It's still not properly packaged up and also nowhere to be found on http://pypi.python.org resulting in no pip and no easy_install options. Pretty much every useful python package is distributed that way, see httpie for example [1].

[1] https://github.com/jkbr/httpie


I think these two packages could become a great learning resource for noobies. I'm a Ruby guy, but am definitely going to take a look into this version, should add usually difficult to find "context".

Nice work :)


AH! I was waiting for the python version.

I also watch this python static blogging app on github here:https://github.com/fallenhitokiri/Zenbo


I wrote my own static generator with a command-line and web interface a while ago, add it to your watch list if interested, ill eventually clean it up into a v1.0 and release it, but it works right now and I have been using it for my own blog for a while:

https://github.com/nikcub/floyd


So much drama around what is basically a skin/cosmetic improvement...

Good luck anyway.


I'm holding out for the Haskell version.


This is getting ridiculous... nice job all the same!


Nice work, thanks, though I have a feeling that it's misnamed, sPymple would've been a nice match to Obtvse :)


Acvte, surely?


This should probably have a license added to it somewhere. Especially with those 21 forks hanging around.


I'm a Django guy. Can someone explain the appeal of Python micro-frameworks like flask? Why would you want to give up all of those open-source Django apps?

http://djangopackages.com/


You know what? Today I was thinking of that it'd great if Obtvse was written in Python + Flask :)


I'm holding out for Svmple


I'll wait for Svmpler


This one doesn't even bother to rewrite the CSS; it just takes the cloned CSS from Obtuse. The snake eats its own tail.


Obtvse was open-sourced for a reason: so that people could take it and modify it and use it however they'd like. This is open-source working.


You keep telling yourself that.


I don't see what's so difficult, Thomas. A clever, smug person posted about a project of his and behaved poorly when people complained about not having access to it. So somebody else cloned it – not to steal the thunder, but to let people use the program. Now it's been cloned again and spreads a little further. I'm sure the guy that open-sourced it considers this a victory, inasmuch as the idea has spread even further.

If Dustin's stopped sulking about his little change-the-world club being subverted and opened up, he's probably happy about this too: this idea that he came up with and worked on is so popular that people are making an effort to spread it further. If his actual idea is even greater and grander, then when Svtble opens up people will flock to it and thank him for it. Everybody wins.


I think there's one important distinction to make here. Dustin Curtis wasn't the one who submitted the link to hacker news. So, he wasn't really saying how awesome his product is, ans then saying that we can't have it, as many people said on both the Svbtle post, and the Obtvse post (at least not to Hacker News).

I was still annoyed by the wording by the post, but I think the fact it wasn't meant to be posted to Hacker News should be taken into consideration.


You have to give him some credit that he is using this opportunity to defend Curtis and build a powerful relationship when everyone else is slamming him. People don't forget it when you defend them when few others will.


I don't know Dustin Curtis or care particularly too much about Dustin Curtis. What I remember about him was that he wrote a blog post about American Airlines that got a lot of play that I found simultaneously smug and naive in that infuriating way designers sometimes have, and that he spent a lot of time making all his blog posts look different.

What I don't like is bullying. This whole site spent a week chasing a YC company around with a pitchfork and torches for stealing designs from a well-known company, but when some guy writes some promo copy that enough people here don't like, HN manages to spawn a meme that the same copying is somehow liberation for the cause of open source.

People are allowed to choose who they associate with. Dustin Curtis does not need to "open up" his little club. For crissakes, you're writing this on the message board of an exclusive club that won't have you as a member.

"Powerful relationship with Dustin Curtis". Sheesh.


While it is easy to point at things that are apparent hypocrisies, and blast them as such, it may be that there are other factors at play then the dimension that has the conflict. Perhaps when a for-profit company takes the work of another for-profit company, it is wrong, because there is harm. Perhaps when someone touts how awesome his ideas are, for the sake of publicity, with vague claims of "if you're lucky I'll let you near the brilliance some day" it is a different scenario. If the goal is publicity and auto-horn-sounding, then people copying is furthering the goal of publicity - and as such, it becomes hard to see where damage is done, other than to perhaps an ego (damage here being "maybe my idea isn't so brilliant, it it's a day before people can do it themselves, oh it hurts not being a genius").

Or perhaps you are also suggesting that those who point at things like the "one-click" and other trivial software patents are also hypocrites? Maybe the degree of copying is different in the cases (I actually am unsure here)?

Anyway, point being, there are many dimensions to analyze in human behavior, and conflict in one, does not necessarily amount to bullying or hypocrisy.


Copying is liberation. You're freed from relying on the original instance.

The issue I took with Dustin wasn't just the idiocy with which he decided making a pretty blog equated to somehow creating the future of journalism. It was how, when people on this site complained about his copy, his response wasn't "it was a joke" or "this is still a private beta" but "good, my marketing worked because you'll remember it".

If Dustin didn't want his private little club to go public, he could have chosen not to write about Svtble at all, and we'd have no idea of what it looked like behind the scenes. Once he went public, his ideas became a part of every "club" that cared to look at them, including ours. You are always responsible for what you do in public. Always.

It's twisted to look at the response as "bullying". Somebody copied a public idea and released it to people who didn't have access to it yet. Partly in response to Dustin's saying, "You know what, I don't care if I offend you, as long as you pay attention to me." The only way that the open-sourcing was bullying was that it turns out Dustin does care about offending people after all. Not that he seems to have learned anything from this, other than "people on that web site don't like me and that sucks."


I didn't see Dustin's supposedly arrogant comments back when this shitstorm blew in, but I still don't understand why anyone thinks this is OK. Was Dustin upset about people copying the backend? because, I don't see a problem with someone taking his "ideas instead of drafts" bit and running with it. What is completely unacceptable is the wholesale copying of his visual deign. We now have two different "open source" blogging systems that allow people to create websites that look pretty much exactly like Dustin's, without his permission. That's shitty and wrong. Dustin created a visual brand for himself, and yes, six others. No one has the right to take that and use it for themselves without his permission. There is no "liberation" in using someone else's design, there is only theft.


The design is not his design. Please compare the two before jumping to that conclusion. The copy has stripped all unique elements of Dustin's design.

http://obtvse.herokuapp.com http://dcurt.is


That is laughable. I did compare the two before writing my post, and arguing that the one would not be mistaken for the other is preposterous. When I see the copied design I see nothing but papered over choices Dustin made. If you, and more importantly, the other people who have been defending this really believe that the design is unique, it totally explains why this started such a huge argument on HN, the two sides are not even arguing about the same thing.

1. No one cares if you take Dustin's concept that pre-published posts should be called "ideas" instead of posts and have lower overhead. He told us all about it, he gave it away. Open source it, it's a great idea, everyone should be able to host their own blog and have as little overhead as possible in nurturing ideas into posts.

2. It is wrong to take someone's design and just use it for yourself. It seem especially shitty to do this when someone has announced they are going to try and make money off of using that design as a brand. This obviously gets pretty grey pretty fast but there is a line and this copy crosses it. It's cool to use other people's work to guide your own, that's how we learn. But when you take something, you have to make it your own. Imagine if I took kottke's css and changed the bars on top from blue to red, it would not only be wrong but silly. Aping someone else's style is not how you want your blog to be remembered.


Uh huh. What's a well-known site elsewhere on the Internet that looks more similar to Dustin's than yours?


Already showed you one in the other thread. Done playing with the trolls..


Give me a fucking break. If he didn't want to be chased around by a pack of trolls, he could have just chosen not to write. What a detestable sentiment.

Feel free to score yourself another 20-50 karma points by cheerleading this bullshit. I'm done, I hope, with this thread.


You started this conversation, Thomas. You don't get a break when you're the one actively participating.

I don't mind seeing interesting ideas freed from smug people who'd rather hoard them publicly. I don't mind seeing interesting ideas freed from anybody, really; by simply stating an idea in public, you're setting it free. But I especially don't mind when it's Dustin Curtis, whose ideas are small enough to be freed so easily and whose ego is huge enough that we get such an overblown response.

(In response to your post-edit: Nobody's trolling him. They're creating a service which, it seems, many more than just 6 people want. Why is spreading a good idea considered trolling?)


Pay attention to the language you're using: "smug", "huge ego", "overblown response", "idiocy", etc.

You're trying to make this out to be a principled stance about "spreading ideas", and yet with every post you undermine that claim and make it clear that it's really about "Dustin Curtis is a jerk, so fuck him."


Dustin Curtis is a jerk. But I thought I'd made it clear that I wouldn't have minded this happening even if it had happened to somebody else.

Ultimately, what's valuable about Svtble is where Dustin's capable of taking it, both as a network and as a platform. These spinoffs can't touch that, because they're not Dustin. If Dustin ends up launching a great platform, then the copycats won't be able to touch him. Until he launches anything, however, I see no problem with people seeing his concepts and launching copycats, especially not if they're open-sourcing the clones.


Agreed. It goes without saying that you are anything but obsequious. Much respect you for doing it for the right reasons. You both struck me as similar types for a moment - very talented curmudgeons.

I think Curtis has a very bright future and would be a great collaborator for those who see through the exterior.


Pretty crazy that one open source project would reuse something from another. :P


i don't think you understand why obtvse was created in the first place


To troll Dustin Curtis? Yeah, I think I get it.


And it succeeded!

More seriously, if you genuinely have a problem with Simple using the CSS from Obtvse, I think you don't understand how open source software works. Either that, or you're being somewhat obtvse yourself.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: