CommaFeed - Open-source bloat-free Google Reader clone
commafeed.com
commafeed.com
That account name is still there, so I can't recreate it.
Adding a feed: http://cl.ly/image/16183s0h0t2e (clever, it auto-fills the name after a second) (not so clever, the only drop-down option is 'all', and it's not pre-selected)
Having added two feeds, I see this: http://cl.ly/image/321t1J2p461p it persists for a while, the spinner in the corner goes away, it persists... toggled 'all', 'unread', etc, no results.
Then it pulls in 5 PHD-comics: http://cl.ly/image/1Y0k01310Q04 No XKCD yet, not sure what happened to it.
And one comic, with read above, unread below: http://cl.ly/image/3N2d3i2Z0g2b
Some basic key commands I've used in Google Reader still work. The UI takes a moment to load data from the server when you change where you are, but once it finishes it's fast. Minor bugs, some holes things seem to fall through, but as a basic RSS reader it works. Maybe there's more to come?
As long as nobody messes it up for everyone else, "somebody password" is what I used if you want to try it out.
I'm not exited by it being a java-application (hosting that on my own could be a hassle) and the google reader import doesn't work (invalid grant, error code 400, want the eror message?). Importing the .xml seems to have no effect at all (edit: now it does. just takes some time?).
What is the feed-polling strategy? Does it support pubsubhubbub? Will this instance stay active?
Good work though! I think i might use this.
I actually have a half-baked code generator to use Ruby to generate Java for some Android hobby-projects because I found that less painful and obnoxious than writing the Java directly.
One question: I uploaded my opml file, and ... nothing happened. It is processing or queued somewhere? (That's fine, I'd just like to know.) I then added a single feed, which worked fine.
Edit: I'd switch to this from The Old Reader (and gladly pay) if you make a mobile view.
* Import a list of feeds from a simple text file. I find it strange readers don't support this. If I have a list of 50 rss feeds, I don't really want to enter them one by one. Importing from a file another reader has exported is great, but I'd like to import from a text file too.
* Filters. Per-feed and per-category. Again, perhaps naively, I imagine this would be simple to implement but I don't know of a web-based reader that does this and I usually have to resort to Yahoo Pipes or similar, which is a pretty clunky solution. Filters like: Only show entries containing "bar", or don't show entries containing "foo". Bonus points if I can edit a multi-line list of filters, so if I want to filter for 50 separate words I don't have to enter them one-by-one
* Sort-by-newest that works properly across categories. I currently use feedly and somehow in category view posts 12 hours old show up ahead of posts 3 minutes old.
[1]: http://reader.feedshow.com/goodies/opml/OPMLBuilder-create-o...
com.commafeed.frontend.utils.exception.DisplayException: 400 Bad Request
{
"error" : "invalid_grant"
}
at com.commafeed.frontend.pages.GoogleImportCallbackPage.<init>(GoogleImportCallbackPage.java:94)
at sun.reflect.GeneratedConstructorAccessor187.newInstance(Unknown Source)
...1. Error on Google Reader import 2. Agreed with others it does need at least a single screenshot on the front page (or an About page as a demo). 3. It would be nice to offer a default Google Reader CSS file to add to the styling function.
But yeah, very nice attempt.
Thanks for showing
What I'm reading or interested in is none of any company's business.
This is why I prefer to use a dedicated RSS app on my computer rather than use one on some "free" web service.
I guess a good solution to address both of our problems would be to run a hosted Reader clone.
Another waste ...
No keyboard shortcuts.
Method onFormSubmitted of interface org.apache.wicket.markup.html.form.IFormSubmitListener targeted at [SignInForm [Component id = signInForm]] on component [SignInForm [Component id = signInForm]] threw an exception Go back to the previous page or to the home page. org.apache.wicket.WicketRuntimeException: Method onFormSubmitted of interface org.apache.wicket.markup.html.form.IFormSubmitListener targeted at [SignInForm [Component id = signInForm]] on component [SignInForm [Component id = signInForm]] threw an exception at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:268) at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:216) at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:240) at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:226) at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:840) at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64) at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:254) at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:211) at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:282) at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:244) at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:188) at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:267) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722) Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.GeneratedMethodAccessor311.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:258) ... 28 more Caused by: javax.ejb.EJBException: The bean encountered a non-application exception; nested exception is: javax.ejb.EJBTransactionRolledbackException: The transaction has been marked rollback only because the bean encountered a non-application exception :java.lang.NullPointerException : null at org.apache.openejb.core.ivm.BaseEjbProxyHandler.convertException(BaseEjbProxyHandler.java:363) at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:283) at com.commafeed.backend.services.UserService$LocalBeanProxy.login(com/commafeed/backend/services/UserService.java) at com.commafeed.frontend.CommaFeedSession.authenticate(CommaFeedSession.java:54) at org.apache.wicket.authroles.authentication.AuthenticatedWebSession.signIn(AuthenticatedWebSession.java:65) at org.apache.wicket.authroles.authentication.panel.SignInPanel.signIn(SignInPanel.java:221) at org.apache.wicket.authroles.authentication.panel.SignInPanel.access$100(SignInPanel.java:51) at org.apache.wicket.authroles.authentication.panel.SignInPanel$SignInForm.onSubmit(SignInPanel.java:296) at org.apache.wicket.markup.html.form.Form$9.component(Form.java:1246) at org.apache.wicket.markup.html.form.Form$9.component(Form.java:1240) at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:274) at org.apache.wicket.util.visit.Visits.visitPostOrder(Visits.java:245) at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1239) at org.apache.wicket.markup.html.form.Form.process(Form.java:921) at org.apache.wicket.markup.html.form.StatelessForm.process(StatelessForm.java:87) at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:767) at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:700) ... 32 more Caused by: javax.ejb.EJBTransactionRolledbackException: The transaction has been marked rollback only because the bean encountered a non-application exception :java.lang.NullPointerException : null at org.apache.openejb.core.ivm.BaseEjbProxyHandler.convertException(BaseEjbProxyHandler.java:345) at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:283) at com.commafeed.backend.dao.UserDAO$LocalBeanProxy.findByName(com/commafeed/backend/dao/UserDAO.java) at com.commafeed.backend.services.UserService.login(UserService.java:24) at sun.reflect.GeneratedMethodAccessor309.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:181) at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:163) at org.apache.openejb.cdi.CdiInterceptor.invoke(CdiInterceptor.java:130) at org.apache.openejb.cdi.CdiInterceptor.access$000(CdiInterceptor.java:43) at org.apache.openejb.cdi.CdiInterceptor$1.call(CdiInterceptor.java:67) at org.apache.openejb.cdi.CdiInterceptor.aroundInvoke(CdiInterceptor.java:73) at sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:181) at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:163) at org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:180) at org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:99) at sun.reflect.GeneratedMethodAccessor31.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:181) at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:163) at org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:138) at org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:239) at org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:191) at org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:256) at org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:251) at org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:85) at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:279) ... 47 more Caused by: java.lang.NullPointerException at com.commafeed.backend.dao.UserDAO.findByName(UserDAO.java:19) at sun.reflect.GeneratedMethodAccessor283.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:181) at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:163) at org.apache.openejb.cdi.CdiInterceptor.invoke(CdiInterceptor.java:130) at org.apache.openejb.cdi.CdiInterceptor.access$000(CdiInterceptor.java:43) at org.apache.openejb.cdi.CdiInterceptor$1.call(CdiInterceptor.java:67) at org.apache.openejb.cdi.CdiInterceptor.aroundInvoke(CdiInterceptor.java:73) at sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:181) at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(R
EDIT: oh snap, it's an OpenSource project, so we can see what's been used in the code :) https://github.com/Athou/commafeed